@mhalder/qdrant-mcp-server 3.1.1 → 3.2.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.
@@ -0,0 +1,592 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { buildCorrelations, normalizeScores, calculateRRFScore, pathsMatch, } from "./federated.js";
3
+ // ============================================================================
4
+ // Unit Tests for Helper Functions
5
+ // ============================================================================
6
+ describe("normalizeScores", () => {
7
+ it("should return empty array for empty input", () => {
8
+ const result = normalizeScores([]);
9
+ expect(result).toEqual([]);
10
+ });
11
+ it("should normalize single result to score of 1", () => {
12
+ const input = [{ score: 0.5, id: "a" }];
13
+ const result = normalizeScores(input);
14
+ expect(result).toHaveLength(1);
15
+ expect(result[0].score).toBe(1);
16
+ expect(result[0].id).toBe("a");
17
+ });
18
+ it("should normalize scores to [0, 1] range", () => {
19
+ const input = [
20
+ { score: 10, id: "a" },
21
+ { score: 5, id: "b" },
22
+ { score: 0, id: "c" },
23
+ ];
24
+ const result = normalizeScores(input);
25
+ expect(result).toHaveLength(3);
26
+ expect(result.find((r) => r.id === "a")?.score).toBe(1); // highest
27
+ expect(result.find((r) => r.id === "b")?.score).toBe(0.5); // middle
28
+ expect(result.find((r) => r.id === "c")?.score).toBe(0); // lowest
29
+ });
30
+ it("should handle identical scores by normalizing all to 1", () => {
31
+ const input = [
32
+ { score: 0.7, id: "a" },
33
+ { score: 0.7, id: "b" },
34
+ { score: 0.7, id: "c" },
35
+ ];
36
+ const result = normalizeScores(input);
37
+ expect(result.every((r) => r.score === 1)).toBe(true);
38
+ });
39
+ it("should handle negative scores", () => {
40
+ const input = [
41
+ { score: -5, id: "a" },
42
+ { score: 5, id: "b" },
43
+ ];
44
+ const result = normalizeScores(input);
45
+ expect(result.find((r) => r.id === "a")?.score).toBe(0);
46
+ expect(result.find((r) => r.id === "b")?.score).toBe(1);
47
+ });
48
+ it("should preserve other properties", () => {
49
+ const input = [
50
+ { score: 1, id: "a", extra: "data1" },
51
+ { score: 0, id: "b", extra: "data2" },
52
+ ];
53
+ const result = normalizeScores(input);
54
+ expect(result[0].extra).toBeDefined();
55
+ expect(result[1].extra).toBeDefined();
56
+ });
57
+ });
58
+ describe("calculateRRFScore", () => {
59
+ it("should calculate RRF for single rank", () => {
60
+ // RRF with k=60: 1/(60+1) = 0.01639...
61
+ const score = calculateRRFScore([1]);
62
+ expect(score).toBeCloseTo(1 / 61, 5);
63
+ });
64
+ it("should calculate RRF for multiple ranks", () => {
65
+ // RRF with k=60: 1/(60+1) + 1/(60+2) = 0.01639... + 0.01613...
66
+ const score = calculateRRFScore([1, 2]);
67
+ expect(score).toBeCloseTo(1 / 61 + 1 / 62, 5);
68
+ });
69
+ it("should return 0 for empty ranks", () => {
70
+ const score = calculateRRFScore([]);
71
+ expect(score).toBe(0);
72
+ });
73
+ it("should give higher score to lower ranks (better positions)", () => {
74
+ const scoreRank1 = calculateRRFScore([1]);
75
+ const scoreRank10 = calculateRRFScore([10]);
76
+ expect(scoreRank1).toBeGreaterThan(scoreRank10);
77
+ });
78
+ it("should handle high ranks without overflow", () => {
79
+ const score = calculateRRFScore([1000]);
80
+ expect(score).toBeCloseTo(1 / 1060, 5);
81
+ expect(Number.isFinite(score)).toBe(true);
82
+ });
83
+ });
84
+ describe("pathsMatch", () => {
85
+ it("should match identical paths", () => {
86
+ expect(pathsMatch("src/auth/user.ts", "src/auth/user.ts")).toBe(true);
87
+ });
88
+ it("should match when shorter path is suffix of longer path", () => {
89
+ expect(pathsMatch("app/models/user.ts", "models/user.ts")).toBe(true);
90
+ expect(pathsMatch("models/user.ts", "app/models/user.ts")).toBe(true);
91
+ });
92
+ it("should match filename only against full path", () => {
93
+ expect(pathsMatch("src/components/Button.tsx", "Button.tsx")).toBe(true);
94
+ expect(pathsMatch("Button.tsx", "src/components/Button.tsx")).toBe(true);
95
+ });
96
+ it("should NOT match paths with different parent directories", () => {
97
+ // This was the false positive case
98
+ expect(pathsMatch("app/models/user.ts", "lib/user.ts")).toBe(false);
99
+ expect(pathsMatch("src/auth/middleware.ts", "other/middleware.ts")).toBe(false);
100
+ });
101
+ it("should NOT match completely different filenames", () => {
102
+ expect(pathsMatch("src/auth.ts", "src/user.ts")).toBe(false);
103
+ });
104
+ it("should handle Windows-style backslashes", () => {
105
+ expect(pathsMatch("src\\auth\\user.ts", "auth/user.ts")).toBe(true);
106
+ });
107
+ it("should be case-insensitive", () => {
108
+ expect(pathsMatch("src/Auth/User.ts", "auth/user.ts")).toBe(true);
109
+ });
110
+ it("should return false for empty paths", () => {
111
+ expect(pathsMatch("", "src/file.ts")).toBe(false);
112
+ expect(pathsMatch("src/file.ts", "")).toBe(false);
113
+ expect(pathsMatch("", "")).toBe(false);
114
+ });
115
+ });
116
+ describe("buildCorrelations", () => {
117
+ const createCodeResult = (overrides = {}) => ({
118
+ content: "function test() {}",
119
+ filePath: "src/utils/helper.ts",
120
+ startLine: 10,
121
+ endLine: 20,
122
+ language: "typescript",
123
+ score: 0.85,
124
+ fileExtension: ".ts",
125
+ ...overrides,
126
+ });
127
+ const createGitResult = (overrides = {}) => ({
128
+ content: "Commit content",
129
+ commitHash: "abc123def456",
130
+ shortHash: "abc123d",
131
+ author: "John Doe",
132
+ date: "2024-01-15T10:30:00Z",
133
+ subject: "feat: add helper function",
134
+ commitType: "feat",
135
+ files: ["src/utils/helper.ts", "src/index.ts"],
136
+ score: 0.9,
137
+ ...overrides,
138
+ });
139
+ it("should find correlations when file paths match", () => {
140
+ const codeResults = [createCodeResult({ filePath: "src/utils/helper.ts" })];
141
+ const gitResults = [
142
+ createGitResult({ files: ["src/utils/helper.ts", "src/index.ts"] }),
143
+ ];
144
+ const correlations = buildCorrelations(codeResults, gitResults);
145
+ expect(correlations).toHaveLength(1);
146
+ expect(correlations[0].codeResult.filePath).toBe("src/utils/helper.ts");
147
+ expect(correlations[0].relatedCommits).toHaveLength(1);
148
+ expect(correlations[0].relatedCommits[0].shortHash).toBe("abc123d");
149
+ });
150
+ it("should match partial paths (relative vs absolute)", () => {
151
+ const codeResults = [
152
+ createCodeResult({ filePath: "/home/user/project/src/utils/helper.ts" }),
153
+ ];
154
+ const gitResults = [createGitResult({ files: ["src/utils/helper.ts"] })];
155
+ const correlations = buildCorrelations(codeResults, gitResults);
156
+ expect(correlations).toHaveLength(1);
157
+ expect(correlations[0].relatedCommits).toHaveLength(1);
158
+ });
159
+ it("should return empty array when no matches found", () => {
160
+ const codeResults = [createCodeResult({ filePath: "src/other/file.ts" })];
161
+ const gitResults = [createGitResult({ files: ["src/different/path.ts"] })];
162
+ const correlations = buildCorrelations(codeResults, gitResults);
163
+ expect(correlations).toHaveLength(0);
164
+ });
165
+ it("should find multiple related commits for one file", () => {
166
+ const codeResults = [createCodeResult({ filePath: "src/utils/helper.ts" })];
167
+ const gitResults = [
168
+ createGitResult({
169
+ shortHash: "abc123d",
170
+ files: ["src/utils/helper.ts"],
171
+ }),
172
+ createGitResult({
173
+ shortHash: "xyz789a",
174
+ files: ["src/utils/helper.ts", "src/other.ts"],
175
+ }),
176
+ ];
177
+ const correlations = buildCorrelations(codeResults, gitResults);
178
+ expect(correlations).toHaveLength(1);
179
+ expect(correlations[0].relatedCommits).toHaveLength(2);
180
+ expect(correlations[0].relatedCommits.map((c) => c.shortHash)).toContain("abc123d");
181
+ expect(correlations[0].relatedCommits.map((c) => c.shortHash)).toContain("xyz789a");
182
+ });
183
+ it("should handle multiple code results with different correlations", () => {
184
+ const codeResults = [
185
+ createCodeResult({ filePath: "src/utils/helper.ts" }),
186
+ createCodeResult({ filePath: "src/services/api.ts" }),
187
+ ];
188
+ const gitResults = [
189
+ createGitResult({
190
+ shortHash: "abc123d",
191
+ files: ["src/utils/helper.ts"],
192
+ }),
193
+ createGitResult({
194
+ shortHash: "xyz789a",
195
+ files: ["src/services/api.ts"],
196
+ }),
197
+ ];
198
+ const correlations = buildCorrelations(codeResults, gitResults);
199
+ expect(correlations).toHaveLength(2);
200
+ });
201
+ it("should handle empty code results", () => {
202
+ const gitResults = [createGitResult()];
203
+ const correlations = buildCorrelations([], gitResults);
204
+ expect(correlations).toHaveLength(0);
205
+ });
206
+ it("should handle empty git results", () => {
207
+ const codeResults = [createCodeResult()];
208
+ const correlations = buildCorrelations(codeResults, []);
209
+ expect(correlations).toHaveLength(0);
210
+ });
211
+ it("should handle case-insensitive path matching", () => {
212
+ const codeResults = [createCodeResult({ filePath: "SRC/Utils/Helper.ts" })];
213
+ const gitResults = [createGitResult({ files: ["src/utils/helper.ts"] })];
214
+ const correlations = buildCorrelations(codeResults, gitResults);
215
+ expect(correlations).toHaveLength(1);
216
+ });
217
+ it("should normalize Windows-style paths", () => {
218
+ const codeResults = [
219
+ createCodeResult({ filePath: "src\\utils\\helper.ts" }),
220
+ ];
221
+ const gitResults = [createGitResult({ files: ["src/utils/helper.ts"] })];
222
+ const correlations = buildCorrelations(codeResults, gitResults);
223
+ expect(correlations).toHaveLength(1);
224
+ });
225
+ });
226
+ // ============================================================================
227
+ // Integration Tests for Tool Implementations
228
+ // ============================================================================
229
+ describe("contextual_search integration", () => {
230
+ // Mock indexers
231
+ const mockCodeIndexer = {
232
+ getIndexStatus: vi.fn(),
233
+ searchCode: vi.fn(),
234
+ indexCodebase: vi.fn(),
235
+ reindexChanges: vi.fn(),
236
+ clearIndex: vi.fn(),
237
+ };
238
+ const mockGitHistoryIndexer = {
239
+ getIndexStatus: vi.fn(),
240
+ searchHistory: vi.fn(),
241
+ indexHistory: vi.fn(),
242
+ indexNewCommits: vi.fn(),
243
+ clearIndex: vi.fn(),
244
+ };
245
+ beforeEach(() => {
246
+ vi.resetAllMocks();
247
+ });
248
+ it("should execute code and git searches in parallel", async () => {
249
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
250
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
251
+ status: "indexed",
252
+ });
253
+ mockCodeIndexer.searchCode.mockResolvedValue([
254
+ {
255
+ content: "function test() {}",
256
+ filePath: "src/test.ts",
257
+ startLine: 1,
258
+ endLine: 5,
259
+ language: "typescript",
260
+ score: 0.9,
261
+ fileExtension: ".ts",
262
+ },
263
+ ]);
264
+ mockGitHistoryIndexer.searchHistory.mockResolvedValue([
265
+ {
266
+ content: "Commit content",
267
+ commitHash: "abc123",
268
+ shortHash: "abc123d",
269
+ author: "Test Author",
270
+ date: "2024-01-15",
271
+ subject: "feat: add test",
272
+ commitType: "feat",
273
+ files: ["src/test.ts"],
274
+ score: 0.85,
275
+ },
276
+ ]);
277
+ // Import and call performContextualSearch directly
278
+ const { registerFederatedTools } = await import("./federated.js");
279
+ // Create a mock server
280
+ const mockServer = {
281
+ registerTool: vi.fn(),
282
+ };
283
+ registerFederatedTools(mockServer, {
284
+ codeIndexer: mockCodeIndexer,
285
+ gitHistoryIndexer: mockGitHistoryIndexer,
286
+ });
287
+ // Get the handler for contextual_search
288
+ const contextualSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "contextual_search");
289
+ expect(contextualSearchCall).toBeDefined();
290
+ const handler = contextualSearchCall[2];
291
+ const result = await handler({
292
+ path: "/test/repo",
293
+ query: "test function",
294
+ codeLimit: 5,
295
+ gitLimit: 5,
296
+ correlate: true,
297
+ });
298
+ expect(mockCodeIndexer.searchCode).toHaveBeenCalledWith("/test/repo", "test function", { limit: 5 });
299
+ expect(mockGitHistoryIndexer.searchHistory).toHaveBeenCalledWith("/test/repo", "test function", { limit: 5 });
300
+ expect(result.content[0].text).toContain("Code Results");
301
+ expect(result.content[0].text).toContain("Git History Results");
302
+ expect(result.content[0].text).toContain("Correlations");
303
+ });
304
+ it("should return error when code index not found", async () => {
305
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "not_indexed" });
306
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
307
+ status: "indexed",
308
+ });
309
+ const { registerFederatedTools } = await import("./federated.js");
310
+ const mockServer = { registerTool: vi.fn() };
311
+ registerFederatedTools(mockServer, {
312
+ codeIndexer: mockCodeIndexer,
313
+ gitHistoryIndexer: mockGitHistoryIndexer,
314
+ });
315
+ const contextualSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "contextual_search");
316
+ const handler = contextualSearchCall[2];
317
+ const result = await handler({
318
+ path: "/test/repo",
319
+ query: "test",
320
+ });
321
+ expect(result.isError).toBe(true);
322
+ expect(result.content[0].text).toContain("Code index not found");
323
+ });
324
+ it("should return error when git index not found", async () => {
325
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
326
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
327
+ status: "not_indexed",
328
+ });
329
+ const { registerFederatedTools } = await import("./federated.js");
330
+ const mockServer = { registerTool: vi.fn() };
331
+ registerFederatedTools(mockServer, {
332
+ codeIndexer: mockCodeIndexer,
333
+ gitHistoryIndexer: mockGitHistoryIndexer,
334
+ });
335
+ const contextualSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "contextual_search");
336
+ const handler = contextualSearchCall[2];
337
+ const result = await handler({
338
+ path: "/test/repo",
339
+ query: "test",
340
+ });
341
+ expect(result.isError).toBe(true);
342
+ expect(result.content[0].text).toContain("Git history index not found");
343
+ });
344
+ it("should skip correlations when correlate=false", async () => {
345
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
346
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
347
+ status: "indexed",
348
+ });
349
+ mockCodeIndexer.searchCode.mockResolvedValue([
350
+ {
351
+ content: "code",
352
+ filePath: "src/test.ts",
353
+ startLine: 1,
354
+ endLine: 5,
355
+ language: "typescript",
356
+ score: 0.9,
357
+ fileExtension: ".ts",
358
+ },
359
+ ]);
360
+ mockGitHistoryIndexer.searchHistory.mockResolvedValue([
361
+ {
362
+ content: "commit",
363
+ commitHash: "abc123",
364
+ shortHash: "abc123d",
365
+ author: "Author",
366
+ date: "2024-01-15",
367
+ subject: "feat: test",
368
+ commitType: "feat",
369
+ files: ["src/test.ts"],
370
+ score: 0.85,
371
+ },
372
+ ]);
373
+ const { registerFederatedTools } = await import("./federated.js");
374
+ const mockServer = { registerTool: vi.fn() };
375
+ registerFederatedTools(mockServer, {
376
+ codeIndexer: mockCodeIndexer,
377
+ gitHistoryIndexer: mockGitHistoryIndexer,
378
+ });
379
+ const contextualSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "contextual_search");
380
+ const handler = contextualSearchCall[2];
381
+ const result = await handler({
382
+ path: "/test/repo",
383
+ query: "test",
384
+ correlate: false,
385
+ });
386
+ expect(result.content[0].text).not.toContain("Correlations (Code");
387
+ expect(result.content[0].text).toContain("0 correlation(s)");
388
+ });
389
+ });
390
+ describe("federated_search integration", () => {
391
+ const mockCodeIndexer = {
392
+ getIndexStatus: vi.fn(),
393
+ searchCode: vi.fn(),
394
+ indexCodebase: vi.fn(),
395
+ reindexChanges: vi.fn(),
396
+ clearIndex: vi.fn(),
397
+ };
398
+ const mockGitHistoryIndexer = {
399
+ getIndexStatus: vi.fn(),
400
+ searchHistory: vi.fn(),
401
+ indexHistory: vi.fn(),
402
+ indexNewCommits: vi.fn(),
403
+ clearIndex: vi.fn(),
404
+ };
405
+ beforeEach(() => {
406
+ vi.resetAllMocks();
407
+ });
408
+ it("should search across multiple repositories", async () => {
409
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
410
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
411
+ status: "indexed",
412
+ });
413
+ mockCodeIndexer.searchCode.mockResolvedValue([
414
+ {
415
+ content: "function test() {}",
416
+ filePath: "src/test.ts",
417
+ startLine: 1,
418
+ endLine: 5,
419
+ language: "typescript",
420
+ score: 0.9,
421
+ fileExtension: ".ts",
422
+ },
423
+ ]);
424
+ mockGitHistoryIndexer.searchHistory.mockResolvedValue([
425
+ {
426
+ content: "Commit",
427
+ commitHash: "abc123",
428
+ shortHash: "abc123d",
429
+ author: "Author",
430
+ date: "2024-01-15",
431
+ subject: "feat: add",
432
+ commitType: "feat",
433
+ files: ["src/test.ts"],
434
+ score: 0.85,
435
+ },
436
+ ]);
437
+ const { registerFederatedTools } = await import("./federated.js");
438
+ const mockServer = { registerTool: vi.fn() };
439
+ registerFederatedTools(mockServer, {
440
+ codeIndexer: mockCodeIndexer,
441
+ gitHistoryIndexer: mockGitHistoryIndexer,
442
+ });
443
+ const federatedSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "federated_search");
444
+ const handler = federatedSearchCall[2];
445
+ const result = await handler({
446
+ paths: ["/repo1", "/repo2"],
447
+ query: "test function",
448
+ searchType: "both",
449
+ limit: 20,
450
+ });
451
+ // Each repo gets searched for code and git
452
+ expect(mockCodeIndexer.searchCode).toHaveBeenCalledTimes(2);
453
+ expect(mockGitHistoryIndexer.searchHistory).toHaveBeenCalledTimes(2);
454
+ expect(result.content[0].text).toContain("Federated Search Results");
455
+ expect(result.content[0].text).toContain("Repositories: 2");
456
+ });
457
+ it("should fail fast when any repository is not indexed", async () => {
458
+ mockCodeIndexer.getIndexStatus
459
+ .mockResolvedValueOnce({ status: "indexed" })
460
+ .mockResolvedValueOnce({ status: "not_indexed" });
461
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
462
+ status: "indexed",
463
+ });
464
+ const { registerFederatedTools } = await import("./federated.js");
465
+ const mockServer = { registerTool: vi.fn() };
466
+ registerFederatedTools(mockServer, {
467
+ codeIndexer: mockCodeIndexer,
468
+ gitHistoryIndexer: mockGitHistoryIndexer,
469
+ });
470
+ const federatedSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "federated_search");
471
+ const handler = federatedSearchCall[2];
472
+ const result = await handler({
473
+ paths: ["/repo1", "/repo2"],
474
+ query: "test",
475
+ });
476
+ expect(result.isError).toBe(true);
477
+ expect(result.content[0].text).toContain("Index validation failed");
478
+ expect(result.content[0].text).toContain("Code index not found");
479
+ // Should not perform searches when validation fails
480
+ expect(mockCodeIndexer.searchCode).not.toHaveBeenCalled();
481
+ });
482
+ it("should respect searchType=code and only search code", async () => {
483
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
484
+ mockCodeIndexer.searchCode.mockResolvedValue([]);
485
+ const { registerFederatedTools } = await import("./federated.js");
486
+ const mockServer = { registerTool: vi.fn() };
487
+ registerFederatedTools(mockServer, {
488
+ codeIndexer: mockCodeIndexer,
489
+ gitHistoryIndexer: mockGitHistoryIndexer,
490
+ });
491
+ const federatedSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "federated_search");
492
+ const handler = federatedSearchCall[2];
493
+ await handler({
494
+ paths: ["/repo1"],
495
+ query: "test",
496
+ searchType: "code",
497
+ });
498
+ expect(mockCodeIndexer.searchCode).toHaveBeenCalled();
499
+ expect(mockGitHistoryIndexer.searchHistory).not.toHaveBeenCalled();
500
+ });
501
+ it("should respect searchType=git and only search git history", async () => {
502
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
503
+ status: "indexed",
504
+ });
505
+ mockGitHistoryIndexer.searchHistory.mockResolvedValue([]);
506
+ const { registerFederatedTools } = await import("./federated.js");
507
+ const mockServer = { registerTool: vi.fn() };
508
+ registerFederatedTools(mockServer, {
509
+ codeIndexer: mockCodeIndexer,
510
+ gitHistoryIndexer: mockGitHistoryIndexer,
511
+ });
512
+ const federatedSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "federated_search");
513
+ const handler = federatedSearchCall[2];
514
+ await handler({
515
+ paths: ["/repo1"],
516
+ query: "test",
517
+ searchType: "git",
518
+ });
519
+ expect(mockCodeIndexer.searchCode).not.toHaveBeenCalled();
520
+ expect(mockGitHistoryIndexer.searchHistory).toHaveBeenCalled();
521
+ });
522
+ it("should apply limit to combined results", async () => {
523
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
524
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
525
+ status: "indexed",
526
+ });
527
+ // Return many results from each search
528
+ const codeResults = Array(10)
529
+ .fill(null)
530
+ .map((_, i) => ({
531
+ content: `code ${i}`,
532
+ filePath: `src/file${i}.ts`,
533
+ startLine: 1,
534
+ endLine: 5,
535
+ language: "typescript",
536
+ score: 0.9 - i * 0.05,
537
+ fileExtension: ".ts",
538
+ }));
539
+ const gitResults = Array(10)
540
+ .fill(null)
541
+ .map((_, i) => ({
542
+ content: `commit ${i}`,
543
+ commitHash: `hash${i}`,
544
+ shortHash: `hash${i}`,
545
+ author: "Author",
546
+ date: "2024-01-15",
547
+ subject: `feat: commit ${i}`,
548
+ commitType: "feat",
549
+ files: [`src/file${i}.ts`],
550
+ score: 0.85 - i * 0.05,
551
+ }));
552
+ mockCodeIndexer.searchCode.mockResolvedValue(codeResults);
553
+ mockGitHistoryIndexer.searchHistory.mockResolvedValue(gitResults);
554
+ const { registerFederatedTools } = await import("./federated.js");
555
+ const mockServer = { registerTool: vi.fn() };
556
+ registerFederatedTools(mockServer, {
557
+ codeIndexer: mockCodeIndexer,
558
+ gitHistoryIndexer: mockGitHistoryIndexer,
559
+ });
560
+ const federatedSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "federated_search");
561
+ const handler = federatedSearchCall[2];
562
+ const result = await handler({
563
+ paths: ["/repo1"],
564
+ query: "test",
565
+ limit: 5,
566
+ });
567
+ // Should limit total results
568
+ expect(result.content[0].text).toContain("Total: 5 result(s)");
569
+ });
570
+ it("should return message when no results found", async () => {
571
+ mockCodeIndexer.getIndexStatus.mockResolvedValue({ status: "indexed" });
572
+ mockGitHistoryIndexer.getIndexStatus.mockResolvedValue({
573
+ status: "indexed",
574
+ });
575
+ mockCodeIndexer.searchCode.mockResolvedValue([]);
576
+ mockGitHistoryIndexer.searchHistory.mockResolvedValue([]);
577
+ const { registerFederatedTools } = await import("./federated.js");
578
+ const mockServer = { registerTool: vi.fn() };
579
+ registerFederatedTools(mockServer, {
580
+ codeIndexer: mockCodeIndexer,
581
+ gitHistoryIndexer: mockGitHistoryIndexer,
582
+ });
583
+ const federatedSearchCall = mockServer.registerTool.mock.calls.find((call) => call[0] === "federated_search");
584
+ const handler = federatedSearchCall[2];
585
+ const result = await handler({
586
+ paths: ["/repo1"],
587
+ query: "nonexistent query",
588
+ });
589
+ expect(result.content[0].text).toContain("No results found");
590
+ });
591
+ });
592
+ //# sourceMappingURL=federated.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federated.test.js","sourceRoot":"","sources":["../../src/tools/federated.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAuBN;AAGD,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQzD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CA4BN;AAGD,cAAc,cAAc,CAAC"}
@@ -4,6 +4,7 @@
4
4
  import { registerCodeTools } from "./code.js";
5
5
  import { registerCollectionTools } from "./collection.js";
6
6
  import { registerDocumentTools } from "./document.js";
7
+ import { registerFederatedTools } from "./federated.js";
7
8
  import { registerGitHistoryTools } from "./git-history.js";
8
9
  import { registerSearchTools } from "./search.js";
9
10
  /**
@@ -28,6 +29,10 @@ export function registerAllTools(server, deps) {
28
29
  registerGitHistoryTools(server, {
29
30
  gitHistoryIndexer: deps.gitHistoryIndexer,
30
31
  });
32
+ registerFederatedTools(server, {
33
+ codeIndexer: deps.codeIndexer,
34
+ gitHistoryIndexer: deps.gitHistoryIndexer,
35
+ });
31
36
  }
32
37
  // Re-export schemas for external use
33
38
  export * from "./schemas.js";