codevault 1.8.3 → 1.8.5
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 +33 -5
- package/dist/chunking/file-grouper.d.ts +1 -1
- package/dist/chunking/file-grouper.d.ts.map +1 -1
- package/dist/chunking/file-grouper.js +3 -3
- package/dist/chunking/file-grouper.js.map +1 -1
- package/dist/chunking/semantic-chunker.d.ts +1 -1
- package/dist/chunking/semantic-chunker.d.ts.map +1 -1
- package/dist/chunking/token-counter.d.ts +1 -1
- package/dist/chunking/token-counter.d.ts.map +1 -1
- package/dist/chunking/token-counter.js +16 -10
- package/dist/chunking/token-counter.js.map +1 -1
- package/dist/cli/commands/ask-cmd.js +15 -15
- package/dist/cli/commands/ask-cmd.js.map +1 -1
- package/dist/cli/commands/chat-cmd.d.ts.map +1 -1
- package/dist/cli/commands/chat-cmd.js +40 -40
- package/dist/cli/commands/chat-cmd.js.map +1 -1
- package/dist/cli/commands/config-cmd.d.ts.map +1 -1
- package/dist/cli/commands/config-cmd.js +61 -52
- package/dist/cli/commands/config-cmd.js.map +1 -1
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +20 -11
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/index-cmd.d.ts.map +1 -1
- package/dist/cli/commands/index-cmd.js +109 -85
- package/dist/cli/commands/index-cmd.js.map +1 -1
- package/dist/cli/commands/info-cmd.d.ts.map +1 -1
- package/dist/cli/commands/info-cmd.js +12 -11
- package/dist/cli/commands/info-cmd.js.map +1 -1
- package/dist/cli/commands/interactive-config.d.ts.map +1 -1
- package/dist/cli/commands/interactive-config.js +60 -20
- package/dist/cli/commands/interactive-config.js.map +1 -1
- package/dist/cli/commands/search-cmd.d.ts.map +1 -1
- package/dist/cli/commands/search-cmd.js +22 -11
- package/dist/cli/commands/search-cmd.js.map +1 -1
- package/dist/cli/commands/search-with-code-cmd.d.ts.map +1 -1
- package/dist/cli/commands/search-with-code-cmd.js +25 -16
- package/dist/cli/commands/search-with-code-cmd.js.map +1 -1
- package/dist/cli/commands/update-cmd.d.ts.map +1 -1
- package/dist/cli/commands/update-cmd.js +16 -7
- package/dist/cli/commands/update-cmd.js.map +1 -1
- package/dist/cli/commands/watch-cmd.d.ts.map +1 -1
- package/dist/cli/commands/watch-cmd.js +21 -11
- package/dist/cli/commands/watch-cmd.js.map +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils.d.ts +56 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +98 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/cli.js +0 -0
- package/dist/codemap/io.js.map +1 -1
- package/dist/config/constants.d.ts +4 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/context/packs.d.ts +2 -2
- package/dist/context/packs.d.ts.map +1 -1
- package/dist/context/packs.js +7 -4
- package/dist/context/packs.js.map +1 -1
- package/dist/core/IndexerEngine.d.ts +2 -0
- package/dist/core/IndexerEngine.d.ts.map +1 -1
- package/dist/core/IndexerEngine.js +34 -26
- package/dist/core/IndexerEngine.js.map +1 -1
- package/dist/core/SearchService.d.ts +2 -1
- package/dist/core/SearchService.d.ts.map +1 -1
- package/dist/core/SearchService.js +25 -18
- package/dist/core/SearchService.js.map +1 -1
- package/dist/core/batch-indexer.d.ts +4 -3
- package/dist/core/batch-indexer.d.ts.map +1 -1
- package/dist/core/batch-indexer.js +32 -35
- package/dist/core/batch-indexer.js.map +1 -1
- package/dist/core/indexing/FileProcessor.d.ts +1 -0
- package/dist/core/indexing/FileProcessor.d.ts.map +1 -1
- package/dist/core/indexing/FileProcessor.js +32 -9
- package/dist/core/indexing/FileProcessor.js.map +1 -1
- package/dist/core/indexing/IndexContext.d.ts +6 -4
- package/dist/core/indexing/IndexContext.d.ts.map +1 -1
- package/dist/core/indexing/IndexContext.js +3 -3
- package/dist/core/indexing/IndexContext.js.map +1 -1
- package/dist/core/indexing/IndexFinalizationStage.d.ts +6 -1
- package/dist/core/indexing/IndexFinalizationStage.d.ts.map +1 -1
- package/dist/core/indexing/IndexFinalizationStage.js +22 -3
- package/dist/core/indexing/IndexFinalizationStage.js.map +1 -1
- package/dist/core/indexing/IndexState.d.ts +3 -8
- package/dist/core/indexing/IndexState.d.ts.map +1 -1
- package/dist/core/indexing/IndexState.js.map +1 -1
- package/dist/core/indexing/PersistManager.d.ts +1 -1
- package/dist/core/indexing/PersistManager.d.ts.map +1 -1
- package/dist/core/indexing/PersistManager.js +17 -17
- package/dist/core/indexing/PersistManager.js.map +1 -1
- package/dist/core/indexing/chunk-pipeline.d.ts +33 -7
- package/dist/core/indexing/chunk-pipeline.d.ts.map +1 -1
- package/dist/core/indexing/chunk-pipeline.js +20 -8
- package/dist/core/indexing/chunk-pipeline.js.map +1 -1
- package/dist/core/metadata.d.ts +1 -1
- package/dist/core/metadata.d.ts.map +1 -1
- package/dist/core/metadata.js +1 -1
- package/dist/core/metadata.js.map +1 -1
- package/dist/core/search/CandidateRetriever.d.ts +1 -1
- package/dist/core/search/CandidateRetriever.d.ts.map +1 -1
- package/dist/core/search/CandidateRetriever.js +7 -5
- package/dist/core/search/CandidateRetriever.js.map +1 -1
- package/dist/core/search/HybridFusion.d.ts +1 -2
- package/dist/core/search/HybridFusion.d.ts.map +1 -1
- package/dist/core/search/HybridFusion.js +5 -17
- package/dist/core/search/HybridFusion.js.map +1 -1
- package/dist/core/search/ResultMapper.d.ts +0 -1
- package/dist/core/search/ResultMapper.d.ts.map +1 -1
- package/dist/core/search/ResultMapper.js +3 -14
- package/dist/core/search/ResultMapper.js.map +1 -1
- package/dist/core/search/SearchContextManager.d.ts +4 -1
- package/dist/core/search/SearchContextManager.d.ts.map +1 -1
- package/dist/core/search/SearchContextManager.js +19 -6
- package/dist/core/search/SearchContextManager.js.map +1 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +9 -4
- package/dist/core/search.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/database/db.d.ts +14 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +14 -14
- package/dist/database/db.js.map +1 -1
- package/dist/indexer/merkle.js +1 -1
- package/dist/indexer/merkle.js.map +1 -1
- package/dist/languages/rules.d.ts +2 -1
- package/dist/languages/rules.d.ts.map +1 -1
- package/dist/languages/rules.js +14 -5
- package/dist/languages/rules.js.map +1 -1
- package/dist/languages/tree-sitter-loader.d.ts +24 -24
- package/dist/languages/tree-sitter-loader.d.ts.map +1 -1
- package/dist/languages/tree-sitter-loader.js +14 -10
- package/dist/languages/tree-sitter-loader.js.map +1 -1
- package/dist/mcp/handlers/context.d.ts +5 -11
- package/dist/mcp/handlers/context.d.ts.map +1 -1
- package/dist/mcp/handlers/context.js.map +1 -1
- package/dist/mcp/handlers/project.d.ts +9 -27
- package/dist/mcp/handlers/project.d.ts.map +1 -1
- package/dist/mcp/handlers/search.d.ts +24 -18
- package/dist/mcp/handlers/search.d.ts.map +1 -1
- package/dist/mcp/handlers/search.js +8 -2
- package/dist/mcp/handlers/search.js.map +1 -1
- package/dist/mcp/handlers/synthesis.d.ts +15 -11
- package/dist/mcp/handlers/synthesis.d.ts.map +1 -1
- package/dist/mcp/handlers/synthesis.js +4 -1
- package/dist/mcp/handlers/synthesis.js.map +1 -1
- package/dist/mcp/schemas.d.ts +2 -2
- package/dist/mcp/tools/ask-codebase.d.ts +10 -28
- package/dist/mcp/tools/ask-codebase.d.ts.map +1 -1
- package/dist/mcp/tools/ask-codebase.js +1 -1
- package/dist/mcp/tools/ask-codebase.js.map +1 -1
- package/dist/mcp/tools/use-context-pack.d.ts +14 -23
- package/dist/mcp/tools/use-context-pack.d.ts.map +1 -1
- package/dist/mcp/tools/use-context-pack.js +4 -3
- package/dist/mcp/tools/use-context-pack.js.map +1 -1
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +39 -24
- package/dist/mcp-server.js.map +1 -1
- package/dist/providers/base.d.ts +3 -2
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +3 -10
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/chat-llm.d.ts +3 -2
- package/dist/providers/chat-llm.d.ts.map +1 -1
- package/dist/providers/chat-llm.js +13 -9
- package/dist/providers/chat-llm.js.map +1 -1
- package/dist/providers/mock.d.ts.map +1 -1
- package/dist/providers/mock.js +6 -5
- package/dist/providers/mock.js.map +1 -1
- package/dist/providers/openai.d.ts +2 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +15 -19
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/token-counter.d.ts.map +1 -1
- package/dist/providers/token-counter.js +11 -3
- package/dist/providers/token-counter.js.map +1 -1
- package/dist/ranking/api-reranker.d.ts +1 -1
- package/dist/ranking/api-reranker.d.ts.map +1 -1
- package/dist/ranking/api-reranker.js +50 -13
- package/dist/ranking/api-reranker.js.map +1 -1
- package/dist/ranking/symbol-boost.d.ts.map +1 -1
- package/dist/ranking/symbol-boost.js +4 -11
- package/dist/ranking/symbol-boost.js.map +1 -1
- package/dist/search/bm25.d.ts +10 -0
- package/dist/search/bm25.d.ts.map +1 -1
- package/dist/search/bm25.js +16 -0
- package/dist/search/bm25.js.map +1 -1
- package/dist/search/hybrid.js.map +1 -1
- package/dist/search/scope.d.ts.map +1 -1
- package/dist/search/scope.js +3 -2
- package/dist/search/scope.js.map +1 -1
- package/dist/storage/encrypted-chunks.d.ts +3 -0
- package/dist/storage/encrypted-chunks.d.ts.map +1 -1
- package/dist/storage/encrypted-chunks.js +126 -47
- package/dist/storage/encrypted-chunks.js.map +1 -1
- package/dist/symbols/extract.d.ts.map +1 -1
- package/dist/symbols/extract.js +3 -2
- package/dist/symbols/extract.js.map +1 -1
- package/dist/symbols/graph.d.ts.map +1 -1
- package/dist/symbols/graph.js +14 -8
- package/dist/symbols/graph.js.map +1 -1
- package/dist/synthesis/conversational-synthesizer.d.ts +2 -1
- package/dist/synthesis/conversational-synthesizer.d.ts.map +1 -1
- package/dist/synthesis/conversational-synthesizer.js +6 -1
- package/dist/synthesis/conversational-synthesizer.js.map +1 -1
- package/dist/synthesis/markdown-formatter.d.ts.map +1 -1
- package/dist/synthesis/markdown-formatter.js +1 -1
- package/dist/synthesis/markdown-formatter.js.map +1 -1
- package/dist/synthesis/prompt-builder.d.ts.map +1 -1
- package/dist/synthesis/prompt-builder.js +42 -15
- package/dist/synthesis/prompt-builder.js.map +1 -1
- package/dist/synthesis/synthesizer.d.ts.map +1 -1
- package/dist/synthesis/synthesizer.js +23 -10
- package/dist/synthesis/synthesizer.js.map +1 -1
- package/dist/tests/api-reranker.test.d.ts +2 -0
- package/dist/tests/api-reranker.test.d.ts.map +1 -0
- package/dist/tests/api-reranker.test.js +575 -0
- package/dist/tests/api-reranker.test.js.map +1 -0
- package/dist/tests/bm25.test.d.ts +2 -0
- package/dist/tests/bm25.test.d.ts.map +1 -0
- package/dist/tests/bm25.test.js +340 -0
- package/dist/tests/bm25.test.js.map +1 -0
- package/dist/tests/chunking/file-grouper.test.d.ts +2 -0
- package/dist/tests/chunking/file-grouper.test.d.ts.map +1 -0
- package/dist/tests/chunking/file-grouper.test.js +495 -0
- package/dist/tests/chunking/file-grouper.test.js.map +1 -0
- package/dist/tests/chunking/semantic-chunker.test.d.ts +2 -0
- package/dist/tests/chunking/semantic-chunker.test.d.ts.map +1 -0
- package/dist/tests/chunking/semantic-chunker.test.js +509 -0
- package/dist/tests/chunking/semantic-chunker.test.js.map +1 -0
- package/dist/tests/chunking/token-counter.test.d.ts +2 -0
- package/dist/tests/chunking/token-counter.test.d.ts.map +1 -0
- package/dist/tests/chunking/token-counter.test.js +441 -0
- package/dist/tests/chunking/token-counter.test.js.map +1 -0
- package/dist/tests/cli/ask-cmd.test.d.ts +2 -0
- package/dist/tests/cli/ask-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/ask-cmd.test.js +152 -0
- package/dist/tests/cli/ask-cmd.test.js.map +1 -0
- package/dist/tests/cli/chat-cmd.test.d.ts +2 -0
- package/dist/tests/cli/chat-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/chat-cmd.test.js +118 -0
- package/dist/tests/cli/chat-cmd.test.js.map +1 -0
- package/dist/tests/cli/config-cmd.test.d.ts +2 -0
- package/dist/tests/cli/config-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/config-cmd.test.js +226 -0
- package/dist/tests/cli/config-cmd.test.js.map +1 -0
- package/dist/tests/cli/context.test.d.ts +2 -0
- package/dist/tests/cli/context.test.d.ts.map +1 -0
- package/dist/tests/cli/context.test.js +158 -0
- package/dist/tests/cli/context.test.js.map +1 -0
- package/dist/tests/cli/index-cmd.test.d.ts +2 -0
- package/dist/tests/cli/index-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/index-cmd.test.js +89 -0
- package/dist/tests/cli/index-cmd.test.js.map +1 -0
- package/dist/tests/cli/index.test.d.ts +2 -0
- package/dist/tests/cli/index.test.d.ts.map +1 -0
- package/dist/tests/cli/index.test.js +167 -0
- package/dist/tests/cli/index.test.js.map +1 -0
- package/dist/tests/cli/info-cmd.test.d.ts +2 -0
- package/dist/tests/cli/info-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/info-cmd.test.js +47 -0
- package/dist/tests/cli/info-cmd.test.js.map +1 -0
- package/dist/tests/cli/interactive-config.test.d.ts +2 -0
- package/dist/tests/cli/interactive-config.test.d.ts.map +1 -0
- package/dist/tests/cli/interactive-config.test.js +30 -0
- package/dist/tests/cli/interactive-config.test.js.map +1 -0
- package/dist/tests/cli/mcp-cmd.test.d.ts +2 -0
- package/dist/tests/cli/mcp-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/mcp-cmd.test.js +47 -0
- package/dist/tests/cli/mcp-cmd.test.js.map +1 -0
- package/dist/tests/cli/search-cmd.test.d.ts +2 -0
- package/dist/tests/cli/search-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/search-cmd.test.js +120 -0
- package/dist/tests/cli/search-cmd.test.js.map +1 -0
- package/dist/tests/cli/search-with-code-cmd.test.d.ts +2 -0
- package/dist/tests/cli/search-with-code-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/search-with-code-cmd.test.js +140 -0
- package/dist/tests/cli/search-with-code-cmd.test.js.map +1 -0
- package/dist/tests/cli/update-cmd.test.d.ts +2 -0
- package/dist/tests/cli/update-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/update-cmd.test.js +75 -0
- package/dist/tests/cli/update-cmd.test.js.map +1 -0
- package/dist/tests/cli/utils.test.d.ts +2 -0
- package/dist/tests/cli/utils.test.d.ts.map +1 -0
- package/dist/tests/cli/utils.test.js +119 -0
- package/dist/tests/cli/utils.test.js.map +1 -0
- package/dist/tests/cli/watch-cmd.test.d.ts +2 -0
- package/dist/tests/cli/watch-cmd.test.d.ts.map +1 -0
- package/dist/tests/cli/watch-cmd.test.js +84 -0
- package/dist/tests/cli/watch-cmd.test.js.map +1 -0
- package/dist/tests/cli-ui.test.d.ts +2 -0
- package/dist/tests/cli-ui.test.d.ts.map +1 -0
- package/dist/tests/cli-ui.test.js +608 -0
- package/dist/tests/cli-ui.test.js.map +1 -0
- package/dist/tests/codemap-io.test.d.ts +2 -0
- package/dist/tests/codemap-io.test.d.ts.map +1 -0
- package/dist/tests/codemap-io.test.js +992 -0
- package/dist/tests/codemap-io.test.js.map +1 -0
- package/dist/tests/config/apply-env.test.d.ts +2 -0
- package/dist/tests/config/apply-env.test.d.ts.map +1 -0
- package/dist/tests/config/apply-env.test.js +717 -0
- package/dist/tests/config/apply-env.test.js.map +1 -0
- package/dist/tests/config/constants.test.d.ts +2 -0
- package/dist/tests/config/constants.test.d.ts.map +1 -0
- package/dist/tests/config/constants.test.js +406 -0
- package/dist/tests/config/constants.test.js.map +1 -0
- package/dist/tests/config/loader.test.d.ts +2 -0
- package/dist/tests/config/loader.test.d.ts.map +1 -0
- package/dist/tests/config/loader.test.js +716 -0
- package/dist/tests/config/loader.test.js.map +1 -0
- package/dist/tests/config/resolver.test.d.ts +2 -0
- package/dist/tests/config/resolver.test.d.ts.map +1 -0
- package/dist/tests/config/resolver.test.js +402 -0
- package/dist/tests/config/resolver.test.js.map +1 -0
- package/dist/tests/config/types.test.d.ts +2 -0
- package/dist/tests/config/types.test.d.ts.map +1 -0
- package/dist/tests/config/types.test.js +460 -0
- package/dist/tests/config/types.test.js.map +1 -0
- package/dist/tests/context-packs.test.d.ts +2 -0
- package/dist/tests/context-packs.test.d.ts.map +1 -0
- package/dist/tests/context-packs.test.js +826 -0
- package/dist/tests/context-packs.test.js.map +1 -0
- package/dist/tests/conversational-synthesizer.test.d.ts +2 -0
- package/dist/tests/conversational-synthesizer.test.d.ts.map +1 -0
- package/dist/tests/conversational-synthesizer.test.js +595 -0
- package/dist/tests/conversational-synthesizer.test.js.map +1 -0
- package/dist/tests/database.test.d.ts +2 -0
- package/dist/tests/database.test.d.ts.map +1 -0
- package/dist/tests/database.test.js +965 -0
- package/dist/tests/database.test.js.map +1 -0
- package/dist/tests/encrypted-chunks.test.d.ts +2 -0
- package/dist/tests/encrypted-chunks.test.d.ts.map +1 -0
- package/dist/tests/encrypted-chunks.test.js +1470 -0
- package/dist/tests/encrypted-chunks.test.js.map +1 -0
- package/dist/tests/hybrid.test.d.ts +2 -0
- package/dist/tests/hybrid.test.d.ts.map +1 -0
- package/dist/tests/hybrid.test.js +456 -0
- package/dist/tests/hybrid.test.js.map +1 -0
- package/dist/tests/indexer/ChangeQueue.test.d.ts +12 -0
- package/dist/tests/indexer/ChangeQueue.test.d.ts.map +1 -0
- package/dist/tests/indexer/ChangeQueue.test.js +441 -0
- package/dist/tests/indexer/ChangeQueue.test.js.map +1 -0
- package/dist/tests/indexer/ProviderManager.test.d.ts +12 -0
- package/dist/tests/indexer/ProviderManager.test.d.ts.map +1 -0
- package/dist/tests/indexer/ProviderManager.test.js +290 -0
- package/dist/tests/indexer/ProviderManager.test.js.map +1 -0
- package/dist/tests/indexer/WatchService.test.d.ts +14 -0
- package/dist/tests/indexer/WatchService.test.d.ts.map +1 -0
- package/dist/tests/indexer/WatchService.test.js +667 -0
- package/dist/tests/indexer/WatchService.test.js.map +1 -0
- package/dist/tests/indexer/merkle.test.d.ts +11 -0
- package/dist/tests/indexer/merkle.test.d.ts.map +1 -0
- package/dist/tests/indexer/merkle.test.js +497 -0
- package/dist/tests/indexer/merkle.test.js.map +1 -0
- package/dist/tests/indexer/update.test.d.ts +10 -0
- package/dist/tests/indexer/update.test.d.ts.map +1 -0
- package/dist/tests/indexer/update.test.js +317 -0
- package/dist/tests/indexer/update.test.js.map +1 -0
- package/dist/tests/indexer/watch.test.d.ts +8 -0
- package/dist/tests/indexer/watch.test.d.ts.map +1 -0
- package/dist/tests/indexer/watch.test.js +95 -0
- package/dist/tests/indexer/watch.test.js.map +1 -0
- package/dist/tests/integration/index-search.integration.test.js +6 -4
- package/dist/tests/integration/index-search.integration.test.js.map +1 -1
- package/dist/tests/languages.test.d.ts +2 -0
- package/dist/tests/languages.test.d.ts.map +1 -0
- package/dist/tests/languages.test.js +575 -0
- package/dist/tests/languages.test.js.map +1 -0
- package/dist/tests/logger-redaction.test.d.ts +2 -0
- package/dist/tests/logger-redaction.test.d.ts.map +1 -0
- package/dist/tests/logger-redaction.test.js +48 -0
- package/dist/tests/logger-redaction.test.js.map +1 -0
- package/dist/tests/logger.test.d.ts +2 -0
- package/dist/tests/logger.test.d.ts.map +1 -0
- package/dist/tests/logger.test.js +468 -0
- package/dist/tests/logger.test.js.map +1 -0
- package/dist/tests/markdown-formatter.test.d.ts +2 -0
- package/dist/tests/markdown-formatter.test.d.ts.map +1 -0
- package/dist/tests/markdown-formatter.test.js +453 -0
- package/dist/tests/markdown-formatter.test.js.map +1 -0
- package/dist/tests/mcp/tools/use-context-pack.test.d.ts +7 -0
- package/dist/tests/mcp/tools/use-context-pack.test.d.ts.map +1 -0
- package/dist/tests/mcp/tools/use-context-pack.test.js +505 -0
- package/dist/tests/mcp/tools/use-context-pack.test.js.map +1 -0
- package/dist/tests/mutex.test.d.ts +2 -0
- package/dist/tests/mutex.test.d.ts.map +1 -0
- package/dist/tests/mutex.test.js +489 -0
- package/dist/tests/mutex.test.js.map +1 -0
- package/dist/tests/path-helpers.test.d.ts +2 -0
- package/dist/tests/path-helpers.test.d.ts.map +1 -0
- package/dist/tests/path-helpers.test.js +332 -0
- package/dist/tests/path-helpers.test.js.map +1 -0
- package/dist/tests/prompt-builder.test.d.ts +2 -0
- package/dist/tests/prompt-builder.test.d.ts.map +1 -0
- package/dist/tests/prompt-builder.test.js +417 -0
- package/dist/tests/prompt-builder.test.js.map +1 -0
- package/dist/tests/providers/base.test.d.ts +2 -0
- package/dist/tests/providers/base.test.d.ts.map +1 -0
- package/dist/tests/providers/base.test.js +299 -0
- package/dist/tests/providers/base.test.js.map +1 -0
- package/dist/tests/providers/chat-llm.test.d.ts +2 -0
- package/dist/tests/providers/chat-llm.test.d.ts.map +1 -0
- package/dist/tests/providers/chat-llm.test.js +435 -0
- package/dist/tests/providers/chat-llm.test.js.map +1 -0
- package/dist/tests/providers/index.test.d.ts +2 -0
- package/dist/tests/providers/index.test.d.ts.map +1 -0
- package/dist/tests/providers/index.test.js +204 -0
- package/dist/tests/providers/index.test.js.map +1 -0
- package/dist/tests/providers/mock.test.d.ts +2 -0
- package/dist/tests/providers/mock.test.d.ts.map +1 -0
- package/dist/tests/providers/mock.test.js +225 -0
- package/dist/tests/providers/mock.test.js.map +1 -0
- package/dist/tests/providers/openai.test.d.ts +2 -0
- package/dist/tests/providers/openai.test.d.ts.map +1 -0
- package/dist/tests/providers/openai.test.js +408 -0
- package/dist/tests/providers/openai.test.js.map +1 -0
- package/dist/tests/providers/token-counter.test.d.ts +2 -0
- package/dist/tests/providers/token-counter.test.d.ts.map +1 -0
- package/dist/tests/providers/token-counter.test.js +247 -0
- package/dist/tests/providers/token-counter.test.js.map +1 -0
- package/dist/tests/rate-limiter.test.js +392 -1
- package/dist/tests/rate-limiter.test.js.map +1 -1
- package/dist/tests/scope.test.d.ts +2 -0
- package/dist/tests/scope.test.d.ts.map +1 -0
- package/dist/tests/scope.test.js +529 -0
- package/dist/tests/scope.test.js.map +1 -0
- package/dist/tests/search-normalization.test.js.map +1 -1
- package/dist/tests/semantic-chunker.test.js.map +1 -1
- package/dist/tests/simple-lru.test.js +377 -0
- package/dist/tests/simple-lru.test.js.map +1 -1
- package/dist/tests/symbol-boost.test.js +730 -10
- package/dist/tests/symbol-boost.test.js.map +1 -1
- package/dist/tests/symbols-extract.test.d.ts +2 -0
- package/dist/tests/symbols-extract.test.d.ts.map +1 -0
- package/dist/tests/symbols-extract.test.js +536 -0
- package/dist/tests/symbols-extract.test.js.map +1 -0
- package/dist/tests/symbols-graph.test.d.ts +2 -0
- package/dist/tests/symbols-graph.test.d.ts.map +1 -0
- package/dist/tests/symbols-graph.test.js +656 -0
- package/dist/tests/symbols-graph.test.js.map +1 -0
- package/dist/tests/synthesizer.test.d.ts +2 -0
- package/dist/tests/synthesizer.test.d.ts.map +1 -0
- package/dist/tests/synthesizer.test.js +381 -0
- package/dist/tests/synthesizer.test.js.map +1 -0
- package/dist/types/codemap.d.ts +2 -2
- package/dist/types/codemap.d.ts.map +1 -1
- package/dist/types/codemap.js +17 -9
- package/dist/types/codemap.js.map +1 -1
- package/dist/types/context-pack.d.ts +5 -5
- package/dist/types/context-pack.d.ts.map +1 -1
- package/dist/types/context-pack.js +6 -3
- package/dist/types/context-pack.js.map +1 -1
- package/dist/utils/cli-ui.d.ts +1 -1
- package/dist/utils/cli-ui.d.ts.map +1 -1
- package/dist/utils/cli-ui.js +26 -26
- package/dist/utils/cli-ui.js.map +1 -1
- package/dist/utils/indexer-with-progress.d.ts.map +1 -1
- package/dist/utils/indexer-with-progress.js +0 -6
- package/dist/utils/indexer-with-progress.js.map +1 -1
- package/dist/utils/logger.d.ts +10 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +158 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mutex.d.ts +7 -2
- package/dist/utils/mutex.d.ts.map +1 -1
- package/dist/utils/mutex.js +35 -7
- package/dist/utils/mutex.js.map +1 -1
- package/dist/utils/path-helpers.d.ts.map +1 -1
- package/dist/utils/path-helpers.js +5 -2
- package/dist/utils/path-helpers.js.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +23 -4
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/simple-lru.d.ts +6 -0
- package/dist/utils/simple-lru.d.ts.map +1 -1
- package/dist/utils/simple-lru.js +26 -0
- package/dist/utils/simple-lru.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { analyzeCodeSize, batchAnalyzeCodeSize, getTokenCountStats, resetTokenCountStats, clearTokenCache } from '../../chunking/token-counter.js';
|
|
4
|
+
// Size limits for testing
|
|
5
|
+
const standardLimits = {
|
|
6
|
+
min: 50,
|
|
7
|
+
max: 500,
|
|
8
|
+
optimal: 300
|
|
9
|
+
};
|
|
10
|
+
const smallLimits = {
|
|
11
|
+
min: 10,
|
|
12
|
+
max: 100,
|
|
13
|
+
optimal: 50
|
|
14
|
+
};
|
|
15
|
+
// Simple synchronous token counter (1 char = 1 token for simplicity)
|
|
16
|
+
const syncTokenCounter = (text) => text.length;
|
|
17
|
+
// Async token counter
|
|
18
|
+
const asyncTokenCounter = async (text) => {
|
|
19
|
+
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
20
|
+
return text.length;
|
|
21
|
+
};
|
|
22
|
+
// Token counter that returns 4 chars per token
|
|
23
|
+
const standardTokenCounter = (text) => Math.ceil(text.length / 4);
|
|
24
|
+
// Reset stats before each test
|
|
25
|
+
test.beforeEach(() => {
|
|
26
|
+
resetTokenCountStats();
|
|
27
|
+
clearTokenCache();
|
|
28
|
+
});
|
|
29
|
+
// -------------------------------------------------------------------
|
|
30
|
+
// Tests for analyzeCodeSize
|
|
31
|
+
// -------------------------------------------------------------------
|
|
32
|
+
test('analyzeCodeSize returns too_small for code below min threshold', async () => {
|
|
33
|
+
const code = 'x'.repeat(20); // Below min of 50
|
|
34
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
35
|
+
assert.equal(result.decision, 'too_small');
|
|
36
|
+
assert.equal(result.size, 20);
|
|
37
|
+
assert.equal(result.method, 'tokenized');
|
|
38
|
+
});
|
|
39
|
+
test('analyzeCodeSize returns too_large for code above max threshold', async () => {
|
|
40
|
+
const code = 'x'.repeat(600); // Above max of 500
|
|
41
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
42
|
+
assert.equal(result.decision, 'too_large');
|
|
43
|
+
assert.equal(result.size, 600);
|
|
44
|
+
assert.equal(result.method, 'tokenized');
|
|
45
|
+
});
|
|
46
|
+
test('analyzeCodeSize returns optimal for code within optimal range', async () => {
|
|
47
|
+
const code = 'x'.repeat(250); // Below optimal of 300
|
|
48
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
49
|
+
assert.equal(result.decision, 'optimal');
|
|
50
|
+
assert.equal(result.size, 250);
|
|
51
|
+
});
|
|
52
|
+
test('analyzeCodeSize returns needs_tokenization for code between optimal and max', async () => {
|
|
53
|
+
const code = 'x'.repeat(400); // Above optimal (300) but below max (500)
|
|
54
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
55
|
+
assert.equal(result.decision, 'needs_tokenization');
|
|
56
|
+
assert.equal(result.size, 400);
|
|
57
|
+
});
|
|
58
|
+
test('analyzeCodeSize uses char estimate for too_large with allowEstimateForSkip', async () => {
|
|
59
|
+
// With standard token counter (4 chars = 1 token), we need a lot of chars
|
|
60
|
+
// to exceed the max limit estimate (max * 1.2 = 600 tokens = 2400 chars)
|
|
61
|
+
const code = 'x'.repeat(3000); // Should estimate to ~750 tokens (3000/4)
|
|
62
|
+
const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter, true);
|
|
63
|
+
// When allowEstimateForSkip is true and estimate says too_large, skip tokenization
|
|
64
|
+
assert.equal(result.decision, 'too_large');
|
|
65
|
+
assert.equal(result.method, 'char_estimate');
|
|
66
|
+
});
|
|
67
|
+
test('analyzeCodeSize does not skip tokenization without allowEstimateForSkip', async () => {
|
|
68
|
+
const code = 'x'.repeat(3000);
|
|
69
|
+
const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter, false);
|
|
70
|
+
// Should still tokenize
|
|
71
|
+
assert.equal(result.method, 'tokenized');
|
|
72
|
+
});
|
|
73
|
+
test('analyzeCodeSize works with async token counter', async () => {
|
|
74
|
+
const code = 'x'.repeat(100);
|
|
75
|
+
const result = await analyzeCodeSize(code, standardLimits, asyncTokenCounter);
|
|
76
|
+
assert.equal(result.size, 100);
|
|
77
|
+
assert.equal(result.method, 'tokenized');
|
|
78
|
+
});
|
|
79
|
+
test('analyzeCodeSize uses cache for repeated calls', async () => {
|
|
80
|
+
const code = 'exact same code';
|
|
81
|
+
// First call
|
|
82
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
83
|
+
// Second call with same code should use cache
|
|
84
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
85
|
+
const stats = getTokenCountStats();
|
|
86
|
+
assert.ok(stats.cacheHits >= 1, 'Should have cache hits');
|
|
87
|
+
});
|
|
88
|
+
test('analyzeCodeSize falls back to estimate on tokenization error', async () => {
|
|
89
|
+
const code = 'test code';
|
|
90
|
+
const failingCounter = () => {
|
|
91
|
+
throw new Error('Tokenization failed');
|
|
92
|
+
};
|
|
93
|
+
const result = await analyzeCodeSize(code, standardLimits, failingCounter);
|
|
94
|
+
// Should fall back to character estimation
|
|
95
|
+
// Estimate: ceil(9/4) = 3 tokens, which is too_small
|
|
96
|
+
assert.ok(result.size > 0);
|
|
97
|
+
});
|
|
98
|
+
test('analyzeCodeSize handles empty code', async () => {
|
|
99
|
+
const result = await analyzeCodeSize('', standardLimits, syncTokenCounter);
|
|
100
|
+
assert.equal(result.size, 0);
|
|
101
|
+
assert.equal(result.decision, 'too_small');
|
|
102
|
+
});
|
|
103
|
+
test('analyzeCodeSize handles boundary values exactly at min', async () => {
|
|
104
|
+
const code = 'x'.repeat(50); // Exactly at min
|
|
105
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
106
|
+
// At or above min but at or below optimal = optimal
|
|
107
|
+
assert.equal(result.decision, 'optimal');
|
|
108
|
+
});
|
|
109
|
+
test('analyzeCodeSize handles boundary values exactly at max', async () => {
|
|
110
|
+
const code = 'x'.repeat(500); // Exactly at max
|
|
111
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
112
|
+
// Above optimal (300) but at max (500) = needs_tokenization
|
|
113
|
+
assert.equal(result.decision, 'needs_tokenization');
|
|
114
|
+
});
|
|
115
|
+
test('analyzeCodeSize handles boundary values exactly at optimal', async () => {
|
|
116
|
+
const code = 'x'.repeat(300); // Exactly at optimal
|
|
117
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
118
|
+
assert.equal(result.decision, 'optimal');
|
|
119
|
+
});
|
|
120
|
+
test('analyzeCodeSize handles one character above max', async () => {
|
|
121
|
+
const code = 'x'.repeat(501);
|
|
122
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
123
|
+
assert.equal(result.decision, 'too_large');
|
|
124
|
+
});
|
|
125
|
+
test('analyzeCodeSize handles one character below min', async () => {
|
|
126
|
+
const code = 'x'.repeat(49);
|
|
127
|
+
const result = await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
128
|
+
assert.equal(result.decision, 'too_small');
|
|
129
|
+
});
|
|
130
|
+
// -------------------------------------------------------------------
|
|
131
|
+
// Tests for batchAnalyzeCodeSize
|
|
132
|
+
// -------------------------------------------------------------------
|
|
133
|
+
test('batchAnalyzeCodeSize analyzes multiple code snippets', async () => {
|
|
134
|
+
const snippets = [
|
|
135
|
+
'x'.repeat(30), // too_small
|
|
136
|
+
'x'.repeat(200), // optimal
|
|
137
|
+
'x'.repeat(400), // needs_tokenization
|
|
138
|
+
'x'.repeat(600) // too_large
|
|
139
|
+
];
|
|
140
|
+
const results = await batchAnalyzeCodeSize(snippets, standardLimits, syncTokenCounter);
|
|
141
|
+
assert.equal(results.length, 4);
|
|
142
|
+
assert.equal(results[0].decision, 'too_small');
|
|
143
|
+
assert.equal(results[1].decision, 'optimal');
|
|
144
|
+
assert.equal(results[2].decision, 'needs_tokenization');
|
|
145
|
+
assert.equal(results[3].decision, 'too_large');
|
|
146
|
+
});
|
|
147
|
+
test('batchAnalyzeCodeSize uses char estimate for large items with allowEstimateForSkip', async () => {
|
|
148
|
+
const snippets = [
|
|
149
|
+
'x'.repeat(100), // Normal
|
|
150
|
+
'x'.repeat(3000), // Very large, should use estimate
|
|
151
|
+
'x'.repeat(200) // Normal
|
|
152
|
+
];
|
|
153
|
+
const results = await batchAnalyzeCodeSize(snippets, standardLimits, standardTokenCounter, true);
|
|
154
|
+
assert.equal(results.length, 3);
|
|
155
|
+
// The very large one should use char_estimate
|
|
156
|
+
const largeResult = results[1];
|
|
157
|
+
assert.equal(largeResult.method, 'char_estimate');
|
|
158
|
+
assert.equal(largeResult.decision, 'too_large');
|
|
159
|
+
});
|
|
160
|
+
test('batchAnalyzeCodeSize returns results in correct order', async () => {
|
|
161
|
+
const snippets = ['a', 'bb', 'ccc', 'dddd', 'eeeee'];
|
|
162
|
+
const results = await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
|
|
163
|
+
assert.equal(results.length, 5);
|
|
164
|
+
assert.equal(results[0].size, 1);
|
|
165
|
+
assert.equal(results[1].size, 2);
|
|
166
|
+
assert.equal(results[2].size, 3);
|
|
167
|
+
assert.equal(results[3].size, 4);
|
|
168
|
+
assert.equal(results[4].size, 5);
|
|
169
|
+
});
|
|
170
|
+
test('batchAnalyzeCodeSize uses cache for subsequent calls', async () => {
|
|
171
|
+
// First batch call
|
|
172
|
+
await batchAnalyzeCodeSize(['test1', 'test2', 'test3'], standardLimits, syncTokenCounter);
|
|
173
|
+
// Reset stats
|
|
174
|
+
resetTokenCountStats();
|
|
175
|
+
// Second batch with same items should hit cache
|
|
176
|
+
await batchAnalyzeCodeSize(['test1', 'test2', 'test3'], standardLimits, syncTokenCounter);
|
|
177
|
+
const stats = getTokenCountStats();
|
|
178
|
+
// All items should be cache hits on second call
|
|
179
|
+
assert.ok(stats.cacheHits >= 3, 'Should have cache hits on second batch call');
|
|
180
|
+
});
|
|
181
|
+
test('batchAnalyzeCodeSize handles empty array', async () => {
|
|
182
|
+
const results = await batchAnalyzeCodeSize([], standardLimits, syncTokenCounter);
|
|
183
|
+
assert.deepEqual(results, []);
|
|
184
|
+
});
|
|
185
|
+
test('batchAnalyzeCodeSize handles single item', async () => {
|
|
186
|
+
const results = await batchAnalyzeCodeSize(['test'], smallLimits, syncTokenCounter);
|
|
187
|
+
assert.equal(results.length, 1);
|
|
188
|
+
});
|
|
189
|
+
test('batchAnalyzeCodeSize works with async token counter', async () => {
|
|
190
|
+
const snippets = ['abc', 'defgh', 'ijklmno'];
|
|
191
|
+
const results = await batchAnalyzeCodeSize(snippets, smallLimits, asyncTokenCounter);
|
|
192
|
+
assert.equal(results.length, 3);
|
|
193
|
+
assert.equal(results[0].size, 3);
|
|
194
|
+
assert.equal(results[1].size, 5);
|
|
195
|
+
assert.equal(results[2].size, 7);
|
|
196
|
+
});
|
|
197
|
+
test('batchAnalyzeCodeSize increments stats correctly', async () => {
|
|
198
|
+
resetTokenCountStats();
|
|
199
|
+
const snippets = ['a', 'b', 'c'];
|
|
200
|
+
await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
|
|
201
|
+
const stats = getTokenCountStats();
|
|
202
|
+
assert.equal(stats.batchTokenizations, 1);
|
|
203
|
+
assert.equal(stats.actualTokenizations, 3);
|
|
204
|
+
});
|
|
205
|
+
test('batchAnalyzeCodeSize handles mixed cached and uncached items', async () => {
|
|
206
|
+
// Pre-cache one item
|
|
207
|
+
await analyzeCodeSize('cached item', standardLimits, syncTokenCounter);
|
|
208
|
+
// Now batch with cached and new items
|
|
209
|
+
const snippets = ['cached item', 'new item 1', 'new item 2'];
|
|
210
|
+
const results = await batchAnalyzeCodeSize(snippets, standardLimits, syncTokenCounter);
|
|
211
|
+
assert.equal(results.length, 3);
|
|
212
|
+
const stats = getTokenCountStats();
|
|
213
|
+
assert.ok(stats.cacheHits >= 1);
|
|
214
|
+
});
|
|
215
|
+
// -------------------------------------------------------------------
|
|
216
|
+
// Tests for getTokenCountStats
|
|
217
|
+
// -------------------------------------------------------------------
|
|
218
|
+
test('getTokenCountStats returns initial zero values after reset', () => {
|
|
219
|
+
resetTokenCountStats();
|
|
220
|
+
const stats = getTokenCountStats();
|
|
221
|
+
assert.equal(stats.totalRequests, 0);
|
|
222
|
+
assert.equal(stats.cacheHits, 0);
|
|
223
|
+
assert.equal(stats.charFilterSkips, 0);
|
|
224
|
+
assert.equal(stats.actualTokenizations, 0);
|
|
225
|
+
assert.equal(stats.batchTokenizations, 0);
|
|
226
|
+
assert.equal(stats.cacheHitRate, '0%');
|
|
227
|
+
assert.equal(stats.charFilterRate, '0%');
|
|
228
|
+
assert.equal(stats.tokenizationRate, '0%');
|
|
229
|
+
});
|
|
230
|
+
test('getTokenCountStats tracks total requests including internal calls', async () => {
|
|
231
|
+
await analyzeCodeSize('test1', standardLimits, syncTokenCounter);
|
|
232
|
+
await analyzeCodeSize('test2', standardLimits, syncTokenCounter);
|
|
233
|
+
await analyzeCodeSize('test3', standardLimits, syncTokenCounter);
|
|
234
|
+
const stats = getTokenCountStats();
|
|
235
|
+
// Implementation increments totalRequests in both analyzeCodeSize and countTokensWithCache
|
|
236
|
+
// So each call increments by 2: once at entry, once in the cache function
|
|
237
|
+
assert.ok(stats.totalRequests >= 3, 'Should track at least 3 requests');
|
|
238
|
+
});
|
|
239
|
+
test('getTokenCountStats calculates cache hit rate', async () => {
|
|
240
|
+
const code = 'repeated code';
|
|
241
|
+
// First call (miss)
|
|
242
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
243
|
+
// Second call (hit)
|
|
244
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
245
|
+
// Third call (hit)
|
|
246
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
247
|
+
const stats = getTokenCountStats();
|
|
248
|
+
// Cache hits occur in countTokensWithCache for the 2nd and 3rd calls
|
|
249
|
+
assert.ok(stats.cacheHits >= 2, 'Should have at least 2 cache hits');
|
|
250
|
+
});
|
|
251
|
+
test('getTokenCountStats calculates char filter rate', async () => {
|
|
252
|
+
// Need to trigger char filter skips
|
|
253
|
+
const veryLargeCode = 'x'.repeat(10000);
|
|
254
|
+
await analyzeCodeSize(veryLargeCode, standardLimits, standardTokenCounter, true);
|
|
255
|
+
await analyzeCodeSize(veryLargeCode, standardLimits, standardTokenCounter, true);
|
|
256
|
+
const stats = getTokenCountStats();
|
|
257
|
+
// All should use char filter
|
|
258
|
+
assert.ok(parseFloat(stats.charFilterRate) > 0);
|
|
259
|
+
});
|
|
260
|
+
test('getTokenCountStats calculates tokenization rate', async () => {
|
|
261
|
+
await analyzeCodeSize('test1', standardLimits, syncTokenCounter);
|
|
262
|
+
await analyzeCodeSize('test2', standardLimits, syncTokenCounter);
|
|
263
|
+
const stats = getTokenCountStats();
|
|
264
|
+
// Both unique, so actualTokenizations should be 2
|
|
265
|
+
assert.equal(stats.actualTokenizations, 2);
|
|
266
|
+
});
|
|
267
|
+
test('getTokenCountStats tracks batch tokenizations', async () => {
|
|
268
|
+
await batchAnalyzeCodeSize(['a', 'b', 'c'], smallLimits, syncTokenCounter);
|
|
269
|
+
await batchAnalyzeCodeSize(['d', 'e'], smallLimits, syncTokenCounter);
|
|
270
|
+
const stats = getTokenCountStats();
|
|
271
|
+
assert.equal(stats.batchTokenizations, 2);
|
|
272
|
+
});
|
|
273
|
+
// -------------------------------------------------------------------
|
|
274
|
+
// Tests for resetTokenCountStats
|
|
275
|
+
// -------------------------------------------------------------------
|
|
276
|
+
test('resetTokenCountStats clears all counters', async () => {
|
|
277
|
+
// Build up some stats
|
|
278
|
+
await analyzeCodeSize('test', standardLimits, syncTokenCounter);
|
|
279
|
+
await batchAnalyzeCodeSize(['a', 'b'], smallLimits, syncTokenCounter);
|
|
280
|
+
// Verify stats exist
|
|
281
|
+
let stats = getTokenCountStats();
|
|
282
|
+
assert.ok(stats.totalRequests > 0);
|
|
283
|
+
// Reset
|
|
284
|
+
resetTokenCountStats();
|
|
285
|
+
// Verify all cleared
|
|
286
|
+
stats = getTokenCountStats();
|
|
287
|
+
assert.equal(stats.totalRequests, 0);
|
|
288
|
+
assert.equal(stats.cacheHits, 0);
|
|
289
|
+
assert.equal(stats.charFilterSkips, 0);
|
|
290
|
+
assert.equal(stats.actualTokenizations, 0);
|
|
291
|
+
assert.equal(stats.batchTokenizations, 0);
|
|
292
|
+
});
|
|
293
|
+
// -------------------------------------------------------------------
|
|
294
|
+
// Tests for clearTokenCache
|
|
295
|
+
// -------------------------------------------------------------------
|
|
296
|
+
test('clearTokenCache removes cached values', async () => {
|
|
297
|
+
const code = 'cached content';
|
|
298
|
+
// First call caches
|
|
299
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
300
|
+
// Clear cache
|
|
301
|
+
clearTokenCache();
|
|
302
|
+
// Second call should not be a cache hit
|
|
303
|
+
resetTokenCountStats();
|
|
304
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
305
|
+
const stats = getTokenCountStats();
|
|
306
|
+
assert.equal(stats.cacheHits, 0, 'Should have no cache hits after clear');
|
|
307
|
+
});
|
|
308
|
+
test('clearTokenCache allows re-caching', async () => {
|
|
309
|
+
const code = 'test code';
|
|
310
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
311
|
+
clearTokenCache();
|
|
312
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
313
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
314
|
+
// After clear and re-cache, second call should hit
|
|
315
|
+
const stats = getTokenCountStats();
|
|
316
|
+
assert.ok(stats.cacheHits >= 1);
|
|
317
|
+
});
|
|
318
|
+
// -------------------------------------------------------------------
|
|
319
|
+
// Tests for pre-filtering logic
|
|
320
|
+
// -------------------------------------------------------------------
|
|
321
|
+
test('pre-filter correctly identifies too_small estimate', async () => {
|
|
322
|
+
// With standard token counter (4 chars = 1 token)
|
|
323
|
+
// min * 0.8 = 50 * 0.8 = 40 tokens = 160 chars
|
|
324
|
+
// Code of 100 chars = ~25 tokens, which is below minEstimate
|
|
325
|
+
const code = 'x'.repeat(100);
|
|
326
|
+
const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter);
|
|
327
|
+
// Even though pre-filter might say too_small, we still tokenize
|
|
328
|
+
// Actual: 100/4 = 25 tokens < 50 min = too_small
|
|
329
|
+
assert.equal(result.decision, 'too_small');
|
|
330
|
+
});
|
|
331
|
+
test('pre-filter correctly identifies optimal estimate', async () => {
|
|
332
|
+
// optimalLow = 300 * 0.8 = 240 tokens = 960 chars
|
|
333
|
+
// optimalHigh = 300 * 1.2 = 360 tokens = 1440 chars
|
|
334
|
+
// Code of 1200 chars = ~300 tokens
|
|
335
|
+
const code = 'x'.repeat(1200);
|
|
336
|
+
const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter, true);
|
|
337
|
+
// Estimated ~300 tokens, which is in optimal range
|
|
338
|
+
// Still tokenizes because we don't skip optimal
|
|
339
|
+
assert.equal(result.method, 'tokenized');
|
|
340
|
+
});
|
|
341
|
+
// -------------------------------------------------------------------
|
|
342
|
+
// Edge cases and error handling
|
|
343
|
+
// -------------------------------------------------------------------
|
|
344
|
+
test('handles unicode characters correctly', async () => {
|
|
345
|
+
const unicodeCode = 'const emoji = "\\uD83D\\uDE00\\uD83C\\uDF89"; // party';
|
|
346
|
+
const result = await analyzeCodeSize(unicodeCode, standardLimits, syncTokenCounter);
|
|
347
|
+
assert.ok(result.size > 0);
|
|
348
|
+
});
|
|
349
|
+
test('handles newlines and whitespace', async () => {
|
|
350
|
+
const code = 'line1\n line2\n\t\tline3\n';
|
|
351
|
+
const result = await analyzeCodeSize(code, smallLimits, syncTokenCounter);
|
|
352
|
+
assert.equal(result.size, code.length);
|
|
353
|
+
});
|
|
354
|
+
test('handles very long single-line code', async () => {
|
|
355
|
+
const longLine = 'x'.repeat(100000);
|
|
356
|
+
const result = await analyzeCodeSize(longLine, standardLimits, standardTokenCounter, true);
|
|
357
|
+
assert.equal(result.decision, 'too_large');
|
|
358
|
+
});
|
|
359
|
+
test('batch handles all empty strings', async () => {
|
|
360
|
+
const snippets = ['', '', ''];
|
|
361
|
+
const results = await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
|
|
362
|
+
assert.equal(results.length, 3);
|
|
363
|
+
results.forEach((r) => {
|
|
364
|
+
assert.equal(r.size, 0);
|
|
365
|
+
assert.equal(r.decision, 'too_small');
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
test('concurrent analyze calls complete correctly', async () => {
|
|
369
|
+
const code = 'shared code for concurrency test';
|
|
370
|
+
// Run multiple concurrent calls
|
|
371
|
+
const promises = Array.from({ length: 10 }, () => analyzeCodeSize(code, standardLimits, asyncTokenCounter));
|
|
372
|
+
const results = await Promise.all(promises);
|
|
373
|
+
// All should return same result
|
|
374
|
+
results.forEach((r) => {
|
|
375
|
+
assert.equal(r.size, code.length);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
test('stats percentages format correctly', async () => {
|
|
379
|
+
// Create specific ratio
|
|
380
|
+
const code = 'test';
|
|
381
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
382
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
383
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
384
|
+
const stats = getTokenCountStats();
|
|
385
|
+
// Verify percentage format (ends with %)
|
|
386
|
+
assert.ok(stats.cacheHitRate.endsWith('%'));
|
|
387
|
+
assert.ok(stats.charFilterRate.endsWith('%'));
|
|
388
|
+
assert.ok(stats.tokenizationRate.endsWith('%'));
|
|
389
|
+
// Verify percentages are numeric
|
|
390
|
+
const cacheRate = parseFloat(stats.cacheHitRate);
|
|
391
|
+
assert.ok(!isNaN(cacheRate));
|
|
392
|
+
assert.ok(cacheRate >= 0 && cacheRate <= 100);
|
|
393
|
+
});
|
|
394
|
+
test('handles token counter returning zero', async () => {
|
|
395
|
+
const zeroCounter = () => 0;
|
|
396
|
+
const result = await analyzeCodeSize('test code', standardLimits, zeroCounter);
|
|
397
|
+
assert.equal(result.size, 0);
|
|
398
|
+
assert.equal(result.decision, 'too_small');
|
|
399
|
+
});
|
|
400
|
+
test('handles token counter returning very large numbers', async () => {
|
|
401
|
+
const largeCounter = () => 1000000;
|
|
402
|
+
const result = await analyzeCodeSize('tiny', standardLimits, largeCounter);
|
|
403
|
+
assert.equal(result.size, 1000000);
|
|
404
|
+
assert.equal(result.decision, 'too_large');
|
|
405
|
+
});
|
|
406
|
+
test('batch maintains correct index mapping with mixed cache hits', async () => {
|
|
407
|
+
// Pre-cache indices 1 and 3
|
|
408
|
+
await analyzeCodeSize('snippet_b', smallLimits, syncTokenCounter);
|
|
409
|
+
await analyzeCodeSize('snippet_d', smallLimits, syncTokenCounter);
|
|
410
|
+
resetTokenCountStats();
|
|
411
|
+
const snippets = ['snippet_a', 'snippet_b', 'snippet_c', 'snippet_d', 'snippet_e'];
|
|
412
|
+
const results = await batchAnalyzeCodeSize(snippets, smallLimits, syncTokenCounter);
|
|
413
|
+
// Verify correct sizes at correct indices
|
|
414
|
+
assert.equal(results[0].size, 9); // snippet_a
|
|
415
|
+
assert.equal(results[1].size, 9); // snippet_b (cached)
|
|
416
|
+
assert.equal(results[2].size, 9); // snippet_c
|
|
417
|
+
assert.equal(results[3].size, 9); // snippet_d (cached)
|
|
418
|
+
assert.equal(results[4].size, 9); // snippet_e
|
|
419
|
+
const stats = getTokenCountStats();
|
|
420
|
+
assert.equal(stats.cacheHits, 2);
|
|
421
|
+
assert.equal(stats.actualTokenizations, 3);
|
|
422
|
+
});
|
|
423
|
+
test('analyzeCodeSize increments totalRequests even with cache hits', async () => {
|
|
424
|
+
const code = 'test';
|
|
425
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
426
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
427
|
+
await analyzeCodeSize(code, standardLimits, syncTokenCounter);
|
|
428
|
+
const stats = getTokenCountStats();
|
|
429
|
+
// Note: analyzeCodeSize increments totalRequests at start
|
|
430
|
+
// The implementation may double-count due to countTokensWithCache also incrementing
|
|
431
|
+
// This test verifies the expected behavior
|
|
432
|
+
assert.ok(stats.totalRequests >= 3);
|
|
433
|
+
});
|
|
434
|
+
test('pre-filter needs_tokenization triggers actual tokenization', async () => {
|
|
435
|
+
// Create code that falls in needs_tokenization range in pre-filter
|
|
436
|
+
// but still needs actual tokenization
|
|
437
|
+
const code = 'x'.repeat(1500); // ~375 tokens, between optimal (300) and max (500)
|
|
438
|
+
const result = await analyzeCodeSize(code, standardLimits, standardTokenCounter);
|
|
439
|
+
assert.equal(result.method, 'tokenized');
|
|
440
|
+
});
|
|
441
|
+
//# sourceMappingURL=token-counter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-counter.test.js","sourceRoot":"","sources":["../../../src/tests/chunking/token-counter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-cmd.test.d.ts","sourceRoot":"","sources":["../../../src/tests/cli/ask-cmd.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for ask-cmd.ts
|
|
3
|
+
* Tests the ask command registration and option handling
|
|
4
|
+
*/
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { registerAskCommand } from '../../cli/commands/ask-cmd.js';
|
|
9
|
+
test('registerAskCommand adds ask command to program', () => {
|
|
10
|
+
const program = new Command();
|
|
11
|
+
registerAskCommand(program);
|
|
12
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
13
|
+
assert.ok(askCmd, 'ask command should be registered');
|
|
14
|
+
});
|
|
15
|
+
test('ask command requires question argument', () => {
|
|
16
|
+
const program = new Command();
|
|
17
|
+
registerAskCommand(program);
|
|
18
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
19
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
20
|
+
// Check for required question argument
|
|
21
|
+
const args = askCmd.registeredArguments || [];
|
|
22
|
+
assert.ok(args.length >= 1, 'should have at least one argument');
|
|
23
|
+
if (args.length > 0) {
|
|
24
|
+
assert.ok(args[0].required, 'question should be required');
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
test('ask command has correct description', () => {
|
|
28
|
+
const program = new Command();
|
|
29
|
+
registerAskCommand(program);
|
|
30
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
31
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
32
|
+
const desc = askCmd.description().toLowerCase();
|
|
33
|
+
assert.ok(desc.includes('question') || desc.includes('ask') || desc.includes('answer'), 'description should mention question/ask/answer');
|
|
34
|
+
});
|
|
35
|
+
test('ask command has provider option with auto default', () => {
|
|
36
|
+
const program = new Command();
|
|
37
|
+
registerAskCommand(program);
|
|
38
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
39
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
40
|
+
const providerOpt = askCmd.options.find(opt => opt.long === '--provider');
|
|
41
|
+
assert.ok(providerOpt, 'should have --provider option');
|
|
42
|
+
assert.equal(providerOpt.defaultValue, 'auto', 'default should be auto');
|
|
43
|
+
});
|
|
44
|
+
test('ask command has chat-provider option with auto default', () => {
|
|
45
|
+
const program = new Command();
|
|
46
|
+
registerAskCommand(program);
|
|
47
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
48
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
49
|
+
const chatProviderOpt = askCmd.options.find(opt => opt.long === '--chat-provider');
|
|
50
|
+
assert.ok(chatProviderOpt, 'should have --chat-provider option');
|
|
51
|
+
assert.equal(chatProviderOpt.defaultValue, 'auto', 'default should be auto');
|
|
52
|
+
});
|
|
53
|
+
test('ask command has max-chunks option with default 10', () => {
|
|
54
|
+
const program = new Command();
|
|
55
|
+
registerAskCommand(program);
|
|
56
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
57
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
58
|
+
const maxChunksOpt = askCmd.options.find(opt => opt.long === '--max-chunks');
|
|
59
|
+
assert.ok(maxChunksOpt, 'should have --max-chunks option');
|
|
60
|
+
assert.equal(maxChunksOpt.defaultValue, '10', 'default should be 10');
|
|
61
|
+
});
|
|
62
|
+
test('ask command has short flag -k for max-chunks', () => {
|
|
63
|
+
const program = new Command();
|
|
64
|
+
registerAskCommand(program);
|
|
65
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
66
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
67
|
+
const maxChunksOpt = askCmd.options.find(opt => opt.long === '--max-chunks');
|
|
68
|
+
assert.ok(maxChunksOpt, 'should have --max-chunks option');
|
|
69
|
+
assert.equal(maxChunksOpt.short, '-k', 'should have -k short flag');
|
|
70
|
+
});
|
|
71
|
+
test('ask command has temperature option with default 0.7', () => {
|
|
72
|
+
const program = new Command();
|
|
73
|
+
registerAskCommand(program);
|
|
74
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
75
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
76
|
+
const tempOpt = askCmd.options.find(opt => opt.long === '--temperature');
|
|
77
|
+
assert.ok(tempOpt, 'should have --temperature option');
|
|
78
|
+
assert.equal(tempOpt.defaultValue, '0.7', 'default should be 0.7');
|
|
79
|
+
});
|
|
80
|
+
test('ask command has reranker option with default on', () => {
|
|
81
|
+
const program = new Command();
|
|
82
|
+
registerAskCommand(program);
|
|
83
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
84
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
85
|
+
const rerankerOpt = askCmd.options.find(opt => opt.long === '--reranker');
|
|
86
|
+
assert.ok(rerankerOpt, 'should have --reranker option');
|
|
87
|
+
assert.equal(rerankerOpt.defaultValue, 'on', 'default should be on');
|
|
88
|
+
});
|
|
89
|
+
test('ask command has multi-query flag', () => {
|
|
90
|
+
const program = new Command();
|
|
91
|
+
registerAskCommand(program);
|
|
92
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
93
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
94
|
+
const multiQueryOpt = askCmd.options.find(opt => opt.long === '--multi-query');
|
|
95
|
+
assert.ok(multiQueryOpt, 'should have --multi-query option');
|
|
96
|
+
});
|
|
97
|
+
test('ask command has stream flag', () => {
|
|
98
|
+
const program = new Command();
|
|
99
|
+
registerAskCommand(program);
|
|
100
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
101
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
102
|
+
const streamOpt = askCmd.options.find(opt => opt.long === '--stream');
|
|
103
|
+
assert.ok(streamOpt, 'should have --stream option');
|
|
104
|
+
});
|
|
105
|
+
test('ask command has citations flag', () => {
|
|
106
|
+
const program = new Command();
|
|
107
|
+
registerAskCommand(program);
|
|
108
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
109
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
110
|
+
const citationsOpt = askCmd.options.find(opt => opt.long === '--citations');
|
|
111
|
+
assert.ok(citationsOpt, 'should have --citations option');
|
|
112
|
+
});
|
|
113
|
+
test('ask command has no-metadata flag', () => {
|
|
114
|
+
const program = new Command();
|
|
115
|
+
registerAskCommand(program);
|
|
116
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
117
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
118
|
+
const noMetadataOpt = askCmd.options.find(opt => opt.long === '--no-metadata');
|
|
119
|
+
assert.ok(noMetadataOpt, 'should have --no-metadata option');
|
|
120
|
+
});
|
|
121
|
+
test('ask command has path filtering options', () => {
|
|
122
|
+
const program = new Command();
|
|
123
|
+
registerAskCommand(program);
|
|
124
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
125
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
126
|
+
const pathGlobOpt = askCmd.options.find(opt => opt.long === '--path_glob');
|
|
127
|
+
const tagsOpt = askCmd.options.find(opt => opt.long === '--tags');
|
|
128
|
+
const langOpt = askCmd.options.find(opt => opt.long === '--lang');
|
|
129
|
+
assert.ok(pathGlobOpt, 'should have --path_glob option');
|
|
130
|
+
assert.ok(tagsOpt, 'should have --tags option');
|
|
131
|
+
assert.ok(langOpt, 'should have --lang option');
|
|
132
|
+
});
|
|
133
|
+
test('ask command has path option with default .', () => {
|
|
134
|
+
const program = new Command();
|
|
135
|
+
registerAskCommand(program);
|
|
136
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
137
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
138
|
+
const pathOpt = askCmd.options.find(opt => opt.long === '--path');
|
|
139
|
+
assert.ok(pathOpt, 'should have --path option');
|
|
140
|
+
assert.equal(pathOpt.defaultValue, '.', 'default should be .');
|
|
141
|
+
});
|
|
142
|
+
test('ask command has project and directory path aliases', () => {
|
|
143
|
+
const program = new Command();
|
|
144
|
+
registerAskCommand(program);
|
|
145
|
+
const askCmd = program.commands.find(cmd => cmd.name() === 'ask');
|
|
146
|
+
assert.ok(askCmd, 'ask command should exist');
|
|
147
|
+
const projectOpt = askCmd.options.find(opt => opt.long === '--project');
|
|
148
|
+
const directoryOpt = askCmd.options.find(opt => opt.long === '--directory');
|
|
149
|
+
assert.ok(projectOpt, 'should have --project option');
|
|
150
|
+
assert.ok(directoryOpt, 'should have --directory option');
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=ask-cmd.test.js.map
|