@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,109 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test script to verify download locking works correctly
4
+ * Tests both in-process and cross-process locking
5
+ */
6
+
7
+ import { getBinaryPath } from './src/utils.js';
8
+ import { spawn } from 'child_process';
9
+ import { fileURLToPath } from 'url';
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+
13
+ async function testInProcessLocking() {
14
+ console.log('=== Test 1: In-Process Locking ===\n');
15
+
16
+ // Simulate 5 concurrent calls to getBinaryPath with the same version
17
+ const version = '0.6.0-rc100'; // Use a specific version to trigger download
18
+
19
+ console.log(`Initiating 5 concurrent getBinaryPath calls for version ${version}...`);
20
+ const startTime = Date.now();
21
+
22
+ const promises = Array.from({ length: 5 }, (_, i) => {
23
+ return getBinaryPath({ version, forceDownload: false })
24
+ .then(path => {
25
+ console.log(`Call ${i + 1} completed: ${path}`);
26
+ return path;
27
+ })
28
+ .catch(err => {
29
+ console.error(`Call ${i + 1} failed:`, err.message);
30
+ throw err;
31
+ });
32
+ });
33
+
34
+ const results = await Promise.all(promises);
35
+ const endTime = Date.now();
36
+
37
+ console.log(`\nAll calls completed in ${endTime - startTime}ms`);
38
+ console.log('All calls returned the same path:', new Set(results).size === 1);
39
+ console.log('✅ In-process locking test passed\n');
40
+ }
41
+
42
+ async function testCrossProcessLocking() {
43
+ console.log('=== Test 2: Cross-Process Locking ===\n');
44
+
45
+ const version = '0.6.0-rc101'; // Different version for cross-process test
46
+
47
+ console.log(`Spawning 3 separate Node.js processes to download version ${version}...`);
48
+
49
+ const processes = Array.from({ length: 3 }, (_, i) => {
50
+ return new Promise((resolve, reject) => {
51
+ const child = spawn('node', [
52
+ '-e',
53
+ `import('${__filename.replace(/\\/g, '/')}').then(m => m.singleDownload('${version}'))`
54
+ ], {
55
+ stdio: 'inherit',
56
+ shell: true
57
+ });
58
+
59
+ child.on('exit', (code) => {
60
+ if (code === 0) {
61
+ resolve();
62
+ } else {
63
+ reject(new Error(`Process ${i + 1} exited with code ${code}`));
64
+ }
65
+ });
66
+
67
+ child.on('error', reject);
68
+ });
69
+ });
70
+
71
+ await Promise.all(processes);
72
+ console.log('✅ Cross-process locking test passed\n');
73
+ }
74
+
75
+ // Helper function for spawned processes
76
+ export async function singleDownload(version) {
77
+ console.log(`[Process ${process.pid}] Starting download for version ${version}`);
78
+ const path = await getBinaryPath({ version, forceDownload: false });
79
+ console.log(`[Process ${process.pid}] Download completed: ${path}`);
80
+ }
81
+
82
+ async function runTests() {
83
+ try {
84
+ console.log('Testing Download Locking Mechanism\n');
85
+ console.log('Lock features:');
86
+ console.log('- In-memory locks for same-process coordination');
87
+ console.log('- File-based locks for cross-process coordination');
88
+ console.log('- 5-minute timeout for stuck downloads');
89
+ console.log('- Automatic retry if locked download fails');
90
+ console.log('- Stale lock detection and cleanup');
91
+ console.log('- Poll-based waiting (500ms intervals)\n');
92
+
93
+ await testInProcessLocking();
94
+
95
+ // Uncomment to test cross-process locking
96
+ // Note: This requires the version to not already be downloaded
97
+ // await testCrossProcessLocking();
98
+
99
+ console.log('✅ All tests passed!');
100
+ } catch (error) {
101
+ console.error('Test failed:', error);
102
+ process.exit(1);
103
+ }
104
+ }
105
+
106
+ // Run tests if this is the main module
107
+ if (process.argv[1] === __filename) {
108
+ runTests();
109
+ }
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { grep } from './src/index.js';
4
+
5
+ async function testSecurityFixes() {
6
+ console.log('Testing grep security (command injection prevention)...\n');
7
+
8
+ try {
9
+ // Test 1: Malicious pattern with shell metacharacters
10
+ console.log('Test 1: Pattern with shell metacharacters (should be safe)');
11
+ const maliciousPattern = 'test"; echo "INJECTED"; echo "';
12
+ try {
13
+ const result = await grep({
14
+ pattern: maliciousPattern,
15
+ paths: './src',
16
+ lineNumbers: true
17
+ });
18
+ console.log('✅ Pattern treated as literal string (no injection)');
19
+ console.log(` Found ${result.split('\n').filter(l => l).length} lines`);
20
+ } catch (error) {
21
+ // This is expected - the pattern won't match
22
+ console.log('✅ No matches found (pattern treated as literal)');
23
+ }
24
+ console.log('\n---\n');
25
+
26
+ // Test 2: Path with shell metacharacters
27
+ console.log('Test 2: Path with shell metacharacters (should be safe)');
28
+ const maliciousPath = './src; echo INJECTED;';
29
+ try {
30
+ const result = await grep({
31
+ pattern: 'export',
32
+ paths: maliciousPath,
33
+ lineNumbers: true
34
+ });
35
+ console.log('⚠️ Unexpected: command should have failed');
36
+ } catch (error) {
37
+ console.log('✅ Path handled securely (command failed safely)');
38
+ console.log(` Error: ${error.message.substring(0, 100)}`);
39
+ }
40
+ console.log('\n---\n');
41
+
42
+ // Test 3: Pattern with backticks (command substitution attempt)
43
+ console.log('Test 3: Pattern with backticks (should be safe)');
44
+ const backtickPattern = 'test`whoami`test';
45
+ try {
46
+ const result = await grep({
47
+ pattern: backtickPattern,
48
+ paths: './src',
49
+ lineNumbers: true
50
+ });
51
+ console.log('✅ Backticks treated as literal (no command substitution)');
52
+ } catch (error) {
53
+ console.log('✅ No matches found (backticks treated as literal)');
54
+ }
55
+ console.log('\n---\n');
56
+
57
+ // Test 4: Pattern with $() (command substitution attempt)
58
+ console.log('Test 4: Pattern with $() syntax (should be safe)');
59
+ const dollarPattern = 'test$(whoami)test';
60
+ try {
61
+ const result = await grep({
62
+ pattern: dollarPattern,
63
+ paths: './src',
64
+ lineNumbers: true
65
+ });
66
+ console.log('✅ $() treated as literal (no command substitution)');
67
+ } catch (error) {
68
+ console.log('✅ No matches found ($() treated as literal)');
69
+ }
70
+ console.log('\n---\n');
71
+
72
+ // Test 5: Normal regex patterns should still work
73
+ console.log('Test 5: Normal regex patterns work correctly');
74
+ const regexPattern = 'export.*function';
75
+ const result = await grep({
76
+ pattern: regexPattern,
77
+ paths: './src/grep.js',
78
+ lineNumbers: true
79
+ });
80
+ console.log('✅ Regex patterns work correctly');
81
+ console.log(` Found ${result.split('\n').filter(l => l).length} matches`);
82
+ console.log('\n---\n');
83
+
84
+ console.log('✅ All security tests passed!');
85
+ console.log('\nThe grep function is now safe from command injection attacks.');
86
+ console.log('All shell metacharacters are treated as literal strings.');
87
+ } catch (error) {
88
+ console.error('❌ Security test failed:', error.message);
89
+ console.error(error);
90
+ process.exit(1);
91
+ }
92
+ }
93
+
94
+ testSecurityFixes();
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { grep } from './src/index.js';
4
+
5
+ async function testSimplifiedGrep() {
6
+ console.log('Testing simplified grep API...\n');
7
+
8
+ try {
9
+ // Test 1: Basic search (line numbers enabled by default)
10
+ console.log('Test 1: Basic search for "export" in src directory');
11
+ const result1 = await grep({
12
+ pattern: 'export',
13
+ paths: './src',
14
+ lineNumbers: true // This should be the default
15
+ });
16
+ console.log('First 5 lines:');
17
+ console.log(result1.split('\n').slice(0, 5).join('\n'));
18
+ console.log('\n---\n');
19
+
20
+ // Test 2: Case-insensitive search
21
+ console.log('Test 2: Case-insensitive search for "TODO"');
22
+ const result2 = await grep({
23
+ pattern: 'todo',
24
+ paths: './src',
25
+ ignoreCase: true,
26
+ lineNumbers: true
27
+ });
28
+ console.log('Result:');
29
+ console.log(result2);
30
+ console.log('\n---\n');
31
+
32
+ // Test 3: Count matches
33
+ console.log('Test 3: Count "function" occurrences');
34
+ const result3 = await grep({
35
+ pattern: 'function',
36
+ paths: './src',
37
+ count: true
38
+ });
39
+ console.log('First 5 files:');
40
+ console.log(result3.split('\n').slice(0, 5).join('\n'));
41
+ console.log('\n---\n');
42
+
43
+ // Test 4: Search with context
44
+ console.log('Test 4: Search with 1 line of context');
45
+ const result4 = await grep({
46
+ pattern: 'export.*grep',
47
+ paths: './src/index.js',
48
+ context: 1,
49
+ lineNumbers: true
50
+ });
51
+ console.log('Result:');
52
+ console.log(result4);
53
+ console.log('\n---\n');
54
+
55
+ console.log('✅ All simplified grep tests passed!');
56
+ } catch (error) {
57
+ console.error('❌ Test failed:', error.message);
58
+ console.error(error);
59
+ process.exit(1);
60
+ }
61
+ }
62
+
63
+ testSimplifiedGrep();
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { grep } from './src/index.js';
4
+
5
+ async function testGrep() {
6
+ console.log('Testing grep functionality...\n');
7
+
8
+ try {
9
+ // Test 1: Basic search
10
+ console.log('Test 1: Basic search for "TODO" in src directory');
11
+ const result1 = await grep({
12
+ pattern: 'TODO',
13
+ paths: './src',
14
+ lineNumbers: true
15
+ });
16
+ console.log('Result:');
17
+ console.log(result1);
18
+ console.log('\n---\n');
19
+
20
+ // Test 2: Case-insensitive search with count
21
+ console.log('Test 2: Count "function" occurrences (case-insensitive)');
22
+ const result2 = await grep({
23
+ pattern: 'function',
24
+ paths: './src',
25
+ ignoreCase: true,
26
+ count: true
27
+ });
28
+ console.log('Result:');
29
+ console.log(result2);
30
+ console.log('\n---\n');
31
+
32
+ // Test 3: Files with matches
33
+ console.log('Test 3: Files containing "export"');
34
+ const result3 = await grep({
35
+ pattern: 'export',
36
+ paths: './src',
37
+ filesWithMatches: true
38
+ });
39
+ console.log('Result:');
40
+ console.log(result3);
41
+ console.log('\n---\n');
42
+
43
+ console.log('✅ All grep tests passed!');
44
+ } catch (error) {
45
+ console.error('❌ Test failed:', error.message);
46
+ console.error(error);
47
+ process.exit(1);
48
+ }
49
+ }
50
+
51
+ testGrep();
@@ -0,0 +1,96 @@
1
+ # Test Suite for Bundled Binaries
2
+
3
+ This directory contains tests for the bundled binary extraction functionality.
4
+
5
+ ## Test Files
6
+
7
+ ### `extractor.test.js`
8
+ Unit tests for the binary extractor module (`src/extractor.js`).
9
+
10
+ **Coverage:**
11
+ - ✅ Platform detection (Linux, macOS, Windows)
12
+ - ✅ Unsupported platform error handling
13
+ - ✅ tar.gz archive extraction
14
+ - ✅ ZIP archive extraction (Windows)
15
+ - ✅ Path traversal security validation
16
+ - ✅ Error handling for missing binaries
17
+ - ✅ Error handling for empty archives
18
+
19
+ **Security Tests:**
20
+ - Path traversal attacks (../ sequences)
21
+ - Absolute path rejection
22
+ - Malicious archive handling
23
+
24
+ ### `extractor-integration.test.js`
25
+ Integration tests that verify the extraction logic without requiring actual binary files.
26
+
27
+ **Coverage:**
28
+ - ✅ Platform detection logic for all 5 supported platforms
29
+ - ✅ Path safety validation
30
+ - ✅ Archive naming conventions
31
+ - ✅ Binary name detection (Windows vs Unix)
32
+ - ✅ Security validations
33
+
34
+ **Security Tests:**
35
+ - `isPathSafe()` logic verification
36
+ - Path normalization
37
+ - Relative path validation
38
+ - Directory traversal prevention
39
+
40
+ ## Running Tests
41
+
42
+ ```bash
43
+ # Run all tests
44
+ npm test
45
+
46
+ # Run with coverage
47
+ npm run test:coverage
48
+
49
+ # Run in watch mode
50
+ npm run test:watch
51
+
52
+ # Run verbose
53
+ npm run test:verbose
54
+ ```
55
+
56
+ ## Security Test Coverage
57
+
58
+ All security-critical functions have test coverage:
59
+
60
+ 1. **Path Traversal Prevention** ✅
61
+ - Tests verify `../ `sequences are rejected
62
+ - Tests verify absolute paths are rejected
63
+ - Tests verify safe relative paths are accepted
64
+
65
+ 2. **Archive Extraction** ✅
66
+ - tar.gz extraction with path validation
67
+ - ZIP extraction with path validation
68
+ - Malicious archive rejection
69
+
70
+ 3. **Platform Detection** ✅
71
+ - All 5 platforms correctly mapped
72
+ - Unsupported platforms throw errors
73
+ - Correct file extensions selected
74
+
75
+ ## Test Dependencies
76
+
77
+ - `@jest/globals` - Test framework
78
+ - `fs-extra` - File system operations
79
+ - `tar` - tar.gz extraction
80
+ - `adm-zip` - ZIP extraction (dynamically imported)
81
+
82
+ ## Notes
83
+
84
+ - Tests use dynamic imports for `adm-zip` to handle cases where it's not yet installed
85
+ - Tests skip platform-specific functionality (e.g., Windows ZIP tests on macOS)
86
+ - Security tests run on all platforms and verify the core logic
87
+ - Integration tests don't require actual binary files, only test the logic
88
+
89
+ ## Coverage Goals
90
+
91
+ - ✅ Lines: >70%
92
+ - ✅ Functions: >70%
93
+ - ✅ Branches: >70%
94
+ - ✅ Statements: >70%
95
+
96
+ Security-critical functions should aim for 100% coverage.
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Tests for ProbeAgent.compactHistory() method
3
+ */
4
+
5
+ import { jest } from '@jest/globals';
6
+ import { ProbeAgent } from '../src/agent/ProbeAgent.js';
7
+
8
+ describe('ProbeAgent.compactHistory()', () => {
9
+ let agent;
10
+
11
+ beforeEach(() => {
12
+ // Create agent with mock provider to avoid actual API calls
13
+ agent = new ProbeAgent({
14
+ sessionId: 'test-session',
15
+ path: '/tmp/test',
16
+ provider: 'mock',
17
+ debug: false
18
+ });
19
+ });
20
+
21
+ afterEach(async () => {
22
+ if (agent) {
23
+ await agent.cleanup();
24
+ }
25
+ });
26
+
27
+ it('should compact history and return statistics', async () => {
28
+ // Populate history with multiple segments
29
+ agent.history = [
30
+ { role: 'system', content: 'You are a helpful assistant' },
31
+ // Segment 1
32
+ { role: 'user', content: 'Search for functions' },
33
+ { role: 'assistant', content: '<thinking>I need to search</thinking>' },
34
+ { role: 'assistant', content: '<search>function</search>' },
35
+ { role: 'user', content: '<tool_result>Found 10 functions</tool_result>' },
36
+ // Segment 2
37
+ { role: 'user', content: 'Extract the first one' },
38
+ { role: 'assistant', content: '<thinking>Let me extract</thinking>' },
39
+ { role: 'assistant', content: '<extract>file.js:10</extract>' },
40
+ { role: 'user', content: '<tool_result>function code here</tool_result>' },
41
+ // Segment 3 (active)
42
+ { role: 'user', content: 'Modify it' },
43
+ { role: 'assistant', content: '<thinking>I will modify</thinking>' }
44
+ ];
45
+
46
+ const stats = await agent.compactHistory();
47
+
48
+ // Check stats
49
+ expect(stats.originalCount).toBe(11);
50
+ expect(stats.compactedCount).toBeLessThan(11);
51
+ expect(stats.removed).toBeGreaterThan(0);
52
+ expect(stats.reductionPercent).toBeGreaterThan(0);
53
+ expect(stats.tokensSaved).toBeGreaterThan(0);
54
+
55
+ // Check history was actually compacted
56
+ expect(agent.history.length).toBeLessThan(11);
57
+
58
+ // System message should be preserved
59
+ expect(agent.history[0].role).toBe('system');
60
+
61
+ // All user messages should be preserved
62
+ const userMessages = agent.history.filter(
63
+ m => m.role === 'user' && !m.content.includes('tool_result')
64
+ );
65
+ expect(userMessages.length).toBe(3);
66
+
67
+ // Old segment thinking should be removed
68
+ const hasOldThinking = agent.history.some(
69
+ m => m.content && m.content.includes('I need to search')
70
+ );
71
+ expect(hasOldThinking).toBe(false);
72
+
73
+ // Active segment thinking should be preserved
74
+ const hasActiveThinking = agent.history.some(
75
+ m => m.content && m.content.includes('I will modify')
76
+ );
77
+ expect(hasActiveThinking).toBe(true);
78
+ });
79
+
80
+ it('should handle empty history gracefully', async () => {
81
+ agent.history = [];
82
+
83
+ const stats = await agent.compactHistory();
84
+
85
+ expect(stats.originalCount).toBe(0);
86
+ expect(stats.compactedCount).toBe(0);
87
+ expect(stats.removed).toBe(0);
88
+ expect(stats.reductionPercent).toBe(0);
89
+ expect(stats.tokensSaved).toBe(0);
90
+ });
91
+
92
+ it('should respect custom options', async () => {
93
+ agent.history = [
94
+ { role: 'user', content: 'Query 1' },
95
+ { role: 'assistant', content: '<thinking>Thought 1</thinking>' },
96
+ { role: 'user', content: '<tool_result>Result 1</tool_result>' },
97
+ { role: 'user', content: 'Query 2' },
98
+ { role: 'assistant', content: '<thinking>Thought 2</thinking>' },
99
+ { role: 'user', content: '<tool_result>Result 2</tool_result>' },
100
+ { role: 'user', content: 'Query 3' },
101
+ { role: 'assistant', content: '<thinking>Thought 3</thinking>' }
102
+ ];
103
+
104
+ // Keep last 2 segments fully
105
+ const stats = await agent.compactHistory({
106
+ keepLastSegment: true,
107
+ minSegmentsToKeep: 2
108
+ });
109
+
110
+ expect(stats.removed).toBeGreaterThan(0);
111
+
112
+ // Segment 1 should be compacted
113
+ const hasThought1 = agent.history.some(
114
+ m => m.content && m.content.includes('Thought 1')
115
+ );
116
+ expect(hasThought1).toBe(false);
117
+
118
+ // Segments 2 and 3 should be preserved
119
+ const hasThought2 = agent.history.some(
120
+ m => m.content && m.content.includes('Thought 2')
121
+ );
122
+ const hasThought3 = agent.history.some(
123
+ m => m.content && m.content.includes('Thought 3')
124
+ );
125
+ expect(hasThought2).toBe(true);
126
+ expect(hasThought3).toBe(true);
127
+ });
128
+
129
+ it('should handle history with only system message', async () => {
130
+ agent.history = [
131
+ { role: 'system', content: 'You are a helpful assistant' }
132
+ ];
133
+
134
+ const stats = await agent.compactHistory();
135
+
136
+ expect(stats.removed).toBe(0);
137
+ expect(agent.history.length).toBe(1);
138
+ expect(agent.history[0].role).toBe('system');
139
+ });
140
+
141
+ it('should handle history with incomplete segments', async () => {
142
+ agent.history = [
143
+ { role: 'user', content: 'Query' },
144
+ { role: 'assistant', content: '<thinking>Processing...</thinking>' }
145
+ ];
146
+
147
+ const stats = await agent.compactHistory();
148
+
149
+ // Should not crash, incomplete segment should be preserved
150
+ expect(agent.history.length).toBeGreaterThan(0);
151
+ expect(stats).toBeDefined();
152
+ });
153
+
154
+ it('should preserve message order', async () => {
155
+ agent.history = [
156
+ { role: 'system', content: 'System' },
157
+ { role: 'user', content: 'Query 1' },
158
+ { role: 'assistant', content: '<search>test</search>' },
159
+ { role: 'user', content: '<tool_result>Result 1</tool_result>' },
160
+ { role: 'user', content: 'Query 2' },
161
+ { role: 'assistant', content: '<thinking>Active</thinking>' }
162
+ ];
163
+
164
+ await agent.compactHistory();
165
+
166
+ // First message should still be system
167
+ expect(agent.history[0].role).toBe('system');
168
+
169
+ // User messages should maintain their relative order
170
+ const userMessages = agent.history.filter(m => m.role === 'user');
171
+ expect(userMessages[0].content).toBe('Query 1');
172
+ expect(userMessages[2].content).toBe('Query 2');
173
+ });
174
+ });