@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.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- 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
|
+
}
|