@mhalder/qdrant-mcp-server 3.2.1 → 3.3.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 (124) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +12 -21
  3. package/build/code/chunker/tree-sitter-chunker.d.ts.map +1 -1
  4. package/build/code/chunker/tree-sitter-chunker.js +15 -3
  5. package/build/code/chunker/tree-sitter-chunker.js.map +1 -1
  6. package/build/code/indexer.d.ts +1 -0
  7. package/build/code/indexer.d.ts.map +1 -1
  8. package/build/code/indexer.js +24 -4
  9. package/build/code/indexer.js.map +1 -1
  10. package/build/embeddings/cohere.d.ts +1 -0
  11. package/build/embeddings/cohere.d.ts.map +1 -1
  12. package/build/embeddings/cohere.js +8 -1
  13. package/build/embeddings/cohere.js.map +1 -1
  14. package/build/embeddings/cohere.test.js +11 -0
  15. package/build/embeddings/cohere.test.js.map +1 -1
  16. package/build/embeddings/factory.d.ts.map +1 -1
  17. package/build/embeddings/factory.js +2 -0
  18. package/build/embeddings/factory.js.map +1 -1
  19. package/build/embeddings/factory.test.js +12 -1
  20. package/build/embeddings/factory.test.js.map +1 -1
  21. package/build/embeddings/ollama.d.ts +1 -0
  22. package/build/embeddings/ollama.d.ts.map +1 -1
  23. package/build/embeddings/ollama.js +8 -1
  24. package/build/embeddings/ollama.js.map +1 -1
  25. package/build/embeddings/ollama.test.js +11 -0
  26. package/build/embeddings/ollama.test.js.map +1 -1
  27. package/build/embeddings/openai.d.ts +1 -0
  28. package/build/embeddings/openai.d.ts.map +1 -1
  29. package/build/embeddings/openai.js +8 -1
  30. package/build/embeddings/openai.js.map +1 -1
  31. package/build/embeddings/openai.test.js +11 -0
  32. package/build/embeddings/openai.test.js.map +1 -1
  33. package/build/embeddings/voyage.d.ts +1 -0
  34. package/build/embeddings/voyage.d.ts.map +1 -1
  35. package/build/embeddings/voyage.js +8 -1
  36. package/build/embeddings/voyage.js.map +1 -1
  37. package/build/embeddings/voyage.test.js +11 -0
  38. package/build/embeddings/voyage.test.js.map +1 -1
  39. package/build/git/indexer.d.ts +1 -0
  40. package/build/git/indexer.d.ts.map +1 -1
  41. package/build/git/indexer.js +16 -3
  42. package/build/git/indexer.js.map +1 -1
  43. package/build/git/indexer.test.js +15 -9
  44. package/build/git/indexer.test.js.map +1 -1
  45. package/build/index.js +35 -26
  46. package/build/index.js.map +1 -1
  47. package/build/index.test.js +105 -91
  48. package/build/index.test.js.map +1 -1
  49. package/build/logger.d.ts +4 -0
  50. package/build/logger.d.ts.map +1 -0
  51. package/build/logger.js +24 -0
  52. package/build/logger.js.map +1 -0
  53. package/build/qdrant/client.d.ts +1 -0
  54. package/build/qdrant/client.d.ts.map +1 -1
  55. package/build/qdrant/client.js +10 -0
  56. package/build/qdrant/client.js.map +1 -1
  57. package/build/qdrant/client.test.js +11 -0
  58. package/build/qdrant/client.test.js.map +1 -1
  59. package/build/tools/code.d.ts.map +1 -1
  60. package/build/tools/code.js +44 -13
  61. package/build/tools/code.js.map +1 -1
  62. package/build/tools/collection.d.ts.map +1 -1
  63. package/build/tools/collection.js +15 -8
  64. package/build/tools/collection.js.map +1 -1
  65. package/build/tools/document.d.ts.map +1 -1
  66. package/build/tools/document.js +9 -4
  67. package/build/tools/document.js.map +1 -1
  68. package/build/tools/federated.d.ts.map +1 -1
  69. package/build/tools/federated.js +9 -4
  70. package/build/tools/federated.js.map +1 -1
  71. package/build/tools/federated.test.js +11 -0
  72. package/build/tools/federated.test.js.map +1 -1
  73. package/build/tools/git-history.d.ts.map +1 -1
  74. package/build/tools/git-history.js +44 -12
  75. package/build/tools/git-history.js.map +1 -1
  76. package/build/tools/logging.d.ts +16 -0
  77. package/build/tools/logging.d.ts.map +1 -0
  78. package/build/tools/logging.js +68 -0
  79. package/build/tools/logging.js.map +1 -0
  80. package/build/tools/logging.test.d.ts +2 -0
  81. package/build/tools/logging.test.d.ts.map +1 -0
  82. package/build/tools/logging.test.js +139 -0
  83. package/build/tools/logging.test.js.map +1 -0
  84. package/build/tools/schemas.d.ts +32 -19
  85. package/build/tools/schemas.d.ts.map +1 -1
  86. package/build/tools/schemas.js +9 -3
  87. package/build/tools/schemas.js.map +1 -1
  88. package/build/tools/search.d.ts.map +1 -1
  89. package/build/tools/search.js +13 -4
  90. package/build/tools/search.js.map +1 -1
  91. package/mise.toml +2 -0
  92. package/package.json +14 -13
  93. package/src/code/chunker/tree-sitter-chunker.ts +41 -9
  94. package/src/code/indexer.ts +41 -6
  95. package/src/embeddings/cohere.test.ts +12 -0
  96. package/src/embeddings/cohere.ts +10 -2
  97. package/src/embeddings/factory.test.ts +13 -1
  98. package/src/embeddings/factory.ts +3 -0
  99. package/src/embeddings/ollama.test.ts +12 -0
  100. package/src/embeddings/ollama.ts +10 -2
  101. package/src/embeddings/openai.test.ts +12 -0
  102. package/src/embeddings/openai.ts +10 -2
  103. package/src/embeddings/voyage.test.ts +12 -0
  104. package/src/embeddings/voyage.ts +10 -2
  105. package/src/git/indexer.test.ts +22 -16
  106. package/src/git/indexer.ts +30 -4
  107. package/src/index.test.ts +128 -106
  108. package/src/index.ts +59 -38
  109. package/src/logger.ts +33 -0
  110. package/src/qdrant/client.test.ts +12 -0
  111. package/src/qdrant/client.ts +22 -0
  112. package/src/tools/code.ts +107 -62
  113. package/src/tools/collection.ts +39 -22
  114. package/src/tools/document.ts +52 -22
  115. package/src/tools/federated.test.ts +12 -0
  116. package/src/tools/federated.ts +143 -125
  117. package/src/tools/git-history.ts +117 -60
  118. package/src/tools/logging.test.ts +206 -0
  119. package/src/tools/logging.ts +85 -0
  120. package/src/tools/schemas.ts +9 -3
  121. package/src/tools/search.ts +93 -71
  122. package/tests/code/chunker/tree-sitter-chunker.test.ts +13 -1
  123. package/tests/code/indexer.test.ts +12 -0
  124. package/tests/code/integration.test.ts +14 -1
