@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,231 @@
1
+ /**
2
+ * Test for single-quote JSON bug
3
+ *
4
+ * Bug Description:
5
+ * When AI responses contain JavaScript array syntax with single quotes like ['*']
6
+ * instead of valid JSON with double quotes ["*"], the JSON parser fails with:
7
+ * "Unexpected token ''', "['*']" is not valid JSON"
8
+ *
9
+ * This test replicates the bug seen in the debug logs where:
10
+ * 1. AI returns response with JavaScript array syntax: ['*', '!bash']
11
+ * 2. cleanSchemaResponse extracts it as-is (no syntax normalization)
12
+ * 3. JSON.parse fails because single quotes are invalid in JSON
13
+ */
14
+
15
+ import { describe, test, expect } from '@jest/globals';
16
+ import { cleanSchemaResponse, validateJsonResponse } from '../../src/agent/schemaUtils.js';
17
+
18
+ describe('Single-quote JSON Bug', () => {
19
+ describe('JavaScript array syntax with single quotes', () => {
20
+ test('should fail to parse JavaScript array syntax with single quotes', () => {
21
+ // This is what the AI returns - JavaScript syntax, not JSON
22
+ const invalidJson = "['*']";
23
+
24
+ const result = validateJsonResponse(invalidJson);
25
+
26
+ expect(result.isValid).toBe(false);
27
+ expect(result.error).toBeDefined();
28
+ // Should contain error about single quote
29
+ expect(result.error.toLowerCase()).toMatch(/unexpected token|unexpected character|'|quote/);
30
+ });
31
+
32
+ test('should fail to parse array with single-quoted strings', () => {
33
+ // More complex example from the bug report
34
+ const invalidJson = "['*', '!bash']";
35
+
36
+ const result = validateJsonResponse(invalidJson);
37
+
38
+ expect(result.isValid).toBe(false);
39
+ expect(result.error).toBeDefined();
40
+ expect(result.errorContext).toBeDefined();
41
+ expect(result.errorContext.position).toBe(1); // Points to the first single quote
42
+ });
43
+
44
+ test('should succeed with double-quoted JSON array syntax', () => {
45
+ // This is what SHOULD be returned - valid JSON
46
+ const validJson = '["*"]';
47
+
48
+ const result = validateJsonResponse(validJson);
49
+
50
+ expect(result.isValid).toBe(true);
51
+ expect(result.parsed).toEqual(['*']);
52
+ });
53
+
54
+ test('should succeed with double-quoted JSON array with exclusions', () => {
55
+ // Valid JSON version of the bug example
56
+ const validJson = '["*", "!bash"]';
57
+
58
+ const result = validateJsonResponse(validJson);
59
+
60
+ expect(result.isValid).toBe(true);
61
+ expect(result.parsed).toEqual(['*', '!bash']);
62
+ });
63
+ });
64
+
65
+ describe('cleanSchemaResponse normalizes quote syntax (FIX)', () => {
66
+ test('should not extract from javascript code blocks (only json/generic blocks)', () => {
67
+ // AI response with JavaScript array syntax in ```javascript block
68
+ const input = "```javascript\n['*', '!bash']\n```";
69
+
70
+ const cleaned = cleanSchemaResponse(input);
71
+
72
+ // cleanSchemaResponse doesn't extract from ```javascript blocks, only ```json and ```
73
+ // So it returns the original input unchanged
74
+ expect(cleaned).toBe(input);
75
+
76
+ // The uncleaned version with code block markers is not valid JSON
77
+ const result = validateJsonResponse(cleaned);
78
+ expect(result.isValid).toBe(false);
79
+ });
80
+
81
+ test('should extract JavaScript array from json code block AND normalize quotes', () => {
82
+ // Even in a ```json block, the AI might use single quotes
83
+ const input = "```json\n['*']\n```";
84
+
85
+ const cleaned = cleanSchemaResponse(input);
86
+
87
+ // FIX: Extraction happens AND quote normalization (single -> double quotes)
88
+ expect(cleaned).toBe('["*"]');
89
+
90
+ // Now it's valid JSON!
91
+ const result = validateJsonResponse(cleaned);
92
+ expect(result.isValid).toBe(true);
93
+ expect(result.parsed).toEqual(['*']);
94
+ });
95
+
96
+ test('should not modify valid JSON arrays with double quotes', () => {
97
+ const input = '```json\n["*", "!bash"]\n```';
98
+
99
+ const cleaned = cleanSchemaResponse(input);
100
+
101
+ expect(cleaned).toBe('["*", "!bash"]');
102
+
103
+ // This is valid JSON
104
+ const result = validateJsonResponse(cleaned);
105
+ expect(result.isValid).toBe(true);
106
+ expect(result.parsed).toEqual(['*', '!bash']);
107
+ });
108
+
109
+ test('should normalize single quotes in complex arrays', () => {
110
+ const input = "```json\n['*', '!bash', '!docker']\n```";
111
+
112
+ const cleaned = cleanSchemaResponse(input);
113
+
114
+ // Should normalize all single quotes to double quotes
115
+ expect(cleaned).toBe('["*", "!bash", "!docker"]');
116
+
117
+ const result = validateJsonResponse(cleaned);
118
+ expect(result.isValid).toBe(true);
119
+ expect(result.parsed).toEqual(['*', '!bash', '!docker']);
120
+ });
121
+
122
+ test('should normalize single quotes in objects', () => {
123
+ const input = "```json\n{'key': 'value', 'num': 42}\n```";
124
+
125
+ const cleaned = cleanSchemaResponse(input);
126
+
127
+ // Should normalize object keys and string values
128
+ expect(cleaned).toBe('{"key": "value", "num": 42}');
129
+
130
+ const result = validateJsonResponse(cleaned);
131
+ expect(result.isValid).toBe(true);
132
+ expect(result.parsed).toEqual({ key: 'value', num: 42 });
133
+ });
134
+ });
135
+
136
+ describe('Real-world examples from bug report', () => {
137
+ test('should replicate exact error from debug log line 9', () => {
138
+ // From log line 9: [DEBUG] JSON validation: Preview: ['*', '!bash']
139
+ const buggyResponse = "['*', '!bash']";
140
+
141
+ const result = validateJsonResponse(buggyResponse);
142
+
143
+ // From log line 10: Parse failed with error: Unexpected token ''', "['*', '!bash']" is not valid JSON
144
+ expect(result.isValid).toBe(false);
145
+ expect(result.error).toContain("Unexpected token");
146
+ });
147
+
148
+ test('should replicate exact error from debug log line 48', () => {
149
+ // From log line 48: [DEBUG] JSON validation: Preview: ['*']
150
+ const buggyResponse = "['*']";
151
+
152
+ const result = validateJsonResponse(buggyResponse);
153
+
154
+ // From log line 49: Parse failed with error: Unexpected token ''', "['*']" is not valid JSON
155
+ expect(result.isValid).toBe(false);
156
+ expect(result.error).toContain("Unexpected token");
157
+ });
158
+
159
+ test('should show error context pointing to single quote', () => {
160
+ const buggyResponse = "['*']";
161
+
162
+ const result = validateJsonResponse(buggyResponse);
163
+
164
+ expect(result.isValid).toBe(false);
165
+ expect(result.errorContext).toBeDefined();
166
+ // Error should point to position 1 (the first single quote after '[')
167
+ expect(result.errorContext.position).toBe(1);
168
+ expect(result.errorContext.snippet).toContain("['*']");
169
+ });
170
+ });
171
+
172
+ describe('Edge cases with mixed quotes', () => {
173
+ test('should fail with mixed single and double quotes', () => {
174
+ const invalidJson = '["foo", \'bar\']';
175
+
176
+ const result = validateJsonResponse(invalidJson);
177
+
178
+ expect(result.isValid).toBe(false);
179
+ });
180
+
181
+ test('should fail with object using single quotes', () => {
182
+ const invalidJson = "{'key': 'value'}";
183
+
184
+ const result = validateJsonResponse(invalidJson);
185
+
186
+ expect(result.isValid).toBe(false);
187
+ });
188
+
189
+ test('should succeed with properly escaped single quotes inside double quotes', () => {
190
+ const validJson = '["It\'s valid"]';
191
+
192
+ const result = validateJsonResponse(validJson);
193
+
194
+ expect(result.isValid).toBe(true);
195
+ expect(result.parsed).toEqual(["It's valid"]);
196
+ });
197
+ });
198
+
199
+ describe('Attempt completion context', () => {
200
+ test('should succeed when attempt_completion result contains JavaScript array syntax (FIX)', () => {
201
+ // This simulates the exact scenario from the bug report where
202
+ // attempt_completion's result field contains ['*'] instead of ["*"]
203
+ const attemptCompletionResult = "['*']";
204
+
205
+ // First, cleanSchemaResponse is called (now it DOES normalize quotes - FIX!)
206
+ const cleaned = cleanSchemaResponse(attemptCompletionResult);
207
+ expect(cleaned).toBe('["*"]'); // Single quotes normalized to double quotes
208
+
209
+ // Then validateJsonResponse is called without schema
210
+ const result = validateJsonResponse(cleaned);
211
+
212
+ // With the fix, this should now succeed!
213
+ expect(result.isValid).toBe(true);
214
+ expect(result.parsed).toEqual(['*']);
215
+ });
216
+
217
+ test('should handle multi-line response with single-quote arrays', () => {
218
+ // AI might return explanation followed by array
219
+ const response = `Looking at the _parseAllowedTools method, when allowedTools is undefined,
220
+ the system returns ['*'] which enables all tools.`;
221
+
222
+ // cleanSchemaResponse won't extract this (text before JSON)
223
+ const cleaned = cleanSchemaResponse(response);
224
+ expect(cleaned).toBe(response);
225
+
226
+ // Validation will fail because it's not valid JSON
227
+ const result = validateJsonResponse(cleaned);
228
+ expect(result.isValid).toBe(false);
229
+ });
230
+ });
231
+ });
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Subgraph and Node Label Auto-Fix Tests
3
+ *
4
+ * NOTE: Many tests in this file have been skipped for maid 0.0.6 integration.
5
+ * These tests check OLD manual regex-based auto-fix behavior for:
6
+ * - Subgraph quote wrapping (parentheses in unquoted subgraph names)
7
+ * - Node label quote wrapping (parentheses in unquoted node labels)
8
+ * - Specific fixMethod values and performance expectations
9
+ *
10
+ * Maid handles parentheses and quotes differently using proper parsing.
11
+ * Tests marked with .skip check OLD behavior that maid doesn't replicate.
12
+ */
13
+
14
+ import { validateAndFixMermaidResponse } from '../../src/agent/schemaUtils.js';
15
+
16
+ describe('Mermaid Auto-Fix', () => {
17
+ const mockOptions = {
18
+ debug: false,
19
+ path: '/test/path',
20
+ provider: 'anthropic',
21
+ model: 'claude-3-sonnet-20240229'
22
+ };
23
+
24
+ describe('Auto-fix unquoted subgraph names with parentheses', () => {
25
+
26
+ test('should not modify already quoted subgraph names', async () => {
27
+ const response = `Here's the diagram:
28
+
29
+ \`\`\`mermaid
30
+ flowchart TD
31
+ subgraph "AI Check Execution"
32
+ A[AI Provider Generates Response]
33
+ end
34
+
35
+ subgraph "Structured Path (e.g., code-review)"
36
+ B[Parse JSON with issues array]
37
+ end
38
+ \`\`\``;
39
+
40
+ const result = await validateAndFixMermaidResponse(response, mockOptions);
41
+
42
+ // Should not need fixing since it's already properly quoted
43
+ expect(result.wasFixed).toBe(false);
44
+ expect(result.isValid).toBe(true);
45
+ expect(result.fixedResponse).toBe(response);
46
+ });
47
+
48
+
49
+
50
+ });
51
+
52
+ describe('Performance and reliability', () => {
53
+
54
+ test('should fall back to AI fixing for complex errors', async () => {
55
+ const response = `\`\`\`mermaid
56
+ flowchart TD
57
+ subgraph Valid Name
58
+ A[Task with unclosed bracket
59
+ end
60
+ \`\`\``;
61
+
62
+ const result = await validateAndFixMermaidResponse(response, mockOptions);
63
+
64
+ // This should not be auto-fixable and should go to AI
65
+ // (though we're not testing actual AI here, just that it attempts to)
66
+ expect(result.fixingResults.length).toBeGreaterThanOrEqual(0);
67
+ });
68
+ });
69
+
70
+ describe('Auto-fix node labels with parentheses', () => {
71
+
72
+ test('should not modify already quoted node labels', async () => {
73
+ const response = `Here's the diagram:
74
+
75
+ \`\`\`mermaid
76
+ flowchart TD
77
+ A["Task with (parentheses) already quoted"] --> B["Another (quoted) task"]
78
+ \`\`\``;
79
+
80
+ const result = await validateAndFixMermaidResponse(response, mockOptions);
81
+
82
+ // Should not need fixing since it's already properly quoted
83
+ expect(result.wasFixed).toBe(false);
84
+ expect(result.isValid).toBe(true);
85
+ expect(result.fixedResponse).toBe(response);
86
+ });
87
+
88
+ test('should not modify node labels without parentheses', async () => {
89
+ const response = `Here's the diagram:
90
+
91
+ \`\`\`mermaid
92
+ flowchart TD
93
+ A[Simple Task] --> B[Another Task]
94
+ B --> C[Third Task]
95
+ \`\`\``;
96
+
97
+ const result = await validateAndFixMermaidResponse(response, mockOptions);
98
+
99
+ // Should not need fixing since there are no parentheses
100
+ expect(result.wasFixed).toBe(false);
101
+ expect(result.isValid).toBe(true);
102
+ expect(result.fixedResponse).toBe(response);
103
+ });
104
+
105
+
106
+
107
+
108
+
109
+ });
110
+ });
@@ -0,0 +1,32 @@
1
+ import { describe, test, expect } from '@jest/globals';
2
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
3
+
4
+ describe('ProbeAgent systemPrompt alias', () => {
5
+ test('uses systemPrompt when provided', () => {
6
+ const agent = new ProbeAgent({
7
+ path: process.cwd(),
8
+ systemPrompt: 'system-level prompt'
9
+ });
10
+
11
+ expect(agent.customPrompt).toBe('system-level prompt');
12
+ });
13
+
14
+ test('systemPrompt takes precedence over customPrompt', () => {
15
+ const agent = new ProbeAgent({
16
+ path: process.cwd(),
17
+ systemPrompt: 'primary system prompt',
18
+ customPrompt: 'secondary custom prompt'
19
+ });
20
+
21
+ expect(agent.customPrompt).toBe('primary system prompt');
22
+ });
23
+
24
+ test('falls back to customPrompt when systemPrompt is absent', () => {
25
+ const agent = new ProbeAgent({
26
+ path: process.cwd(),
27
+ customPrompt: 'custom prompt only'
28
+ });
29
+
30
+ expect(agent.customPrompt).toBe('custom prompt only');
31
+ });
32
+ });
@@ -0,0 +1,42 @@
1
+ import { describe, test, expect } from '@jest/globals';
2
+ import ts from 'typescript';
3
+
4
+ /**
5
+ * Regression test: ensure the public TypeScript surface exposes tool filtering
6
+ * and system prompt options. We compile a tiny snippet and assert no diagnostics.
7
+ */
8
+ describe('Type definitions: ProbeAgentOptions', () => {
9
+ const compile = (source) => {
10
+ const result = ts.transpileModule(source, {
11
+ compilerOptions: {
12
+ target: ts.ScriptTarget.ES2020,
13
+ module: ts.ModuleKind.ESNext,
14
+ moduleResolution: ts.ModuleResolutionKind.Node16,
15
+ strict: true,
16
+ skipLibCheck: true,
17
+ isolatedModules: true,
18
+ allowImportingTsExtensions: true,
19
+ types: [],
20
+ }
21
+ });
22
+ return result.diagnostics || [];
23
+ };
24
+
25
+ test('accepts systemPrompt, allowedTools, and disableTools', () => {
26
+ const diagnostics = compile(`
27
+ import { ProbeAgent, type ProbeAgentOptions } from '../..';
28
+
29
+ const options: ProbeAgentOptions = {
30
+ systemPrompt: 'hello',
31
+ customPrompt: 'fallback',
32
+ allowedTools: ['search', '!bash'],
33
+ disableTools: false,
34
+ };
35
+
36
+ const agent = new ProbeAgent(options);
37
+ void agent;
38
+ `);
39
+
40
+ expect(diagnostics.length).toBe(0);
41
+ });
42
+ });