@mhalder/qdrant-mcp-server 2.2.0 → 3.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/.github/workflows/ci.yml +4 -1
- package/CHANGELOG.md +22 -0
- package/README.md +78 -3
- package/build/code/indexer.d.ts +2 -1
- package/build/code/indexer.d.ts.map +1 -1
- package/build/code/indexer.js +37 -7
- package/build/code/indexer.js.map +1 -1
- package/build/git/chunker.d.ts +39 -0
- package/build/git/chunker.d.ts.map +1 -0
- package/build/git/chunker.js +210 -0
- package/build/git/chunker.js.map +1 -0
- package/build/git/chunker.test.d.ts +2 -0
- package/build/git/chunker.test.d.ts.map +1 -0
- package/build/git/chunker.test.js +230 -0
- package/build/git/chunker.test.js.map +1 -0
- package/build/git/config.d.ts +34 -0
- package/build/git/config.d.ts.map +1 -0
- package/build/git/config.js +163 -0
- package/build/git/config.js.map +1 -0
- package/build/git/extractor.d.ts +57 -0
- package/build/git/extractor.d.ts.map +1 -0
- package/build/git/extractor.integration.test.d.ts +6 -0
- package/build/git/extractor.integration.test.d.ts.map +1 -0
- package/build/git/extractor.integration.test.js +166 -0
- package/build/git/extractor.integration.test.js.map +1 -0
- package/build/git/extractor.js +231 -0
- package/build/git/extractor.js.map +1 -0
- package/build/git/extractor.test.d.ts +2 -0
- package/build/git/extractor.test.d.ts.map +1 -0
- package/build/git/extractor.test.js +267 -0
- package/build/git/extractor.test.js.map +1 -0
- package/build/git/index.d.ts +10 -0
- package/build/git/index.d.ts.map +1 -0
- package/build/git/index.js +11 -0
- package/build/git/index.js.map +1 -0
- package/build/git/indexer.d.ts +50 -0
- package/build/git/indexer.d.ts.map +1 -0
- package/build/git/indexer.js +588 -0
- package/build/git/indexer.js.map +1 -0
- package/build/git/indexer.test.d.ts +2 -0
- package/build/git/indexer.test.d.ts.map +1 -0
- package/build/git/indexer.test.js +867 -0
- package/build/git/indexer.test.js.map +1 -0
- package/build/git/sync/synchronizer.d.ts +43 -0
- package/build/git/sync/synchronizer.d.ts.map +1 -0
- package/build/git/sync/synchronizer.js +108 -0
- package/build/git/sync/synchronizer.js.map +1 -0
- package/build/git/sync/synchronizer.test.d.ts +2 -0
- package/build/git/sync/synchronizer.test.d.ts.map +1 -0
- package/build/git/sync/synchronizer.test.js +188 -0
- package/build/git/sync/synchronizer.test.js.map +1 -0
- package/build/git/types.d.ts +159 -0
- package/build/git/types.d.ts.map +1 -0
- package/build/git/types.js +5 -0
- package/build/git/types.js.map +1 -0
- package/build/index.js +18 -0
- package/build/index.js.map +1 -1
- package/build/tools/git-history.d.ts +10 -0
- package/build/tools/git-history.d.ts.map +1 -0
- package/build/tools/git-history.js +144 -0
- package/build/tools/git-history.js.map +1 -0
- package/build/tools/index.d.ts +2 -0
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +4 -0
- package/build/tools/index.js.map +1 -1
- package/build/tools/schemas.d.ts +24 -0
- package/build/tools/schemas.d.ts.map +1 -1
- package/build/tools/schemas.js +64 -0
- package/build/tools/schemas.js.map +1 -1
- package/package.json +2 -2
- package/src/code/indexer.ts +49 -7
- package/src/git/chunker.test.ts +284 -0
- package/src/git/chunker.ts +256 -0
- package/src/git/config.ts +173 -0
- package/src/git/extractor.integration.test.ts +221 -0
- package/src/git/extractor.test.ts +403 -0
- package/src/git/extractor.ts +284 -0
- package/src/git/index.ts +31 -0
- package/src/git/indexer.test.ts +1089 -0
- package/src/git/indexer.ts +745 -0
- package/src/git/sync/synchronizer.test.ts +250 -0
- package/src/git/sync/synchronizer.ts +122 -0
- package/src/git/types.ts +192 -0
- package/src/index.ts +42 -0
- package/src/tools/git-history.ts +208 -0
- package/src/tools/index.ts +7 -0
- package/src/tools/schemas.ts +75 -0
- package/vitest.config.ts +2 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHistoryIndexer - Main orchestrator for git history indexing
|
|
3
|
+
*/
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { promises as fs } from "node:fs";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
import { BM25SparseVectorGenerator } from "../embeddings/sparse.js";
|
|
8
|
+
import { CommitChunker } from "./chunker.js";
|
|
9
|
+
import { GIT_INDEXING_METADATA_ID } from "./config.js";
|
|
10
|
+
import { GitExtractor, normalizeRemoteUrl } from "./extractor.js";
|
|
11
|
+
import { GitSynchronizer } from "./sync/synchronizer.js";
|
|
12
|
+
export class GitHistoryIndexer {
|
|
13
|
+
qdrant;
|
|
14
|
+
embeddings;
|
|
15
|
+
config;
|
|
16
|
+
constructor(qdrant, embeddings, config) {
|
|
17
|
+
this.qdrant = qdrant;
|
|
18
|
+
this.embeddings = embeddings;
|
|
19
|
+
this.config = config;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validate that a path doesn't attempt directory traversal
|
|
23
|
+
*/
|
|
24
|
+
async validatePath(path) {
|
|
25
|
+
const absolutePath = resolve(path);
|
|
26
|
+
try {
|
|
27
|
+
const realPath = await fs.realpath(absolutePath);
|
|
28
|
+
return realPath;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return absolutePath;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Index git history for a repository
|
|
36
|
+
*/
|
|
37
|
+
async indexHistory(path, options, progressCallback) {
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
const stats = {
|
|
40
|
+
commitsScanned: 0,
|
|
41
|
+
commitsIndexed: 0,
|
|
42
|
+
chunksCreated: 0,
|
|
43
|
+
durationMs: 0,
|
|
44
|
+
status: "completed",
|
|
45
|
+
errors: [],
|
|
46
|
+
};
|
|
47
|
+
const absolutePath = await this.validatePath(path);
|
|
48
|
+
const collectionName = await this.getCollectionName(absolutePath);
|
|
49
|
+
try {
|
|
50
|
+
// 1. Validate repository
|
|
51
|
+
const extractor = new GitExtractor(absolutePath, this.config);
|
|
52
|
+
progressCallback?.({
|
|
53
|
+
phase: "extracting",
|
|
54
|
+
current: 0,
|
|
55
|
+
total: 100,
|
|
56
|
+
percentage: 0,
|
|
57
|
+
message: "Validating git repository...",
|
|
58
|
+
});
|
|
59
|
+
const isValid = await extractor.validateRepository();
|
|
60
|
+
if (!isValid) {
|
|
61
|
+
throw new Error(`Not a valid git repository: ${path}`);
|
|
62
|
+
}
|
|
63
|
+
// 2. Create or verify collection
|
|
64
|
+
const collectionExists = await this.qdrant.collectionExists(collectionName);
|
|
65
|
+
if (options?.forceReindex && collectionExists) {
|
|
66
|
+
await this.qdrant.deleteCollection(collectionName);
|
|
67
|
+
}
|
|
68
|
+
if (!collectionExists || options?.forceReindex) {
|
|
69
|
+
const vectorSize = this.embeddings.getDimensions();
|
|
70
|
+
await this.qdrant.createCollection(collectionName, vectorSize, "Cosine", this.config.enableHybridSearch);
|
|
71
|
+
}
|
|
72
|
+
// Store "indexing in progress" marker
|
|
73
|
+
await this.storeIndexingMarker(collectionName, false);
|
|
74
|
+
// 3. Extract commits
|
|
75
|
+
progressCallback?.({
|
|
76
|
+
phase: "extracting",
|
|
77
|
+
current: 0,
|
|
78
|
+
total: 100,
|
|
79
|
+
percentage: 5,
|
|
80
|
+
message: "Extracting git commits...",
|
|
81
|
+
});
|
|
82
|
+
const commits = await extractor.getCommits({
|
|
83
|
+
sinceDate: options?.sinceDate,
|
|
84
|
+
maxCommits: options?.maxCommits ?? this.config.maxCommits,
|
|
85
|
+
});
|
|
86
|
+
stats.commitsScanned = commits.length;
|
|
87
|
+
if (commits.length === 0) {
|
|
88
|
+
await this.storeIndexingMarker(collectionName, true);
|
|
89
|
+
stats.status = "completed";
|
|
90
|
+
stats.durationMs = Date.now() - startTime;
|
|
91
|
+
return stats;
|
|
92
|
+
}
|
|
93
|
+
// 4. Create chunks
|
|
94
|
+
const chunker = new CommitChunker(this.config);
|
|
95
|
+
const allChunks = [];
|
|
96
|
+
for (const [index, commit] of commits.entries()) {
|
|
97
|
+
try {
|
|
98
|
+
progressCallback?.({
|
|
99
|
+
phase: "chunking",
|
|
100
|
+
current: index + 1,
|
|
101
|
+
total: commits.length,
|
|
102
|
+
percentage: 10 + Math.round(((index + 1) / commits.length) * 30),
|
|
103
|
+
message: `Creating chunks ${index + 1}/${commits.length}`,
|
|
104
|
+
});
|
|
105
|
+
// Get diff if configured
|
|
106
|
+
let diff;
|
|
107
|
+
if (this.config.includeDiff) {
|
|
108
|
+
diff = await extractor.getCommitDiff(commit.hash);
|
|
109
|
+
}
|
|
110
|
+
const chunks = chunker.createChunks(commit, absolutePath, diff);
|
|
111
|
+
for (const chunk of chunks) {
|
|
112
|
+
const id = chunker.generateChunkId(chunk);
|
|
113
|
+
allChunks.push({ chunk, id });
|
|
114
|
+
}
|
|
115
|
+
stats.commitsIndexed++;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
119
|
+
stats.errors?.push(`Failed to process commit ${commit.shortHash}: ${errorMessage}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
stats.chunksCreated = allChunks.length;
|
|
123
|
+
if (allChunks.length === 0) {
|
|
124
|
+
await this.storeIndexingMarker(collectionName, true);
|
|
125
|
+
stats.status = "completed";
|
|
126
|
+
stats.durationMs = Date.now() - startTime;
|
|
127
|
+
return stats;
|
|
128
|
+
}
|
|
129
|
+
// 5. Generate embeddings and store in batches
|
|
130
|
+
const batchSize = this.config.batchSize;
|
|
131
|
+
for (let i = 0; i < allChunks.length; i += batchSize) {
|
|
132
|
+
const batch = allChunks.slice(i, i + batchSize);
|
|
133
|
+
progressCallback?.({
|
|
134
|
+
phase: "embedding",
|
|
135
|
+
current: i + batch.length,
|
|
136
|
+
total: allChunks.length,
|
|
137
|
+
percentage: 40 + Math.round(((i + batch.length) / allChunks.length) * 30),
|
|
138
|
+
message: `Generating embeddings ${i + batch.length}/${allChunks.length}`,
|
|
139
|
+
});
|
|
140
|
+
// Retry logic for batch processing
|
|
141
|
+
let lastError = null;
|
|
142
|
+
let success = false;
|
|
143
|
+
for (let attempt = 1; attempt <= this.config.batchRetryAttempts; attempt++) {
|
|
144
|
+
try {
|
|
145
|
+
const texts = batch.map((b) => b.chunk.content);
|
|
146
|
+
const embeddings = await this.embeddings.embedBatch(texts);
|
|
147
|
+
progressCallback?.({
|
|
148
|
+
phase: "storing",
|
|
149
|
+
current: i + batch.length,
|
|
150
|
+
total: allChunks.length,
|
|
151
|
+
percentage: 70 + Math.round(((i + batch.length) / allChunks.length) * 30),
|
|
152
|
+
message: `Storing chunks ${i + batch.length}/${allChunks.length}`,
|
|
153
|
+
});
|
|
154
|
+
const points = batch.map((b, idx) => ({
|
|
155
|
+
id: b.id,
|
|
156
|
+
vector: embeddings[idx].embedding,
|
|
157
|
+
payload: {
|
|
158
|
+
content: b.chunk.content,
|
|
159
|
+
commitHash: b.chunk.metadata.commitHash,
|
|
160
|
+
shortHash: b.chunk.metadata.shortHash,
|
|
161
|
+
author: b.chunk.metadata.author,
|
|
162
|
+
authorEmail: b.chunk.metadata.authorEmail,
|
|
163
|
+
date: b.chunk.metadata.date,
|
|
164
|
+
subject: b.chunk.metadata.subject,
|
|
165
|
+
commitType: b.chunk.metadata.commitType,
|
|
166
|
+
files: b.chunk.metadata.files,
|
|
167
|
+
insertions: b.chunk.metadata.insertions,
|
|
168
|
+
deletions: b.chunk.metadata.deletions,
|
|
169
|
+
repoPath: absolutePath,
|
|
170
|
+
},
|
|
171
|
+
}));
|
|
172
|
+
if (this.config.enableHybridSearch) {
|
|
173
|
+
const sparseGenerator = new BM25SparseVectorGenerator();
|
|
174
|
+
const hybridPoints = points.map((point, idx) => ({
|
|
175
|
+
...point,
|
|
176
|
+
sparseVector: sparseGenerator.generate(batch[idx].chunk.content),
|
|
177
|
+
}));
|
|
178
|
+
await this.qdrant.addPointsWithSparse(collectionName, hybridPoints);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
await this.qdrant.addPoints(collectionName, points);
|
|
182
|
+
}
|
|
183
|
+
success = true;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
188
|
+
if (attempt < this.config.batchRetryAttempts) {
|
|
189
|
+
// Exponential backoff: 1s, 2s, 4s...
|
|
190
|
+
const delay = Math.pow(2, attempt - 1) * 1000;
|
|
191
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (!success && lastError) {
|
|
196
|
+
stats.errors?.push(`Failed to process batch at index ${i} after ${this.config.batchRetryAttempts} attempts: ${lastError.message}`);
|
|
197
|
+
stats.status = "partial";
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// 6. Save snapshot for incremental updates
|
|
201
|
+
try {
|
|
202
|
+
const latestHash = await extractor.getLatestCommitHash();
|
|
203
|
+
const synchronizer = new GitSynchronizer(absolutePath, collectionName);
|
|
204
|
+
await synchronizer.updateSnapshot(latestHash, stats.commitsIndexed);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
208
|
+
console.error("Failed to save snapshot:", errorMessage);
|
|
209
|
+
stats.errors?.push(`Snapshot save failed: ${errorMessage}`);
|
|
210
|
+
}
|
|
211
|
+
// Store completion marker
|
|
212
|
+
await this.storeIndexingMarker(collectionName, true);
|
|
213
|
+
stats.durationMs = Date.now() - startTime;
|
|
214
|
+
return stats;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
218
|
+
stats.status = "failed";
|
|
219
|
+
stats.errors?.push(`Indexing failed: ${errorMessage}`);
|
|
220
|
+
stats.durationMs = Date.now() - startTime;
|
|
221
|
+
return stats;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Search indexed git history
|
|
226
|
+
*/
|
|
227
|
+
async searchHistory(path, query, options) {
|
|
228
|
+
// Validate date range if both dates are provided
|
|
229
|
+
if (options?.dateFrom && options?.dateTo) {
|
|
230
|
+
const fromDate = new Date(options.dateFrom);
|
|
231
|
+
const toDate = new Date(options.dateTo);
|
|
232
|
+
if (fromDate > toDate) {
|
|
233
|
+
throw new Error(`Invalid date range: dateFrom (${options.dateFrom}) must be before dateTo (${options.dateTo})`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const absolutePath = await this.validatePath(path);
|
|
237
|
+
const collectionName = await this.getCollectionName(absolutePath);
|
|
238
|
+
// Check if collection exists
|
|
239
|
+
const exists = await this.qdrant.collectionExists(collectionName);
|
|
240
|
+
if (!exists) {
|
|
241
|
+
throw new Error(`Git history not indexed: ${path}`);
|
|
242
|
+
}
|
|
243
|
+
// Check if collection has hybrid search enabled
|
|
244
|
+
const collectionInfo = await this.qdrant.getCollectionInfo(collectionName);
|
|
245
|
+
const useHybrid = (options?.useHybrid ?? this.config.enableHybridSearch) &&
|
|
246
|
+
collectionInfo.hybridEnabled;
|
|
247
|
+
// Generate query embedding
|
|
248
|
+
const { embedding } = await this.embeddings.embed(query);
|
|
249
|
+
// Build filter
|
|
250
|
+
const filter = this.buildSearchFilter(options);
|
|
251
|
+
// Search
|
|
252
|
+
let results;
|
|
253
|
+
if (useHybrid) {
|
|
254
|
+
const sparseGenerator = new BM25SparseVectorGenerator();
|
|
255
|
+
const sparseVector = sparseGenerator.generate(query);
|
|
256
|
+
results = await this.qdrant.hybridSearch(collectionName, embedding, sparseVector, options?.limit || this.config.defaultSearchLimit, filter);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
results = await this.qdrant.search(collectionName, embedding, options?.limit || this.config.defaultSearchLimit, filter);
|
|
260
|
+
}
|
|
261
|
+
// Apply score threshold if specified
|
|
262
|
+
const filteredResults = options?.scoreThreshold
|
|
263
|
+
? results.filter((r) => r.score >= (options.scoreThreshold || 0))
|
|
264
|
+
: results;
|
|
265
|
+
// Format results
|
|
266
|
+
return filteredResults.map((r) => ({
|
|
267
|
+
content: r.payload?.content || "",
|
|
268
|
+
commitHash: r.payload?.commitHash || "",
|
|
269
|
+
shortHash: r.payload?.shortHash || "",
|
|
270
|
+
author: r.payload?.author || "",
|
|
271
|
+
date: r.payload?.date || "",
|
|
272
|
+
subject: r.payload?.subject || "",
|
|
273
|
+
commitType: r.payload?.commitType || "other",
|
|
274
|
+
files: r.payload?.files || [],
|
|
275
|
+
score: r.score,
|
|
276
|
+
}));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get indexing status for a repository
|
|
280
|
+
*/
|
|
281
|
+
async getIndexStatus(path) {
|
|
282
|
+
const absolutePath = await this.validatePath(path);
|
|
283
|
+
const collectionName = await this.getCollectionName(absolutePath);
|
|
284
|
+
const exists = await this.qdrant.collectionExists(collectionName);
|
|
285
|
+
if (!exists) {
|
|
286
|
+
return { isIndexed: false, status: "not_indexed" };
|
|
287
|
+
}
|
|
288
|
+
// Check for indexing marker
|
|
289
|
+
const indexingMarker = await this.qdrant.getPoint(collectionName, GIT_INDEXING_METADATA_ID);
|
|
290
|
+
const info = await this.qdrant.getCollectionInfo(collectionName);
|
|
291
|
+
const isComplete = indexingMarker?.payload?.indexingComplete === true;
|
|
292
|
+
const isInProgress = indexingMarker?.payload?.indexingComplete === false;
|
|
293
|
+
// Subtract 1 from points count if marker exists
|
|
294
|
+
const actualChunksCount = indexingMarker
|
|
295
|
+
? Math.max(0, info.pointsCount - 1)
|
|
296
|
+
: info.pointsCount;
|
|
297
|
+
// Load snapshot for additional info
|
|
298
|
+
const synchronizer = new GitSynchronizer(absolutePath, collectionName);
|
|
299
|
+
const hasSnapshot = await synchronizer.initialize();
|
|
300
|
+
if (isInProgress) {
|
|
301
|
+
return {
|
|
302
|
+
isIndexed: false,
|
|
303
|
+
status: "indexing",
|
|
304
|
+
collectionName,
|
|
305
|
+
chunksCount: actualChunksCount,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
if (isComplete) {
|
|
309
|
+
return {
|
|
310
|
+
isIndexed: true,
|
|
311
|
+
status: "indexed",
|
|
312
|
+
collectionName,
|
|
313
|
+
chunksCount: actualChunksCount,
|
|
314
|
+
commitsCount: hasSnapshot
|
|
315
|
+
? synchronizer.getCommitsIndexed()
|
|
316
|
+
: undefined,
|
|
317
|
+
lastCommitHash: hasSnapshot
|
|
318
|
+
? (synchronizer.getLastCommitHash() ?? undefined)
|
|
319
|
+
: undefined,
|
|
320
|
+
lastIndexedAt: hasSnapshot
|
|
321
|
+
? (synchronizer.getLastIndexedAt() ?? undefined)
|
|
322
|
+
: indexingMarker?.payload?.completedAt
|
|
323
|
+
? new Date(indexingMarker.payload.completedAt)
|
|
324
|
+
: undefined,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Legacy collection (no marker) - check if it has content
|
|
328
|
+
if (actualChunksCount > 0) {
|
|
329
|
+
return {
|
|
330
|
+
isIndexed: true,
|
|
331
|
+
status: "indexed",
|
|
332
|
+
collectionName,
|
|
333
|
+
chunksCount: actualChunksCount,
|
|
334
|
+
commitsCount: hasSnapshot
|
|
335
|
+
? synchronizer.getCommitsIndexed()
|
|
336
|
+
: undefined,
|
|
337
|
+
lastCommitHash: hasSnapshot
|
|
338
|
+
? (synchronizer.getLastCommitHash() ?? undefined)
|
|
339
|
+
: undefined,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
isIndexed: false,
|
|
344
|
+
status: "not_indexed",
|
|
345
|
+
collectionName,
|
|
346
|
+
chunksCount: 0,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Index only new commits since last indexing
|
|
351
|
+
*/
|
|
352
|
+
async indexNewCommits(path, progressCallback) {
|
|
353
|
+
const startTime = Date.now();
|
|
354
|
+
const stats = {
|
|
355
|
+
newCommits: 0,
|
|
356
|
+
chunksAdded: 0,
|
|
357
|
+
durationMs: 0,
|
|
358
|
+
};
|
|
359
|
+
const absolutePath = await this.validatePath(path);
|
|
360
|
+
const collectionName = await this.getCollectionName(absolutePath);
|
|
361
|
+
// Check if collection exists
|
|
362
|
+
const exists = await this.qdrant.collectionExists(collectionName);
|
|
363
|
+
if (!exists) {
|
|
364
|
+
throw new Error(`Git history not indexed: ${path}. Use index_git_history first.`);
|
|
365
|
+
}
|
|
366
|
+
// Initialize synchronizer
|
|
367
|
+
const synchronizer = new GitSynchronizer(absolutePath, collectionName);
|
|
368
|
+
const hasSnapshot = await synchronizer.initialize();
|
|
369
|
+
if (!hasSnapshot) {
|
|
370
|
+
throw new Error("No previous snapshot found. Use index_git_history for initial indexing.");
|
|
371
|
+
}
|
|
372
|
+
const lastCommitHash = synchronizer.getLastCommitHash();
|
|
373
|
+
if (!lastCommitHash) {
|
|
374
|
+
throw new Error("Invalid snapshot: no last commit hash.");
|
|
375
|
+
}
|
|
376
|
+
// Extract new commits
|
|
377
|
+
const extractor = new GitExtractor(absolutePath, this.config);
|
|
378
|
+
progressCallback?.({
|
|
379
|
+
phase: "extracting",
|
|
380
|
+
current: 0,
|
|
381
|
+
total: 100,
|
|
382
|
+
percentage: 0,
|
|
383
|
+
message: "Checking for new commits...",
|
|
384
|
+
});
|
|
385
|
+
const newCommits = await extractor.getCommits({
|
|
386
|
+
sinceCommit: lastCommitHash,
|
|
387
|
+
});
|
|
388
|
+
stats.newCommits = newCommits.length;
|
|
389
|
+
if (newCommits.length === 0) {
|
|
390
|
+
stats.durationMs = Date.now() - startTime;
|
|
391
|
+
return stats;
|
|
392
|
+
}
|
|
393
|
+
// Process new commits
|
|
394
|
+
const chunker = new CommitChunker(this.config);
|
|
395
|
+
const allChunks = [];
|
|
396
|
+
for (const [index, commit] of newCommits.entries()) {
|
|
397
|
+
progressCallback?.({
|
|
398
|
+
phase: "chunking",
|
|
399
|
+
current: index + 1,
|
|
400
|
+
total: newCommits.length,
|
|
401
|
+
percentage: Math.round(((index + 1) / newCommits.length) * 40),
|
|
402
|
+
message: `Processing commit ${index + 1}/${newCommits.length}`,
|
|
403
|
+
});
|
|
404
|
+
let diff;
|
|
405
|
+
if (this.config.includeDiff) {
|
|
406
|
+
diff = await extractor.getCommitDiff(commit.hash);
|
|
407
|
+
}
|
|
408
|
+
const chunks = chunker.createChunks(commit, absolutePath, diff);
|
|
409
|
+
for (const chunk of chunks) {
|
|
410
|
+
const id = chunker.generateChunkId(chunk);
|
|
411
|
+
allChunks.push({ chunk, id });
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
stats.chunksAdded = allChunks.length;
|
|
415
|
+
// Generate embeddings and store
|
|
416
|
+
const batchSize = this.config.batchSize;
|
|
417
|
+
for (let i = 0; i < allChunks.length; i += batchSize) {
|
|
418
|
+
const batch = allChunks.slice(i, i + batchSize);
|
|
419
|
+
progressCallback?.({
|
|
420
|
+
phase: "embedding",
|
|
421
|
+
current: i + batch.length,
|
|
422
|
+
total: allChunks.length,
|
|
423
|
+
percentage: 40 + Math.round(((i + batch.length) / allChunks.length) * 30),
|
|
424
|
+
message: `Generating embeddings ${i + batch.length}/${allChunks.length}`,
|
|
425
|
+
});
|
|
426
|
+
const texts = batch.map((b) => b.chunk.content);
|
|
427
|
+
const embeddings = await this.embeddings.embedBatch(texts);
|
|
428
|
+
progressCallback?.({
|
|
429
|
+
phase: "storing",
|
|
430
|
+
current: i + batch.length,
|
|
431
|
+
total: allChunks.length,
|
|
432
|
+
percentage: 70 + Math.round(((i + batch.length) / allChunks.length) * 30),
|
|
433
|
+
message: `Storing chunks ${i + batch.length}/${allChunks.length}`,
|
|
434
|
+
});
|
|
435
|
+
const points = batch.map((b, idx) => ({
|
|
436
|
+
id: b.id,
|
|
437
|
+
vector: embeddings[idx].embedding,
|
|
438
|
+
payload: {
|
|
439
|
+
content: b.chunk.content,
|
|
440
|
+
commitHash: b.chunk.metadata.commitHash,
|
|
441
|
+
shortHash: b.chunk.metadata.shortHash,
|
|
442
|
+
author: b.chunk.metadata.author,
|
|
443
|
+
authorEmail: b.chunk.metadata.authorEmail,
|
|
444
|
+
date: b.chunk.metadata.date,
|
|
445
|
+
subject: b.chunk.metadata.subject,
|
|
446
|
+
commitType: b.chunk.metadata.commitType,
|
|
447
|
+
files: b.chunk.metadata.files,
|
|
448
|
+
insertions: b.chunk.metadata.insertions,
|
|
449
|
+
deletions: b.chunk.metadata.deletions,
|
|
450
|
+
repoPath: absolutePath,
|
|
451
|
+
},
|
|
452
|
+
}));
|
|
453
|
+
if (this.config.enableHybridSearch) {
|
|
454
|
+
const sparseGenerator = new BM25SparseVectorGenerator();
|
|
455
|
+
const hybridPoints = points.map((point, idx) => ({
|
|
456
|
+
...point,
|
|
457
|
+
sparseVector: sparseGenerator.generate(batch[idx].chunk.content),
|
|
458
|
+
}));
|
|
459
|
+
await this.qdrant.addPointsWithSparse(collectionName, hybridPoints);
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
await this.qdrant.addPoints(collectionName, points);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// Update snapshot
|
|
466
|
+
const latestHash = await extractor.getLatestCommitHash();
|
|
467
|
+
const totalCommits = synchronizer.getCommitsIndexed() + newCommits.length;
|
|
468
|
+
await synchronizer.updateSnapshot(latestHash, totalCommits);
|
|
469
|
+
stats.durationMs = Date.now() - startTime;
|
|
470
|
+
return stats;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Clear all indexed data for a repository
|
|
474
|
+
*/
|
|
475
|
+
async clearIndex(path) {
|
|
476
|
+
const absolutePath = await this.validatePath(path);
|
|
477
|
+
const collectionName = await this.getCollectionName(absolutePath);
|
|
478
|
+
const exists = await this.qdrant.collectionExists(collectionName);
|
|
479
|
+
if (exists) {
|
|
480
|
+
await this.qdrant.deleteCollection(collectionName);
|
|
481
|
+
}
|
|
482
|
+
// Also delete snapshot
|
|
483
|
+
try {
|
|
484
|
+
const synchronizer = new GitSynchronizer(absolutePath, collectionName);
|
|
485
|
+
await synchronizer.deleteSnapshot();
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
// Ignore snapshot deletion errors
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Store indexing status marker in the collection
|
|
493
|
+
*/
|
|
494
|
+
async storeIndexingMarker(collectionName, complete) {
|
|
495
|
+
try {
|
|
496
|
+
const vectorSize = this.embeddings.getDimensions();
|
|
497
|
+
const zeroVector = new Array(vectorSize).fill(0);
|
|
498
|
+
const collectionInfo = await this.qdrant.getCollectionInfo(collectionName);
|
|
499
|
+
const payload = {
|
|
500
|
+
_type: "git_indexing_metadata",
|
|
501
|
+
indexingComplete: complete,
|
|
502
|
+
...(complete
|
|
503
|
+
? { completedAt: new Date().toISOString() }
|
|
504
|
+
: { startedAt: new Date().toISOString() }),
|
|
505
|
+
};
|
|
506
|
+
if (collectionInfo.hybridEnabled) {
|
|
507
|
+
await this.qdrant.addPointsWithSparse(collectionName, [
|
|
508
|
+
{
|
|
509
|
+
id: GIT_INDEXING_METADATA_ID,
|
|
510
|
+
vector: zeroVector,
|
|
511
|
+
sparseVector: { indices: [], values: [] },
|
|
512
|
+
payload,
|
|
513
|
+
},
|
|
514
|
+
]);
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
await this.qdrant.addPoints(collectionName, [
|
|
518
|
+
{
|
|
519
|
+
id: GIT_INDEXING_METADATA_ID,
|
|
520
|
+
vector: zeroVector,
|
|
521
|
+
payload,
|
|
522
|
+
},
|
|
523
|
+
]);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
console.error("Failed to store indexing marker:", error);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Build search filter from options
|
|
532
|
+
*/
|
|
533
|
+
buildSearchFilter(options) {
|
|
534
|
+
if (!options?.commitTypes?.length &&
|
|
535
|
+
!options?.authors?.length &&
|
|
536
|
+
!options?.dateFrom &&
|
|
537
|
+
!options?.dateTo) {
|
|
538
|
+
return undefined;
|
|
539
|
+
}
|
|
540
|
+
const must = [];
|
|
541
|
+
// Filter by commit types
|
|
542
|
+
if (options.commitTypes && options.commitTypes.length > 0) {
|
|
543
|
+
must.push({
|
|
544
|
+
key: "commitType",
|
|
545
|
+
match: { any: options.commitTypes },
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
// Filter by authors
|
|
549
|
+
if (options.authors && options.authors.length > 0) {
|
|
550
|
+
must.push({
|
|
551
|
+
should: options.authors.map((author) => ({
|
|
552
|
+
key: "author",
|
|
553
|
+
match: { text: author },
|
|
554
|
+
})),
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
// Filter by date range
|
|
558
|
+
if (options.dateFrom) {
|
|
559
|
+
must.push({
|
|
560
|
+
key: "date",
|
|
561
|
+
range: { gte: options.dateFrom },
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
if (options.dateTo) {
|
|
565
|
+
must.push({
|
|
566
|
+
key: "date",
|
|
567
|
+
range: { lte: options.dateTo },
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
return must.length > 0 ? { must } : undefined;
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Generate deterministic collection name from repository path.
|
|
574
|
+
* Uses git remote URL for consistent naming across machines, with fallback to full path.
|
|
575
|
+
*/
|
|
576
|
+
async getCollectionName(path) {
|
|
577
|
+
const absolutePath = resolve(path);
|
|
578
|
+
const extractor = new GitExtractor(absolutePath, this.config);
|
|
579
|
+
// Try to get remote URL for consistent naming across machines
|
|
580
|
+
const remoteUrl = await extractor.getRemoteUrl();
|
|
581
|
+
const normalized = normalizeRemoteUrl(remoteUrl);
|
|
582
|
+
// Use normalized remote URL if available, otherwise fall back to full absolute path
|
|
583
|
+
const identifier = normalized || absolutePath;
|
|
584
|
+
const hash = createHash("md5").update(identifier).digest("hex");
|
|
585
|
+
return `git_${hash.substring(0, 8)}`;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/git/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexer.test.d.ts","sourceRoot":"","sources":["../../src/git/indexer.test.ts"],"names":[],"mappings":""}
|