@@ -9,7 +9,11 @@
9
9
  import { z } from "zod";
10
10
  export declare const CreateCollectionSchema: {
11
11
  name: z.ZodString;
12
- distance: z.ZodOptional<z.ZodEnum<["Cosine", "Euclid", "Dot"]>>;
12
+ distance: z.ZodOptional<z.ZodEnum<{
13
+ Cosine: "Cosine";
14
+ Euclid: "Euclid";
15
+ Dot: "Dot";
16
+ }>>;
13
17
  enableHybrid: z.ZodOptional<z.ZodBoolean>;
14
18
  };
15
19
  export declare const DeleteCollectionSchema: {
@@ -21,22 +25,14 @@ export declare const GetCollectionInfoSchema: {
21
25
  export declare const AddDocumentsSchema: {
22
26
  collection: z.ZodString;
23
27
  documents: z.ZodArray<z.ZodObject<{
24
- id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
28
+ id: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
25
29
  text: z.ZodString;
26
30
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
27
- }, "strip", z.ZodTypeAny, {
28
- id: string | number;
29
- text: string;
30
- metadata?: Record<string, any> | undefined;
31
- }, {
32
- id: string | number;
33
- text: string;
34
- metadata?: Record<string, any> | undefined;
35
- }>, "many">;
31
+ }, z.core.$strip>>;
36
32
  };
37
33
  export declare const DeleteDocumentsSchema: {
38
34
  collection: z.ZodString;
39
- ids: z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber]>, "many">;
35
+ ids: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
40
36
  };
