@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,529 @@
1
+ # Building AI Tools on Probe (Node.js SDK & LangChain)
2
+
3
+ This guide explains how to use Probe's Node.js SDK to build custom AI-powered code intelligence tools for your development workflow.
4
+
5
+ ## Overview
6
+
7
+ Probe's Node.js SDK provides programmatic access to its powerful code search capabilities, allowing you to build custom tools, integrate with AI frameworks, and create specialized workflows for your development team.
8
+
9
+ ## Installing @probelabs/probe as a Dependency
10
+
11
+ Start by adding Probe to your Node.js project:
12
+
13
+ ```bash
14
+ # Add to your project
15
+ npm install @probelabs/probe@latest
16
+
17
+ # Or install globally
18
+ npm install -g @probelabs/probe@latest
19
+ ```
20
+
21
+ During installation, the package will automatically download the appropriate Probe binary for your platform (Windows, macOS, or Linux).
22
+
23
+ ## Basic SDK Usage
24
+
25
+ The SDK provides three main functions:
26
+
27
+ ### Search: Find Code Patterns
28
+
29
+ ```javascript
30
+ import { search } from '@probelabs/probe';
31
+
32
+ // Search for code patterns
33
+ const results = await search({
34
+ path: '/path/to/your/project',
35
+ query: 'authentication',
36
+ maxResults: 10
37
+ });
38
+
39
+ console.log(results);
40
+ ```
41
+
42
+ ### Query: Find Specific Code Structures
43
+
44
+ ```javascript
45
+ import { query } from '@probelabs/probe';
46
+
47
+ // Find JavaScript functions
48
+ const functions = await query({
49
+ path: '/path/to/your/project',
50
+ pattern: 'function $NAME($$$PARAMS) $$$BODY',
51
+ language: 'javascript'
52
+ });
53
+
54
+ console.log(functions);
55
+ ```
56
+
57
+ ### Extract: Get Code from Specific Files
58
+
59
+ ```javascript
60
+ import { extract } from '@probelabs/probe';
61
+
62
+ // Extract code from specific files
63
+ const code = await extract({
64
+ files: [
65
+ '/path/to/your/project/src/auth.js',
66
+ '/path/to/your/project/src/api.js:42' // Extract from line 42
67
+ ]
68
+ });
69
+
70
+ // Extract with LLM prompt and instructions
71
+ const codeWithPrompt = await extract({
72
+ files: ['/path/to/your/project/src/auth.js#authenticate'],
73
+ prompt: 'engineer', // Use engineer template
74
+ instructions: 'Explain this authentication function'
75
+ });
76
+
77
+ // Extract with custom prompt template
78
+ const codeWithCustomPrompt = await extract({
79
+ files: ['/path/to/your/project/src/api.js:42'],
80
+ prompt: '/path/to/custom/prompt.txt', // Path to custom prompt file
81
+ instructions: 'Refactor this code'
82
+ });
83
+
84
+ console.log(code);
85
+ ```
86
+
87
+ ## Examples with LangChain
88
+
89
+ LangChain is a popular framework for building AI applications. Here's how to integrate Probe with LangChain:
90
+
91
+ ### Creating LangChain Tools
92
+
93
+ ```javascript
94
+ import { ChatOpenAI } from '@langchain/openai';
95
+ import { tools } from '@probelabs/probe';
96
+
97
+ // Create LangChain tools from Probe
98
+ const searchTool = tools.createSearchTool();
99
+ const queryTool = tools.createQueryTool();
100
+ const extractTool = tools.createExtractTool();
101
+
102
+ // Create a ChatOpenAI instance with tools
103
+ const model = new ChatOpenAI({
104
+ modelName: "gpt-4o",
105
+ temperature: 0.7
106
+ }).withTools([searchTool, queryTool, extractTool]);
107
+
108
+ // Use the model with tools
109
+ async function chatWithAI(userMessage) {
110
+ const result = await model.invoke([
111
+ {
112
+ role: "system",
113
+ content: "You are a code intelligence assistant. Use the provided tools to search and analyze code."
114
+ },
115
+ {
116
+ role: "user",
117
+ content: userMessage
118
+ }
119
+ ]);
120
+
121
+ return result.content;
122
+ }
123
+
124
+ // Example usage
125
+ const response = await chatWithAI("How is authentication implemented in this project?");
126
+ console.log(response);
127
+ ```
128
+
129
+ ### Building a Code Explanation Chain
130
+
131
+ ```javascript
132
+ import { search } from '@probelabs/probe';
133
+ import { ChatOpenAI } from '@langchain/openai';
134
+ import { PromptTemplate } from '@langchain/core/prompts';
135
+ import { StringOutputParser } from '@langchain/core/output_parsers';
136
+
137
+ // Create a chain for code explanation
138
+ async function createCodeExplainer() {
139
+ // Create a chat model
140
+ const model = new ChatOpenAI({
141
+ modelName: "gpt-4o",
142
+ temperature: 0.5
143
+ });
144
+
145
+ // Create a prompt template
146
+ const promptTemplate = PromptTemplate.fromTemplate(`
147
+ You are a code explanation expert. I'll provide you with a question and some code search results.
148
+ Please analyze the code and explain it in a clear, concise manner.
149
+
150
+ Question: {question}
151
+
152
+ Code search results:
153
+ {searchResults}
154
+
155
+ Your explanation:
156
+ `);
157
+
158
+ // Create a chain
159
+ const chain = promptTemplate
160
+ .pipe(model)
161
+ .pipe(new StringOutputParser());
162
+
163
+ // Function to explain code
164
+ async function explainCode(question, codebasePath) {
165
+ // Search for relevant code
166
+ const searchResults = await search({
167
+ path: codebasePath,
168
+ query: question,
169
+ maxResults: 5,
170
+ maxTokens: 8000
171
+ });
172
+
173
+ // Get the explanation from the AI
174
+ const explanation = await chain.invoke({
175
+ question,
176
+ searchResults
177
+ });
178
+
179
+ return explanation;
180
+ }
181
+
182
+ return { explainCode };
183
+ }
184
+
185
+ // Usage
186
+ const explainer = await createCodeExplainer();
187
+ const explanation = await explainer.explainCode(
188
+ "How does the authentication system work?",
189
+ "/path/to/your/project"
190
+ );
191
+ console.log(explanation);
192
+ ```
193
+
194
+ ## Examples with Vercel AI SDK
195
+
196
+ The Vercel AI SDK is another popular framework for building AI applications. The latest version of Probe provides tool generators that allow for better configuration and session isolation:
197
+
198
+ ```javascript
199
+ import { generateText } from 'ai';
200
+ import { searchTool, queryTool, extractTool } from '@probelabs/probe';
201
+ import { randomUUID } from 'crypto';
202
+
203
+ // Generate a session ID for tool isolation
204
+ const sessionId = randomUUID();
205
+ console.log(`Generated session ID: ${sessionId}`);
206
+
207
+ // Configure tools with options
208
+ const configOptions = {
209
+ sessionId,
210
+ debug: process.env.DEBUG === 'true',
211
+ maxTokens: 30000 // Optional: override default max tokens
212
+ };
213
+
214
+ // Create configured tool instances
215
+ const configuredTools = {
216
+ search: searchTool(configOptions),
217
+ query: queryTool(configOptions),
218
+ extract: extractTool(configOptions)
219
+ };
220
+
221
+ // Use the configured tools with Vercel AI SDK
222
+ async function chatWithAI(userMessage) {
223
+ const result = await generateText({
224
+ model: provider(modelName),
225
+ messages: [{ role: 'user', content: userMessage }],
226
+ system: "You are a code intelligence assistant. Use the provided tools to search and analyze code.",
227
+ tools: configuredTools,
228
+ maxSteps: 15,
229
+ temperature: 0.7
230
+ });
231
+
232
+ return result.text;
233
+ }
234
+
235
+ // Example usage
236
+ const response = await chatWithAI("Find all API endpoints in this project");
237
+ console.log(response);
238
+ ```
239
+
240
+ ### Benefits of Tool Generators
241
+
242
+ The new tool generator approach provides several advantages:
243
+
244
+ 1. **Session Isolation**: Each tool instance can have its own session ID, which is crucial in concurrent environments like web applications
245
+ 2. **Configurable Options**: You can customize tools with options like debug logging and token limits
246
+ 3. **Better Debugging**: Enable debug mode to see detailed logs of tool execution
247
+ 4. **Backward Compatibility**: The package still exports pre-configured tools for backward compatibility
248
+
249
+ ### Backward Compatibility
250
+
251
+ If you prefer the previous approach, you can still use the pre-configured tools:
252
+
253
+ ```javascript
254
+ import { tools } from '@probelabs/probe';
255
+
256
+ // Use the pre-configured tools
257
+ const result = await generateText({
258
+ model: provider(modelName),
259
+ messages: [{ role: 'user', content: userMessage }],
260
+ system: "You are a code intelligence assistant.",
261
+ tools: {
262
+ search: tools.searchTool,
263
+ query: tools.queryTool,
264
+ extract: tools.extractTool
265
+ }
266
+ });
267
+ ```
268
+
269
+ ## Building a Custom Code Search API
270
+
271
+ Create a REST API for code search:
272
+
273
+ ```javascript
274
+ import express from 'express';
275
+ import { search, query, extract } from '@probelabs/probe';
276
+
277
+ const app = express();
278
+ app.use(express.json());
279
+
280
+ // Search endpoint
281
+ app.post('/api/search', async (req, res) => {
282
+ try {
283
+ const { path, query, options } = req.body;
284
+ const results = await search({
285
+ path,
286
+ query,
287
+ ...options
288
+ });
289
+ res.json({ results });
290
+ } catch (error) {
291
+ res.status(500).json({ error: error.message });
292
+ }
293
+ });
294
+
295
+ // Query endpoint
296
+ app.post('/api/query', async (req, res) => {
297
+ try {
298
+ const { path, pattern, language, options } = req.body;
299
+ const results = await query({
300
+ path,
301
+ pattern,
302
+ language,
303
+ ...options
304
+ });
305
+ res.json({ results });
306
+ } catch (error) {
307
+ res.status(500).json({ error: error.message });
308
+ }
309
+ });
310
+
311
+ // Extract endpoint
312
+ app.post('/api/extract', async (req, res) => {
313
+ try {
314
+ const { files, prompt, instructions, options } = req.body;
315
+ const results = await extract({
316
+ files,
317
+ prompt,
318
+ instructions,
319
+ ...options
320
+ });
321
+ res.json({ results });
322
+ } catch (error) {
323
+ res.status(500).json({ error: error.message });
324
+ }
325
+ });
326
+
327
+ app.listen(3000, () => {
328
+ console.log('Code search API running on port 3000');
329
+ });
330
+ ```
331
+
332
+ ## Handling Concurrency and Caching
333
+
334
+ For production applications, you'll want to handle concurrency and implement caching:
335
+
336
+ ### Implementing a Cache Layer
337
+
338
+ ```javascript
339
+ import { search } from '@probelabs/probe';
340
+ import NodeCache from 'node-cache';
341
+
342
+ // Create a cache with 1 hour TTL
343
+ const cache = new NodeCache({ stdTTL: 3600 });
344
+
345
+ // Cached search function
346
+ async function cachedSearch(params) {
347
+ // Create a cache key from the parameters
348
+ const cacheKey = JSON.stringify(params);
349
+
350
+ // Check if we have a cached result
351
+ const cachedResult = cache.get(cacheKey);
352
+ if (cachedResult) {
353
+ console.log('Cache hit!');
354
+ return cachedResult;
355
+ }
356
+
357
+ // Perform the search
358
+ console.log('Cache miss, performing search...');
359
+ const results = await search(params);
360
+
361
+ // Cache the results
362
+ cache.set(cacheKey, results);
363
+
364
+ return results;
365
+ }
366
+
367
+ // Example usage
368
+ const results = await cachedSearch({
369
+ path: '/path/to/your/project',
370
+ query: 'authentication',
371
+ maxResults: 10
372
+ });
373
+ ```
374
+
375
+ ### Managing Concurrency
376
+
377
+ ```javascript
378
+ import { search } from '@probelabs/probe';
379
+ import pLimit from 'p-limit';
380
+
381
+ // Limit concurrency to 5 simultaneous searches
382
+ const limit = pLimit(5);
383
+
384
+ // Function to search multiple repositories
385
+ async function searchMultipleRepos(query, repositories) {
386
+ // Map each repository to a limited promise
387
+ const promises = repositories.map(repo =>
388
+ limit(() => search({
389
+ path: repo,
390
+ query,
391
+ maxResults: 10
392
+ }))
393
+ );
394
+
395
+ // Wait for all searches to complete
396
+ const results = await Promise.all(promises);
397
+
398
+ // Combine and return results
399
+ return repositories.reduce((acc, repo, index) => {
400
+ acc[repo] = results[index];
401
+ return acc;
402
+ }, {});
403
+ }
404
+
405
+ // Example usage
406
+ const results = await searchMultipleRepos(
407
+ 'authentication',
408
+ [
409
+ '/path/to/repo1',
410
+ '/path/to/repo2',
411
+ '/path/to/repo3',
412
+ '/path/to/repo4',
413
+ '/path/to/repo5'
414
+ ]
415
+ );
416
+ ```
417
+
418
+ ## Best Practices for Production
419
+
420
+ ### Error Handling
421
+
422
+ ```javascript
423
+ import { search } from '@probelabs/probe';
424
+
425
+ async function robustSearch(params) {
426
+ try {
427
+ return await search(params);
428
+ } catch (error) {
429
+ console.error('Search error:', error);
430
+
431
+ // Handle specific errors
432
+ if (error.message.includes('Binary not found')) {
433
+ // Handle missing binary
434
+ console.error('Probe binary not found. Trying to reinstall...');
435
+ // Implement reinstall logic
436
+ } else if (error.message.includes('Permission denied')) {
437
+ // Handle permission issues
438
+ console.error('Permission denied. Check file permissions.');
439
+ } else if (error.message.includes('timeout')) {
440
+ // Handle timeouts
441
+ console.error('Search timed out. Try with a more specific query.');
442
+ }
443
+
444
+ // Return a fallback result
445
+ return { error: error.message, fallback: true };
446
+ }
447
+ }
448
+ ```
449
+
450
+ ### Performance Optimization
451
+
452
+ ```javascript
453
+ import { search } from '@probelabs/probe';
454
+
455
+ // Optimize search for performance
456
+ async function optimizedSearch(query, path) {
457
+ // First, do a quick search for files only
458
+ const fileResults = await search({
459
+ path,
460
+ query,
461
+ filesOnly: true,
462
+ maxResults: 50
463
+ });
464
+
465
+ // If we have too many files, refine the query
466
+ if (fileResults.files && fileResults.files.length > 20) {
467
+ console.log('Too many files, refining query...');
468
+ // Add more specific terms to narrow down results
469
+ return search({
470
+ path,
471
+ query: `${query} AND (function OR class OR method)`,
472
+ maxResults: 10
473
+ });
474
+ }
475
+
476
+ // Otherwise, search the content of the files we found
477
+ return search({
478
+ path,
479
+ query,
480
+ maxResults: 10
481
+ });
482
+ }
483
+ ```
484
+
485
+ ### Memory Management
486
+
487
+ ```javascript
488
+ import { search } from '@probelabs/probe';
489
+
490
+ // Search with memory constraints
491
+ async function memoryEfficientSearch(query, path) {
492
+ // Split the search into smaller batches
493
+ const directories = [
494
+ `${path}/src`,
495
+ `${path}/lib`,
496
+ `${path}/packages`
497
+ ];
498
+
499
+ const results = [];
500
+
501
+ // Process each directory separately
502
+ for (const dir of directories) {
503
+ const dirResults = await search({
504
+ path: dir,
505
+ query,
506
+ maxResults: 5
507
+ });
508
+
509
+ results.push(dirResults);
510
+
511
+ // Optional: Force garbage collection if available
512
+ if (global.gc) {
513
+ global.gc();
514
+ }
515
+ }
516
+
517
+ return results;
518
+ }
519
+
520
+ // Run with --expose-gc flag to enable manual garbage collection
521
+ // node --expose-gc your-script.js
522
+ ```
523
+
524
+ ## Next Steps
525
+
526
+ - For individual developer workflows, see [Integrating Probe into AI Code Editors](/use-cases/integrating-probe-into-ai-code-editors)
527
+ - For team collaboration, check out [Deploying the Probe Web Interface](/use-cases/deploying-probe-web-interface)
528
+ - For advanced CLI usage, explore [Advanced CLI: Speed, Token Limits, and Large Repos](/use-cases/advanced-cli)
529
+ - For complete API reference, see the [Node.js SDK API Reference](/nodejs-sdk)