@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,491 @@
1
+ // Import tool generators and instances from @probelabs/probe package
2
+ import {
3
+ searchTool,
4
+ queryTool,
5
+ extractTool,
6
+ DEFAULT_SYSTEM_MESSAGE,
7
+ listFilesToolInstance as packageListFilesToolInstance,
8
+ searchFilesToolInstance as packageSearchFilesToolInstance
9
+ } from '@probelabs/probe';
10
+ import { spawn } from 'child_process';
11
+ import { randomUUID } from 'crypto';
12
+ import { EventEmitter } from 'events';
13
+
14
+ // Import the new pluggable implementation tool
15
+ import { createImplementTool } from './implement/core/ImplementTool.js';
16
+
17
+ // Create an event emitter for tool calls
18
+ export const toolCallEmitter = new EventEmitter();
19
+
20
+ // Map to track active tool executions by session ID
21
+ const activeToolExecutions = new Map();
22
+
23
+ // Function to check if a session has been cancelled
24
+ export function isSessionCancelled(sessionId) {
25
+ return activeToolExecutions.get(sessionId)?.cancelled || false;
26
+ }
27
+
28
+ // Function to cancel all tool executions for a session
29
+ export function cancelToolExecutions(sessionId) {
30
+ // Only log if not in non-interactive mode or if in debug mode
31
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
32
+ console.log(`Cancelling tool executions for session: ${sessionId}`);
33
+ }
34
+ const sessionData = activeToolExecutions.get(sessionId);
35
+ if (sessionData) {
36
+ sessionData.cancelled = true;
37
+ // Only log if not in non-interactive mode or if in debug mode
38
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
39
+ console.log(`Session ${sessionId} marked as cancelled`);
40
+ }
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+
46
+ // Function to register a new tool execution
47
+ function registerToolExecution(sessionId) {
48
+ if (!sessionId) return;
49
+
50
+ if (!activeToolExecutions.has(sessionId)) {
51
+ activeToolExecutions.set(sessionId, { cancelled: false });
52
+ } else {
53
+ // Reset cancelled flag if session already exists for a new execution
54
+ activeToolExecutions.get(sessionId).cancelled = false;
55
+ }
56
+ }
57
+
58
+ // Function to clear tool execution data for a session
59
+ export function clearToolExecutionData(sessionId) {
60
+ if (!sessionId) return;
61
+
62
+ if (activeToolExecutions.has(sessionId)) {
63
+ activeToolExecutions.delete(sessionId);
64
+ // Only log if not in non-interactive mode or if in debug mode
65
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
66
+ console.log(`Cleared tool execution data for session: ${sessionId}`);
67
+ }
68
+ }
69
+ }
70
+
71
+ // Generate a default session ID (less relevant now, session is managed per-chat)
72
+ const defaultSessionId = randomUUID();
73
+ // Only log session ID in debug mode
74
+ if (process.env.DEBUG_CHAT === '1') {
75
+ console.log(`Generated default session ID (probeTool.js): ${defaultSessionId}`);
76
+ }
77
+
78
+ // Create configured tools with the session ID
79
+ // Note: These configOptions are less critical now as sessionId is passed explicitly
80
+ const configOptions = {
81
+ sessionId: defaultSessionId,
82
+ debug: process.env.DEBUG_CHAT === '1'
83
+ };
84
+
85
+ // Helper function to truncate long argument values for logging
86
+ function truncateArgValue(value, maxLength = 200) {
87
+ if (typeof value !== 'string') {
88
+ value = JSON.stringify(value);
89
+ }
90
+ if (value.length <= maxLength * 2) {
91
+ return value;
92
+ }
93
+ // Show first 200 and last 200 characters
94
+ return `${value.substring(0, maxLength)}...${value.substring(value.length - maxLength)}`;
95
+ }
96
+
97
+ // Helper function to format tool arguments for debug logging
98
+ function formatToolArgs(args) {
99
+ const formatted = {};
100
+ for (const [key, value] of Object.entries(args)) {
101
+ formatted[key] = truncateArgValue(value);
102
+ }
103
+ return formatted;
104
+ }
105
+
106
+ // Create the base tools using the imported generators
107
+ const baseSearchTool = searchTool(configOptions);
108
+ const baseQueryTool = queryTool(configOptions);
109
+ const baseExtractTool = extractTool(configOptions);
110
+
111
+
112
+ // Wrap the tools to emit events and handle cancellation
113
+ const wrapToolWithEmitter = (tool, toolName, baseExecute) => {
114
+ return {
115
+ ...tool, // Spread schema, description etc.
116
+ execute: async (params) => { // The execute function now receives parsed params
117
+ const debug = process.env.DEBUG_CHAT === '1';
118
+ // Get the session ID from params (passed down from probeChat.js)
119
+ const toolSessionId = params.sessionId || defaultSessionId; // Fallback, but should always have sessionId
120
+
121
+ if (debug) {
122
+ console.log(`\n[DEBUG] ========================================`);
123
+ console.log(`[DEBUG] Tool Call: ${toolName}`);
124
+ console.log(`[DEBUG] Session: ${toolSessionId}`);
125
+ console.log(`[DEBUG] Arguments:`);
126
+ const formattedArgs = formatToolArgs(params);
127
+ for (const [key, value] of Object.entries(formattedArgs)) {
128
+ console.log(`[DEBUG] ${key}: ${value}`);
129
+ }
130
+ console.log(`[DEBUG] ========================================\n`);
131
+ }
132
+
133
+ // Register this tool execution (and reset cancel flag if needed)
134
+ registerToolExecution(toolSessionId);
135
+
136
+ // Check if this session has been cancelled *before* execution
137
+ if (isSessionCancelled(toolSessionId)) {
138
+ // Only log if not in non-interactive mode or if in debug mode
139
+ console.error(`Tool execution cancelled BEFORE starting for session ${toolSessionId}`);
140
+ throw new Error(`Tool execution cancelled for session ${toolSessionId}`);
141
+ }
142
+ // Only log if not in non-interactive mode or if in debug mode
143
+ console.error(`Executing ${toolName} for session ${toolSessionId}`); // Simplified log
144
+
145
+ // Remove sessionId from params before passing to base tool if it expects only schema params
146
+ const { sessionId, ...toolParams } = params;
147
+
148
+ try {
149
+ // Emit a tool call start event
150
+ const toolCallStartData = {
151
+ timestamp: new Date().toISOString(),
152
+ name: toolName,
153
+ args: toolParams, // Log schema params
154
+ status: 'started'
155
+ };
156
+ if (debug) {
157
+ console.log(`[DEBUG] probeTool: Emitting toolCallStart:${toolSessionId}`);
158
+ }
159
+ toolCallEmitter.emit(`toolCall:${toolSessionId}`, toolCallStartData);
160
+
161
+ // Execute the original tool's execute function with schema params
162
+ // Use a promise-based approach with cancellation check
163
+ let result = null;
164
+ let executionError = null;
165
+
166
+ const executionPromise = baseExecute(toolParams).catch(err => {
167
+ executionError = err; // Capture error
168
+ });
169
+
170
+ const checkInterval = 50; // Check every 50ms
171
+ while (result === null && executionError === null) {
172
+ if (isSessionCancelled(toolSessionId)) {
173
+ console.error(`Tool execution cancelled DURING execution for session ${toolSessionId}`);
174
+ // Attempt to signal cancellation if the underlying tool supports it (future enhancement)
175
+ // For now, just throw the cancellation error
176
+ throw new Error(`Tool execution cancelled for session ${toolSessionId}`);
177
+ }
178
+ // Check if promise is resolved or rejected
179
+ const status = await Promise.race([
180
+ executionPromise.then(() => 'resolved').catch(() => 'rejected'),
181
+ new Promise(resolve => setTimeout(() => resolve('pending'), checkInterval))
182
+ ]);
183
+
184
+ if (status === 'resolved') {
185
+ result = await executionPromise; // Get the result
186
+ } else if (status === 'rejected') {
187
+ // Error already captured by the catch block on executionPromise
188
+ break;
189
+ }
190
+ // If 'pending', continue loop
191
+ }
192
+
193
+ // If loop exited due to error
194
+ if (executionError) {
195
+ throw executionError;
196
+ }
197
+
198
+ // If loop exited due to cancellation within the loop
199
+ if (isSessionCancelled(toolSessionId)) {
200
+ // Only log if not in non-interactive mode or if in debug mode
201
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
202
+ console.log(`Tool execution finished but session was cancelled for ${toolSessionId}`);
203
+ }
204
+ throw new Error(`Tool execution cancelled for session ${toolSessionId}`);
205
+ }
206
+
207
+
208
+ // Emit the tool call completion event
209
+ const toolCallData = {
210
+ timestamp: new Date().toISOString(),
211
+ name: toolName,
212
+ args: toolParams,
213
+ // Safely preview result
214
+ resultPreview: typeof result === 'string'
215
+ ? (result.length > 200 ? result.substring(0, 200) + '...' : result)
216
+ : (result ? JSON.stringify(result).substring(0, 200) + '...' : 'No Result'),
217
+ status: 'completed'
218
+ };
219
+ if (debug) {
220
+ console.log(`[DEBUG] probeTool: Emitting toolCall:${toolSessionId} (completed)`);
221
+ }
222
+ toolCallEmitter.emit(`toolCall:${toolSessionId}`, toolCallData);
223
+
224
+ return result;
225
+ } catch (error) {
226
+ // If it's a cancellation error, re-throw it directly
227
+ if (error.message.includes('cancelled for session')) {
228
+ // Only log if not in non-interactive mode or if in debug mode
229
+ if (process.env.PROBE_NON_INTERACTIVE !== '1' || process.env.DEBUG_CHAT === '1') {
230
+ console.log(`Caught cancellation error for ${toolName} in session ${toolSessionId}`);
231
+ }
232
+ // Emit cancellation event? Or let the caller handle it? Let caller handle.
233
+ throw error;
234
+ }
235
+
236
+ // Handle other execution errors
237
+ if (debug) {
238
+ console.error(`[DEBUG] probeTool: Error executing ${toolName}:`, error);
239
+ }
240
+
241
+ // Emit a tool call error event
242
+ const toolCallErrorData = {
243
+ timestamp: new Date().toISOString(),
244
+ name: toolName,
245
+ args: toolParams,
246
+ error: error.message || 'Unknown error',
247
+ status: 'error'
248
+ };
249
+ if (debug) {
250
+ console.log(`[DEBUG] probeTool: Emitting toolCall:${toolSessionId} (error)`);
251
+ }
252
+ toolCallEmitter.emit(`toolCall:${toolSessionId}`, toolCallErrorData);
253
+
254
+ throw error; // Re-throw the error to be caught by probeChat.js loop
255
+ }
256
+ }
257
+ };
258
+ };
259
+
260
+ // Create the implement tool using the new pluggable system
261
+ const implementToolConfig = {
262
+ enabled: process.env.ALLOW_EDIT === '1' || process.argv.includes('--allow-edit'),
263
+ backendConfig: {
264
+ // Configuration can be extended here
265
+ }
266
+ };
267
+
268
+ const pluggableImplementTool = createImplementTool(implementToolConfig);
269
+
270
+ // Create a compatibility wrapper for the old interface
271
+ const baseImplementTool = {
272
+ name: "implement",
273
+ description: pluggableImplementTool.description,
274
+ inputSchema: pluggableImplementTool.inputSchema,
275
+ execute: async ({ task, autoCommits = false, prompt, sessionId }) => {
276
+ const debug = process.env.DEBUG_CHAT === '1';
277
+
278
+ if (debug) {
279
+ console.log(`[DEBUG] Executing implementation with task: ${task}`);
280
+ console.log(`[DEBUG] Auto-commits: ${autoCommits}`);
281
+ console.log(`[DEBUG] Session ID: ${sessionId}`);
282
+ if (prompt) console.log(`[DEBUG] Custom prompt: ${prompt}`);
283
+ }
284
+
285
+ // Check if the tool is enabled
286
+ if (!implementToolConfig.enabled) {
287
+ return {
288
+ success: false,
289
+ output: null,
290
+ error: 'Implementation tool is not enabled. Use --allow-edit flag to enable.',
291
+ command: null,
292
+ timestamp: new Date().toISOString(),
293
+ prompt: prompt || task
294
+ };
295
+ }
296
+
297
+ try {
298
+ // Use the new pluggable implementation tool
299
+ const result = await pluggableImplementTool.execute({
300
+ task: prompt || task, // Use prompt if provided, otherwise use task
301
+ autoCommit: autoCommits,
302
+ sessionId: sessionId,
303
+ // Pass through any additional options that might be useful
304
+ context: {
305
+ workingDirectory: process.cwd()
306
+ }
307
+ });
308
+
309
+ // The result is already in the expected format
310
+ return result;
311
+
312
+ } catch (error) {
313
+ // Handle any unexpected errors
314
+ console.error(`Error in implement tool:`, error);
315
+ return {
316
+ success: false,
317
+ output: null,
318
+ error: error.message || 'Unknown error in implementation tool',
319
+ command: null,
320
+ timestamp: new Date().toISOString(),
321
+ prompt: prompt || task
322
+ };
323
+ }
324
+ }
325
+ };
326
+
327
+ // Wrapper for listFiles tool with ALLOWED_FOLDERS security
328
+ const baseListFilesTool = {
329
+ ...packageListFilesToolInstance,
330
+ execute: async (params) => {
331
+ const { directory = '.', sessionId } = params;
332
+ const debug = process.env.DEBUG_CHAT === '1';
333
+ const currentWorkingDir = process.cwd();
334
+
335
+ // Get allowed folders from environment variable
336
+ const allowedFoldersEnv = process.env.ALLOWED_FOLDERS;
337
+ let allowedFolders = [];
338
+
339
+ if (allowedFoldersEnv) {
340
+ allowedFolders = allowedFoldersEnv.split(',').map(folder => folder.trim()).filter(folder => folder.length > 0);
341
+ }
342
+
343
+ // Handle default directory behavior when ALLOWED_FOLDERS is set
344
+ let targetDirectory = directory;
345
+ if (allowedFolders.length > 0 && (directory === '.' || directory === './')) {
346
+ // Use the first allowed folder if directory is current directory
347
+ targetDirectory = allowedFolders[0];
348
+ if (debug) {
349
+ console.log(`[DEBUG] Redirecting from '${directory}' to first allowed folder: ${targetDirectory}`);
350
+ }
351
+ }
352
+
353
+ const targetDir = require('path').resolve(currentWorkingDir, targetDirectory);
354
+
355
+ // Validate that the target directory is within allowed folders
356
+ if (allowedFolders.length > 0) {
357
+ const isAllowed = allowedFolders.some(allowedFolder => {
358
+ const resolvedAllowedFolder = require('path').resolve(currentWorkingDir, allowedFolder);
359
+ return targetDir === resolvedAllowedFolder || targetDir.startsWith(resolvedAllowedFolder + require('path').sep);
360
+ });
361
+
362
+ if (!isAllowed) {
363
+ const error = `Access denied: Directory '${targetDirectory}' is not within allowed folders: ${allowedFolders.join(', ')}`;
364
+ if (debug) {
365
+ console.log(`[DEBUG] ${error}`);
366
+ }
367
+ return `Error: ${error}`;
368
+ }
369
+ }
370
+
371
+ // Call the package tool with workingDirectory parameter
372
+ return packageListFilesToolInstance.execute({
373
+ ...params,
374
+ directory: targetDirectory,
375
+ workingDirectory: currentWorkingDir
376
+ });
377
+ }
378
+ };
379
+
380
+ // Wrapper for searchFiles tool with ALLOWED_FOLDERS security
381
+ const baseSearchFilesTool = {
382
+ ...packageSearchFilesToolInstance,
383
+ execute: async (params) => {
384
+ const { pattern, directory = '.', recursive = true, sessionId } = params;
385
+ const debug = process.env.DEBUG_CHAT === '1';
386
+ const currentWorkingDir = process.cwd();
387
+
388
+ // Get allowed folders from environment variable
389
+ const allowedFoldersEnv = process.env.ALLOWED_FOLDERS;
390
+ let allowedFolders = [];
391
+
392
+ if (allowedFoldersEnv) {
393
+ allowedFolders = allowedFoldersEnv.split(',').map(folder => folder.trim()).filter(folder => folder.length > 0);
394
+ }
395
+
396
+ // Handle default directory behavior when ALLOWED_FOLDERS is set
397
+ let targetDirectory = directory;
398
+ if (allowedFolders.length > 0 && (directory === '.' || directory === './')) {
399
+ // Use the first allowed folder if directory is current directory
400
+ targetDirectory = allowedFolders[0];
401
+ if (debug) {
402
+ console.log(`[DEBUG] Redirecting from '${directory}' to first allowed folder: ${targetDirectory}`);
403
+ }
404
+ }
405
+
406
+ const targetDir = require('path').resolve(currentWorkingDir, targetDirectory);
407
+
408
+ // Validate that the target directory is within allowed folders
409
+ if (allowedFolders.length > 0) {
410
+ const isAllowed = allowedFolders.some(allowedFolder => {
411
+ const resolvedAllowedFolder = require('path').resolve(currentWorkingDir, allowedFolder);
412
+ return targetDir === resolvedAllowedFolder || targetDir.startsWith(resolvedAllowedFolder + require('path').sep);
413
+ });
414
+
415
+ if (!isAllowed) {
416
+ const error = `Access denied: Directory '${targetDirectory}' is not within allowed folders: ${allowedFolders.join(', ')}`;
417
+ if (debug) {
418
+ console.log(`[DEBUG] ${error}`);
419
+ }
420
+ return {
421
+ success: false,
422
+ directory: targetDir,
423
+ pattern: pattern,
424
+ error: error,
425
+ timestamp: new Date().toISOString()
426
+ };
427
+ }
428
+ }
429
+
430
+ // Log execution parameters to stderr for visibility
431
+ console.error(`Executing searchFiles with params: pattern="${pattern}", directory="${targetDirectory}", recursive=${recursive}`);
432
+
433
+ try {
434
+ // Call the package tool with workingDirectory parameter
435
+ const files = await packageSearchFilesToolInstance.execute({
436
+ ...params,
437
+ directory: targetDirectory,
438
+ recursive,
439
+ workingDirectory: currentWorkingDir
440
+ });
441
+
442
+ if (debug) {
443
+ console.log(`[DEBUG] Found ${files.length} files matching pattern ${pattern}`);
444
+ }
445
+
446
+ // Return in the expected format for backward compatibility
447
+ return {
448
+ success: true,
449
+ directory: targetDir,
450
+ pattern: pattern,
451
+ recursive: recursive,
452
+ files: files.map(file => require('path').join(targetDirectory, file)),
453
+ count: files.length,
454
+ totalMatches: files.length,
455
+ limited: false,
456
+ timestamp: new Date().toISOString()
457
+ };
458
+ } catch (error) {
459
+ console.error(`Error searching files with pattern "${pattern}" in ${targetDir}:`, error);
460
+ return {
461
+ success: false,
462
+ directory: targetDir,
463
+ pattern: pattern,
464
+ error: error.message || 'Unknown error searching files',
465
+ timestamp: new Date().toISOString()
466
+ };
467
+ }
468
+ }
469
+ };
470
+
471
+ // Export the wrapped tool instances
472
+ export const searchToolInstance = wrapToolWithEmitter(baseSearchTool, 'search', baseSearchTool.execute);
473
+ export const queryToolInstance = wrapToolWithEmitter(baseQueryTool, 'query', baseQueryTool.execute);
474
+ export const extractToolInstance = wrapToolWithEmitter(baseExtractTool, 'extract', baseExtractTool.execute);
475
+ export const implementToolInstance = wrapToolWithEmitter(baseImplementTool, 'implement', baseImplementTool.execute);
476
+ export const listFilesToolInstance = wrapToolWithEmitter(baseListFilesTool, 'listFiles', baseListFilesTool.execute);
477
+ export const searchFilesToolInstance = wrapToolWithEmitter(baseSearchFilesTool, 'searchFiles', baseSearchFilesTool.execute);
478
+
479
+ // Log available tools at startup in debug mode
480
+ if (process.env.DEBUG_CHAT === '1') {
481
+ console.log('\n[DEBUG] ========================================');
482
+ console.log('[DEBUG] Probe Tools Loaded:');
483
+ console.log('[DEBUG] - search: Search for code patterns');
484
+ console.log('[DEBUG] - query: Semantic code search');
485
+ console.log('[DEBUG] - extract: Extract code snippets');
486
+ console.log('[DEBUG] - implement: Generate code implementations');
487
+ console.log('[DEBUG] - listFiles: List directory contents');
488
+ console.log('[DEBUG] - searchFiles: Search files by pattern');
489
+ console.log('[DEBUG] ========================================\n');
490
+ }
491
+