41
37
  export declare const SemanticSearchSchema: {
42
38
  collection: z.ZodString;
@@ -53,14 +49,14 @@ export declare const HybridSearchSchema: {
53
49
  export declare const IndexCodebaseSchema: {
54
50
  path: z.ZodString;
55
51
  forceReindex: z.ZodOptional<z.ZodBoolean>;
56
- extensions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
57
- ignorePatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
52
+ extensions: z.ZodOptional<z.ZodArray<z.ZodString>>;
53
+ ignorePatterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
54
  };
59
55
  export declare const SearchCodeSchema: {
60
56
  path: z.ZodString;
61
57
  query: z.ZodString;
62
58
  limit: z.ZodOptional<z.ZodNumber>;
63
- fileTypes: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
59
+ fileTypes: z.ZodOptional<z.ZodArray<z.ZodString>>;
64
60
  pathPattern: z.ZodOptional<z.ZodString>;
65
61
  };
66
62
  export declare const ReindexChangesSchema: {
@@ -82,8 +78,21 @@ export declare const SearchGitHistorySchema: {
82
78
  path: z.ZodString;
83
79
  query: z.ZodString;
84
80
  limit: z.ZodOptional<z.ZodNumber>;
85
- commitTypes: z.ZodOptional<z.ZodArray<z.ZodEnum<["feat", "fix", "refactor", "docs", "test", "chore", "style", "perf", "build", "ci", "revert", "other"]>, "many">>;
86
- authors: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
81
+ commitTypes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
82
+ test: "test";
83
+ feat: "feat";
84
+ fix: "fix";
85
+ refactor: "refactor";
86
+ docs: "docs";
87
+ chore: "chore";
88
+ style: "style";
89
+ perf: "perf";
90
+ build: "build";
91
+ ci: "ci";
92
+ revert: "revert";
93
+ other: "other";
94
+ }>>>;
95
+ authors: z.ZodOptional<z.ZodArray<z.ZodString>>;
87
96
  dateFrom: z.ZodOptional<z.ZodString>;
88
97
  dateTo: z.ZodOptional<z.ZodString>;
89
98
  };
@@ -104,9 +113,13 @@ export declare const ContextualSearchSchema: {
104
113
  correlate: z.ZodOptional<z.ZodBoolean>;
105
114
  };
106
115
  export declare const FederatedSearchSchema: {
107
- paths: z.ZodArray<z.ZodString, "many">;
116
+ paths: z.ZodArray<z.ZodString>;
108
117
  query: z.ZodString;
109
- searchType: z.ZodOptional<z.ZodEnum<["code", "git", "both"]>>;
118
+ searchType: z.ZodOptional<z.ZodEnum<{
119
+ git: "git";
120
+ code: "code";
121
+ both: "both";
122
+ }>>;
110
123
  limit: z.ZodOptional<z.ZodNumber>;
111
124
  };
112
125
  //# sourceMappingURL=schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sBAAsB;;;;CAUlC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAGF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;CAgB9B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;CAKjC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;;CAQhC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;CAQ9B,CAAC;AAGF,eAAO,MAAM,mBAAmB;;;;;CAkB/B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;CAiB5B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAE5B,CAAC;AAGF,eAAO,MAAM,qBAAqB;;;;;CAgBjC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;CA0ClC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;CAEjC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAGF,eAAO,MAAM,sBAAsB;;;;;;CAmBlC,CAAC;AAGF,eAAO,MAAM,qBAAqB;;;;;CAcjC,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,sBAAsB;;;;;;;;CAUlC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAGF,eAAO,MAAM,kBAAkB;;;;;;;CAgB9B,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;CAKjC,CAAC;AAGF,eAAO,MAAM,oBAAoB;;;;;CAWhC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;CAW9B,CAAC;AAGF,eAAO,MAAM,mBAAmB;;;;;CAkB/B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;CAiB5B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAE5B,CAAC;AAGF,eAAO,MAAM,qBAAqB;;;;;CAgBjC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;CA0ClC,CAAC;AAEF,eAAO,MAAM,qBAAqB;;CAEjC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAGF,eAAO,MAAM,sBAAsB;;;;;;CAmBlC,CAAC;AAGF,eAAO,MAAM,qBAAqB;;;;;;;;;CAcjC,CAAC"}
@@ -35,7 +35,7 @@ export const AddDocumentsSchema = {
35
35
  .describe("Unique identifier for the document"),
36
36
  text: z.string().describe("Text content to embed and store"),
37
37
  metadata: z
38
- .record(z.any())
38
+ .record(z.string(), z.any())
39
39
  .optional()
40
40
  .describe("Optional metadata to store with the document"),
41
41
  }))
