@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.
Files changed (88) hide show
  1. package/.github/workflows/ci.yml +4 -1
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +78 -3
  4. package/build/code/indexer.d.ts +2 -1
  5. package/build/code/indexer.d.ts.map +1 -1
  6. package/build/code/indexer.js +37 -7
  7. package/build/code/indexer.js.map +1 -1
  8. package/build/git/chunker.d.ts +39 -0
  9. package/build/git/chunker.d.ts.map +1 -0
  10. package/build/git/chunker.js +210 -0
  11. package/build/git/chunker.js.map +1 -0
  12. package/build/git/chunker.test.d.ts +2 -0
  13. package/build/git/chunker.test.d.ts.map +1 -0
  14. package/build/git/chunker.test.js +230 -0
  15. package/build/git/chunker.test.js.map +1 -0
  16. package/build/git/config.d.ts +34 -0
  17. package/build/git/config.d.ts.map +1 -0
  18. package/build/git/config.js +163 -0
  19. package/build/git/config.js.map +1 -0
  20. package/build/git/extractor.d.ts +57 -0
  21. package/build/git/extractor.d.ts.map +1 -0
  22. package/build/git/extractor.integration.test.d.ts +6 -0
  23. package/build/git/extractor.integration.test.d.ts.map +1 -0
  24. package/build/git/extractor.integration.test.js +166 -0
  25. package/build/git/extractor.integration.test.js.map +1 -0
  26. package/build/git/extractor.js +231 -0
  27. package/build/git/extractor.js.map +1 -0
  28. package/build/git/extractor.test.d.ts +2 -0
  29. package/build/git/extractor.test.d.ts.map +1 -0
  30. package/build/git/extractor.test.js +267 -0
  31. package/build/git/extractor.test.js.map +1 -0
  32. package/build/git/index.d.ts +10 -0
  33. package/build/git/index.d.ts.map +1 -0
  34. package/build/git/index.js +11 -0
  35. package/build/git/index.js.map +1 -0
  36. package/build/git/indexer.d.ts +50 -0
  37. package/build/git/indexer.d.ts.map +1 -0
  38. package/build/git/indexer.js +588 -0
  39. package/build/git/indexer.js.map +1 -0
  40. package/build/git/indexer.test.d.ts +2 -0
  41. package/build/git/indexer.test.d.ts.map +1 -0
  42. package/build/git/indexer.test.js +867 -0
  43. package/build/git/indexer.test.js.map +1 -0
  44. package/build/git/sync/synchronizer.d.ts +43 -0
  45. package/build/git/sync/synchronizer.d.ts.map +1 -0
  46. package/build/git/sync/synchronizer.js +108 -0
  47. package/build/git/sync/synchronizer.js.map +1 -0
  48. package/build/git/sync/synchronizer.test.d.ts +2 -0
  49. package/build/git/sync/synchronizer.test.d.ts.map +1 -0
  50. package/build/git/sync/synchronizer.test.js +188 -0
  51. package/build/git/sync/synchronizer.test.js.map +1 -0
  52. package/build/git/types.d.ts +159 -0
  53. package/build/git/types.d.ts.map +1 -0
  54. package/build/git/types.js +5 -0
  55. package/build/git/types.js.map +1 -0
  56. package/build/index.js +18 -0
  57. package/build/index.js.map +1 -1
  58. package/build/tools/git-history.d.ts +10 -0
  59. package/build/tools/git-history.d.ts.map +1 -0
  60. package/build/tools/git-history.js +144 -0
  61. package/build/tools/git-history.js.map +1 -0
  62. package/build/tools/index.d.ts +2 -0
  63. package/build/tools/index.d.ts.map +1 -1
  64. package/build/tools/index.js +4 -0
  65. package/build/tools/index.js.map +1 -1
  66. package/build/tools/schemas.d.ts +24 -0
  67. package/build/tools/schemas.d.ts.map +1 -1
  68. package/build/tools/schemas.js +64 -0
  69. package/build/tools/schemas.js.map +1 -1
  70. package/package.json +2 -2
  71. package/src/code/indexer.ts +49 -7
  72. package/src/git/chunker.test.ts +284 -0
  73. package/src/git/chunker.ts +256 -0
  74. package/src/git/config.ts +173 -0
  75. package/src/git/extractor.integration.test.ts +221 -0
  76. package/src/git/extractor.test.ts +403 -0
  77. package/src/git/extractor.ts +284 -0
  78. package/src/git/index.ts +31 -0
  79. package/src/git/indexer.test.ts +1089 -0
  80. package/src/git/indexer.ts +745 -0
  81. package/src/git/sync/synchronizer.test.ts +250 -0
  82. package/src/git/sync/synchronizer.ts +122 -0
  83. package/src/git/types.ts +192 -0
  84. package/src/index.ts +42 -0
  85. package/src/tools/git-history.ts +208 -0
  86. package/src/tools/index.ts +7 -0
  87. package/src/tools/schemas.ts +75 -0
  88. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=indexer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.test.d.ts","sourceRoot":"","sources":["../../src/git/indexer.test.ts"],"names":[],"mappings":""}