@code-rag/core 0.1.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/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/auth/audit-log.d.ts +35 -0
- package/dist/auth/audit-log.js +110 -0
- package/dist/auth/audit-log.js.map +1 -0
- package/dist/auth/audit-log.test.d.ts +1 -0
- package/dist/auth/audit-log.test.js +261 -0
- package/dist/auth/audit-log.test.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oidc-provider.d.ts +49 -0
- package/dist/auth/oidc-provider.js +358 -0
- package/dist/auth/oidc-provider.js.map +1 -0
- package/dist/auth/oidc-provider.test.d.ts +1 -0
- package/dist/auth/oidc-provider.test.js +520 -0
- package/dist/auth/oidc-provider.test.js.map +1 -0
- package/dist/auth/rbac.d.ts +29 -0
- package/dist/auth/rbac.js +75 -0
- package/dist/auth/rbac.js.map +1 -0
- package/dist/auth/rbac.test.d.ts +1 -0
- package/dist/auth/rbac.test.js +224 -0
- package/dist/auth/rbac.test.js.map +1 -0
- package/dist/auth/saml-provider.d.ts +51 -0
- package/dist/auth/saml-provider.js +355 -0
- package/dist/auth/saml-provider.js.map +1 -0
- package/dist/auth/saml-provider.test.d.ts +1 -0
- package/dist/auth/saml-provider.test.js +422 -0
- package/dist/auth/saml-provider.test.js.map +1 -0
- package/dist/auth/types.d.ts +81 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/types.test.d.ts +1 -0
- package/dist/auth/types.test.js +147 -0
- package/dist/auth/types.test.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.d.ts +10 -0
- package/dist/backlog/ab-reference-scanner.js +22 -0
- package/dist/backlog/ab-reference-scanner.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/ab-reference-scanner.test.js +83 -0
- package/dist/backlog/ab-reference-scanner.test.js.map +1 -0
- package/dist/backlog/azure-devops-provider.d.ts +59 -0
- package/dist/backlog/azure-devops-provider.js +283 -0
- package/dist/backlog/azure-devops-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.d.ts +13 -0
- package/dist/backlog/backlog-provider.js +6 -0
- package/dist/backlog/backlog-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.test.d.ts +1 -0
- package/dist/backlog/backlog-provider.test.js +426 -0
- package/dist/backlog/backlog-provider.test.js.map +1 -0
- package/dist/backlog/clickup-provider.d.ts +55 -0
- package/dist/backlog/clickup-provider.js +301 -0
- package/dist/backlog/clickup-provider.js.map +1 -0
- package/dist/backlog/clickup-provider.test.d.ts +1 -0
- package/dist/backlog/clickup-provider.test.js +426 -0
- package/dist/backlog/clickup-provider.test.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.d.ts +10 -0
- package/dist/backlog/clickup-reference-scanner.js +32 -0
- package/dist/backlog/clickup-reference-scanner.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/clickup-reference-scanner.test.js +92 -0
- package/dist/backlog/clickup-reference-scanner.test.js.map +1 -0
- package/dist/backlog/code-linker.d.ts +63 -0
- package/dist/backlog/code-linker.js +90 -0
- package/dist/backlog/code-linker.js.map +1 -0
- package/dist/backlog/code-linker.test.d.ts +1 -0
- package/dist/backlog/code-linker.test.js +325 -0
- package/dist/backlog/code-linker.test.js.map +1 -0
- package/dist/backlog/index.d.ts +14 -0
- package/dist/backlog/index.js +8 -0
- package/dist/backlog/index.js.map +1 -0
- package/dist/backlog/jira-provider.d.ts +60 -0
- package/dist/backlog/jira-provider.js +272 -0
- package/dist/backlog/jira-provider.js.map +1 -0
- package/dist/backlog/jira-provider.test.d.ts +1 -0
- package/dist/backlog/jira-provider.test.js +449 -0
- package/dist/backlog/jira-provider.test.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.d.ts +11 -0
- package/dist/backlog/jira-reference-scanner.js +26 -0
- package/dist/backlog/jira-reference-scanner.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/jira-reference-scanner.test.js +127 -0
- package/dist/backlog/jira-reference-scanner.test.js.map +1 -0
- package/dist/backlog/types.d.ts +22 -0
- package/dist/backlog/types.js +1 -0
- package/dist/backlog/types.js.map +1 -0
- package/dist/chunker/ast-chunker.d.ts +45 -0
- package/dist/chunker/ast-chunker.js +292 -0
- package/dist/chunker/ast-chunker.js.map +1 -0
- package/dist/chunker/ast-chunker.test.d.ts +1 -0
- package/dist/chunker/ast-chunker.test.js +391 -0
- package/dist/chunker/ast-chunker.test.js.map +1 -0
- package/dist/chunker/chunker.d.ts +8 -0
- package/dist/chunker/chunker.js +1 -0
- package/dist/chunker/chunker.js.map +1 -0
- package/dist/chunker/index.d.ts +3 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/config/config-parser.d.ts +15 -0
- package/dist/config/config-parser.js +283 -0
- package/dist/config/config-parser.js.map +1 -0
- package/dist/config/config-parser.test.d.ts +1 -0
- package/dist/config/config-parser.test.js +699 -0
- package/dist/config/config-parser.test.js.map +1 -0
- package/dist/docs/confluence-provider.d.ts +121 -0
- package/dist/docs/confluence-provider.js +459 -0
- package/dist/docs/confluence-provider.js.map +1 -0
- package/dist/docs/confluence-provider.test.d.ts +1 -0
- package/dist/docs/confluence-provider.test.js +765 -0
- package/dist/docs/confluence-provider.test.js.map +1 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.js +2 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/sharepoint-provider.d.ts +150 -0
- package/dist/docs/sharepoint-provider.js +637 -0
- package/dist/docs/sharepoint-provider.js.map +1 -0
- package/dist/docs/sharepoint-provider.test.d.ts +1 -0
- package/dist/docs/sharepoint-provider.test.js +873 -0
- package/dist/docs/sharepoint-provider.test.js.map +1 -0
- package/dist/embedding/bm25-index.d.ts +12 -0
- package/dist/embedding/bm25-index.js +89 -0
- package/dist/embedding/bm25-index.js.map +1 -0
- package/dist/embedding/bm25-index.test.d.ts +1 -0
- package/dist/embedding/bm25-index.test.js +289 -0
- package/dist/embedding/bm25-index.test.js.map +1 -0
- package/dist/embedding/hybrid-search.d.ts +13 -0
- package/dist/embedding/hybrid-search.js +124 -0
- package/dist/embedding/hybrid-search.js.map +1 -0
- package/dist/embedding/hybrid-search.test.d.ts +1 -0
- package/dist/embedding/hybrid-search.test.js +266 -0
- package/dist/embedding/hybrid-search.test.js.map +1 -0
- package/dist/embedding/index.d.ts +11 -0
- package/dist/embedding/index.js +7 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/lancedb-store.d.ts +21 -0
- package/dist/embedding/lancedb-store.js +172 -0
- package/dist/embedding/lancedb-store.js.map +1 -0
- package/dist/embedding/lancedb-store.test.d.ts +1 -0
- package/dist/embedding/lancedb-store.test.js +268 -0
- package/dist/embedding/lancedb-store.test.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.d.ts +83 -0
- package/dist/embedding/model-lifecycle-manager.js +419 -0
- package/dist/embedding/model-lifecycle-manager.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.test.d.ts +1 -0
- package/dist/embedding/model-lifecycle-manager.test.js +642 -0
- package/dist/embedding/model-lifecycle-manager.test.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.d.ts +16 -0
- package/dist/embedding/ollama-embedding-provider.js +74 -0
- package/dist/embedding/ollama-embedding-provider.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/ollama-embedding-provider.test.js +198 -0
- package/dist/embedding/ollama-embedding-provider.test.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.d.ts +19 -0
- package/dist/embedding/openai-compatible-embedding-provider.js +108 -0
- package/dist/embedding/openai-compatible-embedding-provider.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js +456 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js.map +1 -0
- package/dist/embedding/qdrant-store.d.ts +28 -0
- package/dist/embedding/qdrant-store.js +174 -0
- package/dist/embedding/qdrant-store.js.map +1 -0
- package/dist/embedding/qdrant-store.test.d.ts +1 -0
- package/dist/embedding/qdrant-store.test.js +359 -0
- package/dist/embedding/qdrant-store.test.js.map +1 -0
- package/dist/enrichment/index.d.ts +4 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/nl-enricher.d.ts +16 -0
- package/dist/enrichment/nl-enricher.js +47 -0
- package/dist/enrichment/nl-enricher.js.map +1 -0
- package/dist/enrichment/nl-enricher.test.d.ts +1 -0
- package/dist/enrichment/nl-enricher.test.js +154 -0
- package/dist/enrichment/nl-enricher.test.js.map +1 -0
- package/dist/enrichment/ollama-client.d.ts +18 -0
- package/dist/enrichment/ollama-client.js +55 -0
- package/dist/enrichment/ollama-client.js.map +1 -0
- package/dist/enrichment/ollama-client.test.d.ts +1 -0
- package/dist/enrichment/ollama-client.test.js +129 -0
- package/dist/enrichment/ollama-client.test.js.map +1 -0
- package/dist/git/git-client.d.ts +22 -0
- package/dist/git/git-client.js +6 -0
- package/dist/git/git-client.js.map +1 -0
- package/dist/git/git-client.test.d.ts +1 -0
- package/dist/git/git-client.test.js +200 -0
- package/dist/git/git-client.test.js.map +1 -0
- package/dist/git/ignore-filter.d.ts +2 -0
- package/dist/git/ignore-filter.js +31 -0
- package/dist/git/ignore-filter.js.map +1 -0
- package/dist/git/ignore-filter.test.d.ts +1 -0
- package/dist/git/ignore-filter.test.js +87 -0
- package/dist/git/ignore-filter.test.js.map +1 -0
- package/dist/git/index.d.ts +4 -0
- package/dist/git/index.js +3 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/simple-git-client.d.ts +12 -0
- package/dist/git/simple-git-client.js +138 -0
- package/dist/git/simple-git-client.js.map +1 -0
- package/dist/graph/cross-repo-resolver.d.ts +50 -0
- package/dist/graph/cross-repo-resolver.js +315 -0
- package/dist/graph/cross-repo-resolver.js.map +1 -0
- package/dist/graph/cross-repo-resolver.test.d.ts +1 -0
- package/dist/graph/cross-repo-resolver.test.js +548 -0
- package/dist/graph/cross-repo-resolver.test.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +44 -0
- package/dist/graph/dependency-graph.js +108 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/dependency-graph.test.d.ts +1 -0
- package/dist/graph/dependency-graph.test.js +276 -0
- package/dist/graph/dependency-graph.test.js.map +1 -0
- package/dist/graph/graph-builder.d.ts +11 -0
- package/dist/graph/graph-builder.js +113 -0
- package/dist/graph/graph-builder.js.map +1 -0
- package/dist/graph/graph-builder.test.d.ts +1 -0
- package/dist/graph/graph-builder.test.js +178 -0
- package/dist/graph/graph-builder.test.js.map +1 -0
- package/dist/graph/import-resolver.d.ts +11 -0
- package/dist/graph/import-resolver.js +199 -0
- package/dist/graph/import-resolver.js.map +1 -0
- package/dist/graph/import-resolver.test.d.ts +1 -0
- package/dist/graph/import-resolver.test.js +282 -0
- package/dist/graph/import-resolver.test.js.map +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/file-scanner.d.ts +34 -0
- package/dist/indexer/file-scanner.js +69 -0
- package/dist/indexer/file-scanner.js.map +1 -0
- package/dist/indexer/file-scanner.test.d.ts +1 -0
- package/dist/indexer/file-scanner.test.js +110 -0
- package/dist/indexer/file-scanner.test.js.map +1 -0
- package/dist/indexer/file-watcher.d.ts +79 -0
- package/dist/indexer/file-watcher.js +148 -0
- package/dist/indexer/incremental-indexer.d.ts +67 -0
- package/dist/indexer/incremental-indexer.js +142 -0
- package/dist/indexer/incremental-indexer.js.map +1 -0
- package/dist/indexer/incremental-indexer.test.d.ts +1 -0
- package/dist/indexer/incremental-indexer.test.js +266 -0
- package/dist/indexer/incremental-indexer.test.js.map +1 -0
- package/dist/indexer/index-check.d.ts +22 -0
- package/dist/indexer/index-check.js +74 -0
- package/dist/indexer/index-check.js.map +1 -0
- package/dist/indexer/index-check.test.d.ts +1 -0
- package/dist/indexer/index-check.test.js +100 -0
- package/dist/indexer/index-check.test.js.map +1 -0
- package/dist/indexer/index-state.d.ts +61 -0
- package/dist/indexer/index-state.js +82 -0
- package/dist/indexer/index-state.js.map +1 -0
- package/dist/indexer/index-state.test.d.ts +1 -0
- package/dist/indexer/index-state.test.js +140 -0
- package/dist/indexer/index-state.test.js.map +1 -0
- package/dist/indexer/index.d.ts +12 -0
- package/dist/indexer/index.js +6 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.d.ts +63 -0
- package/dist/indexer/multi-repo-indexer.js +144 -0
- package/dist/indexer/multi-repo-indexer.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.test.d.ts +1 -0
- package/dist/indexer/multi-repo-indexer.test.js +238 -0
- package/dist/indexer/multi-repo-indexer.test.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/language-registry.d.ts +46 -0
- package/dist/parser/language-registry.js +219 -0
- package/dist/parser/language-registry.js.map +1 -0
- package/dist/parser/language-registry.test.d.ts +1 -0
- package/dist/parser/language-registry.test.js +225 -0
- package/dist/parser/language-registry.test.js.map +1 -0
- package/dist/parser/markdown-parser.d.ts +124 -0
- package/dist/parser/markdown-parser.js +487 -0
- package/dist/parser/markdown-parser.js.map +1 -0
- package/dist/parser/markdown-parser.test.d.ts +1 -0
- package/dist/parser/markdown-parser.test.js +600 -0
- package/dist/parser/markdown-parser.test.js.map +1 -0
- package/dist/parser/tree-sitter-parser.d.ts +32 -0
- package/dist/parser/tree-sitter-parser.js +146 -0
- package/dist/parser/tree-sitter-parser.js.map +1 -0
- package/dist/retrieval/context-expander.d.ts +51 -0
- package/dist/retrieval/context-expander.js +218 -0
- package/dist/retrieval/context-expander.js.map +1 -0
- package/dist/retrieval/context-expander.test.d.ts +1 -0
- package/dist/retrieval/context-expander.test.js +339 -0
- package/dist/retrieval/context-expander.test.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.d.ts +16 -0
- package/dist/retrieval/cross-encoder-reranker.js +90 -0
- package/dist/retrieval/cross-encoder-reranker.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.d.ts +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.js +305 -0
- package/dist/retrieval/cross-encoder-reranker.test.js.map +1 -0
- package/dist/retrieval/index.d.ts +8 -0
- package/dist/retrieval/index.js +4 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/query-analyzer.d.ts +29 -0
- package/dist/retrieval/query-analyzer.js +238 -0
- package/dist/retrieval/query-analyzer.js.map +1 -0
- package/dist/retrieval/query-analyzer.test.d.ts +1 -0
- package/dist/retrieval/query-analyzer.test.js +236 -0
- package/dist/retrieval/query-analyzer.test.js.map +1 -0
- package/dist/retrieval/token-budget.d.ts +51 -0
- package/dist/retrieval/token-budget.js +141 -0
- package/dist/retrieval/token-budget.js.map +1 -0
- package/dist/retrieval/token-budget.test.d.ts +1 -0
- package/dist/retrieval/token-budget.test.js +404 -0
- package/dist/retrieval/token-budget.test.js.map +1 -0
- package/dist/storage/azure-blob-provider.d.ts +19 -0
- package/dist/storage/azure-blob-provider.js +199 -0
- package/dist/storage/azure-blob-provider.js.map +1 -0
- package/dist/storage/azure-blob-provider.test.d.ts +1 -0
- package/dist/storage/azure-blob-provider.test.js +250 -0
- package/dist/storage/azure-blob-provider.test.js.map +1 -0
- package/dist/storage/gcs-provider.d.ts +22 -0
- package/dist/storage/gcs-provider.js +241 -0
- package/dist/storage/gcs-provider.js.map +1 -0
- package/dist/storage/gcs-provider.test.d.ts +1 -0
- package/dist/storage/gcs-provider.test.js +299 -0
- package/dist/storage/gcs-provider.test.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +21 -0
- package/dist/storage/s3-provider.js +220 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/s3-provider.test.d.ts +1 -0
- package/dist/storage/s3-provider.test.js +329 -0
- package/dist/storage/s3-provider.test.js.map +1 -0
- package/dist/storage/types.d.ts +65 -0
- package/dist/storage/types.js +12 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/types/chunk.d.ts +32 -0
- package/dist/types/chunk.js +1 -0
- package/dist/types/chunk.js.map +1 -0
- package/dist/types/config.d.ts +71 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.d.ts +54 -0
- package/dist/types/provider.js +36 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/search.d.ts +27 -0
- package/dist/types/search.js +1 -0
- package/dist/types/search.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { QueryAnalyzer } from './query-analyzer.js';
|
|
3
|
+
describe('QueryAnalyzer', () => {
|
|
4
|
+
const analyzer = new QueryAnalyzer();
|
|
5
|
+
describe('analyze returns correct structure', () => {
|
|
6
|
+
it('should return all required fields', () => {
|
|
7
|
+
const result = analyzer.analyze('hello world');
|
|
8
|
+
expect(result).toHaveProperty('originalQuery', 'hello world');
|
|
9
|
+
expect(result).toHaveProperty('intent');
|
|
10
|
+
expect(result).toHaveProperty('entities');
|
|
11
|
+
expect(result).toHaveProperty('suggestedFilters');
|
|
12
|
+
expect(result).toHaveProperty('expandedTerms');
|
|
13
|
+
expect(Array.isArray(result.entities)).toBe(true);
|
|
14
|
+
expect(Array.isArray(result.expandedTerms)).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it('should preserve the original query string', () => {
|
|
17
|
+
const query = 'where is MyClass defined';
|
|
18
|
+
const result = analyzer.analyze(query);
|
|
19
|
+
expect(result.originalQuery).toBe(query);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('intent detection', () => {
|
|
23
|
+
const intentCases = [
|
|
24
|
+
// find_definition
|
|
25
|
+
{ query: 'where is MyClass defined', expected: 'find_definition' },
|
|
26
|
+
{ query: 'definition of parseConfig', expected: 'find_definition' },
|
|
27
|
+
{ query: 'find definition of HybridSearch', expected: 'find_definition' },
|
|
28
|
+
{ query: 'show me the definition', expected: 'find_definition' },
|
|
29
|
+
{ query: 'where is MyClass declared', expected: 'find_definition' },
|
|
30
|
+
{ query: 'declaration of SearchResult', expected: 'find_definition' },
|
|
31
|
+
// find_usage
|
|
32
|
+
{ query: 'who calls parseConfig', expected: 'find_usage' },
|
|
33
|
+
{ query: 'usage of DependencyGraph', expected: 'find_usage' },
|
|
34
|
+
{ query: 'where is MyClass used', expected: 'find_usage' },
|
|
35
|
+
{ query: 'references to SearchResult', expected: 'find_usage' },
|
|
36
|
+
{ query: 'callers of initialize', expected: 'find_usage' },
|
|
37
|
+
{ query: 'consumers of the API', expected: 'find_usage' },
|
|
38
|
+
{ query: 'find usage of handleRequest', expected: 'find_usage' },
|
|
39
|
+
{ query: 'used by other modules', expected: 'find_usage' },
|
|
40
|
+
// understand_module
|
|
41
|
+
{ query: 'how does HybridSearch work', expected: 'understand_module' },
|
|
42
|
+
{ query: 'explain the indexer module', expected: 'understand_module' },
|
|
43
|
+
{ query: 'what does parseConfig do', expected: 'understand_module' },
|
|
44
|
+
{ query: 'understand the graph module', expected: 'understand_module' },
|
|
45
|
+
{ query: 'overview of the embedding system', expected: 'understand_module' },
|
|
46
|
+
{ query: 'describe the chunker', expected: 'understand_module' },
|
|
47
|
+
{ query: 'how is BM25Index implemented', expected: 'understand_module' },
|
|
48
|
+
// find_similar
|
|
49
|
+
{ query: 'similar to HybridSearch', expected: 'find_similar' },
|
|
50
|
+
{ query: 'something like parseConfig', expected: 'find_similar' },
|
|
51
|
+
{ query: 'alternatives to LanceDB', expected: 'find_similar' },
|
|
52
|
+
{ query: 'related to the search module', expected: 'find_similar' },
|
|
53
|
+
// general
|
|
54
|
+
{ query: 'search function', expected: 'general' },
|
|
55
|
+
{ query: 'what are the main modules', expected: 'general' },
|
|
56
|
+
{ query: 'list all functions', expected: 'general' },
|
|
57
|
+
];
|
|
58
|
+
for (const { query, expected } of intentCases) {
|
|
59
|
+
it(`should detect "${expected}" for: "${query}"`, () => {
|
|
60
|
+
const result = analyzer.analyze(query);
|
|
61
|
+
expect(result.intent).toBe(expected);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
describe('entity extraction', () => {
|
|
66
|
+
it('should extract PascalCase identifiers as class entities', () => {
|
|
67
|
+
const result = analyzer.analyze('find DependencyGraph');
|
|
68
|
+
const classEntities = result.entities.filter((e) => e.type === 'class');
|
|
69
|
+
expect(classEntities).toContainEqual({
|
|
70
|
+
type: 'class',
|
|
71
|
+
value: 'DependencyGraph',
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it('should extract camelCase identifiers as function entities', () => {
|
|
75
|
+
const result = analyzer.analyze('where is parseConfig defined');
|
|
76
|
+
const funcEntities = result.entities.filter((e) => e.type === 'function');
|
|
77
|
+
expect(funcEntities).toContainEqual({
|
|
78
|
+
type: 'function',
|
|
79
|
+
value: 'parseConfig',
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
it('should extract file paths as file entities', () => {
|
|
83
|
+
const result = analyzer.analyze('look at src/graph/dependency-graph.ts');
|
|
84
|
+
const fileEntities = result.entities.filter((e) => e.type === 'file');
|
|
85
|
+
expect(fileEntities).toContainEqual({
|
|
86
|
+
type: 'file',
|
|
87
|
+
value: 'src/graph/dependency-graph.ts',
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it('should not extract common English words as entities', () => {
|
|
91
|
+
const result = analyzer.analyze('find the class');
|
|
92
|
+
const entities = result.entities.map((e) => e.value);
|
|
93
|
+
expect(entities).not.toContain('the');
|
|
94
|
+
expect(entities).not.toContain('find');
|
|
95
|
+
});
|
|
96
|
+
it('should deduplicate entities', () => {
|
|
97
|
+
const result = analyzer.analyze('MyClass and MyClass');
|
|
98
|
+
const myClassEntities = result.entities.filter((e) => e.value === 'MyClass');
|
|
99
|
+
expect(myClassEntities).toHaveLength(1);
|
|
100
|
+
});
|
|
101
|
+
it('should extract multiple identifiers', () => {
|
|
102
|
+
const result = analyzer.analyze('MyClass uses parseConfig from HybridSearch');
|
|
103
|
+
expect(result.entities.length).toBeGreaterThanOrEqual(3);
|
|
104
|
+
});
|
|
105
|
+
it('should return empty entities for plain text query', () => {
|
|
106
|
+
const result = analyzer.analyze('search for something');
|
|
107
|
+
// "something" doesn't match PascalCase or camelCase multi-word
|
|
108
|
+
expect(result.entities).toHaveLength(0);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('filter suggestion', () => {
|
|
112
|
+
it('should suggest typescript language filter', () => {
|
|
113
|
+
const result = analyzer.analyze('find typescript functions');
|
|
114
|
+
expect(result.suggestedFilters.languages).toContain('typescript');
|
|
115
|
+
});
|
|
116
|
+
it('should suggest language filter for abbreviated names', () => {
|
|
117
|
+
const result = analyzer.analyze('show me ts classes');
|
|
118
|
+
expect(result.suggestedFilters.languages).toContain('typescript');
|
|
119
|
+
});
|
|
120
|
+
it('should suggest python language filter', () => {
|
|
121
|
+
const result = analyzer.analyze('find python modules');
|
|
122
|
+
expect(result.suggestedFilters.languages).toContain('python');
|
|
123
|
+
});
|
|
124
|
+
it('should suggest chunk type filter for "function"', () => {
|
|
125
|
+
const result = analyzer.analyze('list all functions');
|
|
126
|
+
expect(result.suggestedFilters.chunkTypes).toContain('function');
|
|
127
|
+
});
|
|
128
|
+
it('should suggest chunk type filter for "class"', () => {
|
|
129
|
+
const result = analyzer.analyze('find the class definition');
|
|
130
|
+
expect(result.suggestedFilters.chunkTypes).toContain('class');
|
|
131
|
+
});
|
|
132
|
+
it('should suggest chunk type filter for "interface"', () => {
|
|
133
|
+
const result = analyzer.analyze('show all interfaces');
|
|
134
|
+
expect(result.suggestedFilters.chunkTypes).toContain('interface');
|
|
135
|
+
});
|
|
136
|
+
it('should suggest file path filter', () => {
|
|
137
|
+
const result = analyzer.analyze('look at src/graph/dependency-graph.ts');
|
|
138
|
+
expect(result.suggestedFilters.filePaths).toContain('src/graph/dependency-graph.ts');
|
|
139
|
+
});
|
|
140
|
+
it('should return empty filters when no language or type mentioned', () => {
|
|
141
|
+
const result = analyzer.analyze('hello world');
|
|
142
|
+
expect(result.suggestedFilters.languages).toBeUndefined();
|
|
143
|
+
expect(result.suggestedFilters.chunkTypes).toBeUndefined();
|
|
144
|
+
expect(result.suggestedFilters.filePaths).toBeUndefined();
|
|
145
|
+
});
|
|
146
|
+
it('should detect multiple languages', () => {
|
|
147
|
+
const result = analyzer.analyze('compare typescript and python');
|
|
148
|
+
expect(result.suggestedFilters.languages).toContain('typescript');
|
|
149
|
+
expect(result.suggestedFilters.languages).toContain('python');
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('edge cases', () => {
|
|
153
|
+
it('should return general intent for empty string', () => {
|
|
154
|
+
const result = analyzer.analyze('');
|
|
155
|
+
expect(result.intent).toBe('general');
|
|
156
|
+
expect(result.entities).toHaveLength(0);
|
|
157
|
+
expect(result.expandedTerms).toHaveLength(0);
|
|
158
|
+
expect(result.originalQuery).toBe('');
|
|
159
|
+
});
|
|
160
|
+
it('should return general intent for whitespace-only string', () => {
|
|
161
|
+
const result = analyzer.analyze(' \t\n ');
|
|
162
|
+
expect(result.intent).toBe('general');
|
|
163
|
+
expect(result.entities).toHaveLength(0);
|
|
164
|
+
expect(result.expandedTerms).toHaveLength(0);
|
|
165
|
+
});
|
|
166
|
+
it('should return general intent for oversized string', () => {
|
|
167
|
+
const longQuery = 'a'.repeat(3000);
|
|
168
|
+
const result = analyzer.analyze(longQuery);
|
|
169
|
+
expect(result.intent).toBe('general');
|
|
170
|
+
expect(result.entities).toHaveLength(0);
|
|
171
|
+
expect(result.expandedTerms).toHaveLength(0);
|
|
172
|
+
expect(result.originalQuery).toBe(longQuery);
|
|
173
|
+
});
|
|
174
|
+
it('should handle strings with special regex characters', () => {
|
|
175
|
+
const result = analyzer.analyze('find [MyClass] (deprecated)');
|
|
176
|
+
// Should not throw, should extract MyClass as class entity
|
|
177
|
+
expect(result).toBeDefined();
|
|
178
|
+
const classEntities = result.entities.filter((e) => e.type === 'class');
|
|
179
|
+
expect(classEntities).toContainEqual({
|
|
180
|
+
type: 'class',
|
|
181
|
+
value: 'MyClass',
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('term expansion', () => {
|
|
186
|
+
it('should include original query terms', () => {
|
|
187
|
+
const result = analyzer.analyze('search function');
|
|
188
|
+
expect(result.expandedTerms).toContain('search');
|
|
189
|
+
expect(result.expandedTerms).toContain('function');
|
|
190
|
+
});
|
|
191
|
+
it('should expand "test" with related terms', () => {
|
|
192
|
+
const result = analyzer.analyze('test');
|
|
193
|
+
expect(result.expandedTerms).toContain('test');
|
|
194
|
+
expect(result.expandedTerms).toContain('spec');
|
|
195
|
+
expect(result.expandedTerms).toContain('describe');
|
|
196
|
+
expect(result.expandedTerms).toContain('it');
|
|
197
|
+
expect(result.expandedTerms).toContain('expect');
|
|
198
|
+
});
|
|
199
|
+
it('should expand "error" with related terms', () => {
|
|
200
|
+
const result = analyzer.analyze('error handling');
|
|
201
|
+
expect(result.expandedTerms).toContain('error');
|
|
202
|
+
expect(result.expandedTerms).toContain('exception');
|
|
203
|
+
expect(result.expandedTerms).toContain('throw');
|
|
204
|
+
expect(result.expandedTerms).toContain('catch');
|
|
205
|
+
});
|
|
206
|
+
it('should expand "config" with related terms', () => {
|
|
207
|
+
const result = analyzer.analyze('config setup');
|
|
208
|
+
expect(result.expandedTerms).toContain('config');
|
|
209
|
+
expect(result.expandedTerms).toContain('configuration');
|
|
210
|
+
expect(result.expandedTerms).toContain('settings');
|
|
211
|
+
});
|
|
212
|
+
it('should expand "auth" with related terms', () => {
|
|
213
|
+
const result = analyzer.analyze('auth flow');
|
|
214
|
+
expect(result.expandedTerms).toContain('auth');
|
|
215
|
+
expect(result.expandedTerms).toContain('authentication');
|
|
216
|
+
expect(result.expandedTerms).toContain('login');
|
|
217
|
+
});
|
|
218
|
+
it('should expand "database" with related terms', () => {
|
|
219
|
+
const result = analyzer.analyze('database operations');
|
|
220
|
+
expect(result.expandedTerms).toContain('database');
|
|
221
|
+
expect(result.expandedTerms).toContain('db');
|
|
222
|
+
expect(result.expandedTerms).toContain('query');
|
|
223
|
+
});
|
|
224
|
+
it('should not duplicate terms during expansion', () => {
|
|
225
|
+
const result = analyzer.analyze('test spec');
|
|
226
|
+
const testCount = result.expandedTerms.filter((t) => t === 'test').length;
|
|
227
|
+
expect(testCount).toBe(1);
|
|
228
|
+
});
|
|
229
|
+
it('should preserve non-expandable terms', () => {
|
|
230
|
+
const result = analyzer.analyze('foobar baz');
|
|
231
|
+
expect(result.expandedTerms).toContain('foobar');
|
|
232
|
+
expect(result.expandedTerms).toContain('baz');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=query-analyzer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-analyzer.test.js","sourceRoot":"","sources":["../../src/retrieval/query-analyzer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SearchResult } from '../types/index.js';
|
|
2
|
+
import type { ExpandedContext, RelatedChunk } from './context-expander.js';
|
|
3
|
+
export interface TokenBudgetConfig {
|
|
4
|
+
/** Maximum total tokens for assembled context. Default 8000. */
|
|
5
|
+
maxTokens: number;
|
|
6
|
+
/** Tokens reserved for the LLM response. Default 2000. */
|
|
7
|
+
reserveForAnswer: number;
|
|
8
|
+
/** Fraction of available budget for primary results. Default 0.6. */
|
|
9
|
+
primaryWeight: number;
|
|
10
|
+
/** Fraction of available budget for related context. Default 0.3. */
|
|
11
|
+
relatedWeight: number;
|
|
12
|
+
/** Fraction of available budget for graph excerpt. Default 0.1. */
|
|
13
|
+
graphWeight: number;
|
|
14
|
+
}
|
|
15
|
+
export interface AssembledContext {
|
|
16
|
+
/** Final assembled context string with formatted sections. */
|
|
17
|
+
content: string;
|
|
18
|
+
/** Primary results that fit within the budget. */
|
|
19
|
+
primaryChunks: SearchResult[];
|
|
20
|
+
/** Related chunks that fit within the budget. */
|
|
21
|
+
relatedChunks: RelatedChunk[];
|
|
22
|
+
/** Estimated total token count of the assembled content. */
|
|
23
|
+
tokenCount: number;
|
|
24
|
+
/** Whether results were truncated to fit the budget. */
|
|
25
|
+
truncated: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare class TokenBudgetOptimizer {
|
|
28
|
+
private readonly config;
|
|
29
|
+
constructor(config?: Partial<TokenBudgetConfig>);
|
|
30
|
+
/**
|
|
31
|
+
* Assemble an ExpandedContext into a token-budgeted context string.
|
|
32
|
+
*
|
|
33
|
+
* Pipeline:
|
|
34
|
+
* 1. Calculate available budget: maxTokens - reserveForAnswer
|
|
35
|
+
* 2. Allocate budget: primary * primaryWeight, related * relatedWeight, graph * graphWeight
|
|
36
|
+
* 3. Fill primary results first (highest score first)
|
|
37
|
+
* 4. Fill related chunks (closest relationship first)
|
|
38
|
+
* 5. Add graph excerpt if budget remains
|
|
39
|
+
* 6. Build formatted context string
|
|
40
|
+
*/
|
|
41
|
+
assemble(expanded: ExpandedContext): AssembledContext;
|
|
42
|
+
/** Estimate token count using the text.length / 4 approximation. */
|
|
43
|
+
estimateTokens(text: string): number;
|
|
44
|
+
/**
|
|
45
|
+
* Fill a budget with items, returning what fits.
|
|
46
|
+
* Uses the formatted version of each item to estimate tokens.
|
|
47
|
+
*/
|
|
48
|
+
private fillBudget;
|
|
49
|
+
/** Format the graph excerpt as a simplified text representation. */
|
|
50
|
+
private formatGraphExcerpt;
|
|
51
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
maxTokens: 8000,
|
|
3
|
+
reserveForAnswer: 2000,
|
|
4
|
+
primaryWeight: 0.6,
|
|
5
|
+
relatedWeight: 0.3,
|
|
6
|
+
graphWeight: 0.1,
|
|
7
|
+
};
|
|
8
|
+
export class TokenBudgetOptimizer {
|
|
9
|
+
config;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Assemble an ExpandedContext into a token-budgeted context string.
|
|
15
|
+
*
|
|
16
|
+
* Pipeline:
|
|
17
|
+
* 1. Calculate available budget: maxTokens - reserveForAnswer
|
|
18
|
+
* 2. Allocate budget: primary * primaryWeight, related * relatedWeight, graph * graphWeight
|
|
19
|
+
* 3. Fill primary results first (highest score first)
|
|
20
|
+
* 4. Fill related chunks (closest relationship first)
|
|
21
|
+
* 5. Add graph excerpt if budget remains
|
|
22
|
+
* 6. Build formatted context string
|
|
23
|
+
*/
|
|
24
|
+
assemble(expanded) {
|
|
25
|
+
const availableBudget = Math.max(0, this.config.maxTokens - this.config.reserveForAnswer);
|
|
26
|
+
const primaryBudget = Math.floor(availableBudget * this.config.primaryWeight);
|
|
27
|
+
const relatedBudget = Math.floor(availableBudget * this.config.relatedWeight);
|
|
28
|
+
const graphBudget = Math.floor(availableBudget * this.config.graphWeight);
|
|
29
|
+
// Step 1: Fill primary results (sorted by score descending)
|
|
30
|
+
const sortedPrimary = [...expanded.primaryResults].sort((a, b) => b.score - a.score);
|
|
31
|
+
const { items: includedPrimary, tokensUsed: primaryTokensUsed } = this.fillBudget(sortedPrimary, primaryBudget, formatPrimaryChunk);
|
|
32
|
+
// Step 2: Fill related chunks (sorted by distance ascending)
|
|
33
|
+
const sortedRelated = [...expanded.relatedChunks].sort((a, b) => a.distance - b.distance);
|
|
34
|
+
const { items: includedRelated, tokensUsed: relatedTokensUsed } = this.fillBudget(sortedRelated, relatedBudget, formatRelatedChunk);
|
|
35
|
+
// Step 3: Build graph excerpt string
|
|
36
|
+
const graphString = this.formatGraphExcerpt(expanded.graphExcerpt);
|
|
37
|
+
const graphTokens = this.estimateTokens(graphString);
|
|
38
|
+
const includedGraph = graphTokens <= graphBudget ? graphString : '';
|
|
39
|
+
const graphTokensUsed = includedGraph ? graphTokens : 0;
|
|
40
|
+
// Step 4: Build formatted context string
|
|
41
|
+
const sections = [];
|
|
42
|
+
if (includedPrimary.length > 0) {
|
|
43
|
+
sections.push('## Primary Results\n');
|
|
44
|
+
for (const chunk of includedPrimary) {
|
|
45
|
+
sections.push(formatPrimaryChunk(chunk));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (includedRelated.length > 0) {
|
|
49
|
+
sections.push('## Related Context\n');
|
|
50
|
+
for (const related of includedRelated) {
|
|
51
|
+
sections.push(formatRelatedChunk(related));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (includedGraph) {
|
|
55
|
+
sections.push('## Dependency Graph\n');
|
|
56
|
+
sections.push(includedGraph);
|
|
57
|
+
}
|
|
58
|
+
const content = sections.join('\n');
|
|
59
|
+
const totalTokens = primaryTokensUsed + relatedTokensUsed + graphTokensUsed;
|
|
60
|
+
const truncated = includedPrimary.length < expanded.primaryResults.length ||
|
|
61
|
+
includedRelated.length < expanded.relatedChunks.length ||
|
|
62
|
+
(!includedGraph &&
|
|
63
|
+
expanded.graphExcerpt.nodes.length > 0 &&
|
|
64
|
+
graphTokens > graphBudget);
|
|
65
|
+
return {
|
|
66
|
+
content,
|
|
67
|
+
primaryChunks: includedPrimary,
|
|
68
|
+
relatedChunks: includedRelated,
|
|
69
|
+
tokenCount: totalTokens,
|
|
70
|
+
truncated,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Estimate token count using the text.length / 4 approximation. */
|
|
74
|
+
estimateTokens(text) {
|
|
75
|
+
return Math.ceil(text.length / 4);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fill a budget with items, returning what fits.
|
|
79
|
+
* Uses the formatted version of each item to estimate tokens.
|
|
80
|
+
*/
|
|
81
|
+
fillBudget(items, budget, formatter) {
|
|
82
|
+
const included = [];
|
|
83
|
+
let tokensUsed = 0;
|
|
84
|
+
for (const item of items) {
|
|
85
|
+
const formatted = formatter(item);
|
|
86
|
+
const tokens = this.estimateTokens(formatted);
|
|
87
|
+
if (tokensUsed + tokens > budget) {
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
included.push(item);
|
|
91
|
+
tokensUsed += tokens;
|
|
92
|
+
}
|
|
93
|
+
return { items: included, tokensUsed };
|
|
94
|
+
}
|
|
95
|
+
/** Format the graph excerpt as a simplified text representation. */
|
|
96
|
+
formatGraphExcerpt(excerpt) {
|
|
97
|
+
if (excerpt.nodes.length === 0)
|
|
98
|
+
return '';
|
|
99
|
+
const lines = [];
|
|
100
|
+
lines.push(`Nodes: ${excerpt.nodes.join(', ')}`);
|
|
101
|
+
for (const edge of excerpt.edges) {
|
|
102
|
+
lines.push(`${edge.from} --[${edge.type}]--> ${edge.to}`);
|
|
103
|
+
}
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Format a primary search result chunk for context output. */
|
|
108
|
+
function formatPrimaryChunk(result) {
|
|
109
|
+
const header = result.metadata?.name
|
|
110
|
+
? `### ${result.metadata.name} (${result.metadata.chunkType})`
|
|
111
|
+
: '### (unnamed chunk)';
|
|
112
|
+
const filePath = result.chunk?.filePath ?? '';
|
|
113
|
+
const lines = result.chunk?.startLine !== undefined && result.chunk?.endLine !== undefined
|
|
114
|
+
? ` [L${result.chunk.startLine}-${result.chunk.endLine}]`
|
|
115
|
+
: '';
|
|
116
|
+
const locationLine = filePath ? `File: ${filePath}${lines}` : '';
|
|
117
|
+
const parts = [header];
|
|
118
|
+
if (locationLine)
|
|
119
|
+
parts.push(locationLine);
|
|
120
|
+
if (result.nlSummary)
|
|
121
|
+
parts.push(result.nlSummary);
|
|
122
|
+
parts.push('```');
|
|
123
|
+
parts.push(result.content);
|
|
124
|
+
parts.push('```');
|
|
125
|
+
return parts.join('\n');
|
|
126
|
+
}
|
|
127
|
+
/** Format a related chunk for context output. */
|
|
128
|
+
function formatRelatedChunk(related) {
|
|
129
|
+
const label = `[${related.relationship}, distance=${related.distance}]`;
|
|
130
|
+
const name = related.chunk.metadata?.name ?? 'unknown';
|
|
131
|
+
const filePath = related.chunk.chunk?.filePath ?? '';
|
|
132
|
+
const parts = [`### ${name} ${label}`];
|
|
133
|
+
if (filePath)
|
|
134
|
+
parts.push(`File: ${filePath}`);
|
|
135
|
+
if (related.chunk.nlSummary)
|
|
136
|
+
parts.push(related.chunk.nlSummary);
|
|
137
|
+
parts.push('```');
|
|
138
|
+
parts.push(related.chunk.content);
|
|
139
|
+
parts.push('```');
|
|
140
|
+
return parts.join('\n');
|
|
141
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-budget.js","sourceRoot":"","sources":["../../src/retrieval/token-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|