@@ -55,7 +55,10 @@ export const SemanticSearchSchema = {
55
55
  .number()
56
56
  .optional()
57
57
  .describe("Maximum number of results (default: 5)"),
58
- filter: z.record(z.any()).optional().describe("Optional metadata filter"),
58
+ filter: z
59
+ .record(z.string(), z.any())
60
+ .optional()
61
+ .describe("Optional metadata filter"),
59
62
  };
60
63
  export const HybridSearchSchema = {
61
64
  collection: z.string().describe("Name of the collection to search"),
@@ -64,7 +67,10 @@ export const HybridSearchSchema = {
64
67
  .number()
65
68
  .optional()
66
69
  .describe("Maximum number of results (default: 5)"),
67
- filter: z.record(z.any()).optional().describe("Optional metadata filter"),
70
+ filter: z
71
+ .record(z.string(), z.any())
72
+ .optional()
73
+ .describe("Optional metadata filter"),
68
74
  };
69
75
  // Code indexing schemas
70
76
  export const IndexCodebaseSchema = {
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,sBAAsB,GAC3B,IAAI,CAuGN"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,sBAAsB,GAC3B,IAAI,CAyHN"}
@@ -1,8 +1,11 @@
1
1
  /**
2
2
  * Search tools registration
3
3
  */
4
+ import logger from "../logger.js";
4
5
  import { BM25SparseVectorGenerator } from "../embeddings/sparse.js";
6
+ import { withToolLogging } from "./logging.js";
5
7
  import * as schemas from "./schemas.js";
8
+ const log = logger.child({ component: "tools" });
6
9
  export function registerSearchTools(server, deps) {
7
10
  const { qdrant, embeddings } = deps;
8
11
  // semantic_search
@@ -10,7 +13,12 @@ export function registerSearchTools(server, deps) {
10
13
  title: "Semantic Search",
11
14
  description: "Search for documents using natural language queries. Returns the most semantically similar documents.",
12
15
  inputSchema: schemas.SemanticSearchSchema,
13
- }, async ({ collection, query, limit, filter }) => {
16
+ }, withToolLogging("semantic_search", async ({ collection, query, limit, filter }) => {
17
+ log.info({
18
+ tool: "semantic_search",
19
+ collection,
20
+ query: query.substring(0, 80),
21
+ }, "Tool called");
14
22
  // Check if collection exists
15
23
  const exists = await qdrant.collectionExists(collection);
16
24
  if (!exists) {
@@ -31,13 +39,14 @@ export function registerSearchTools(server, deps) {
31
39
  return {
32
40
  content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
33
41
  };
34
- });
42
+ }));
35
43
  // hybrid_search
36
44
  server.registerTool("hybrid_search", {
37
45
  title: "Hybrid Search",
38
46
  description: "Perform hybrid search combining semantic vector search with keyword search using BM25. This provides better results by combining the strengths of both approaches. The collection must be created with enableHybrid set to true.",
39
47
  inputSchema: schemas.HybridSearchSchema,
40
- }, async ({ collection, query, limit, filter }) => {
48
+ }, withToolLogging("hybrid_search", async ({ collection, query, limit, filter }) => {
49
+ log.info({ tool: "hybrid_search", collection, query: query.substring(0, 80) }, "Tool called");
41
50
  // Check if collection exists
42
51
  const exists = await qdrant.collectionExists(collection);
43
52
  if (!exists) {
@@ -74,6 +83,6 @@ export function registerSearchTools(server, deps) {
74
83
  return {
75
84
  content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
76
85
  };
77
- });
86
+ }));
78
87
  }
79
88
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
package/mise.toml ADDED
@@ -0,0 +1,2 @@
1
+ [tools]
2
+ node = "22"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhalder/qdrant-mcp-server",
3
- "version": "3.2.1",
3
+ "version": "3.3.0",
4
4
  "description": "MCP server for semantic search using local Qdrant and Ollama (default) with support for OpenAI, Cohere, and Voyage AI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -40,14 +40,15 @@
40
40
  "tree-sitter": "^0.25.0"
41
41
  },
