@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,567 @@
1
+ /**
2
+ * Backend manager for handling multiple implementation backends
3
+ * @module BackendManager
4
+ */
5
+
6
+ import { BackendError, ErrorTypes, ErrorHandler, RetryHandler } from './utils.js';
7
+ import { getDefaultTimeoutMs } from './timeouts.js';
8
+
9
+ /**
10
+ * Manages registration, selection, and execution of implementation backends
11
+ * @class
12
+ */
13
+ class BackendManager {
14
+ /**
15
+ * @param {Object} config - Backend manager configuration
16
+ * @param {string} config.defaultBackend - Default backend name
17
+ * @param {string[]} [config.fallbackBackends] - Fallback backend names
18
+ * @param {string} [config.selectionStrategy='auto'] - Backend selection strategy
19
+ * @param {number} [config.maxConcurrentSessions=3] - Maximum concurrent sessions
20
+ * @param {number} [config.timeout=300000] - Default timeout in milliseconds
21
+ * @param {number} [config.retryAttempts=2] - Number of retry attempts
22
+ */
23
+ constructor(config) {
24
+ this.config = {
25
+ defaultBackend: config.defaultBackend || 'aider',
26
+ selectionStrategy: config.selectionStrategy || 'auto',
27
+ maxConcurrentSessions: config.maxConcurrentSessions || 3,
28
+ timeout: config.timeout || getDefaultTimeoutMs(), // Use centralized default (20 minutes)
29
+ retryAttempts: config.retryAttempts || 2,
30
+ ...config
31
+ };
32
+
33
+ this.backends = new Map();
34
+ this.activeSessionCount = 0;
35
+ this.sessionBackendMap = new Map();
36
+ this.initialized = false;
37
+ }
38
+
39
+ /**
40
+ * Initialize the backend manager
41
+ * @returns {Promise<void>}
42
+ */
43
+ async initialize() {
44
+ if (this.initialized) return;
45
+
46
+ // Initialize any pre-registered backends
47
+ for (const [name, backend] of this.backends) {
48
+ try {
49
+ if (!backend.initialized) {
50
+ await backend.initialize(this.config.backends?.[name] || {});
51
+ }
52
+ } catch (error) {
53
+ console.warn(`Failed to initialize backend '${name}':`, error.message);
54
+ }
55
+ }
56
+
57
+ this.initialized = true;
58
+ }
59
+
60
+ /**
61
+ * Register a new backend
62
+ * @param {import('../backends/BaseBackend')} backend - Backend instance
63
+ * @returns {Promise<void>}
64
+ */
65
+ async registerBackend(backend) {
66
+ if (!backend || !backend.name) {
67
+ throw new Error('Invalid backend: must have a name property');
68
+ }
69
+
70
+ // Check if backend already registered
71
+ if (this.backends.has(backend.name)) {
72
+ console.warn(`Backend '${backend.name}' is already registered, replacing...`);
73
+ }
74
+
75
+ this.backends.set(backend.name, backend);
76
+
77
+ // Initialize if manager is already initialized
78
+ if (this.initialized && !backend.initialized) {
79
+ try {
80
+ await backend.initialize(this.config.backends?.[backend.name] || {});
81
+ } catch (error) {
82
+ console.warn(`Failed to initialize backend '${backend.name}':`, error.message);
83
+ }
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Unregister a backend
89
+ * @param {string} name - Backend name
90
+ * @returns {Promise<void>}
91
+ */
92
+ async unregisterBackend(name) {
93
+ const backend = this.backends.get(name);
94
+ if (backend) {
95
+ await backend.cleanup();
96
+ this.backends.delete(name);
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Get list of available backend names
102
+ * @returns {string[]}
103
+ */
104
+ getAvailableBackends() {
105
+ return Array.from(this.backends.keys());
106
+ }
107
+
108
+ /**
109
+ * Get backend instance by name
110
+ * @param {string} name - Backend name
111
+ * @returns {import('../backends/BaseBackend')|null}
112
+ */
113
+ getBackend(name) {
114
+ return this.backends.get(name) || null;
115
+ }
116
+
117
+ /**
118
+ * Get backend information
119
+ * @param {string} name - Backend name
120
+ * @returns {import('../types/BackendTypes').BackendInfo|null}
121
+ */
122
+ async getBackendInfo(name) {
123
+ const backend = this.backends.get(name);
124
+ if (!backend) return null;
125
+
126
+ const info = backend.getInfo();
127
+ info.available = await backend.isAvailable();
128
+
129
+ return info;
130
+ }
131
+
132
+ /**
133
+ * Select appropriate backend for request
134
+ * @param {import('../types/BackendTypes').ImplementRequest} request - Implementation request
135
+ * @returns {Promise<string>} Selected backend name
136
+ */
137
+ async selectBackend(request) {
138
+ switch (this.config.selectionStrategy) {
139
+ case 'preference':
140
+ return this.selectByPreference(request);
141
+ case 'capability':
142
+ return this.selectByCapability(request);
143
+ case 'auto':
144
+ default:
145
+ return this.selectAuto(request);
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Select backend using auto strategy
151
+ * @param {import('../types/BackendTypes').ImplementRequest} request - Implementation request
152
+ * @returns {Promise<string>}
153
+ * @private
154
+ */
155
+ async selectAuto(request) {
156
+ console.error('[BackendManager] Starting backend selection with strategy: auto');
157
+ console.error(`[BackendManager] Default backend: ${this.config.defaultBackend}`);
158
+ console.error(`[BackendManager] Available backends: ${Array.from(this.backends.keys()).join(', ')}`);
159
+
160
+ // First try explicit backend if specified
161
+ if (request.options?.backend && this.backends.has(request.options.backend)) {
162
+ console.error(`[BackendManager] Checking explicit backend: ${request.options.backend}`);
163
+ const backend = this.backends.get(request.options.backend);
164
+ if (await backend.isAvailable()) {
165
+ console.error(`[BackendManager] Selected explicit backend: ${request.options.backend}`);
166
+ return request.options.backend;
167
+ } else {
168
+ // If explicit backend is not available, fail immediately (no fallbacks)
169
+ console.error(`[BackendManager] Explicit backend ${request.options.backend} is not available`);
170
+ throw new BackendError(
171
+ `Requested backend '${request.options.backend}' is not available`,
172
+ ErrorTypes.BACKEND_NOT_FOUND,
173
+ 'BACKEND_NOT_AVAILABLE'
174
+ );
175
+ }
176
+ }
177
+
178
+ // Try default backend
179
+ if (this.backends.has(this.config.defaultBackend)) {
180
+ console.error(`[BackendManager] Checking default backend: ${this.config.defaultBackend}`);
181
+ const backend = this.backends.get(this.config.defaultBackend);
182
+ const isAvailable = await backend.isAvailable();
183
+ console.error(`[BackendManager] Default backend ${this.config.defaultBackend} available: ${isAvailable}`);
184
+ if (isAvailable) {
185
+ console.error(`[BackendManager] Selected default backend: ${this.config.defaultBackend}`);
186
+ return this.config.defaultBackend;
187
+ }
188
+ }
189
+
190
+ // No fallbacks - if default backend is not available, fail
191
+ console.error('[BackendManager] No available backends found!');
192
+ throw new BackendError(
193
+ `Default backend '${this.config.defaultBackend}' is not available`,
194
+ ErrorTypes.BACKEND_NOT_FOUND,
195
+ 'NO_AVAILABLE_BACKENDS'
196
+ );
197
+ }
198
+
199
+ /**
200
+ * Select backend by user preference
201
+ * @param {import('../types/BackendTypes').ImplementRequest} request - Implementation request
202
+ * @returns {Promise<string>}
203
+ * @private
204
+ */
205
+ async selectByPreference(request) {
206
+ const preference = request.options?.backend || this.config.defaultBackend;
207
+
208
+ if (!this.backends.has(preference)) {
209
+ throw new BackendError(
210
+ `Preferred backend '${preference}' not found`,
211
+ ErrorTypes.BACKEND_NOT_FOUND,
212
+ 'PREFERRED_BACKEND_NOT_FOUND'
213
+ );
214
+ }
215
+
216
+ const backend = this.backends.get(preference);
217
+ if (!(await backend.isAvailable())) {
218
+ throw new BackendError(
219
+ `Preferred backend '${preference}' is not available`,
220
+ ErrorTypes.BACKEND_NOT_FOUND,
221
+ 'PREFERRED_BACKEND_UNAVAILABLE'
222
+ );
223
+ }
224
+
225
+ return preference;
226
+ }
227
+
228
+ /**
229
+ * Select backend by capability matching
230
+ * @param {import('../types/BackendTypes').ImplementRequest} request - Implementation request
231
+ * @returns {Promise<string>}
232
+ * @private
233
+ */
234
+ async selectByCapability(request) {
235
+ const candidates = [];
236
+
237
+ for (const [name, backend] of this.backends) {
238
+ if (!(await backend.isAvailable())) continue;
239
+
240
+ const capabilities = backend.getCapabilities();
241
+ let score = 0;
242
+
243
+ // Score based on language support
244
+ if (request.context?.language) {
245
+ if (capabilities.supportsLanguages.includes(request.context.language)) {
246
+ score += 10;
247
+ } else if (capabilities.supportsLanguages.includes('all')) {
248
+ score += 5;
249
+ }
250
+ }
251
+
252
+ // Score based on requested features
253
+ if (request.options?.generateTests && capabilities.supportsTestGeneration) {
254
+ score += 5;
255
+ }
256
+
257
+ if (request.options?.streaming && capabilities.supportsStreaming) {
258
+ score += 3;
259
+ }
260
+
261
+ // Prefer backends with higher concurrent session limits
262
+ score += Math.min(capabilities.maxConcurrentSessions, 5);
263
+
264
+ candidates.push({ name, score });
265
+ }
266
+
267
+ if (candidates.length === 0) {
268
+ throw new BackendError(
269
+ 'No capable backends found',
270
+ ErrorTypes.BACKEND_NOT_FOUND,
271
+ 'NO_CAPABLE_BACKENDS'
272
+ );
273
+ }
274
+
275
+ // Sort by score and return highest
276
+ candidates.sort((a, b) => b.score - a.score);
277
+ return candidates[0].name;
278
+ }
279
+
280
+ /**
281
+ * Execute implementation request
282
+ * @param {import('../types/BackendTypes').ImplementRequest} request - Implementation request
283
+ * @returns {Promise<import('../types/BackendTypes').ImplementResult>}
284
+ */
285
+ async executeImplementation(request) {
286
+ // Ensure manager is initialized
287
+ await this.initialize();
288
+
289
+ // Check concurrent session limit
290
+ if (this.activeSessionCount >= this.config.maxConcurrentSessions) {
291
+ throw new BackendError(
292
+ 'Maximum concurrent sessions reached',
293
+ ErrorTypes.QUOTA_EXCEEDED,
294
+ 'MAX_SESSIONS_REACHED',
295
+ { limit: this.config.maxConcurrentSessions, current: this.activeSessionCount }
296
+ );
297
+ }
298
+
299
+ // Select backend
300
+ console.error(`[BackendManager] Selecting backend for request ${request.sessionId}`);
301
+ const backendName = await this.selectBackend(request);
302
+ console.error(`[BackendManager] Selected backend: ${backendName}`);
303
+ const backend = this.backends.get(backendName);
304
+
305
+ if (!backend) {
306
+ throw new BackendError(
307
+ `Backend '${backendName}' not found`,
308
+ ErrorTypes.BACKEND_NOT_FOUND,
309
+ 'BACKEND_NOT_FOUND'
310
+ );
311
+ }
312
+
313
+ // Track session
314
+ this.activeSessionCount++;
315
+ this.sessionBackendMap.set(request.sessionId, backendName);
316
+
317
+ try {
318
+ // Apply timeout if not specified
319
+ if (!request.options?.timeout) {
320
+ request.options = request.options || {};
321
+ request.options.timeout = this.config.timeout;
322
+ }
323
+
324
+ // Execute with retry logic
325
+ const result = await RetryHandler.withRetry(
326
+ () => backend.execute(request),
327
+ {
328
+ maxAttempts: this.config.retryAttempts + 1,
329
+ shouldRetry: (error) => {
330
+ // Don't retry user cancellations or validation errors
331
+ if (error instanceof BackendError) {
332
+ if (error.type === ErrorTypes.CANCELLATION ||
333
+ error.type === ErrorTypes.VALIDATION_ERROR) {
334
+ return false;
335
+ }
336
+ }
337
+ return ErrorHandler.isRetryable(error);
338
+ }
339
+ }
340
+ );
341
+
342
+ // Add backend information to result
343
+ result.backend = backendName;
344
+
345
+ return result;
346
+
347
+ } catch (error) {
348
+ // Try fallback backends if configured
349
+ if (this.config.fallbackBackends.length > 0) {
350
+ console.warn(`Backend '${backendName}' failed, trying fallbacks...`);
351
+
352
+ for (const fallbackName of this.config.fallbackBackends) {
353
+ if (fallbackName === backendName) continue;
354
+
355
+ const fallbackBackend = this.backends.get(fallbackName);
356
+ if (!fallbackBackend || !(await fallbackBackend.isAvailable())) {
357
+ continue;
358
+ }
359
+
360
+ try {
361
+ console.log(`Trying fallback backend: ${fallbackName}`);
362
+ this.sessionBackendMap.set(request.sessionId, fallbackName);
363
+
364
+ const result = await fallbackBackend.execute(request);
365
+ result.backend = fallbackName;
366
+ result.fallback = true;
367
+
368
+ return result;
369
+ } catch (fallbackError) {
370
+ console.warn(`Fallback backend '${fallbackName}' also failed:`, fallbackError.message);
371
+ }
372
+ }
373
+ }
374
+
375
+ // All backends failed
376
+ throw error;
377
+
378
+ } finally {
379
+ this.activeSessionCount--;
380
+ this.sessionBackendMap.delete(request.sessionId);
381
+ }
382
+ }
383
+
384
+ /**
385
+ * Cancel an implementation session
386
+ * @param {string} sessionId - Session ID
387
+ * @returns {Promise<void>}
388
+ */
389
+ async cancelImplementation(sessionId) {
390
+ const backendName = this.sessionBackendMap.get(sessionId);
391
+ if (!backendName) {
392
+ throw new BackendError(
393
+ `Session '${sessionId}' not found`,
394
+ ErrorTypes.SESSION_NOT_FOUND,
395
+ 'SESSION_NOT_FOUND'
396
+ );
397
+ }
398
+
399
+ const backend = this.backends.get(backendName);
400
+ if (backend) {
401
+ await backend.cancel(sessionId);
402
+ }
403
+
404
+ this.sessionBackendMap.delete(sessionId);
405
+ this.activeSessionCount = Math.max(0, this.activeSessionCount - 1);
406
+ }
407
+
408
+ /**
409
+ * Get session status
410
+ * @param {string} sessionId - Session ID
411
+ * @returns {Promise<import('../types/BackendTypes').BackendStatus>}
412
+ */
413
+ async getSessionStatus(sessionId) {
414
+ const backendName = this.sessionBackendMap.get(sessionId);
415
+ if (!backendName) {
416
+ return {
417
+ status: 'unknown',
418
+ message: 'Session not found'
419
+ };
420
+ }
421
+
422
+ const backend = this.backends.get(backendName);
423
+ if (!backend) {
424
+ return {
425
+ status: 'error',
426
+ message: 'Backend not found'
427
+ };
428
+ }
429
+
430
+ const status = await backend.getStatus(sessionId);
431
+ status.backend = backendName;
432
+
433
+ return status;
434
+ }
435
+
436
+ /**
437
+ * Validate configuration
438
+ * @returns {Promise<import('../types/BackendTypes').ValidationResult>}
439
+ */
440
+ async validateConfiguration() {
441
+ const errors = [];
442
+ const warnings = [];
443
+
444
+ // Check default backend exists
445
+ if (!this.backends.has(this.config.defaultBackend)) {
446
+ errors.push(`Default backend '${this.config.defaultBackend}' not registered`);
447
+ }
448
+
449
+ // Fallback backends removed - no longer checking them
450
+
451
+ // Check at least one backend is available
452
+ let hasAvailable = false;
453
+ for (const [name, backend] of this.backends) {
454
+ if (await backend.isAvailable()) {
455
+ hasAvailable = true;
456
+ break;
457
+ }
458
+ }
459
+
460
+ if (!hasAvailable) {
461
+ errors.push('No backends are available');
462
+ }
463
+
464
+ return {
465
+ valid: errors.length === 0,
466
+ errors,
467
+ warnings
468
+ };
469
+ }
470
+
471
+ /**
472
+ * Check health of all backends
473
+ * @param {string} [name] - Specific backend to check, or all if not specified
474
+ * @returns {Promise<Object>}
475
+ */
476
+ async checkBackendHealth(name = null) {
477
+ const results = {};
478
+
479
+ const backendsToCheck = name
480
+ ? [name]
481
+ : Array.from(this.backends.keys());
482
+
483
+ for (const backendName of backendsToCheck) {
484
+ const backend = this.backends.get(backendName);
485
+ if (!backend) continue;
486
+
487
+ try {
488
+ const available = await backend.isAvailable();
489
+ const info = backend.getInfo();
490
+
491
+ results[backendName] = {
492
+ status: available ? 'healthy' : 'unavailable',
493
+ available,
494
+ version: info.version,
495
+ capabilities: info.capabilities,
496
+ dependencies: info.dependencies
497
+ };
498
+ } catch (error) {
499
+ results[backendName] = {
500
+ status: 'error',
501
+ available: false,
502
+ error: error.message
503
+ };
504
+ }
505
+ }
506
+
507
+ return results;
508
+ }
509
+
510
+ /**
511
+ * Get recommended backend for a given context
512
+ * @param {Object} context - Request context
513
+ * @returns {string|null}
514
+ */
515
+ getRecommendedBackend(context) {
516
+ // Simple recommendation logic
517
+ if (context.language) {
518
+ for (const [name, backend] of this.backends) {
519
+ const capabilities = backend.getCapabilities();
520
+ if (capabilities.supportsLanguages.includes(context.language)) {
521
+ return name;
522
+ }
523
+ }
524
+ }
525
+
526
+ return this.config.defaultBackend;
527
+ }
528
+
529
+ /**
530
+ * Check if a backend can handle a request
531
+ * @param {string} backendName - Backend name
532
+ * @param {import('../types/BackendTypes').ImplementRequest} request - Request to check
533
+ * @returns {boolean}
534
+ */
535
+ canHandleRequest(backendName, request) {
536
+ const backend = this.backends.get(backendName);
537
+ if (!backend) return false;
538
+
539
+ const validation = backend.validateRequest(request);
540
+ return validation.valid;
541
+ }
542
+
543
+ /**
544
+ * Clean up all backends
545
+ * @returns {Promise<void>}
546
+ */
547
+ async cleanup() {
548
+ const cleanupPromises = [];
549
+
550
+ for (const [name, backend] of this.backends) {
551
+ cleanupPromises.push(
552
+ backend.cleanup().catch(error => {
553
+ console.error(`Error cleaning up backend '${name}':`, error);
554
+ })
555
+ );
556
+ }
557
+
558
+ await Promise.all(cleanupPromises);
559
+
560
+ this.backends.clear();
561
+ this.sessionBackendMap.clear();
562
+ this.activeSessionCount = 0;
563
+ this.initialized = false;
564
+ }
565
+ }
566
+
567
+ export default BackendManager;