codebase-context 1.6.2 → 1.8.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 -21
- package/README.md +417 -282
- package/dist/analyzers/angular/index.d.ts.map +1 -1
- package/dist/analyzers/angular/index.js +91 -40
- package/dist/analyzers/angular/index.js.map +1 -1
- package/dist/analyzers/generic/index.d.ts +1 -0
- package/dist/analyzers/generic/index.d.ts.map +1 -1
- package/dist/analyzers/generic/index.js +94 -14
- package/dist/analyzers/generic/index.js.map +1 -1
- package/dist/cli-formatters.d.ts +47 -0
- package/dist/cli-formatters.d.ts.map +1 -0
- package/dist/cli-formatters.js +803 -0
- package/dist/cli-formatters.js.map +1 -0
- package/dist/cli-memory.d.ts +5 -0
- package/dist/cli-memory.d.ts.map +1 -0
- package/dist/cli-memory.js +218 -0
- package/dist/cli-memory.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +317 -88
- package/dist/cli.js.map +1 -1
- package/dist/constants/codebase-context.d.ts +13 -0
- package/dist/constants/codebase-context.d.ts.map +1 -1
- package/dist/constants/codebase-context.js +13 -0
- package/dist/constants/codebase-context.js.map +1 -1
- package/dist/core/auto-refresh.d.ts +16 -0
- package/dist/core/auto-refresh.d.ts.map +1 -0
- package/dist/core/auto-refresh.js +25 -0
- package/dist/core/auto-refresh.js.map +1 -0
- package/dist/core/file-watcher.d.ts +15 -0
- package/dist/core/file-watcher.d.ts.map +1 -0
- package/dist/core/file-watcher.js +59 -0
- package/dist/core/file-watcher.js.map +1 -0
- package/dist/core/index-meta.d.ts +27 -0
- package/dist/core/index-meta.d.ts.map +1 -0
- package/dist/core/index-meta.js +212 -0
- package/dist/core/index-meta.js.map +1 -0
- package/dist/core/indexer.d.ts.map +1 -1
- package/dist/core/indexer.js +324 -26
- package/dist/core/indexer.js.map +1 -1
- package/dist/core/reranker.d.ts.map +1 -1
- package/dist/core/reranker.js +3 -0
- package/dist/core/reranker.js.map +1 -1
- package/dist/core/search-quality.js +2 -2
- package/dist/core/search-quality.js.map +1 -1
- package/dist/core/search.d.ts +1 -0
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +79 -11
- package/dist/core/search.js.map +1 -1
- package/dist/core/symbol-references.d.ts +20 -0
- package/dist/core/symbol-references.d.ts.map +1 -0
- package/dist/core/symbol-references.js +186 -0
- package/dist/core/symbol-references.js.map +1 -0
- package/dist/embeddings/index.d.ts +8 -0
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +17 -2
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/openai.d.ts +1 -1
- package/dist/embeddings/openai.d.ts.map +1 -1
- package/dist/embeddings/openai.js +3 -1
- package/dist/embeddings/openai.js.map +1 -1
- package/dist/embeddings/transformers.d.ts +6 -0
- package/dist/embeddings/transformers.d.ts.map +1 -1
- package/dist/embeddings/transformers.js +12 -5
- package/dist/embeddings/transformers.js.map +1 -1
- package/dist/embeddings/types.d.ts +1 -0
- package/dist/embeddings/types.d.ts.map +1 -1
- package/dist/embeddings/types.js +7 -1
- package/dist/embeddings/types.js.map +1 -1
- package/dist/eval/harness.d.ts +5 -0
- package/dist/eval/harness.d.ts.map +1 -0
- package/dist/eval/harness.js +153 -0
- package/dist/eval/harness.js.map +1 -0
- package/dist/eval/types.d.ts +59 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +2 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/grammars/manifest.d.ts +26 -0
- package/dist/grammars/manifest.d.ts.map +1 -0
- package/dist/grammars/manifest.js +64 -0
- package/dist/grammars/manifest.js.map +1 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +181 -1300
- package/dist/index.js.map +1 -1
- package/dist/patterns/semantics.d.ts +2 -1
- package/dist/patterns/semantics.d.ts.map +1 -1
- package/dist/patterns/semantics.js +0 -2
- package/dist/patterns/semantics.js.map +1 -1
- package/dist/preflight/evidence-lock.d.ts +6 -0
- package/dist/preflight/evidence-lock.d.ts.map +1 -1
- package/dist/preflight/evidence-lock.js +33 -1
- package/dist/preflight/evidence-lock.js.map +1 -1
- package/dist/storage/index.d.ts +4 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -2
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/lancedb.d.ts +11 -1
- package/dist/storage/lancedb.d.ts.map +1 -1
- package/dist/storage/lancedb.js +45 -11
- package/dist/storage/lancedb.js.map +1 -1
- package/dist/storage/types.d.ts +4 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js.map +1 -1
- package/dist/tools/detect-circular-dependencies.d.ts +5 -0
- package/dist/tools/detect-circular-dependencies.d.ts.map +1 -0
- package/dist/tools/detect-circular-dependencies.js +117 -0
- package/dist/tools/detect-circular-dependencies.js.map +1 -0
- package/dist/tools/get-codebase-metadata.d.ts +5 -0
- package/dist/tools/get-codebase-metadata.d.ts.map +1 -0
- package/dist/tools/get-codebase-metadata.js +53 -0
- package/dist/tools/get-codebase-metadata.js.map +1 -0
- package/dist/tools/get-indexing-status.d.ts +5 -0
- package/dist/tools/get-indexing-status.d.ts.map +1 -0
- package/dist/tools/get-indexing-status.js +44 -0
- package/dist/tools/get-indexing-status.js.map +1 -0
- package/dist/tools/get-memory.d.ts +5 -0
- package/dist/tools/get-memory.d.ts.map +1 -0
- package/dist/tools/get-memory.js +89 -0
- package/dist/tools/get-memory.js.map +1 -0
- package/dist/tools/get-style-guide.d.ts +5 -0
- package/dist/tools/get-style-guide.d.ts.map +1 -0
- package/dist/tools/get-style-guide.js +151 -0
- package/dist/tools/get-style-guide.js.map +1 -0
- package/dist/tools/get-symbol-references.d.ts +5 -0
- package/dist/tools/get-symbol-references.d.ts.map +1 -0
- package/dist/tools/get-symbol-references.js +70 -0
- package/dist/tools/get-symbol-references.js.map +1 -0
- package/dist/tools/get-team-patterns.d.ts +5 -0
- package/dist/tools/get-team-patterns.d.ts.map +1 -0
- package/dist/tools/get-team-patterns.js +147 -0
- package/dist/tools/get-team-patterns.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +41 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/refresh-index.d.ts +5 -0
- package/dist/tools/refresh-index.d.ts.map +1 -0
- package/dist/tools/refresh-index.js +40 -0
- package/dist/tools/refresh-index.js.map +1 -0
- package/dist/tools/remember.d.ts +5 -0
- package/dist/tools/remember.d.ts.map +1 -0
- package/dist/tools/remember.js +101 -0
- package/dist/tools/remember.js.map +1 -0
- package/dist/tools/search-codebase.d.ts +5 -0
- package/dist/tools/search-codebase.d.ts.map +1 -0
- package/dist/tools/search-codebase.js +745 -0
- package/dist/tools/search-codebase.js.map +1 -0
- package/dist/tools/types.d.ts +223 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types/index.d.ts +79 -11
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/ast-chunker.d.ts +71 -0
- package/dist/utils/ast-chunker.d.ts.map +1 -0
- package/dist/utils/ast-chunker.js +453 -0
- package/dist/utils/ast-chunker.js.map +1 -0
- package/dist/utils/chunking.d.ts.map +1 -1
- package/dist/utils/chunking.js +10 -3
- package/dist/utils/chunking.js.map +1 -1
- package/dist/utils/language-detection.d.ts.map +1 -1
- package/dist/utils/language-detection.js +26 -1
- package/dist/utils/language-detection.js.map +1 -1
- package/dist/utils/tree-sitter.d.ts +28 -0
- package/dist/utils/tree-sitter.d.ts.map +1 -0
- package/dist/utils/tree-sitter.js +422 -0
- package/dist/utils/tree-sitter.js.map +1 -0
- package/dist/utils/usage-tracker.d.ts +30 -40
- package/dist/utils/usage-tracker.d.ts.map +1 -1
- package/dist/utils/usage-tracker.js +66 -8
- package/dist/utils/usage-tracker.js.map +1 -1
- package/docs/capabilities.md +183 -92
- package/docs/cli.md +196 -0
- package/grammars/.gitkeep +0 -0
- package/grammars/tree-sitter-c.wasm +0 -0
- package/grammars/tree-sitter-c_sharp.wasm +0 -0
- package/grammars/tree-sitter-cpp.wasm +0 -0
- package/grammars/tree-sitter-go.wasm +0 -0
- package/grammars/tree-sitter-java.wasm +0 -0
- package/grammars/tree-sitter-javascript.wasm +0 -0
- package/grammars/tree-sitter-kotlin.wasm +0 -0
- package/grammars/tree-sitter-python.wasm +0 -0
- package/grammars/tree-sitter-rust.wasm +0 -0
- package/grammars/tree-sitter-tsx.wasm +0 -0
- package/grammars/tree-sitter-typescript.wasm +0 -0
- package/package.json +153 -157
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { CODEBASE_CONTEXT_DIRNAME, KEYWORD_INDEX_FILENAME } from '../constants/codebase-context.js';
|
|
4
|
+
import { IndexCorruptedError } from '../errors/index.js';
|
|
5
|
+
import { detectLanguage } from '../utils/language-detection.js';
|
|
6
|
+
import { findIdentifierOccurrences } from '../utils/tree-sitter.js';
|
|
7
|
+
function escapeRegex(value) {
|
|
8
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
9
|
+
}
|
|
10
|
+
function getUsageFile(rootPath, chunk) {
|
|
11
|
+
if (typeof chunk.relativePath === 'string' && chunk.relativePath.trim()) {
|
|
12
|
+
return chunk.relativePath.replace(/\\/g, '/');
|
|
13
|
+
}
|
|
14
|
+
if (typeof chunk.filePath === 'string' && chunk.filePath.trim()) {
|
|
15
|
+
const relativePath = path.relative(rootPath, chunk.filePath);
|
|
16
|
+
if (!relativePath || relativePath.startsWith('..')) {
|
|
17
|
+
return path.basename(chunk.filePath);
|
|
18
|
+
}
|
|
19
|
+
return relativePath.replace(/\\/g, '/');
|
|
20
|
+
}
|
|
21
|
+
return 'unknown';
|
|
22
|
+
}
|
|
23
|
+
function buildPreview(content, lineOffset) {
|
|
24
|
+
const lines = content.split('\n');
|
|
25
|
+
const start = Math.max(0, lineOffset - 1);
|
|
26
|
+
const end = Math.min(lines.length, lineOffset + 2);
|
|
27
|
+
const previewLines = lines.slice(start, end);
|
|
28
|
+
return previewLines.join('\n').trim();
|
|
29
|
+
}
|
|
30
|
+
function buildPreviewFromFileLines(lines, line) {
|
|
31
|
+
const start = Math.max(0, line - 2);
|
|
32
|
+
const end = Math.min(lines.length, line + 1);
|
|
33
|
+
return lines.slice(start, end).join('\n').trim();
|
|
34
|
+
}
|
|
35
|
+
function resolveAbsoluteChunkPath(rootPath, chunk) {
|
|
36
|
+
const resolvedRoot = path.resolve(rootPath);
|
|
37
|
+
const isWithinRoot = (candidate) => {
|
|
38
|
+
const resolvedCandidate = path.resolve(candidate);
|
|
39
|
+
const relative = path.relative(resolvedRoot, resolvedCandidate);
|
|
40
|
+
return Boolean(relative) && !relative.startsWith('..') && !path.isAbsolute(relative);
|
|
41
|
+
};
|
|
42
|
+
if (typeof chunk.filePath === 'string' && chunk.filePath.trim()) {
|
|
43
|
+
const raw = chunk.filePath.trim();
|
|
44
|
+
if (path.isAbsolute(raw)) {
|
|
45
|
+
return isWithinRoot(raw) ? raw : null;
|
|
46
|
+
}
|
|
47
|
+
const resolved = path.resolve(resolvedRoot, raw);
|
|
48
|
+
return isWithinRoot(resolved) ? resolved : null;
|
|
49
|
+
}
|
|
50
|
+
if (typeof chunk.relativePath === 'string' && chunk.relativePath.trim()) {
|
|
51
|
+
const resolved = path.resolve(resolvedRoot, chunk.relativePath.trim());
|
|
52
|
+
return isWithinRoot(resolved) ? resolved : null;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
async function fileExists(targetPath) {
|
|
57
|
+
try {
|
|
58
|
+
const stat = await fs.stat(targetPath);
|
|
59
|
+
return stat.isFile();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function findSymbolReferences(rootPath, symbol, limit = 10) {
|
|
66
|
+
const normalizedSymbol = symbol.trim();
|
|
67
|
+
const normalizedLimit = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 10;
|
|
68
|
+
if (!normalizedSymbol) {
|
|
69
|
+
return {
|
|
70
|
+
status: 'error',
|
|
71
|
+
message: 'Symbol is required'
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const indexPath = path.join(rootPath, CODEBASE_CONTEXT_DIRNAME, KEYWORD_INDEX_FILENAME);
|
|
75
|
+
let chunksRaw;
|
|
76
|
+
try {
|
|
77
|
+
const content = await fs.readFile(indexPath, 'utf-8');
|
|
78
|
+
chunksRaw = JSON.parse(content);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new IndexCorruptedError(`Keyword index missing or unreadable (rebuild required): ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
}
|
|
83
|
+
if (Array.isArray(chunksRaw)) {
|
|
84
|
+
throw new IndexCorruptedError('Legacy keyword index format detected (missing header). Rebuild required.');
|
|
85
|
+
}
|
|
86
|
+
const chunks = chunksRaw !== null &&
|
|
87
|
+
typeof chunksRaw === 'object' &&
|
|
88
|
+
'chunks' in chunksRaw &&
|
|
89
|
+
Array.isArray(chunksRaw.chunks)
|
|
90
|
+
? chunksRaw.chunks
|
|
91
|
+
: null;
|
|
92
|
+
if (!chunks) {
|
|
93
|
+
throw new IndexCorruptedError('Keyword index corrupted: expected { header, chunks }');
|
|
94
|
+
}
|
|
95
|
+
const usages = [];
|
|
96
|
+
let usageCount = 0;
|
|
97
|
+
const escapedSymbol = escapeRegex(normalizedSymbol);
|
|
98
|
+
const prefilter = new RegExp(`\\b${escapedSymbol}\\b`);
|
|
99
|
+
const matcher = new RegExp(`\\b${escapedSymbol}\\b`, 'g');
|
|
100
|
+
// Prefilter candidate files from the keyword index. We do not trust chunk contents for
|
|
101
|
+
// exact reference counting when Tree-sitter is available; chunks only guide which files to scan.
|
|
102
|
+
const chunksByFile = new Map();
|
|
103
|
+
for (const chunkRaw of chunks) {
|
|
104
|
+
const chunk = chunkRaw;
|
|
105
|
+
if (typeof chunk.content !== 'string')
|
|
106
|
+
continue;
|
|
107
|
+
if (!prefilter.test(chunk.content))
|
|
108
|
+
continue;
|
|
109
|
+
const relPath = getUsageFile(rootPath, chunk);
|
|
110
|
+
const absPath = resolveAbsoluteChunkPath(rootPath, chunk);
|
|
111
|
+
const entry = chunksByFile.get(relPath);
|
|
112
|
+
if (entry) {
|
|
113
|
+
entry.chunks.push(chunk);
|
|
114
|
+
// Prefer a real absolute path when available
|
|
115
|
+
if (!entry.absPath && absPath) {
|
|
116
|
+
entry.absPath = absPath;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
chunksByFile.set(relPath, { relPath, absPath, chunks: [chunk] });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for (const entry of chunksByFile.values()) {
|
|
124
|
+
const relPath = entry.relPath;
|
|
125
|
+
const absPath = entry.absPath;
|
|
126
|
+
// Preferred: Tree-sitter identifier walk on the real file content.
|
|
127
|
+
if (absPath && (await fileExists(absPath))) {
|
|
128
|
+
try {
|
|
129
|
+
const raw = await fs.readFile(absPath, 'utf-8');
|
|
130
|
+
const content = raw.replace(/\r\n/g, '\n');
|
|
131
|
+
const language = detectLanguage(absPath);
|
|
132
|
+
const occurrences = await findIdentifierOccurrences(content, language, normalizedSymbol);
|
|
133
|
+
if (occurrences) {
|
|
134
|
+
usageCount += occurrences.length;
|
|
135
|
+
if (usages.length < normalizedLimit && occurrences.length > 0) {
|
|
136
|
+
const lines = content.split('\n');
|
|
137
|
+
for (const occ of occurrences) {
|
|
138
|
+
if (usages.length >= normalizedLimit)
|
|
139
|
+
break;
|
|
140
|
+
usages.push({
|
|
141
|
+
file: relPath,
|
|
142
|
+
line: occ.line,
|
|
143
|
+
preview: buildPreviewFromFileLines(lines, occ.line)
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Fall through to chunk-regex fallback (missing grammar, parse failure, etc.)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Fallback: regex scan inside the matched chunks (legacy behavior).
|
|
155
|
+
for (const chunk of entry.chunks) {
|
|
156
|
+
if (typeof chunk.content !== 'string')
|
|
157
|
+
continue;
|
|
158
|
+
const chunkContent = chunk.content;
|
|
159
|
+
const startLine = typeof chunk.startLine === 'number' ? chunk.startLine : 1;
|
|
160
|
+
matcher.lastIndex = 0;
|
|
161
|
+
let match;
|
|
162
|
+
while ((match = matcher.exec(chunkContent)) !== null) {
|
|
163
|
+
usageCount += 1;
|
|
164
|
+
if (usages.length >= normalizedLimit) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const prefix = chunkContent.slice(0, match.index);
|
|
168
|
+
const lineOffset = prefix.split('\n').length - 1;
|
|
169
|
+
usages.push({
|
|
170
|
+
file: relPath,
|
|
171
|
+
line: startLine + lineOffset,
|
|
172
|
+
preview: buildPreview(chunkContent, lineOffset)
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
status: 'success',
|
|
179
|
+
symbol: normalizedSymbol,
|
|
180
|
+
usageCount,
|
|
181
|
+
usages,
|
|
182
|
+
confidence: 'syntactic',
|
|
183
|
+
isComplete: usageCount < normalizedLimit
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=symbol-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-references.js","sourceRoot":"","sources":["../../src/core/symbol-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
2
|
export * from './transformers.js';
|
|
3
3
|
import { EmbeddingProvider, EmbeddingConfig } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Returns expected embedding dimensions for a given config without initializing any provider.
|
|
6
|
+
* Used for LanceDB dimension validation before committing to an incremental update.
|
|
7
|
+
*
|
|
8
|
+
* Looks up dimensions from MODEL_CONFIGS (the authoritative source shared with the provider
|
|
9
|
+
* implementation) so new models are automatically handled without updating this function.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getConfiguredDimensions(config?: Partial<EmbeddingConfig>): number;
|
|
4
12
|
export declare function getEmbeddingProvider(config?: Partial<EmbeddingConfig>): Promise<EmbeddingProvider>;
|
|
5
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EACL,iBAAiB,EACjB,eAAe,EAIhB,MAAM,YAAY,CAAC;AAGpB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,MAAM,CAOrF;AAKD,wBAAsB,oBAAoB,CACxC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAmC5B"}
|
package/dist/embeddings/index.js
CHANGED
|
@@ -1,7 +1,22 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
2
|
export * from './transformers.js';
|
|
3
|
-
import { DEFAULT_EMBEDDING_CONFIG } from './types.js';
|
|
4
|
-
import { TransformersEmbeddingProvider } from './transformers.js';
|
|
3
|
+
import { DEFAULT_EMBEDDING_CONFIG, DEFAULT_MODEL, parseEmbeddingProviderName } from './types.js';
|
|
4
|
+
import { TransformersEmbeddingProvider, MODEL_CONFIGS } from './transformers.js';
|
|
5
|
+
/**
|
|
6
|
+
* Returns expected embedding dimensions for a given config without initializing any provider.
|
|
7
|
+
* Used for LanceDB dimension validation before committing to an incremental update.
|
|
8
|
+
*
|
|
9
|
+
* Looks up dimensions from MODEL_CONFIGS (the authoritative source shared with the provider
|
|
10
|
+
* implementation) so new models are automatically handled without updating this function.
|
|
11
|
+
*/
|
|
12
|
+
export function getConfiguredDimensions(config = {}) {
|
|
13
|
+
const provider = config.provider ?? parseEmbeddingProviderName(process.env.EMBEDDING_PROVIDER) ?? 'transformers';
|
|
14
|
+
const model = config.model ?? process.env.EMBEDDING_MODEL ?? DEFAULT_MODEL;
|
|
15
|
+
if (provider === 'openai')
|
|
16
|
+
return model.includes('large') ? 3072 : 1536; // text-embedding-3-large: 3072, all others: 1536
|
|
17
|
+
// Look up from the same MODEL_CONFIGS the provider uses — avoids stale hardcoded guesses
|
|
18
|
+
return MODEL_CONFIGS[model]?.dimensions ?? 384;
|
|
19
|
+
}
|
|
5
20
|
let cachedProvider = null;
|
|
6
21
|
let cachedProviderType = null;
|
|
7
22
|
export async function getEmbeddingProvider(config = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAGL,wBAAwB,EACxB,aAAa,EACb,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,6BAA6B,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAmC,EAAE;IAC3E,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,IAAI,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,cAAc,CAAC;IAClG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,aAAa,CAAC;IAC3E,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,iDAAiD;IAC1H,yFAAyF;IACzF,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC;AACjD,CAAC;AAED,IAAI,cAAc,GAA6B,IAAI,CAAC;AACpD,IAAI,kBAAkB,GAAkB,IAAI,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAmC,EAAE;IAErC,MAAM,YAAY,GAAG,EAAE,GAAG,wBAAwB,EAAE,GAAG,MAAM,EAAE,CAAC;IAChE,MAAM,WAAW,GAAG,GAAG,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;IAErE,IAAI,cAAc,IAAI,kBAAkB,KAAK,WAAW,EAAE,CAAC;QACzD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAC1C,YAAY,CAAC,KAAK,IAAI,wBAAwB,EAC9C,YAAY,CAAC,MAAM,EACnB,YAAY,CAAC,WAAW,CACzB,CAAC;QACF,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,cAAc,GAAG,QAAQ,CAAC;QAC1B,kBAAkB,GAAG,WAAW,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC5B,cAAc,GAAG,QAAQ,CAAC;IAC1B,kBAAkB,GAAG,WAAW,CAAC;IAEjC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -9,7 +9,7 @@ export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
|
9
9
|
private apiKey?;
|
|
10
10
|
private apiEndpoint;
|
|
11
11
|
readonly name = "openai";
|
|
12
|
-
|
|
12
|
+
get dimensions(): number;
|
|
13
13
|
constructor(modelName?: string, apiKey?: string | undefined, apiEndpoint?: string);
|
|
14
14
|
initialize(): Promise<void>;
|
|
15
15
|
isReady(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAO7D,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,WAAW;IARrB,QAAQ,CAAC,IAAI,YAAY;IACzB,IAAI,UAAU,IAAI,MAAM,CAEvB;gBAGU,SAAS,GAAE,MAAiC,EAC7C,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,WAAW,GAAE,MAAoC;IAGrD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,IAAI,OAAO;IAIZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CA+BvD"}
|
|
@@ -8,7 +8,9 @@ export class OpenAIEmbeddingProvider {
|
|
|
8
8
|
apiKey;
|
|
9
9
|
apiEndpoint;
|
|
10
10
|
name = 'openai';
|
|
11
|
-
dimensions
|
|
11
|
+
get dimensions() {
|
|
12
|
+
return this.modelName.includes('large') ? 3072 : 1536;
|
|
13
|
+
}
|
|
12
14
|
constructor(modelName = 'text-embedding-3-small', apiKey, apiEndpoint = 'https://api.openai.com/v1') {
|
|
13
15
|
this.modelName = modelName;
|
|
14
16
|
this.apiKey = apiKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,OAAO,uBAAuB;IAOvB;IACD;IACA;IARD,IAAI,GAAG,QAAQ,CAAC;IACzB,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,YACW,YAAoB,wBAAwB,EAC7C,MAAe,EACf,cAAsB,2BAA2B;QAFhD,cAAS,GAAT,SAAS,CAAmC;QAC7C,WAAM,GAAN,MAAM,CAAS;QACf,gBAAW,GAAX,WAAW,CAAsC;IACxD,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,aAAa,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,SAAS;oBACrB,KAAK,EAAE,KAAK;oBACZ,eAAe,EAAE,OAAO;iBACzB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;YAEhE,wCAAwC;YACxC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { EmbeddingProvider } from './types.js';
|
|
2
|
+
interface ModelConfig {
|
|
3
|
+
dimensions: number;
|
|
4
|
+
maxContext: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const MODEL_CONFIGS: Record<string, ModelConfig>;
|
|
2
7
|
export declare class TransformersEmbeddingProvider implements EmbeddingProvider {
|
|
3
8
|
readonly name = "transformers";
|
|
4
9
|
readonly modelName: string;
|
|
@@ -14,4 +19,5 @@ export declare class TransformersEmbeddingProvider implements EmbeddingProvider
|
|
|
14
19
|
isReady(): boolean;
|
|
15
20
|
}
|
|
16
21
|
export declare function createEmbeddingProvider(modelName?: string): Promise<EmbeddingProvider>;
|
|
22
|
+
export {};
|
|
17
23
|
//# sourceMappingURL=transformers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../src/embeddings/transformers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../../src/embeddings/transformers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAC;AAG9D,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAKrD,CAAC;AAYF,qBAAa,6BAA8B,YAAW,iBAAiB;IACrE,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAA8B;gBAErC,SAAS,GAAE,MAAsB;IAKvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAQnB,WAAW;IA8BnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA2BtD,OAAO,IAAI,OAAO;CAGnB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAI5B"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
1
|
import { DEFAULT_MODEL } from './types.js';
|
|
3
|
-
const MODEL_CONFIGS = {
|
|
2
|
+
export const MODEL_CONFIGS = {
|
|
4
3
|
'Xenova/bge-small-en-v1.5': { dimensions: 384, maxContext: 512 },
|
|
5
4
|
'Xenova/all-MiniLM-L6-v2': { dimensions: 384, maxContext: 512 },
|
|
6
5
|
'Xenova/bge-base-en-v1.5': { dimensions: 768, maxContext: 512 },
|
|
@@ -36,14 +35,18 @@ export class TransformersEmbeddingProvider {
|
|
|
36
35
|
}
|
|
37
36
|
async _initialize() {
|
|
38
37
|
try {
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
if (process.env.CODEBASE_CONTEXT_DEBUG) {
|
|
39
|
+
console.error(`Loading embedding model: ${this.modelName}`);
|
|
40
|
+
console.error('(First run will download the model - this may take a moment)');
|
|
41
|
+
}
|
|
41
42
|
const { pipeline } = await import('@huggingface/transformers');
|
|
42
43
|
this.pipeline = await pipeline('feature-extraction', this.modelName, {
|
|
43
44
|
dtype: 'q8'
|
|
44
45
|
});
|
|
45
46
|
this.ready = true;
|
|
46
|
-
|
|
47
|
+
if (process.env.CODEBASE_CONTEXT_DEBUG) {
|
|
48
|
+
console.error(`Model loaded successfully: ${this.modelName}`);
|
|
49
|
+
}
|
|
47
50
|
}
|
|
48
51
|
catch (error) {
|
|
49
52
|
console.error('Failed to initialize embedding model:', error);
|
|
@@ -54,6 +57,8 @@ export class TransformersEmbeddingProvider {
|
|
|
54
57
|
if (!this.ready) {
|
|
55
58
|
await this.initialize();
|
|
56
59
|
}
|
|
60
|
+
if (!this.pipeline)
|
|
61
|
+
throw new Error('Pipeline not initialized');
|
|
57
62
|
try {
|
|
58
63
|
const output = await this.pipeline(text, {
|
|
59
64
|
pooling: 'mean',
|
|
@@ -70,6 +75,8 @@ export class TransformersEmbeddingProvider {
|
|
|
70
75
|
if (!this.ready) {
|
|
71
76
|
await this.initialize();
|
|
72
77
|
}
|
|
78
|
+
if (!this.pipeline)
|
|
79
|
+
throw new Error('Pipeline not initialized');
|
|
73
80
|
const embeddings = [];
|
|
74
81
|
const batchSize = computeSafeBatchSize(this.modelName);
|
|
75
82
|
for (let i = 0; i < texts.length; i += batchSize) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../src/embeddings/transformers.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../src/embeddings/transformers.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export interface EmbeddingConfig {
|
|
|
15
15
|
apiKey?: string;
|
|
16
16
|
apiEndpoint?: string;
|
|
17
17
|
}
|
|
18
|
+
export declare function parseEmbeddingProviderName(value: unknown): EmbeddingConfig['provider'] | undefined;
|
|
18
19
|
export declare const DEFAULT_MODEL: string;
|
|
19
20
|
export declare const DEFAULT_EMBEDDING_CONFIG: EmbeddingConfig;
|
|
20
21
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,eAAe,CAAC,UAAU,CAAC,GAAG,SAAS,CAKzC;AAKD,eAAO,MAAM,aAAa,QAA4D,CAAC;AAEvF,eAAO,MAAM,wBAAwB,EAAE,eAMtC,CAAC"}
|
package/dist/embeddings/types.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
export function parseEmbeddingProviderName(value) {
|
|
2
|
+
if (value === 'transformers' || value === 'ollama' || value === 'openai' || value === 'custom') {
|
|
3
|
+
return value;
|
|
4
|
+
}
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
1
7
|
// Default: bge-small (fast, ~2min indexing, consumer-hardware safe)
|
|
2
8
|
// Opt-in: set EMBEDDING_MODEL=onnx-community/granite-embedding-small-english-r2-ONNX for
|
|
3
9
|
// better conceptual search at the cost of 5-10x slower indexing and higher RAM usage
|
|
4
10
|
export const DEFAULT_MODEL = process.env.EMBEDDING_MODEL || 'Xenova/bge-small-en-v1.5';
|
|
5
11
|
export const DEFAULT_EMBEDDING_CONFIG = {
|
|
6
|
-
provider: process.env.EMBEDDING_PROVIDER
|
|
12
|
+
provider: parseEmbeddingProviderName(process.env.EMBEDDING_PROVIDER) ?? 'transformers',
|
|
7
13
|
model: DEFAULT_MODEL,
|
|
8
14
|
batchSize: 32,
|
|
9
15
|
maxRetries: 3,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,0BAA0B,CACxC,KAAc;IAEd,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,oEAAoE;AACpE,yFAAyF;AACzF,qFAAqF;AACrF,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,0BAA0B,CAAC;AAEvF,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,QAAQ,EAAE,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,cAAc;IACtF,KAAK,EAAE,aAAa;IACpB,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;CACnC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EvalGate, EvalResult, EvalSummary, EvaluateFixtureParams, FormatEvalReportParams } from './types.js';
|
|
2
|
+
export declare function evaluateFixture({ fixture, searcher, limit, searchOptions }: EvaluateFixtureParams): Promise<EvalSummary>;
|
|
3
|
+
export declare function summarizeEvaluation(results: EvalResult[], gate?: EvalGate): EvalSummary;
|
|
4
|
+
export declare function formatEvalReport({ codebaseLabel, fixturePath, summary, redactPaths }: FormatEvalReportParams): string;
|
|
5
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/eval/harness.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,QAAQ,EAER,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AA4GpB,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,QAAQ,EACR,KAAS,EACT,aAAa,EACd,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAS9C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,QAAc,GAAG,WAAW,CAsB5F;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,aAAa,EACb,WAAW,EACX,OAAO,EACP,WAAkB,EACnB,EAAE,sBAAsB,GAAG,MAAM,CAuDjC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
function normalizePath(filePath) {
|
|
3
|
+
return filePath.toLowerCase().replace(/\\/g, '/');
|
|
4
|
+
}
|
|
5
|
+
function isTestFile(filePath) {
|
|
6
|
+
const normalized = normalizePath(filePath);
|
|
7
|
+
return (normalized.includes('.spec.') ||
|
|
8
|
+
normalized.includes('.test.') ||
|
|
9
|
+
normalized.includes('/e2e/') ||
|
|
10
|
+
normalized.includes('/__tests__/'));
|
|
11
|
+
}
|
|
12
|
+
function matchesPattern(filePath, patterns) {
|
|
13
|
+
const normalized = normalizePath(filePath);
|
|
14
|
+
return patterns.some((pattern) => normalized.includes(pattern.toLowerCase()));
|
|
15
|
+
}
|
|
16
|
+
function dedupeByFile(results) {
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
const deduped = [];
|
|
19
|
+
for (const result of results) {
|
|
20
|
+
const key = normalizePath(result.filePath);
|
|
21
|
+
if (seen.has(key)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
seen.add(key);
|
|
25
|
+
deduped.push(result);
|
|
26
|
+
}
|
|
27
|
+
return deduped;
|
|
28
|
+
}
|
|
29
|
+
function getExpectedPatterns(query) {
|
|
30
|
+
return query.expectedPatterns ?? query.expectedTopFiles ?? [];
|
|
31
|
+
}
|
|
32
|
+
function getExpectedNotPatterns(query) {
|
|
33
|
+
return query.expectedNotPatterns ?? query.expectedNotTopFiles ?? [];
|
|
34
|
+
}
|
|
35
|
+
function evaluateQuery(query, results) {
|
|
36
|
+
const uniqueResults = dedupeByFile(results);
|
|
37
|
+
const topFile = uniqueResults.length > 0 ? uniqueResults[0].filePath : null;
|
|
38
|
+
const top3Files = uniqueResults.slice(0, 3).map((result) => result.filePath);
|
|
39
|
+
const expectedPatterns = getExpectedPatterns(query);
|
|
40
|
+
const expectedNotPatterns = getExpectedNotPatterns(query);
|
|
41
|
+
const top1Correct = topFile !== null &&
|
|
42
|
+
matchesPattern(topFile, expectedPatterns) &&
|
|
43
|
+
!matchesPattern(topFile, expectedNotPatterns);
|
|
44
|
+
const top3Recall = top3Files.some((filePath) => matchesPattern(filePath, expectedPatterns) && !matchesPattern(filePath, expectedNotPatterns));
|
|
45
|
+
const specCount = top3Files.filter((filePath) => isTestFile(filePath)).length;
|
|
46
|
+
const specContaminated = specCount >= 2;
|
|
47
|
+
return {
|
|
48
|
+
queryId: query.id,
|
|
49
|
+
query: query.query,
|
|
50
|
+
category: query.category,
|
|
51
|
+
expectedPatterns,
|
|
52
|
+
expectedNotPatterns,
|
|
53
|
+
topFile,
|
|
54
|
+
top3Files,
|
|
55
|
+
top1Correct,
|
|
56
|
+
top3Recall,
|
|
57
|
+
specContaminated,
|
|
58
|
+
score: uniqueResults.length > 0 ? uniqueResults[0].score : 0
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function resolveGateThreshold(total, gate) {
|
|
62
|
+
if (gate <= 1) {
|
|
63
|
+
return Math.ceil(total * gate);
|
|
64
|
+
}
|
|
65
|
+
return Math.ceil(gate);
|
|
66
|
+
}
|
|
67
|
+
function hashPath(filePath) {
|
|
68
|
+
return crypto.createHash('sha1').update(normalizePath(filePath)).digest('hex').slice(0, 8);
|
|
69
|
+
}
|
|
70
|
+
function formatPath(filePath, redactPaths) {
|
|
71
|
+
if (!filePath) {
|
|
72
|
+
return 'none';
|
|
73
|
+
}
|
|
74
|
+
const normalized = filePath.replace(/\\/g, '/');
|
|
75
|
+
if (!redactPaths) {
|
|
76
|
+
return normalized;
|
|
77
|
+
}
|
|
78
|
+
const base = normalized.split('/').pop() || normalized;
|
|
79
|
+
return `path#${hashPath(normalized)}/${base}`;
|
|
80
|
+
}
|
|
81
|
+
export async function evaluateFixture({ fixture, searcher, limit = 5, searchOptions }) {
|
|
82
|
+
const results = [];
|
|
83
|
+
for (const query of fixture.queries) {
|
|
84
|
+
const searchResults = await searcher.search(query.query, limit, undefined, searchOptions);
|
|
85
|
+
results.push(evaluateQuery(query, searchResults));
|
|
86
|
+
}
|
|
87
|
+
return summarizeEvaluation(results);
|
|
88
|
+
}
|
|
89
|
+
export function summarizeEvaluation(results, gate = 0.7) {
|
|
90
|
+
const total = results.length;
|
|
91
|
+
const top1Correct = results.filter((result) => result.top1Correct).length;
|
|
92
|
+
const top3RecallCount = results.filter((result) => result.top3Recall).length;
|
|
93
|
+
const specContaminatedCount = results.filter((result) => result.specContaminated).length;
|
|
94
|
+
const avgTopScore = total > 0 ? results.reduce((sum, result) => sum + result.score, 0) / total : 0;
|
|
95
|
+
const gateThreshold = resolveGateThreshold(total, gate);
|
|
96
|
+
return {
|
|
97
|
+
total,
|
|
98
|
+
top1Correct,
|
|
99
|
+
top1Accuracy: total > 0 ? top1Correct / total : 0,
|
|
100
|
+
top3RecallCount,
|
|
101
|
+
top3Recall: total > 0 ? top3RecallCount / total : 0,
|
|
102
|
+
specContaminatedCount,
|
|
103
|
+
specContaminationRate: total > 0 ? specContaminatedCount / total : 0,
|
|
104
|
+
avgTopScore,
|
|
105
|
+
gateThreshold,
|
|
106
|
+
passesGate: total > 0 && top1Correct >= gateThreshold,
|
|
107
|
+
results
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function formatEvalReport({ codebaseLabel, fixturePath, summary, redactPaths = true }) {
|
|
111
|
+
const lines = [];
|
|
112
|
+
const wins = summary.results.filter((result) => result.top1Correct);
|
|
113
|
+
const failures = summary.results.filter((result) => !result.top1Correct);
|
|
114
|
+
lines.push(`\n=== Eval Report: ${codebaseLabel} ===`);
|
|
115
|
+
lines.push(`Fixture: ${fixturePath}`);
|
|
116
|
+
lines.push(`Top-1 Accuracy: ${summary.top1Correct}/${summary.total} (${(summary.top1Accuracy * 100).toFixed(0)}%)`);
|
|
117
|
+
lines.push(`Top-3 Recall: ${summary.top3RecallCount}/${summary.total} (${(summary.top3Recall * 100).toFixed(0)}%)`);
|
|
118
|
+
lines.push(`Spec Contamination: ${summary.specContaminatedCount}/${summary.total} (${(summary.specContaminationRate * 100).toFixed(0)}%)`);
|
|
119
|
+
lines.push(`Gate (${summary.gateThreshold}/${summary.total}): ${summary.passesGate ? 'PASS' : 'FAIL'}`);
|
|
120
|
+
lines.push(`Wins: ${wins.length} | Failures: ${failures.length}`);
|
|
121
|
+
lines.push('\nWins:');
|
|
122
|
+
if (wins.length === 0) {
|
|
123
|
+
lines.push(' (none)');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
for (const result of wins) {
|
|
127
|
+
lines.push(` PASS #${result.queryId} [${result.category}] "${result.query}" -> ${formatPath(result.topFile, redactPaths)} (${result.score.toFixed(3)})`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
lines.push('\nFailures:');
|
|
131
|
+
if (failures.length === 0) {
|
|
132
|
+
lines.push(' (none)');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
for (const result of failures) {
|
|
136
|
+
lines.push(` FAIL #${result.queryId} [${result.category}] "${result.query}" -> ${formatPath(result.topFile, redactPaths)} (${result.score.toFixed(3)})`);
|
|
137
|
+
lines.push(` expected: ${result.expectedPatterns.join(' | ') || '(none)'}`);
|
|
138
|
+
lines.push(` expected-not: ${result.expectedNotPatterns.join(' | ') || '(none)'}`);
|
|
139
|
+
lines.push(' top-3 actual:');
|
|
140
|
+
if (result.top3Files.length === 0) {
|
|
141
|
+
lines.push(' 1. none');
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
for (let index = 0; index < result.top3Files.length; index++) {
|
|
145
|
+
lines.push(` ${index + 1}. ${formatPath(result.top3Files[index], redactPaths)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
lines.push('\n================================');
|
|
151
|
+
return lines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/eval/harness.ts"],"names":[],"mappings":"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"}
|