@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,483 @@
1
+ import {fileURLToPath} from "url";
2
+ import {dirname, extname, resolve} from "path";
3
+ import {IncomingMessage, ServerResponse} from "http";
4
+ import * as fs from "node:fs";
5
+
6
+ type SessionData = {
7
+ apiKey: string;
8
+ websiteId: string;
9
+ userId?: string;
10
+ createdAt: number;
11
+ expiresAt: number;
12
+ };
13
+
14
+ type BackendDeps = {
15
+ config: {
16
+ corsOrigins: string[];
17
+ port: number;
18
+ session: {
19
+ ttl: number;
20
+ };
21
+ };
22
+ sessionStore: {
23
+ create: (apiKey: string, websiteId: string, userId?: string) => Promise<string>;
24
+ get: (token: string) => Promise<SessionData | null>;
25
+ delete: (token: string) => Promise<boolean>;
26
+ extend: (token: string) => Promise<boolean>;
27
+ count: () => Promise<number>;
28
+ };
29
+ DQMClient: new (apiKey: string, websiteId: string) => {
30
+ validateCredentials: () => Promise<boolean>;
31
+ createAsset: (data: { html: string; url?: string; websiteId?: string }) => Promise<any>;
32
+ getAssetStatus: (assetId: string) => Promise<any>;
33
+ getPageHighlightAll: (assetId: string) => Promise<string>;
34
+ getPageHighlightCheckpoint: (assetId: string, checkpointId: string, highlightSource?: boolean) => Promise<string>;
35
+ };
36
+ };
37
+
38
+ const __filename = fileURLToPath(import.meta.url);
39
+ const __dirname = dirname(__filename);
40
+ const authUiPath = resolve(__dirname, 'dist', 'auth-ui');
41
+ const authUiIndexPath = resolve(authUiPath, 'index.html');
42
+
43
+ const MAX_BODY_BYTES = 10 * 1024 * 1024;
44
+
45
+ const contentTypes: Record<string, string> = {
46
+ '.html': 'text/html; charset=utf-8',
47
+ '.js': 'text/javascript; charset=utf-8',
48
+ '.mjs': 'text/javascript; charset=utf-8',
49
+ '.css': 'text/css; charset=utf-8',
50
+ '.json': 'application/json; charset=utf-8',
51
+ '.map': 'application/json; charset=utf-8',
52
+ '.svg': 'image/svg+xml',
53
+ '.png': 'image/png',
54
+ '.jpg': 'image/jpeg',
55
+ '.jpeg': 'image/jpeg',
56
+ '.webp': 'image/webp',
57
+ '.ico': 'image/x-icon',
58
+ '.woff': 'font/woff',
59
+ '.woff2': 'font/woff2',
60
+ '.ttf': 'font/ttf',
61
+ };
62
+
63
+ const authUiCsp = [
64
+ "default-src 'self'",
65
+ "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com",
66
+ "font-src 'self' https://fonts.gstatic.com",
67
+ "img-src 'self' data: https:",
68
+ "script-src 'self'",
69
+ "connect-src 'self'",
70
+ ].join('; ');
71
+
72
+ const getContentType = (filePath: string) => contentTypes[extname(filePath).toLowerCase()] || 'application/octet-stream';
73
+
74
+ const sendJson = (res: ServerResponse, status: number, data: unknown) => {
75
+ res.statusCode = status;
76
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
77
+ res.end(JSON.stringify(data));
78
+ };
79
+
80
+ const sendText = (res: ServerResponse, status: number, message: string) => {
81
+ res.statusCode = status;
82
+ res.setHeader('Content-Type', 'text/plain; charset=utf-8');
83
+ res.end(message);
84
+ };
85
+
86
+ const applyAuthUiHeaders = (res: ServerResponse) => {
87
+ res.setHeader('Content-Security-Policy', authUiCsp);
88
+ res.setHeader('X-Content-Type-Options', 'nosniff');
89
+ res.setHeader('Referrer-Policy', 'no-referrer');
90
+ };
91
+
92
+ const applyCors = (req: IncomingMessage, res: ServerResponse, allowedOrigins: string[]) => {
93
+ const origin = req.headers.origin;
94
+ if (!origin || !allowedOrigins.includes(origin)) {
95
+ return;
96
+ }
97
+
98
+ res.setHeader('Access-Control-Allow-Origin', origin);
99
+ res.setHeader('Access-Control-Allow-Credentials', 'true');
100
+ res.setHeader('Vary', 'Origin');
101
+ };
102
+
103
+ const handlePreflight = (req: IncomingMessage, res: ServerResponse, allowedOrigins: string[]) => {
104
+ applyCors(req, res, allowedOrigins);
105
+ res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');
106
+ res.setHeader('Access-Control-Allow-Headers', 'Authorization,Content-Type');
107
+ res.statusCode = 204;
108
+ res.end();
109
+ };
110
+
111
+ const readBody = async (req: IncomingMessage): Promise<Buffer> => {
112
+ return new Promise((resolveBody, reject) => {
113
+ const chunks: Buffer[] = [];
114
+ let size = 0;
115
+
116
+ req.on('data', (chunk: Buffer) => {
117
+ size += chunk.length;
118
+ if (size > MAX_BODY_BYTES) {
119
+ reject(new Error('Payload too large'));
120
+ req.destroy();
121
+ return;
122
+ }
123
+ chunks.push(chunk);
124
+ });
125
+ req.on('end', () => resolveBody(Buffer.concat(chunks)));
126
+ req.on('error', reject);
127
+ });
128
+ };
129
+
130
+ const parseBody = async (req: IncomingMessage, res: ServerResponse) => {
131
+ try {
132
+ const body = await readBody(req);
133
+ const raw = body.toString('utf-8');
134
+ const contentType = req.headers['content-type'] || '';
135
+
136
+ if (contentType.includes('application/json')) {
137
+ return raw ? JSON.parse(raw) : {};
138
+ }
139
+ if (contentType.includes('application/x-www-form-urlencoded')) {
140
+ return Object.fromEntries(new URLSearchParams(raw));
141
+ }
142
+
143
+ return raw;
144
+ } catch (error) {
145
+ if (error instanceof Error && error.message === 'Payload too large') {
146
+ sendJson(res, 413, { error: true, message: 'Payload too large' });
147
+ return null;
148
+ }
149
+ sendJson(res, 400, { error: true, message: 'Invalid request body' });
150
+ return null;
151
+ }
152
+ };
153
+
154
+ const sendFile = (req: IncomingMessage, res: ServerResponse, filePath: string) => {
155
+ try {
156
+ const stat = fs.statSync(filePath);
157
+ if (!stat.isFile()) {
158
+ return false;
159
+ }
160
+
161
+ res.statusCode = 200;
162
+ res.setHeader('Content-Type', getContentType(filePath));
163
+ res.setHeader('Content-Length', stat.size.toString());
164
+
165
+ if (req.method === 'HEAD') {
166
+ res.end();
167
+ return true;
168
+ }
169
+
170
+ const stream = fs.createReadStream(filePath);
171
+ stream.pipe(res);
172
+ stream.on('error', () => {
173
+ if (!res.headersSent) {
174
+ sendText(res, 500, 'File read error');
175
+ }
176
+ });
177
+ return true;
178
+ } catch (error) {
179
+ return false;
180
+ }
181
+ };
182
+
183
+ export const devBackendPlugin = () => {
184
+ let depsPromise: Promise<BackendDeps> | null = null;
185
+ let hasLogged = false;
186
+
187
+ const loadDeps = () => {
188
+ if (!depsPromise) {
189
+ depsPromise = Promise.all([
190
+ import('./server/config.ts'),
191
+ import('./server/services/sessionStore.ts'),
192
+ import('./server/services/dqmClient.ts'),
193
+ ]).then(([configMod, sessionMod, dqmMod]) => ({
194
+ config: configMod.config,
195
+ sessionStore: sessionMod.sessionStore,
196
+ DQMClient: dqmMod.DQMClient,
197
+ }));
198
+ }
199
+ return depsPromise;
200
+ };
201
+
202
+ const logStartup = async (port: number) => {
203
+ const {config} = await loadDeps();
204
+ if (hasLogged) return;
205
+ hasLogged = true;
206
+ console.log('[Vite Backend] Running in DEVELOPMENT');
207
+ console.log('[Vite Backend] Auth UI path:', authUiPath);
208
+ console.log('[Vite Backend] CORS allowed origins:', config.corsOrigins);
209
+ console.log(`[Vite Backend] API ready on http://localhost:${port}`);
210
+ console.log(`[Vite Backend] Health check: http://localhost:${port}/health`);
211
+ };
212
+
213
+ return {
214
+ name: 'vite-dev-backend',
215
+ configureServer(server: any) {
216
+ void loadDeps();
217
+ server.httpServer?.once('listening', () => {
218
+ const address = server.httpServer?.address();
219
+ const port = typeof address === 'object' && address ? address.port : 5173;
220
+ void logStartup(port);
221
+ });
222
+
223
+ server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {
224
+ void (async () => {
225
+ if (!req.url) {
226
+ return next();
227
+ }
228
+
229
+ const url = new URL(req.url, 'http://localhost');
230
+ const pathname = url.pathname;
231
+ const method = (req.method || 'GET').toUpperCase();
232
+
233
+ const isApiPath = pathname.startsWith('/auth') || pathname.startsWith('/dqm') || pathname.startsWith('/assets') || pathname === '/health';
234
+ if (!isApiPath) {
235
+ return next();
236
+ }
237
+
238
+ const {config, sessionStore, DQMClient} = await loadDeps();
239
+ applyCors(req, res, config.corsOrigins);
240
+
241
+ if (method === 'OPTIONS') {
242
+ handlePreflight(req, res, config.corsOrigins);
243
+ return;
244
+ }
245
+
246
+ if (pathname === '/health' && method === 'GET') {
247
+ console.log(`[${new Date().toISOString()}] ${method} ${pathname}`);
248
+ sendJson(res, 200, {status: 'ok', timestamp: new Date().toISOString()});
249
+ return;
250
+ }
251
+
252
+ const requestLogPath = pathname;
253
+ console.log(`[${new Date().toISOString()}] ${method} ${requestLogPath}`);
254
+
255
+ if (pathname === '/auth/login' && method === 'POST') {
256
+ try {
257
+ const body = await parseBody(req, res);
258
+ if (!body) return;
259
+
260
+ const {apiKey, websiteId} = body as { apiKey?: string; websiteId?: string };
261
+ if (!apiKey || !websiteId) {
262
+ sendJson(res, 400, {error: true, message: 'Missing required fields: apiKey, websiteId'});
263
+ return;
264
+ }
265
+
266
+ if (!/^[\x00-\x7F]*$/.test(apiKey)) {
267
+ sendJson(res, 400, {error: true, message: 'API key contains non-ASCII characters'});
268
+ return;
269
+ }
270
+
271
+ const dqmClient = new DQMClient(apiKey, websiteId);
272
+ const isValid = await dqmClient.validateCredentials();
273
+ if (!isValid) {
274
+ console.warn('[Auth] Could not validate credentials during login, will validate on first API call');
275
+ }
276
+
277
+ const sessionToken = await sessionStore.create(apiKey, websiteId);
278
+ console.log(`[Auth] User logged in (websiteId: ${websiteId})`);
279
+ sendJson(res, 200, {sessionToken, websiteId});
280
+ return;
281
+ } catch (error: any) {
282
+ console.error('[Auth] Login error:', error?.message || error);
283
+ sendJson(res, 401, {error: true, message: error?.message || 'Authentication failed'});
284
+ return;
285
+ }
286
+ }
287
+
288
+ if (pathname === '/auth/token' && method === 'POST') {
289
+ sendJson(res, 501, {
290
+ error: true,
291
+ message: 'Session-based authentication not available. Please use /auth/login with API key and website ID.',
292
+ });
293
+ return;
294
+ }
295
+
296
+ if (pathname === '/auth/token/validate' && method === 'POST') {
297
+ const body = await parseBody(req, res);
298
+ if (!body) return;
299
+
300
+ const {sessionToken} = body as { sessionToken?: string };
301
+ if (!sessionToken) {
302
+ sendJson(res, 400, {valid: false, message: 'Missing sessionToken'});
303
+ return;
304
+ }
305
+
306
+ const session = await sessionStore.get(sessionToken);
307
+ if (!session) {
308
+ sendJson(res, 200, {valid: false, message: 'Session not found or expired'});
309
+ return;
310
+ }
311
+
312
+ if (session.expiresAt && new Date(session.expiresAt) < new Date()) {
313
+ await sessionStore.delete(sessionToken);
314
+ sendJson(res, 200, {valid: false, message: 'Session expired'});
315
+ return;
316
+ }
317
+
318
+ sendJson(res, 200, {
319
+ valid: true,
320
+ websiteId: session.websiteId,
321
+ expiresAt: session.expiresAt,
322
+ });
323
+ return;
324
+ }
325
+
326
+ const authenticate = async () => {
327
+ const authHeader = req.headers.authorization;
328
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
329
+ sendJson(res, 401, {error: true, message: 'Missing or invalid authorization header'});
330
+ return null;
331
+ }
332
+
333
+ const token = authHeader.replace('Bearer ', '');
334
+ const session = await sessionStore.get(token);
335
+ if (!session) {
336
+ console.error(`[Auth] Invalid or expired session token: ${token.substring(0, 16)}...`);
337
+ await sessionStore.count();
338
+ sendJson(res, 401, {error: true, message: 'Invalid or expired session token. Please log in again.'});
339
+ return null;
340
+ }
341
+
342
+ await sessionStore.extend(token);
343
+ return {session, token};
344
+ };
345
+
346
+ if (pathname === '/auth/logout' && method === 'POST') {
347
+ const auth = await authenticate();
348
+ if (!auth) return;
349
+ await sessionStore.delete(auth.token);
350
+ sendJson(res, 200, {success: true, message: 'Logged out successfully'});
351
+ return;
352
+ }
353
+
354
+ if (pathname === '/auth/session' && method === 'GET') {
355
+ const auth = await authenticate();
356
+ if (!auth) return;
357
+ sendJson(res, 200, {
358
+ session: {
359
+ websiteId: auth.session.websiteId,
360
+ createdAt: auth.session.createdAt,
361
+ expiresAt: auth.session.expiresAt,
362
+ },
363
+ });
364
+ return;
365
+ }
366
+
367
+ if (pathname === '/dqm/assets' && method === 'POST') {
368
+ const auth = await authenticate();
369
+ if (!auth) return;
370
+ const body = await parseBody(req, res);
371
+ if (!body) return;
372
+
373
+ const {html, url: pageUrl, websiteId} = body as { html?: string; url?: string; websiteId?: string };
374
+ if (!html) {
375
+ sendJson(res, 400, {error: true, message: 'Missing required field: html'});
376
+ return;
377
+ }
378
+
379
+ const dqmClient = new DQMClient(auth.session.apiKey, auth.session.websiteId);
380
+ const result = await dqmClient.createAsset({
381
+ html,
382
+ url: pageUrl,
383
+ websiteId: websiteId || auth.session.websiteId,
384
+ });
385
+ sendJson(res, 200, result);
386
+ return;
387
+ }
388
+
389
+ const statusMatch = pathname.match(/^\/dqm\/assets\/([^/]+)\/status$/);
390
+ if (statusMatch && method === 'GET') {
391
+ const auth = await authenticate();
392
+ if (!auth) return;
393
+ const assetId = statusMatch[1];
394
+ if (!assetId) {
395
+ sendJson(res, 400, {error: true, message: 'Missing required parameter: assetId'});
396
+ return;
397
+ }
398
+ const dqmClient = new DQMClient(auth.session.apiKey, auth.session.websiteId);
399
+ const result = await dqmClient.getAssetStatus(assetId);
400
+ sendJson(res, 200, result);
401
+ return;
402
+ }
403
+
404
+ const highlightAllMatch = pathname.match(/^\/dqm\/assets\/([^/]+)\/pagehighlight\/all$/);
405
+ if (highlightAllMatch && method === 'GET') {
406
+ const auth = await authenticate();
407
+ if (!auth) return;
408
+ const assetId = highlightAllMatch[1];
409
+ if (!assetId) {
410
+ sendJson(res, 400, {error: true, message: 'Missing required parameter: assetId'});
411
+ return;
412
+ }
413
+ const dqmClient = new DQMClient(auth.session.apiKey, auth.session.websiteId);
414
+ const html = await dqmClient.getPageHighlightAll(assetId);
415
+ res.statusCode = 200;
416
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
417
+ res.end(html);
418
+ return;
419
+ }
420
+
421
+ const highlightCheckpointMatch = pathname.match(/^\/dqm\/assets\/([^/]+)\/pagehighlight\/([^/]+)$/);
422
+ if (highlightCheckpointMatch && method === 'GET') {
423
+ const auth = await authenticate();
424
+ if (!auth) return;
425
+ const assetId = highlightCheckpointMatch[1];
426
+ const checkpointId = highlightCheckpointMatch[2];
427
+ if (!assetId || !checkpointId) {
428
+ sendJson(res, 400, {error: true, message: 'Missing required parameters: assetId, checkpointId'});
429
+ return;
430
+ }
431
+ const highlightSource = url.searchParams.get('highlightSource') === 'true';
432
+ const dqmClient = new DQMClient(auth.session.apiKey, auth.session.websiteId);
433
+ const html = await dqmClient.getPageHighlightCheckpoint(assetId, checkpointId, highlightSource);
434
+ res.statusCode = 200;
435
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
436
+ res.end(html);
437
+ return;
438
+ }
439
+
440
+ if (method === 'GET' && (pathname === '/auth' || pathname === '/auth/' || pathname === '/auth/login' || pathname === '/auth/callback')) {
441
+ applyAuthUiHeaders(res);
442
+ if (sendFile(req, res, authUiIndexPath)) {
443
+ return;
444
+ }
445
+ sendText(res, 404, 'Auth UI not built. Run `npm run build:auth-ui`.');
446
+ return;
447
+ }
448
+
449
+ if (method === 'GET' || method === 'HEAD') {
450
+ if (pathname.startsWith('/auth/')) {
451
+ const filePath = resolve(authUiPath, `.${pathname.replace(/^\/auth/, '')}`);
452
+ if (filePath.startsWith(authUiPath)) {
453
+ applyAuthUiHeaders(res);
454
+ if (sendFile(req, res, filePath)) {
455
+ return;
456
+ }
457
+ }
458
+ sendText(res, 404, 'Auth UI asset not found.');
459
+ return;
460
+ }
461
+
462
+ if (pathname.startsWith('/assets/')) {
463
+ const filePath = resolve(authUiPath, `.${pathname}`);
464
+ if (filePath.startsWith(authUiPath)) {
465
+ applyAuthUiHeaders(res);
466
+ if (sendFile(req, res, filePath)) {
467
+ return;
468
+ }
469
+ }
470
+ sendText(res, 404, 'Auth UI asset not found.');
471
+ return;
472
+ }
473
+ }
474
+
475
+ sendJson(res, 404, {error: true, message: 'Not found'});
476
+ })().catch((error: any) => {
477
+ console.error('[Vite Backend] Unhandled error:', error?.message || error);
478
+ sendJson(res, 500, {error: true, message: error?.message || 'Internal server error'});
479
+ });
480
+ });
481
+ },
482
+ };
483
+ };
@@ -0,0 +1,40 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import react from '@vitejs/plugin-react-swc';
3
+ import { resolve } from 'path';
4
+
5
+ export default defineConfig({
6
+ // Cast plugin to any to avoid Vite version mismatch between vitest and project
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ plugins: [react() as any],
9
+ test: {
10
+ globals: true,
11
+ environment: 'jsdom',
12
+ setupFiles: ['./src/__tests__/setup.ts'],
13
+ include: ['src/**/*.{test,spec}.{ts,tsx}'],
14
+ exclude: ['node_modules', 'dist', 'e2e'],
15
+ coverage: {
16
+ provider: 'v8',
17
+ reporter: ['text', 'json', 'html'],
18
+ exclude: [
19
+ 'node_modules/',
20
+ 'dist/',
21
+ 'src/__tests__/',
22
+ 'src/mocks/',
23
+ '**/*.d.ts',
24
+ '**/*.config.*',
25
+ '**/index.ts',
26
+ ],
27
+ },
28
+ // MSW requires a newer version of Node
29
+ server: {
30
+ deps: {
31
+ inline: ['msw'],
32
+ },
33
+ },
34
+ },
35
+ resolve: {
36
+ alias: {
37
+ '@': resolve(__dirname, './src'),
38
+ },
39
+ },
40
+ });
@@ -0,0 +1,58 @@
1
+ # Crownpeak DQM React Component - Documentation Wiki
2
+
3
+ Welcome to the complete documentation for `@crownpeak/dqm-react-component`.
4
+
5
+ ## Quick Links
6
+
7
+ - 📚 **[Quick Start Guide](Quick-Start-Guide)** - Get started in 5 minutes
8
+ - 🤖 **[AI Features Guide](AI-Features-Guide)** - Translation & Summary with OpenAI
9
+ - 📖 **[Example Usage](Example-Usage)** - Integration examples
10
+ - 🔧 **[API Reference](API-Reference)** - Full TypeScript API
11
+
12
+ ## What is DQM?
13
+
14
+ Crownpeak Digital Quality Management (DQM) provides automated quality analysis for web pages, including accessibility violations, SEO issues, mobile responsiveness, design consistency, and performance metrics.
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install @crownpeak/dqm-react-component
20
+ ```
21
+
22
+ ## Basic Example
23
+
24
+ ```typescript
25
+ import React, { useState } from 'react';
26
+ import { DQMSidebar } from '@crownpeak/dqm-react-component';
27
+
28
+ function App() {
29
+ const [open, setOpen] = useState(false);
30
+
31
+ return (
32
+ <DQMSidebar
33
+ open={open}
34
+ onClose={() => setOpen(false)}
35
+ onOpen={() => setOpen(true)}
36
+ config={{
37
+ websiteId: 'your-website-id',
38
+ apiKey: 'your-api-key',
39
+ }}
40
+ />
41
+ );
42
+ }
43
+ ```
44
+
45
+ See **[Quick Start Guide](Quick-Start-Guide)** for detailed setup.
46
+
47
+ ## Documentation Sections
48
+
49
+ Use the sidebar (→) to navigate, or explore:
50
+
51
+ - **[Quick Start Guide](Quick-Start-Guide)** - Installation and setup
52
+ - **[Example Usage](Example-Usage)** - React, Next.js, TypeScript examples
53
+ - **[Authentication Configuration](Authentication-Configuration)** - API keys, backend proxy
54
+ - **[AI Features Guide](AI-Features-Guide)** - Translation & summary generation
55
+ - **[Widget Bundle Guide](Widget-Bundle-Guide)** - Standalone IIFE/ESM bundles
56
+ - **[API Reference](API-Reference)** - Complete TypeScript API
57
+ - **[Troubleshooting Guide](Troubleshooting-Guide)** - Common issues and solutions
58
+ - **[Development Guide](Development-Guide)** - Contributing guide
@@ -0,0 +1,39 @@
1
+ ### Navigation
2
+
3
+ **[🏠 Home](Home)**
4
+
5
+ ---
6
+
7
+ ### Getting Started
8
+ - [Quick Start Guide](Quick-Start-Guide)
9
+ - [Example Usage](Example-Usage)
10
+ - [Authentication Configuration](Authentication-Configuration)
11
+ - [Backend Server](Backend-Server)
12
+ - [Redis Production Setup](Redis-Production-Setup)
13
+
14
+ ---
15
+
16
+ ### AI Features
17
+ - [AI Features Guide](AI-Features-Guide)
18
+ - [MCP Server Integration](MCP-Server-Integration)
19
+ - [API Reference](API-Reference)
20
+ - [Migration Guide](Migration-Guide)
21
+
22
+ ---
23
+
24
+ ### Advanced
25
+ - [Widget Bundle Guide](Widget-Bundle-Guide)
26
+ - [Troubleshooting Guide](Troubleshooting-Guide)
27
+
28
+ ---
29
+
30
+ ### Development
31
+ - [Development Guide](Development-Guide)
32
+ - [NPM Publishing Guide](NPM-Publishing-Guide)
33
+ - [Backend API Guide](Backend-API-Guide)
34
+ - [Contributing](https://github.com/Crownpeak/dqm-react-component?tab=contributing-ov-file#contributing-to-crownpeak-dqm-react-component)
35
+ - [Code of Conduct](https://github.com/Crownpeak/dqm-react-component?tab=coc-ov-file#contributor-covenant-code-of-conduct)
36
+
37
+ ---
38
+
39
+ **[View on GitHub](https://github.com/Crownpeak/dqm-react-component)**
@@ -0,0 +1,20 @@
1
+ {
2
+ "includeDir": "../",
3
+ "toolName": "search_dqm_docs",
4
+ "toolDescription": "Search the Crownpeak DQM React Component documentation. Use this to find information about DQMSidebar props, configuration options, overlay detection, backend authentication, widget bundle integration, and troubleshooting.",
5
+ "ignorePatterns": [
6
+ "node_modules",
7
+ ".git",
8
+ "dist",
9
+ "coverage",
10
+ "*.log",
11
+ "*.lock",
12
+ "*.tgz",
13
+ "dump.rdb",
14
+ "mcp-server",
15
+ "server-ui/dist",
16
+ "test",
17
+ "e2e",
18
+ "html-pages"
19
+ ]
20
+ }