@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,419 @@
1
+ import { get_encoding } from 'tiktoken';
2
+
3
+ /**
4
+ * TokenCounter class to track token usage in the chat
5
+ */
6
+ export class TokenCounter {
7
+ constructor() {
8
+ // Initialize the tokenizer with cl100k_base encoding (works for both Claude and GPT models)
9
+ try {
10
+ // Initialize tokenizer
11
+ this.tokenizer = get_encoding('cl100k_base');
12
+
13
+ // Context window tracking
14
+ this.contextSize = 0; // Current size based on history
15
+ this.history = []; // Store message history for context calculation
16
+
17
+ // Token counters
18
+ this.requestTokens = 0; // Total prompt tokens over session
19
+ this.responseTokens = 0; // Total completion tokens over session
20
+ this.currentRequestTokens = 0; // Prompt tokens for the current LLM call
21
+ this.currentResponseTokens = 0; // Completion tokens for the current LLM call
22
+
23
+ // Cache token tracking
24
+ this.cacheCreationTokens = 0; // Total Anthropic cache creation tokens
25
+ this.cacheReadTokens = 0; // Total Anthropic cache read tokens
26
+ this.currentCacheCreationTokens = 0; // Anthropic cache creation for current call
27
+ this.currentCacheReadTokens = 0; // Anthropic cache read for current call
28
+ this.cachedPromptTokens = 0; // Total OpenAI cached prompt tokens
29
+ this.currentCachedPromptTokens = 0; // OpenAI cached prompt for current call
30
+
31
+ } catch (error) {
32
+ console.error('Error initializing tokenizer:', error);
33
+ // Fallback to a simple token counting method if tiktoken fails
34
+ this.tokenizer = null;
35
+ this.contextSize = 0;
36
+ this.requestTokens = 0;
37
+ this.responseTokens = 0;
38
+ this.currentRequestTokens = 0;
39
+ this.currentResponseTokens = 0;
40
+ this.cacheCreationTokens = 0;
41
+ this.cacheReadTokens = 0;
42
+ this.currentCacheCreationTokens = 0;
43
+ this.currentCacheReadTokens = 0;
44
+ this.cachedPromptTokens = 0;
45
+ this.currentCachedPromptTokens = 0;
46
+ this.history = [];
47
+ }
48
+ this.debug = process.env.DEBUG_CHAT === '1';
49
+ }
50
+
51
+ /**
52
+ * Count tokens in a string using tiktoken or fallback method
53
+ * @param {string} text - The text to count tokens for
54
+ * @returns {number} - The number of tokens
55
+ */
56
+ countTokens(text) {
57
+ if (typeof text !== 'string') {
58
+ text = String(text); // Ensure text is a string
59
+ }
60
+
61
+ if (this.tokenizer) {
62
+ try {
63
+ const tokens = this.tokenizer.encode(text);
64
+ return tokens.length;
65
+ } catch (error) {
66
+ // Log only once per session or use a flag? For now, log each time.
67
+ // console.warn('Error counting tokens with tiktoken, using fallback method:', error.message);
68
+ // Fallback to a simple approximation (1 token ā‰ˆ 4 characters)
69
+ return Math.ceil(text.length / 4);
70
+ }
71
+ } else {
72
+ // Fallback to a simple approximation (1 token ā‰ˆ 4 characters)
73
+ return Math.ceil(text.length / 4);
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Add to request token count (manual counting, less used now with recordUsage)
79
+ * @param {string|number} input - The text to count tokens for or the token count directly
80
+ */
81
+ addRequestTokens(input) {
82
+ let tokenCount = 0;
83
+
84
+ if (typeof input === 'number') {
85
+ tokenCount = input;
86
+ } else if (typeof input === 'string') {
87
+ tokenCount = this.countTokens(input);
88
+ } else {
89
+ console.warn('[WARN] Invalid input type for addRequestTokens:', typeof input);
90
+ return;
91
+ }
92
+
93
+ // This method primarily updates the *total* count historically.
94
+ // `recordUsage` is preferred for setting current/total based on LLM response.
95
+ this.requestTokens += tokenCount;
96
+ // Setting `currentRequestTokens` here might be misleading if `recordUsage` is called later.
97
+ // Let's make this method mainly for historical accumulation if needed,
98
+ // or ensure it's only called when `recordUsage` isn't available.
99
+ // For now, we'll update current as well, assuming it's for the *start* of a turn.
100
+ this.currentRequestTokens = tokenCount;
101
+
102
+ if (this.debug) {
103
+ console.log(`[DEBUG] (Manual) Added ${tokenCount} request tokens. Total: ${this.requestTokens}, Current: ${this.currentRequestTokens}`);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Add to response token count (manual counting, less used now with recordUsage)
109
+ * @param {string|number} input - The text to count tokens for or the token count directly
110
+ */
111
+ addResponseTokens(input) {
112
+ let tokenCount = 0;
113
+
114
+ if (typeof input === 'number') {
115
+ tokenCount = input;
116
+ } else if (typeof input === 'string') {
117
+ tokenCount = this.countTokens(input);
118
+ } else {
119
+ console.warn('[WARN] Invalid input type for addResponseTokens:', typeof input);
120
+ return;
121
+ }
122
+
123
+ this.responseTokens += tokenCount;
124
+ // Update current response tokens, assuming this is called when usage info is missing.
125
+ this.currentResponseTokens = tokenCount;
126
+
127
+ if (this.debug) {
128
+ console.log(`[DEBUG] (Manual) Added ${tokenCount} response tokens. Total: ${this.responseTokens}, Current: ${this.currentResponseTokens}`);
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Record token usage from the AI SDK's result for a single LLM call.
134
+ * This resets 'current' counters and updates totals.
135
+ * @param {Object} usage - The usage object { promptTokens, completionTokens, totalTokens }
136
+ * @param {Object} providerMetadata - Metadata possibly containing cache info
137
+ */
138
+ recordUsage(usage, providerMetadata) {
139
+ if (!usage) {
140
+ console.warn('[WARN] No usage information provided to recordUsage');
141
+ // If usage is missing, maybe fall back to manual counting?
142
+ // For now, just return and rely on manual calls if needed.
143
+ return;
144
+ }
145
+
146
+ // --- Reset CURRENT counters for this specific API call ---
147
+ this.currentRequestTokens = 0;
148
+ this.currentResponseTokens = 0;
149
+ this.currentCacheCreationTokens = 0;
150
+ this.currentCacheReadTokens = 0;
151
+ this.currentCachedPromptTokens = 0;
152
+
153
+ // --- Process usage data ---
154
+ const promptTokens = Number(usage.promptTokens) || 0;
155
+ const completionTokens = Number(usage.completionTokens) || 0;
156
+
157
+ // Update CURRENT tokens for this call
158
+ this.currentRequestTokens = promptTokens;
159
+ this.currentResponseTokens = completionTokens;
160
+
161
+ // Update TOTAL tokens accumulated over the session
162
+ this.requestTokens += promptTokens;
163
+ this.responseTokens += completionTokens;
164
+
165
+ // --- Process Provider Metadata for Cache Info ---
166
+ if (providerMetadata?.anthropic) {
167
+ const cacheCreation = Number(providerMetadata.anthropic.cacheCreationInputTokens) || 0;
168
+ const cacheRead = Number(providerMetadata.anthropic.cacheReadInputTokens) || 0;
169
+
170
+ this.currentCacheCreationTokens = cacheCreation;
171
+ this.currentCacheReadTokens = cacheRead;
172
+
173
+ this.cacheCreationTokens += cacheCreation;
174
+ this.cacheReadTokens += cacheRead;
175
+
176
+ if (this.debug) {
177
+ console.log(`[DEBUG] Anthropic cache tokens (current): creation=${cacheCreation}, read=${cacheRead}`);
178
+ }
179
+ }
180
+
181
+ if (providerMetadata?.openai) {
182
+ const cachedPrompt = Number(providerMetadata.openai.cachedPromptTokens) || 0;
183
+
184
+ this.currentCachedPromptTokens = cachedPrompt;
185
+ this.cachedPromptTokens += cachedPrompt;
186
+
187
+ if (this.debug) {
188
+ console.log(`[DEBUG] OpenAI cached prompt tokens (current): ${cachedPrompt}`);
189
+ }
190
+ }
191
+
192
+ // Note: We don't force context recalculation here.
193
+ // It should be done explicitly after history is updated.
194
+
195
+ if (this.debug) {
196
+ console.log(
197
+ `[DEBUG] Recorded usage: current(req=${this.currentRequestTokens}, resp=${this.currentResponseTokens}), total(req=${this.requestTokens}, resp=${this.responseTokens})`
198
+ );
199
+ // Log cache totals
200
+ console.log(`[DEBUG] Total cache tokens: Anthropic(create=${this.cacheCreationTokens}, read=${this.cacheReadTokens}), OpenAI(prompt=${this.cachedPromptTokens})`);
201
+ }
202
+ }
203
+
204
+ /**
205
+ * Calculate the current context window size based on provided messages or internal history.
206
+ * @param {Array|null} messages - Optional messages array to use for calculation. If null, uses internal this.history.
207
+ * @returns {number} - Total tokens estimated in the context window.
208
+ */
209
+ calculateContextSize(messages = null) {
210
+ const msgsToCount = messages !== null ? messages : this.history;
211
+ let totalTokens = 0;
212
+
213
+ if (this.debug && messages === null) {
214
+ // Log only when using internal history to avoid spamming during loops using local messages array
215
+ console.log(`[DEBUG] Calculating context size from internal history (${this.history.length} messages)`);
216
+ }
217
+
218
+ for (const msg of msgsToCount) {
219
+ let messageTokens = 0;
220
+ // Add tokens for role overhead (approximate)
221
+ // Vercel SDK adds ~4 tokens per message for role/structure.
222
+ // Anthropic might be slightly different. Let's stick with 4 as an estimate.
223
+ messageTokens += 4;
224
+
225
+ // Content tokens
226
+ if (typeof msg.content === 'string') {
227
+ messageTokens += this.countTokens(msg.content);
228
+ } else if (Array.isArray(msg.content)) {
229
+ // Handle array content (e.g., Vercel AI SDK tool usage format with images)
230
+ for (const item of msg.content) {
231
+ if (item.type === 'text' && typeof item.text === 'string') {
232
+ messageTokens += this.countTokens(item.text);
233
+ } else if (item.type === 'image' && item.image) {
234
+ // For images, estimate token cost based on Anthropic/OpenAI pricing
235
+ // Base64 images typically cost ~1000-2000 tokens depending on size
236
+ if (item.image.startsWith('data:image/')) {
237
+ // Estimate based on base64 length - very rough approximation
238
+ const base64Length = item.image.length;
239
+ const estimatedImageTokens = Math.min(Math.max(Math.floor(base64Length / 1000), 500), 2000);
240
+ messageTokens += estimatedImageTokens;
241
+ } else {
242
+ // URL images, estimate moderate token cost
243
+ messageTokens += 1000;
244
+ }
245
+ } else {
246
+ // Estimate tokens for other non-text parts (tool calls/results)
247
+ messageTokens += this.countTokens(JSON.stringify(item));
248
+ }
249
+ }
250
+ } else if (msg.content) {
251
+ // Fallback for other content types
252
+ messageTokens += this.countTokens(JSON.stringify(msg.content));
253
+ }
254
+
255
+ // --- Add tokens for tool calls/results if present (Vercel SDK format) ---
256
+ // These might exist in 'assistant' or 'tool' messages depending on SDK version/usage
257
+ if (msg.toolCalls) {
258
+ messageTokens += this.countTokens(JSON.stringify(msg.toolCalls));
259
+ messageTokens += 5; // Approx overhead for tool_calls structure
260
+ }
261
+ // For 'tool' role messages (results)
262
+ if (msg.role === 'tool' && msg.toolCallId) {
263
+ messageTokens += this.countTokens(msg.toolCallId); // Add tokens for the ID
264
+ messageTokens += 5; // Approx overhead for tool role structure
265
+ // Content is already counted above
266
+ }
267
+ // Deprecated? Check if toolCallResults is still used
268
+ if (msg.toolCallResults) {
269
+ messageTokens += this.countTokens(JSON.stringify(msg.toolCallResults));
270
+ messageTokens += 5; // Approx overhead
271
+ }
272
+ // --- End Vercel SDK specific ---
273
+
274
+
275
+ totalTokens += messageTokens;
276
+
277
+ // if (this.debug) {
278
+ // // This log can be very noisy, disable for now
279
+ // // console.log(`[DEBUG] Msg (${msg.role}): ~${messageTokens} tokens`);
280
+ // }
281
+ }
282
+
283
+ // Update the instance property *only* if calculating based on internal history
284
+ if (messages === null) {
285
+ this.contextSize = totalTokens;
286
+ if (this.debug) {
287
+ console.log(`[DEBUG] Updated internal context size: ${this.contextSize} tokens`);
288
+ }
289
+ }
290
+
291
+
292
+ return totalTokens;
293
+ }
294
+
295
+ /**
296
+ * Update internal history and recalculate internal context window size.
297
+ * @param {Array} messages - New message history array.
298
+ */
299
+ updateHistory(messages) {
300
+ // Ensure messages is an array
301
+ if (!Array.isArray(messages)) {
302
+ console.warn("[WARN] updateHistory called with non-array:", messages);
303
+ this.history = [];
304
+ } else {
305
+ // Create a shallow copy to avoid external modifications
306
+ this.history = [...messages];
307
+ }
308
+ // Recalculate context size based on the new internal history
309
+ this.calculateContextSize(); // This updates this.contextSize
310
+ if (this.debug) {
311
+ console.log(`[DEBUG] History updated (${this.history.length} messages). Recalculated context size: ${this.contextSize}`);
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Clear all counters and internal history. Reset context size.
317
+ */
318
+ clear() {
319
+ // Reset counters
320
+ this.requestTokens = 0;
321
+ this.responseTokens = 0;
322
+ this.currentRequestTokens = 0;
323
+ this.currentResponseTokens = 0;
324
+ this.cacheCreationTokens = 0;
325
+ this.cacheReadTokens = 0;
326
+ this.currentCacheCreationTokens = 0;
327
+ this.currentCacheReadTokens = 0;
328
+ this.cachedPromptTokens = 0;
329
+ this.currentCachedPromptTokens = 0;
330
+
331
+ // Clear history and context
332
+ this.history = [];
333
+ this.contextSize = 0; // Reset calculated context size
334
+
335
+ if (this.debug) {
336
+ console.log('[DEBUG] TokenCounter cleared: usage, history, and context size reset.');
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Start a new conversation turn - reset CURRENT token counters.
342
+ * Calculates context size based on history *before* the new turn.
343
+ */
344
+ startNewTurn() {
345
+ this.currentRequestTokens = 0;
346
+ this.currentResponseTokens = 0;
347
+ this.currentCacheCreationTokens = 0;
348
+ this.currentCacheReadTokens = 0;
349
+ this.currentCachedPromptTokens = 0;
350
+
351
+ // Calculate context size based on current history *before* new messages are added
352
+ this.calculateContextSize(); // Updates this.contextSize
353
+
354
+ if (this.debug) {
355
+ console.log('[DEBUG] TokenCounter: New turn started. Current counters reset.');
356
+ console.log(`[DEBUG] Context size at start of turn: ${this.contextSize} tokens`);
357
+ }
358
+ }
359
+
360
+
361
+ /**
362
+ * Get the current token usage state including context size.
363
+ * Recalculates context size from internal history before returning.
364
+ * @returns {Object} - Object containing current turn, total session, and context window usage.
365
+ */
366
+ getTokenUsage() {
367
+ // Always calculate context window size from internal history right before returning usage
368
+ const currentContextSize = this.calculateContextSize(); // Recalculates and updates this.contextSize
369
+
370
+ // Consolidate cache info for simpler reporting
371
+ const currentCacheRead = this.currentCacheReadTokens + this.currentCachedPromptTokens;
372
+ const currentCacheWrite = this.currentCacheCreationTokens;
373
+ const totalCacheRead = this.cacheReadTokens + this.cachedPromptTokens;
374
+ const totalCacheWrite = this.cacheCreationTokens;
375
+
376
+ const usageData = {
377
+ contextWindow: currentContextSize, // Use the freshly calculated value
378
+ current: { // Usage for the *last* LLM call recorded
379
+ request: this.currentRequestTokens,
380
+ response: this.currentResponseTokens,
381
+ total: this.currentRequestTokens + this.currentResponseTokens,
382
+ cacheRead: currentCacheRead,
383
+ cacheWrite: currentCacheWrite,
384
+ cacheTotal: currentCacheRead + currentCacheWrite,
385
+ // Keep detailed breakdown if needed
386
+ anthropic: {
387
+ cacheCreation: this.currentCacheCreationTokens,
388
+ cacheRead: this.currentCacheReadTokens,
389
+ },
390
+ openai: {
391
+ cachedPrompt: this.currentCachedPromptTokens
392
+ }
393
+ },
394
+ total: { // Accumulated usage over the session
395
+ request: this.requestTokens,
396
+ response: this.responseTokens,
397
+ total: this.requestTokens + this.responseTokens,
398
+ cacheRead: totalCacheRead,
399
+ cacheWrite: totalCacheWrite,
400
+ cacheTotal: totalCacheRead + totalCacheWrite,
401
+ // Keep detailed breakdown if needed
402
+ anthropic: {
403
+ cacheCreation: this.cacheCreationTokens,
404
+ cacheRead: this.cacheReadTokens,
405
+ },
406
+ openai: {
407
+ cachedPrompt: this.cachedPromptTokens
408
+ }
409
+ }
410
+ };
411
+
412
+ if (this.debug) {
413
+ // Log less frequently or only when values change significantly?
414
+ // console.log(`[DEBUG] getTokenUsage() called. Returning data:`, JSON.stringify(usageData, null, 2));
415
+ }
416
+
417
+ return usageData;
418
+ }
419
+ }
@@ -0,0 +1,134 @@
1
+ import chalk from 'chalk';
2
+
3
+ /**
4
+ * TokenUsageDisplay class to format token usage information
5
+ */
6
+ export class TokenUsageDisplay {
7
+ constructor() {
8
+ this.tokenUsage = null;
9
+ }
10
+
11
+ /**
12
+ * Format a number with commas
13
+ * @param {number} num Number to format
14
+ * @returns {string} Formatted number
15
+ */
16
+ formatNumber(num) {
17
+ return num.toLocaleString();
18
+ }
19
+
20
+ /**
21
+ * Format cache tokens
22
+ * @param {Object} tokens Token data
23
+ * @returns {Object} Formatted cache data
24
+ */
25
+ formatCacheTokens(tokens = {}) {
26
+ // Calculate total cache tokens from all providers
27
+ const totalCacheRead = tokens.cacheRead !== undefined ? tokens.cacheRead : (((tokens.anthropic || {}).cacheRead || 0) + ((tokens.openai || {}).cachedPrompt || 0));
28
+ const totalCacheWrite = tokens.cacheWrite !== undefined ? tokens.cacheWrite : ((tokens.anthropic || {}).cacheCreation || 0);
29
+ const totalCache = tokens.cacheTotal !== undefined ? tokens.cacheTotal : (totalCacheRead + totalCacheWrite);
30
+
31
+ // Return consolidated cache data
32
+ return {
33
+ read: this.formatNumber(totalCacheRead),
34
+ write: this.formatNumber(totalCacheWrite),
35
+ total: this.formatNumber(totalCache)
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Format usage data for UI display
41
+ * @param {Object} usage Token usage data
42
+ * @returns {Object} Formatted usage data
43
+ */
44
+ format(usage) {
45
+ // Ensure we have a valid context window value
46
+ const contextWindow = usage.contextWindow || 100;
47
+
48
+ // Ensure usage.current exists
49
+ const current = usage.current || {};
50
+
51
+ // Format the usage data for display
52
+ const formatted = {
53
+ contextWindow: this.formatNumber(contextWindow),
54
+ current: {
55
+ request: this.formatNumber(current.request || 0),
56
+ response: this.formatNumber(current.response || 0),
57
+ total: this.formatNumber(current.total || 0),
58
+ cacheRead: this.formatNumber(current.cacheRead || 0),
59
+ cacheWrite: this.formatNumber(current.cacheWrite || 0),
60
+ cache: this.formatCacheTokens(current)
61
+ },
62
+ total: {
63
+ request: this.formatNumber((usage.total || {}).request || 0),
64
+ response: this.formatNumber((usage.total || {}).response || 0),
65
+ total: this.formatNumber((usage.total || {}).total || 0),
66
+ cacheRead: this.formatNumber((usage.total || {}).cacheRead || 0),
67
+ cacheWrite: this.formatNumber((usage.total || {}).cacheWrite || 0),
68
+ cache: this.formatCacheTokens(usage.total || {})
69
+ }
70
+ };
71
+
72
+ return formatted;
73
+ }
74
+
75
+ /**
76
+ * Update token usage from a token counter
77
+ * @param {Object} tokenCounter - The token counter instance
78
+ */
79
+ updateFromTokenCounter(tokenCounter) {
80
+ if (tokenCounter && typeof tokenCounter.getTokenUsage === 'function') {
81
+ this.tokenUsage = tokenCounter.getTokenUsage();
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Display formatted token usage to console
87
+ */
88
+ display() {
89
+ if (!this.tokenUsage) {
90
+ return;
91
+ }
92
+
93
+ const formatted = this.format(this.tokenUsage);
94
+
95
+ console.log(chalk.cyan('\nšŸ”¢ Token Usage Summary:'));
96
+ console.log(chalk.gray('───────────────────────'));
97
+
98
+ // Current request tokens
99
+ if (formatted.current.total > 0) {
100
+ console.log(chalk.blue('šŸ“ Current Request:'));
101
+ console.log(` Input: ${chalk.yellow(formatted.current.request)} tokens`);
102
+ console.log(` Output: ${chalk.yellow(formatted.current.response)} tokens`);
103
+ console.log(` Total: ${chalk.yellow(formatted.current.total)} tokens`);
104
+
105
+ // Cache info for current request
106
+ if (formatted.current.cache.total > 0) {
107
+ console.log(` Cache: ${chalk.green(formatted.current.cache.read)} read, ${chalk.green(formatted.current.cache.write)} write`);
108
+ }
109
+ }
110
+
111
+ // Session totals
112
+ console.log(chalk.blue('\nšŸ“Š Session Total:'));
113
+ console.log(` Input: ${chalk.yellow(formatted.total.request)} tokens`);
114
+ console.log(` Output: ${chalk.yellow(formatted.total.response)} tokens`);
115
+ console.log(` Total: ${chalk.yellow(formatted.total.total)} tokens`);
116
+
117
+ // Cache totals
118
+ if (formatted.total.cache.total > 0) {
119
+ console.log(` Cache: ${chalk.green(formatted.total.cache.read)} read, ${chalk.green(formatted.total.cache.write)} write`);
120
+ }
121
+
122
+ // Context window
123
+ console.log(` Context: ${chalk.magenta(formatted.contextWindow)} tokens`);
124
+
125
+ console.log(chalk.gray('───────────────────────\n'));
126
+ }
127
+
128
+ /**
129
+ * Clear stored token usage data
130
+ */
131
+ clear() {
132
+ this.tokenUsage = null;
133
+ }
134
+ }