42
42
  "dependencies": {
43
- "@modelcontextprotocol/sdk": "^1.25.2",
43
+ "@modelcontextprotocol/sdk": "^1.26.0",
44
44
  "@qdrant/js-client-rest": "^1.16.2",
45
45
  "bottleneck": "^2.19.5",
46
46
  "cohere-ai": "^7.20.0",
47
47
  "express": "^5.2.1",
48
48
  "ignore": "^7.0.5",
49
- "openai": "^4.104.0",
49
+ "openai": "^6.18.0",
50
50
  "picomatch": "^4.0.3",
51
+ "pino": "^10.3.0",
51
52
  "tree-sitter": "^0.25.0",
52
53
  "tree-sitter-bash": "^0.25.1",
53
54
  "tree-sitter-go": "^0.25.0",
@@ -56,24 +57,24 @@
56
57
  "tree-sitter-python": "^0.25.0",
57
58
  "tree-sitter-rust": "^0.24.0",
58
59
  "tree-sitter-typescript": "^0.23.2",
59
- "zod": "^3.25.76"
60
+ "zod": "^4.3.6"
60
61
  },
61
62
  "devDependencies": {
62
- "@commitlint/cli": "^20.3.1",
63
- "@commitlint/config-conventional": "^20.3.1",
63
+ "@commitlint/cli": "^20.4.1",
64
+ "@commitlint/config-conventional": "^20.4.1",
64
65
  "@semantic-release/changelog": "^6.0.3",
65
66
  "@semantic-release/git": "^10.0.1",
66
- "@semantic-release/github": "^12.0.2",
67
- "@semantic-release/npm": "^13.1.3",
67
+ "@semantic-release/github": "^12.0.5",
68
+ "@semantic-release/npm": "^13.1.4",
68
69
  "@types/express": "^5.0.6",
69
70
  "@types/node": "^22.19.7",
70
71
  "@types/picomatch": "^4.0.2",
71
- "@vitest/coverage-v8": "^4.0.17",
72
- "@vitest/ui": "^4.0.17",
72
+ "@vitest/coverage-v8": "^4.0.18",
73
+ "@vitest/ui": "^4.0.18",
73
74
  "husky": "^9.1.7",
74
- "semantic-release": "^25.0.2",
75
+ "semantic-release": "^25.0.3",
75
76
  "tsx": "^4.21.0",
76
- "typescript": "^5.7.2",
77
- "vitest": "^4.0.17"
77
+ "typescript": "^5.9.3",
78
+ "vitest": "^4.0.18"
78
79
  }
79
80
  }
@@ -13,10 +13,13 @@ import Python from "tree-sitter-python";
13
13
  import Rust from "tree-sitter-rust";
14
14
  import TypeScript from "tree-sitter-typescript";
15
15
 
16
+ import logger from "../../logger.js";
16
17
  import type { ChunkerConfig, CodeChunk } from "../types.js";
17
18
  import type { CodeChunker } from "./base.js";
18
19
  import { CharacterChunker } from "./character-chunker.js";
19
20
 
21
+ const log = logger.child({ component: "tree-sitter-chunker" });
22
+
20
23
  interface LanguageConfig {
21
24
  parser: Parser;
22
25
  chunkableTypes: string[];
@@ -65,7 +68,11 @@ export class TreeSitterChunker implements CodeChunker {
65
68
  pyParser.setLanguage(Python as any);
66
69
  this.languages.set("python", {
67
70
  parser: pyParser,
68
- chunkableTypes: ["function_definition", "class_definition", "decorated_definition"],
71
+ chunkableTypes: [
72
+ "function_definition",
73
+ "class_definition",
74
+ "decorated_definition",
75
+ ],
69
76
  });
70
77
 
71
78
  // Go
@@ -86,7 +93,13 @@ export class TreeSitterChunker implements CodeChunker {
86
93
  rustParser.setLanguage(Rust as any);
87
94
  this.languages.set("rust", {
88
95
  parser: rustParser,
89
- chunkableTypes: ["function_item", "impl_item", "trait_item", "struct_item", "enum_item"],
96
+ chunkableTypes: [
97
+ "function_item",
98
+ "impl_item",
99
+ "trait_item",
100
+ "struct_item",
101
+ "enum_item",
102
+ ],
90
103
  });
91
104
 
92
105
  // Java
@@ -111,7 +124,11 @@ export class TreeSitterChunker implements CodeChunker {
111
124
  });
112
125
  }
113
126
 
114
- async chunk(code: string, filePath: string, language: string): Promise<CodeChunk[]> {
127
+ async chunk(
128
+ code: string,
129
+ filePath: string,
130
+ language: string,
131
+ ): Promise<CodeChunk[]> {
115
132
  const langConfig = this.languages.get(language);
116
133
 
117
134
  if (!langConfig) {
@@ -124,7 +141,10 @@ export class TreeSitterChunker implements CodeChunker {
124
141
  const chunks: CodeChunk[] = [];
125
142
 
126
143
  // Find all chunkable nodes
127
- const nodes = this.findChunkableNodes(tree.rootNode, langConfig.chunkableTypes);
144
+ const nodes = this.findChunkableNodes(
145
+ tree.rootNode,
146
+ langConfig.chunkableTypes,
147
+ );
128
148
 
129
149
  for (const [index, node] of nodes.entries()) {
130
150
  const content = code.substring(node.startIndex, node.endIndex);
@@ -136,7 +156,11 @@ export class TreeSitterChunker implements CodeChunker {
136
156
 
137
157
  // If chunk is too large, fall back to character chunking for this node
138
158
  if (content.length > this.config.maxChunkSize * 2) {
139
- const subChunks = await this.fallbackChunker.chunk(content, filePath, language);
159
+ const subChunks = await this.fallbackChunker.chunk(
160
+ content,
161
+ filePath,
162
+ language,
163
+ );
140
164
  // Adjust line numbers for sub-chunks
141
165
  for (const subChunk of subChunks) {
142
166
  chunks.push({
@@ -174,7 +198,10 @@ export class TreeSitterChunker implements CodeChunker {
174
198
  return chunks;
175
199
  } catch (error) {
176
200
  // On parsing error, fallback to character-based chunking
177
- console.error(`Tree-sitter parsing failed for ${filePath}:`, error);
201
+ log.warn(
202
+ { filePath, err: error },
203
+ "Tree-sitter parsing failed, falling back to character chunker",
204
+ );
178
205
  return this.fallbackChunker.chunk(code, filePath, language);
179
206
  }
180
207
  }
@@ -192,7 +219,7 @@ export class TreeSitterChunker implements CodeChunker {
192
219
  */
193
220
  private findChunkableNodes(
194
221
  node: Parser.SyntaxNode,
195
- chunkableTypes: string[]
222
+ chunkableTypes: string[],
196
223
  ): Parser.SyntaxNode[] {
197
224
  const nodes: Parser.SyntaxNode[] = [];
198
225
 
@@ -215,7 +242,10 @@ export class TreeSitterChunker implements CodeChunker {
215
242
  /**
216
243
  * Extract function/class name from AST node
217
244
  */
218
- private extractName(node: Parser.SyntaxNode, code: string): string | undefined {
245
+ private extractName(
246
+ node: Parser.SyntaxNode,
247
+ code: string,
248
+ ): string | undefined {
219
249
  // Try to find name node
220
250
  const nameNode = node.childForFieldName("name");
221
251
  if (nameNode) {
@@ -235,7 +265,9 @@ export class TreeSitterChunker implements CodeChunker {
235
265
  /**
236
266
  * Map AST node type to chunk type
237
267
  */
238
- private getChunkType(nodeType: string): "function" | "class" | "interface" | "block" {
268
+ private getChunkType(
269
+ nodeType: string,
270
+ ): "function" | "class" | "interface" | "block" {
239
271
  if (nodeType.includes("function") || nodeType.includes("method")) {
240
272
  return "function";
241
273
  }
@@ -8,6 +8,7 @@ import { promises as fs } from "node:fs";
8
8
  import { extname, join, relative, resolve } from "node:path";
9
9
  import { promisify } from "node:util";
10
10
  import picomatch from "picomatch";
11
+ import logger from "../logger.js";
11
12
  import type { EmbeddingProvider } from "../embeddings/base.js";
12
13
  import { BM25SparseVectorGenerator } from "../embeddings/sparse.js";
13
14
  import { normalizeRemoteUrl } from "../git/extractor.js";
@@ -34,6 +35,8 @@ const execFileAsync = promisify(execFile);
34
35
  const INDEXING_METADATA_ID = "__indexing_metadata__";
35
36
 
36
37
  export class CodeIndexer {
38
+ private log = logger.child({ component: "code-indexer" });
39
+
37
40
  constructor(
38
41
  private qdrant: QdrantManager,
39
42
  private embeddings: EmbeddingProvider,
@@ -83,6 +86,8 @@ export class CodeIndexer {
83
86
  const absolutePath = await this.validatePath(path);
84
87
  const collectionName = await this.getCollectionName(absolutePath);
85
88
 
89
+ this.log.info({ path: absolutePath, collectionName }, "Indexing started");
90
+
86
91
  try {
87
92
  // 1. Scan files
88
93
  progressCallback?.({
@@ -105,6 +110,7 @@ export class CodeIndexer {
105
110
  const files = await scanner.scanDirectory(absolutePath);
106
111
 
107
112
  stats.filesScanned = files.length;
113
+ this.log.info({ filesFound: files.length }, "File scan complete");
108
114
 
109
115
  if (files.length === 0) {
110
116
  stats.status = "completed";
@@ -128,6 +134,7 @@ export class CodeIndexer {
128
134
  "Cosine",
129
135
  this.config.enableHybridSearch,
130
136
  );
137
+ this.log.debug({ collectionName, vectorSize }, "Collection created");
131
138
  }
132
139
 
133
140
  // Store "indexing in progress" marker immediately after collection is ready
@@ -209,7 +216,7 @@ export class CodeIndexer {
209
216
  // Snapshot failure shouldn't fail the entire indexing
210
217
  const errorMessage =
211
218
  error instanceof Error ? error.message : String(error);
212
- console.error("Failed to save snapshot:", errorMessage);
219
+ this.log.error({ err: error }, "Failed to save snapshot");
213
220
  stats.errors?.push(`Snapshot save failed: ${errorMessage}`);
214
221
  }
215
222
 
@@ -223,6 +230,10 @@ export class CodeIndexer {
223
230
 
224
231
  // 4. Generate embeddings and store in batches
225
232
  const batchSize = this.config.batchSize;
233
+ this.log.debug(
234
+ { totalChunks: allChunks.length, batchSize },
235
+ "Starting embedding generation",
236
+ );
226
237
  for (let i = 0; i < allChunks.length; i += batchSize) {
227
238
  const batch = allChunks.slice(i, i + batchSize);
228
239
 
@@ -309,6 +320,14 @@ export class CodeIndexer {
309
320
  await this.storeIndexingMarker(collectionName, true);
310
321
 
311
322
  stats.durationMs = Date.now() - startTime;
323
+ this.log.info(
324
+ {
325
+ filesIndexed: stats.filesIndexed,
326
+ chunksCreated: stats.chunksCreated,
327
+ durationMs: stats.durationMs,
328
+ },
329
+ "Indexing complete",
330
+ );
312
331
  return stats;
313
332
  } catch (error) {
314
333
  const errorMessage =
@@ -365,7 +384,7 @@ export class CodeIndexer {
365
384
  }
366
385
  } catch (error) {
367
386
  // Non-fatal: log but don't fail the indexing
368
- console.error("Failed to store indexing marker:", error);
387
+ this.log.error({ err: error }, "Failed to store indexing marker");
369
388
  }
370
389
  }
371
390
 
@@ -564,6 +583,8 @@ export class CodeIndexer {
564
583
  const absolutePath = await this.validatePath(path);
565
584
  const collectionName = await this.getCollectionName(absolutePath);
566
585
 
586
+ this.log.info({ path: absolutePath }, "Reindex started");
587
+
567
588
  // Check if collection exists
568
589
  const exists = await this.qdrant.collectionExists(collectionName);
569
590
  if (!exists) {
@@ -640,9 +661,9 @@ export class CodeIndexer {
640
661
  await this.qdrant.deletePointsByFilter(collectionName, filter);
641
662
  } catch (error) {
642
663
  // Log but don't fail - file might not have any chunks
643
- console.error(
644
- `Failed to delete chunks for ${relativePath}:`,
645
- error,
664
+ this.log.error(
665
+ { relativePath, err: error },
666
+ "Failed to delete chunks during reindex",
646
667
  );
647
668
  }
648
669
  }
@@ -677,7 +698,10 @@ export class CodeIndexer {
677
698
  allChunks.push({ chunk, id });
678
699
  }
679
700
  } catch (error) {
680
- console.error(`Failed to process ${filePath}:`, error);
701
+ this.log.error(
702
+ { filePath, err: error },
703
+ "Failed to process file during reindex",
704
+ );
681
705
  }
682
706
  }
683
707
 
@@ -746,6 +770,16 @@ export class CodeIndexer {
746
770
  await synchronizer.updateSnapshot(currentFiles);
747
771
 
748
772
  stats.durationMs = Date.now() - startTime;
773
+ this.log.info(
774
+ {
775
+ filesAdded: stats.filesAdded,
776
+ filesModified: stats.filesModified,
777
+ filesDeleted: stats.filesDeleted,
778
+ chunksAdded: stats.chunksAdded,
779
+ durationMs: stats.durationMs,
780
+ },
781
+ "Reindex complete",
782
+ );
749
783
  return stats;
750
784
  } catch (error) {
751
785
  const errorMessage =
@@ -758,6 +792,7 @@ export class CodeIndexer {
758
792
  * Clear all indexed data for a codebase
759
793
  */
760
794
  async clearIndex(path: string): Promise<void> {
795
+ this.log.info({ path }, "Clearing index");
761
796
  const absolutePath = await this.validatePath(path);
762
797
  const collectionName = await this.getCollectionName(absolutePath);
763
798
  const exists = await this.qdrant.collectionExists(collectionName);
@@ -12,6 +12,18 @@ vi.mock("cohere-ai", () => ({
12
12
  }),
13
13
  }));
14
14
 
15
+ vi.mock("../logger.js", () => ({
16
+ default: {
17
+ info: vi.fn(),
18
+ warn: vi.fn(),
19
+ error: vi.fn(),
20
+ debug: vi.fn(),
21
+ fatal: vi.fn(),
22
+ trace: vi.fn(),
23
+ child: vi.fn().mockReturnThis(),
24
+ },
25
+ }));
26
+
15
27
  describe("CohereEmbeddings", () => {
16
28
  let embeddings: CohereEmbeddings;
17
29
 
@@ -1,5 +1,6 @@
1
1
  import { CohereClient } from "cohere-ai";
2
2
  import Bottleneck from "bottleneck";
3
+ import logger from "../logger.js";
3
4
  import { EmbeddingProvider, EmbeddingResult, RateLimitConfig } from "./base.js";
4
5
 
5
6
  interface CohereError {
@@ -9,6 +10,7 @@ interface CohereError {
9
10
  }
10
11
 
11
12
  export class CohereEmbeddings implements EmbeddingProvider {
13
+ private log = logger.child({ component: "embeddings", provider: "cohere" });
12
14
  private client: CohereClient;
13
15
  private model: string;
14
16
  private dimensions: number;
@@ -76,8 +78,13 @@ export class CohereEmbeddings implements EmbeddingProvider {
76
78
  if (isRateLimitError && attempt < this.retryAttempts) {
77
79
  const delayMs = this.retryDelayMs * Math.pow(2, attempt);
78
80
  const waitTimeSeconds = (delayMs / 1000).toFixed(1);
79
- console.error(
80
- `Rate limit reached. Retrying in ${waitTimeSeconds}s (attempt ${attempt + 1}/${this.retryAttempts})...`,
81
+ this.log.warn(
82
+ {
83
+ waitTimeSeconds,
84
+ attempt: attempt + 1,
85
+ maxAttempts: this.retryAttempts,
86
+ },
87
+ "Rate limit reached, retrying",
81
88
  );
82
89
 
83
90
  await new Promise((resolve) => setTimeout(resolve, delayMs));
@@ -119,6 +126,7 @@ export class CohereEmbeddings implements EmbeddingProvider {
119
126
  }
120
127
 
121
128
  async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {
129
+ this.log.debug({ batchSize: texts.length }, "embedBatch");
122
130
  return this.limiter.schedule(() =>
123
131
  this.retryWithBackoff(async () => {
124
132
  const response = await this.client.embed({
@@ -1,10 +1,22 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
2
  import { EmbeddingProviderFactory, type FactoryConfig } from "./factory.js";
3
3
  import { OpenAIEmbeddings } from "./openai.js";
4
4
  import { CohereEmbeddings } from "./cohere.js";
5
5
  import { VoyageEmbeddings } from "./voyage.js";
6
6
  import { OllamaEmbeddings } from "./ollama.js";
7
7
 
8
+ vi.mock("../logger.js", () => ({
9
+ default: {
10
+ info: vi.fn(),
11
+ warn: vi.fn(),
12
+ error: vi.fn(),
13
+ debug: vi.fn(),
14
+ fatal: vi.fn(),
15
+ trace: vi.fn(),
16
+ child: vi.fn().mockReturnThis(),
17
+ },
18
+ }));
19
+
8
20
  describe("EmbeddingProviderFactory", () => {
9
21
  let originalEnv: NodeJS.ProcessEnv;
10
22
 
@@ -1,3 +1,4 @@
1
+ import logger from "../logger.js";
1
2
  import { EmbeddingProvider, ProviderConfig } from "./base.js";
2
3
  import { OpenAIEmbeddings } from "./openai.js";
3
4
  import { CohereEmbeddings } from "./cohere.js";
@@ -15,6 +16,8 @@ export class EmbeddingProviderFactory {
15
16
  const { provider, model, dimensions, rateLimitConfig, apiKey, baseUrl } =
16
17
  config;
17
18
 
19
+ logger.info({ provider, model }, "Creating embedding provider");
20
+
18
21
  switch (provider) {
19
22
  case "openai":
20
23
  if (!apiKey) {