@mhalder/qdrant-mcp-server 3.2.0 → 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 (132) hide show
  1. package/.dagger/.gitattributes +1 -0
  2. package/.dagger/package.json +6 -0
  3. package/.dagger/src/index.ts +83 -0
  4. package/.dagger/tsconfig.json +13 -0
  5. package/.dagger/yarn.lock +8 -0
  6. package/.github/workflows/ci.yml +17 -27
  7. package/.github/workflows/release.yml +16 -19
  8. package/CHANGELOG.md +13 -0
  9. package/README.md +11 -9
  10. package/build/code/chunker/tree-sitter-chunker.d.ts.map +1 -1
  11. package/build/code/chunker/tree-sitter-chunker.js +15 -3
  12. package/build/code/chunker/tree-sitter-chunker.js.map +1 -1
  13. package/build/code/indexer.d.ts +1 -0
  14. package/build/code/indexer.d.ts.map +1 -1
  15. package/build/code/indexer.js +24 -4
  16. package/build/code/indexer.js.map +1 -1
  17. package/build/embeddings/cohere.d.ts +1 -0
  18. package/build/embeddings/cohere.d.ts.map +1 -1
  19. package/build/embeddings/cohere.js +8 -1
  20. package/build/embeddings/cohere.js.map +1 -1
  21. package/build/embeddings/cohere.test.js +11 -0
  22. package/build/embeddings/cohere.test.js.map +1 -1
  23. package/build/embeddings/factory.d.ts.map +1 -1
  24. package/build/embeddings/factory.js +2 -0
  25. package/build/embeddings/factory.js.map +1 -1
  26. package/build/embeddings/factory.test.js +12 -1
  27. package/build/embeddings/factory.test.js.map +1 -1
  28. package/build/embeddings/ollama.d.ts +1 -0
  29. package/build/embeddings/ollama.d.ts.map +1 -1
  30. package/build/embeddings/ollama.js +8 -1
  31. package/build/embeddings/ollama.js.map +1 -1
  32. package/build/embeddings/ollama.test.js +11 -0
  33. package/build/embeddings/ollama.test.js.map +1 -1
  34. package/build/embeddings/openai.d.ts +1 -0
  35. package/build/embeddings/openai.d.ts.map +1 -1
  36. package/build/embeddings/openai.js +8 -1
  37. package/build/embeddings/openai.js.map +1 -1
  38. package/build/embeddings/openai.test.js +11 -0
  39. package/build/embeddings/openai.test.js.map +1 -1
  40. package/build/embeddings/voyage.d.ts +1 -0
  41. package/build/embeddings/voyage.d.ts.map +1 -1
  42. package/build/embeddings/voyage.js +8 -1
  43. package/build/embeddings/voyage.js.map +1 -1
  44. package/build/embeddings/voyage.test.js +11 -0
  45. package/build/embeddings/voyage.test.js.map +1 -1
  46. package/build/git/indexer.d.ts +1 -0
  47. package/build/git/indexer.d.ts.map +1 -1
  48. package/build/git/indexer.js +16 -3
  49. package/build/git/indexer.js.map +1 -1
  50. package/build/git/indexer.test.js +15 -9
  51. package/build/git/indexer.test.js.map +1 -1
  52. package/build/index.js +35 -26
  53. package/build/index.js.map +1 -1
  54. package/build/index.test.js +105 -91
  55. package/build/index.test.js.map +1 -1
  56. package/build/logger.d.ts +4 -0
  57. package/build/logger.d.ts.map +1 -0
  58. package/build/logger.js +24 -0
  59. package/build/logger.js.map +1 -0
  60. package/build/qdrant/client.d.ts +1 -0
  61. package/build/qdrant/client.d.ts.map +1 -1
  62. package/build/qdrant/client.js +10 -0
  63. package/build/qdrant/client.js.map +1 -1
  64. package/build/qdrant/client.test.js +11 -0
  65. package/build/qdrant/client.test.js.map +1 -1
  66. package/build/tools/code.d.ts.map +1 -1
  67. package/build/tools/code.js +44 -13
  68. package/build/tools/code.js.map +1 -1
  69. package/build/tools/collection.d.ts.map +1 -1
  70. package/build/tools/collection.js +15 -8
  71. package/build/tools/collection.js.map +1 -1
  72. package/build/tools/document.d.ts.map +1 -1
  73. package/build/tools/document.js +9 -4
  74. package/build/tools/document.js.map +1 -1
  75. package/build/tools/federated.d.ts.map +1 -1
  76. package/build/tools/federated.js +9 -4
  77. package/build/tools/federated.js.map +1 -1
  78. package/build/tools/federated.test.js +11 -0
  79. package/build/tools/federated.test.js.map +1 -1
  80. package/build/tools/git-history.d.ts.map +1 -1
  81. package/build/tools/git-history.js +44 -12
  82. package/build/tools/git-history.js.map +1 -1
  83. package/build/tools/logging.d.ts +16 -0
  84. package/build/tools/logging.d.ts.map +1 -0
  85. package/build/tools/logging.js +68 -0
  86. package/build/tools/logging.js.map +1 -0
  87. package/build/tools/logging.test.d.ts +2 -0
  88. package/build/tools/logging.test.d.ts.map +1 -0
  89. package/build/tools/logging.test.js +139 -0
  90. package/build/tools/logging.test.js.map +1 -0
  91. package/build/tools/schemas.d.ts +32 -19
  92. package/build/tools/schemas.d.ts.map +1 -1
  93. package/build/tools/schemas.js +9 -3
  94. package/build/tools/schemas.js.map +1 -1
  95. package/build/tools/search.d.ts.map +1 -1
  96. package/build/tools/search.js +13 -4
  97. package/build/tools/search.js.map +1 -1
  98. package/dagger.json +8 -0
  99. package/mise.toml +2 -0
  100. package/package.json +14 -13
  101. package/src/code/chunker/tree-sitter-chunker.ts +41 -9
  102. package/src/code/indexer.ts +41 -6
  103. package/src/embeddings/cohere.test.ts +12 -0
  104. package/src/embeddings/cohere.ts +10 -2
  105. package/src/embeddings/factory.test.ts +13 -1
  106. package/src/embeddings/factory.ts +3 -0
  107. package/src/embeddings/ollama.test.ts +12 -0
  108. package/src/embeddings/ollama.ts +10 -2
  109. package/src/embeddings/openai.test.ts +12 -0
  110. package/src/embeddings/openai.ts +10 -2
  111. package/src/embeddings/voyage.test.ts +12 -0
  112. package/src/embeddings/voyage.ts +10 -2
  113. package/src/git/indexer.test.ts +22 -16
  114. package/src/git/indexer.ts +30 -4
  115. package/src/index.test.ts +128 -106
  116. package/src/index.ts +59 -38
  117. package/src/logger.ts +33 -0
  118. package/src/qdrant/client.test.ts +12 -0
  119. package/src/qdrant/client.ts +22 -0
  120. package/src/tools/code.ts +107 -62
  121. package/src/tools/collection.ts +39 -22
  122. package/src/tools/document.ts +52 -22
  123. package/src/tools/federated.test.ts +12 -0
  124. package/src/tools/federated.ts +143 -125
  125. package/src/tools/git-history.ts +117 -60
  126. package/src/tools/logging.test.ts +206 -0
  127. package/src/tools/logging.ts +85 -0
  128. package/src/tools/schemas.ts +9 -3
  129. package/src/tools/search.ts +93 -71
  130. package/tests/code/chunker/tree-sitter-chunker.test.ts +13 -1
  131. package/tests/code/indexer.test.ts +12 -0
  132. package/tests/code/integration.test.ts +14 -1
package/build/index.js CHANGED
@@ -7,6 +7,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
7
7
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
8
8
  import Bottleneck from "bottleneck";
9
9
  import express from "express";
10
+ import logger from "./logger.js";
10
11
  import { DEFAULT_BATCH_SIZE, DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE, DEFAULT_CODE_EXTENSIONS, DEFAULT_IGNORE_PATTERNS, DEFAULT_SEARCH_LIMIT, } from "./code/config.js";
11
12
  import { CodeIndexer } from "./code/indexer.js";
12
13
  import { DEFAULT_GIT_CONFIG, GitHistoryIndexer } from "./git/index.js";
@@ -29,7 +30,7 @@ const PROMPTS_CONFIG_FILE = process.env.PROMPTS_CONFIG_FILE || join(__dirname, "
29
30
  // Validate HTTP_PORT when HTTP mode is selected
30
31
  if (TRANSPORT_MODE === "http") {
31
32
  if (Number.isNaN(HTTP_PORT) || HTTP_PORT < 1 || HTTP_PORT > 65535) {
32
- console.error(`Error: Invalid HTTP_PORT "${process.env.HTTP_PORT}". Must be a number between 1 and 65535.`);
33
+ logger.fatal({ port: process.env.HTTP_PORT }, "Invalid HTTP_PORT. Must be a number between 1 and 65535");
33
34
  process.exit(1);
34
35
  }
35
36
  }
@@ -51,11 +52,11 @@ if (EMBEDDING_PROVIDER !== "ollama") {
51
52
  requiredKeyName = "VOYAGE_API_KEY";
52
53
  break;
53
54
  default:
54
- console.error(`Error: Unknown embedding provider "${EMBEDDING_PROVIDER}". Supported providers: openai, cohere, voyage, ollama.`);
55
+ logger.fatal({ provider: EMBEDDING_PROVIDER }, "Unknown embedding provider. Supported providers: openai, cohere, voyage, ollama");
55
56
  process.exit(1);
56
57
  }
57
58
  if (!apiKey) {
58
- console.error(`Error: ${requiredKeyName} is required for ${EMBEDDING_PROVIDER} provider.`);
59
+ logger.fatal({ provider: EMBEDDING_PROVIDER, requiredKey: requiredKeyName }, `${requiredKeyName} is required for ${EMBEDDING_PROVIDER} provider`);
59
60
  process.exit(1);
60
61
  }
61
62
  }
@@ -88,14 +89,14 @@ async function checkOllamaAvailability() {
88
89
  `Please ensure the model is available on your Ollama instance:\n` +
89
90
  ` ollama pull ${modelName}`;
90
91
  }
91
- console.error(errorMessage);
92
+ logger.fatal({ model: modelName }, errorMessage);
92
93
  process.exit(1);
93
94
  }
94
95
  }
95
96
  catch (error) {
96
97
  const errorMessage = error instanceof Error
97
- ? `Error: ${error.message}`
98
- : `Error: Ollama is not running at ${baseUrl}.\n`;
98
+ ? error.message
99
+ : `Ollama is not running at ${baseUrl}`;
99
100
  let helpText = "";
100
101
  if (isLocalhost) {
101
102
  helpText =
@@ -113,14 +114,20 @@ async function checkOllamaAvailability() {
113
114
  ` - The URL is accessible from this machine\n` +
114
115
  ` - The embedding model is available (e.g., nomic-embed-text)`;
115
116
  }
116
- console.error(`${errorMessage}\n${helpText}`);
117
+ logger.fatal({ baseUrl, err: error }, `${errorMessage}\n${helpText}`);
117
118
  process.exit(1);
118
119
  }
119
120
  }
120
121
  }
121
122
  // Initialize clients
122
123
  const qdrant = new QdrantManager(QDRANT_URL, QDRANT_API_KEY);
124
+ logger.info({ url: QDRANT_URL }, "Qdrant client initialized");
123
125
  const embeddings = EmbeddingProviderFactory.createFromEnv();
126
+ logger.info({
127
+ provider: EMBEDDING_PROVIDER,
128
+ model: embeddings.getModel(),
129
+ dimensions: embeddings.getDimensions(),
130
+ }, "Embedding provider initialized");
124
131
  // Initialize code indexer
125
132
  const codeConfig = {
126
133
  chunkSize: parseInt(process.env.CODE_CHUNK_SIZE || String(DEFAULT_CHUNK_SIZE), 10),
@@ -133,6 +140,7 @@ const codeConfig = {
133
140
  enableHybridSearch: process.env.CODE_ENABLE_HYBRID === "true",
134
141
  };
135
142
  const codeIndexer = new CodeIndexer(qdrant, embeddings, codeConfig);
143
+ logger.debug({ codeConfig }, "Code indexer configured");
136
144
  // Initialize git history indexer
137
145
  const gitConfig = {
138
146
  maxCommits: parseInt(process.env.GIT_MAX_COMMITS || String(DEFAULT_GIT_CONFIG.maxCommits), 10),
@@ -149,15 +157,16 @@ const gitConfig = {
149
157
  enableHybridSearch: process.env.GIT_ENABLE_HYBRID !== "false",
150
158
  };
151
159
  const gitHistoryIndexer = new GitHistoryIndexer(qdrant, embeddings, gitConfig);
160
+ logger.debug({ gitConfig }, "Git history indexer configured");
152
161
  // Load prompts configuration if file exists
153
162
  let promptsConfig = null;
154
163
  if (existsSync(PROMPTS_CONFIG_FILE)) {
155
164
  try {
156
165
  promptsConfig = loadPromptsConfig(PROMPTS_CONFIG_FILE);
157
- console.error(`Loaded ${promptsConfig.prompts.length} prompts from ${PROMPTS_CONFIG_FILE}`);
166
+ logger.info({ count: promptsConfig.prompts.length, file: PROMPTS_CONFIG_FILE }, "Loaded prompts config");
158
167
  }
159
168
  catch (error) {
160
- console.error(`Failed to load prompts configuration from ${PROMPTS_CONFIG_FILE}:`, error);
169
+ logger.fatal({ file: PROMPTS_CONFIG_FILE, err: error }, "Failed to load prompts configuration");
161
170
  process.exit(1);
162
171
  }
163
172
  }
@@ -182,7 +191,7 @@ function createAndConfigureServer() {
182
191
  return server;
183
192
  }
184
193
  catch (error) {
185
- console.error("Failed to configure MCP server:", error);
194
+ logger.error({ err: error }, "Failed to configure MCP server");
186
195
  throw error;
187
196
  }
188
197
  }
@@ -193,7 +202,7 @@ async function startStdioServer() {
193
202
  await checkOllamaAvailability();
194
203
  const transport = new StdioServerTransport();
195
204
  await server.connect(transport);
196
- console.error("Qdrant MCP server running on stdio");
205
+ logger.info("Qdrant MCP server running on stdio");
197
206
  }
198
207
  // Constants for HTTP server configuration
199
208
  const RATE_LIMIT_MAX_REQUESTS = 100; // Max requests per window
@@ -204,7 +213,7 @@ const REQUEST_TIMEOUT_MS = parseInt(process.env.HTTP_REQUEST_TIMEOUT_MS || "3000
204
213
  const SHUTDOWN_GRACE_PERIOD_MS = 10 * 1000; // 10 seconds
205
214
  // Validate REQUEST_TIMEOUT_MS
206
215
  if (Number.isNaN(REQUEST_TIMEOUT_MS) || REQUEST_TIMEOUT_MS <= 0) {
207
- console.error(`Error: Invalid HTTP_REQUEST_TIMEOUT_MS "${process.env.HTTP_REQUEST_TIMEOUT_MS}". Must be a positive integer.`);
216
+ logger.fatal({ value: process.env.HTTP_REQUEST_TIMEOUT_MS }, "Invalid HTTP_REQUEST_TIMEOUT_MS. Must be a positive integer");
208
217
  process.exit(1);
209
218
  }
210
219
  // Start server with HTTP transport
@@ -247,7 +256,7 @@ async function startHttpServer() {
247
256
  ipLastAccess.delete(ip);
248
257
  });
249
258
  if (keysToDelete.length > 0) {
250
- console.error(`Cleaned up ${keysToDelete.length} inactive rate limiters`);
259
+ logger.debug({ count: keysToDelete.length }, "Cleaned up inactive rate limiters");
251
260
  }
252
261
  }, RATE_LIMITER_CLEANUP_INTERVAL_MS);
253
262
  // Rate limiting middleware
@@ -264,10 +273,10 @@ async function startHttpServer() {
264
273
  catch (error) {
265
274
  // Differentiate between rate limit errors and unexpected errors
266
275
  if (error instanceof Bottleneck.BottleneckError) {
267
- console.error(`Rate limit exceeded for IP ${clientIp}:`, error.message);
276
+ logger.warn({ clientIp }, "Rate limit exceeded");
268
277
  }
269
278
  else {
270
- console.error("Unexpected rate limiting error:", error);
279
+ logger.error({ clientIp, err: error }, "Unexpected rate limiting error");
271
280
  }
272
281
  sendErrorResponse(res, -32000, "Too many requests", 429);
273
282
  }
@@ -302,7 +311,7 @@ async function startHttpServer() {
302
311
  const timeoutId = setTimeout(() => {
303
312
  sendErrorResponse(res, -32000, "Request timeout", 504);
304
313
  cleanup().catch((err) => {
305
- console.error("Error during timeout cleanup:", err);
314
+ logger.error({ err }, "Error during timeout cleanup");
306
315
  });
307
316
  }, REQUEST_TIMEOUT_MS);
308
317
  try {
@@ -316,29 +325,29 @@ async function startHttpServer() {
316
325
  const cleanupHandler = () => {
317
326
  clearTimeout(timeoutId);
318
327
  cleanup().catch((err) => {
319
- console.error("Error during response cleanup:", err);
328
+ logger.error({ err }, "Error during response cleanup");
320
329
  });
321
330
  };
322
331
  res.on("finish", cleanupHandler);
323
332
  res.on("close", cleanupHandler);
324
333
  res.on("error", (err) => {
325
- console.error("Response stream error:", err);
334
+ logger.error({ err }, "Response stream error");
326
335
  cleanupHandler();
327
336
  });
328
337
  }
329
338
  catch (error) {
330
339
  clearTimeout(timeoutId);
331
- console.error("Error handling MCP request:", error);
340
+ logger.error({ err: error }, "Error handling MCP request");
332
341
  sendErrorResponse(res, -32603, "Internal server error");
333
342
  await cleanup();
334
343
  }
335
344
  });
336
345
  const httpServer = app
337
346
  .listen(HTTP_PORT, () => {
338
- console.error(`Qdrant MCP server running on http://localhost:${HTTP_PORT}/mcp`);
347
+ logger.info({ port: HTTP_PORT }, "Qdrant MCP server running on HTTP");
339
348
  })
340
349
  .on("error", (error) => {
341
- console.error("HTTP server error:", error);
350
+ logger.fatal({ err: error }, "HTTP server error");
342
351
  process.exit(1);
343
352
  });
344
353
  // Graceful shutdown handling
@@ -347,17 +356,17 @@ async function startHttpServer() {
347
356
  if (isShuttingDown)
348
357
  return;
349
358
  isShuttingDown = true;
350
- console.error("Shutdown signal received, closing HTTP server gracefully...");
359
+ logger.info("Shutdown signal received, closing HTTP server gracefully");
351
360
  // Clear the cleanup interval to allow graceful shutdown
352
361
  clearInterval(cleanupIntervalId);
353
362
  // Force shutdown after grace period
354
363
  const forceTimeout = setTimeout(() => {
355
- console.error("Forcing shutdown after timeout");
364
+ logger.warn("Forcing shutdown after timeout");
356
365
  process.exit(1);
357
366
  }, SHUTDOWN_GRACE_PERIOD_MS);
358
367
  httpServer.close(() => {
359
368
  clearTimeout(forceTimeout);
360
- console.error("HTTP server closed");
369
+ logger.info("HTTP server closed");
361
370
  process.exit(0);
362
371
  });
363
372
  };
@@ -373,12 +382,12 @@ async function main() {
373
382
  await startStdioServer();
374
383
  }
375
384
  else {
376
- console.error(`Error: Invalid TRANSPORT_MODE "${TRANSPORT_MODE}". Supported modes: stdio, http.`);
385
+ logger.fatal({ mode: TRANSPORT_MODE }, "Invalid TRANSPORT_MODE. Supported modes: stdio, http");
377
386
  process.exit(1);
378
387
  }
379
388
  }
380
389
  main().catch((error) => {
381
- console.error("Fatal error:", error);
390
+ logger.fatal({ err: error }, "Fatal error");
382
391
  process.exit(1);
383
392
  });
384
393
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAsB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,gCAAgC;AAChC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AAEF,iCAAiC;AACjC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,uBAAuB,CAAC;AACrE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAClD,MAAM,kBAAkB,GAAG,CACzB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,CAC3C,CAAC,WAAW,EAAE,CAAC;AAChB,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7E,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAChE,MAAM,mBAAmB,GACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAExE,gDAAgD;AAChD,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;IAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QAClE,OAAO,CAAC,KAAK,CACX,6BAA6B,OAAO,CAAC,GAAG,CAAC,SAAS,0CAA0C,CAC7F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,IAAI,kBAAkB,KAAK,QAAQ,EAAE,CAAC;IACpC,IAAI,MAA0B,CAAC;IAC/B,IAAI,eAAuB,CAAC;IAE5B,QAAQ,kBAAkB,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YACpC,eAAe,GAAG,gBAAgB,CAAC;YACnC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YACpC,eAAe,GAAG,gBAAgB,CAAC;YACnC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YACpC,eAAe,GAAG,gBAAgB,CAAC;YACnC,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CACX,sCAAsC,kBAAkB,yDAAyD,CAClH,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,UAAU,eAAe,oBAAoB,kBAAkB,YAAY,CAC5E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,KAAK,UAAU,uBAAuB;IACpC,IAAI,kBAAkB,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;QAC3E,MAAM,WAAW,GACf,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,+CAA+C;YAC/C,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,CAAC,CAAC;YACxD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,kBAAkB,CAAC;YACpE,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAC7B,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,CACvE,CAAC;YAEF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,IAAI,YAAY,GAAG,iBAAiB,SAAS,0BAA0B,CAAC;gBAExE,IAAI,WAAW,EAAE,CAAC;oBAChB,YAAY;wBACV,iBAAiB;4BACjB,oDAAoD,SAAS,IAAI;4BACjE,oDAAoD,SAAS,IAAI;4BACjE,+BAA+B,SAAS,EAAE,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACN,YAAY;wBACV,iEAAiE;4BACjE,iBAAiB,SAAS,EAAE,CAAC;gBACjC,CAAC;gBAED,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE;gBAC3B,CAAC,CAAC,mCAAmC,OAAO,KAAK,CAAC;YAEtD,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ;oBACN,wBAAwB;wBACxB,0CAA0C;wBAC1C,0CAA0C;wBAC1C,wEAAwE;wBACxE,oCAAoC;wBACpC,gCAAgC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,QAAQ;oBACN,kBAAkB;wBAClB,8CAA8C;wBAC9C,+CAA+C;wBAC/C,+DAA+D,CAAC;YACpE,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,QAAQ,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,qBAAqB;AACrB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAC7D,MAAM,UAAU,GAAG,wBAAwB,CAAC,aAAa,EAAE,CAAC;AAE5D,0BAA0B;AAC1B,MAAM,UAAU,GAAe;IAC7B,SAAS,EAAE,QAAQ,CACjB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,kBAAkB,CAAC,EACzD,EAAE,CACH;IACD,YAAY,EAAE,QAAQ,CACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,qBAAqB,CAAC,EAC/D,EAAE,CACH;IACD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO;IAC1D,mBAAmB,EAAE,uBAAuB;IAC5C,cAAc,EAAE,uBAAuB;IACvC,SAAS,EAAE,QAAQ,CACjB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,kBAAkB,CAAC,EACzD,EAAE,CACH;IACD,kBAAkB,EAAE,QAAQ,CAC1B,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAC7D,EAAE,CACH;IACD,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM;CAC9D,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEpE,iCAAiC;AACjC,MAAM,SAAS,GAAc;IAC3B,UAAU,EAAE,QAAQ,CAClB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EACpE,EAAE,CACH;IACD,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,OAAO;IAC1D,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO;IACrD,WAAW,EAAE,QAAQ,CACnB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,EACvE,EAAE,CACH;IACD,UAAU,EAAE,QAAQ,CAClB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAChE,EAAE,CACH;IACD,YAAY,EAAE,QAAQ,CACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,EACzE,EAAE,CACH;IACD,SAAS,EAAE,QAAQ,CACjB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAClE,EAAE,CACH;IACD,kBAAkB,EAAE,QAAQ,CAC1B,OAAO,CAAC,GAAG,CAAC,wBAAwB;QAClC,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,EAC/C,EAAE,CACH;IACD,kBAAkB,EAAE,QAAQ,CAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC1B,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,EAC/C,EAAE,CACH;IACD,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,OAAO;CAC9D,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE/E,4CAA4C;AAC5C,IAAI,aAAa,GAAyB,IAAI,CAAC;AAC/C,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,aAAa,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CACX,UAAU,aAAa,CAAC,OAAO,CAAC,MAAM,iBAAiB,mBAAmB,EAAE,CAC7E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,6CAA6C,mBAAmB,GAAG,EACnE,KAAK,CACN,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,SAAS,wBAAwB;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QAEH,qBAAqB;QACrB,gBAAgB,CAAC,MAAM,EAAE;YACvB,MAAM;YACN,UAAU;YACV,WAAW;YACX,iBAAiB;SAClB,CAAC,CAAC;QAEH,yBAAyB;QACzB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAErC,uCAAuC;QACvC,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAE1C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;AAE1C,oCAAoC;AACpC,KAAK,UAAU,gBAAgB;IAC7B,MAAM,uBAAuB,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACtD,CAAC;AAED,0CAA0C;AAC1C,MAAM,uBAAuB,GAAG,GAAG,CAAC,CAAC,0BAA0B;AAC/D,MAAM,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAC1D,MAAM,yBAAyB,GAAG,EAAE,CAAC,CAAC,iCAAiC;AACvE,MAAM,gCAAgC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAClE,MAAM,kBAAkB,GAAG,QAAQ,CACjC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,QAAQ,EAC/C,EAAE,CACH,CAAC;AACF,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AAEzD,8BAA8B;AAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,IAAI,CAAC,EAAE,CAAC;IAChE,OAAO,CAAC,KAAK,CACX,2CAA2C,OAAO,CAAC,GAAG,CAAC,uBAAuB,gCAAgC,CAC/G,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,mCAAmC;AACnC,KAAK,UAAU,eAAe;IAC5B,MAAM,uBAAuB,EAAE,CAAC;IAEhC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,4DAA4D;IAC5D,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAE7B,uFAAuF;IACvF,MAAM,gBAAgB,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;QAC5C,SAAS,EAAE,uBAAuB;QAClC,sBAAsB,EAAE,uBAAuB;QAC/C,wBAAwB,EAAE,oBAAoB;QAC9C,aAAa,EAAE,yBAAyB;KACzC,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,iBAAiB,GAAG,CACxB,GAAqB,EACrB,IAAY,EACZ,OAAe,EACf,aAAqB,GAAG,EACxB,EAAE;QACF,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBACxB,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,qEAAqE;IACrE,qCAAqC;IACrC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,YAAY,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE;YACtC,IAAI,GAAG,GAAG,UAAU,GAAG,gCAAgC,EAAE,CAAC;gBACxD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC1B,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC/B,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,cAAc,YAAY,CAAC,MAAM,yBAAyB,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,EAAE,gCAAgC,CAAC,CAAC;IAErC,2BAA2B;IAC3B,MAAM,mBAAmB,GAAG,KAAK,EAC/B,GAAoB,EACpB,GAAqB,EACrB,IAA0B,EAC1B,EAAE;QACF,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;QAEjE,IAAI,CAAC;YACH,sCAAsC;YACtC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAEvC,+CAA+C;YAC/C,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gEAAgE;YAChE,IAAI,KAAK,YAAY,UAAU,CAAC,eAAe,EAAE,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;YACD,iBAAiB,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;IAEF,wBAAwB;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,kBAAkB,EAAE,kBAAkB;SACvC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACvD,uCAAuC;QACvC,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAC;QAEjD,2CAA2C;QAC3C,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;YAClD,kBAAkB,EAAE,SAAS;YAC7B,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACxC,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,mDAAmD;QACnD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,iBAAiB,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEvC,wDAAwD;YACxD,kFAAkF;YAClF,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAElD,uCAAuC;YACvC,uEAAuE;YACvE,MAAM,cAAc,GAAG,GAAG,EAAE;gBAC1B,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACtB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;gBACvD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACjC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YAChC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACtB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;gBAC7C,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,iBAAiB,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;YACxD,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,GAAG;SACnB,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,KAAK,CACX,iDAAiD,SAAS,MAAM,CACjE,CAAC;IACJ,CAAC,CAAC;SACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,6BAA6B;IAC7B,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QAEtB,OAAO,CAAC,KAAK,CACX,6DAA6D,CAC9D,CAAC;QAEF,wDAAwD;QACxD,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAEjC,oCAAoC;QACpC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAE7B,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE;YACpB,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,mBAAmB;AACnB,KAAK,UAAU,IAAI;IACjB,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;SAAM,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QACtC,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CACX,kCAAkC,cAAc,kCAAkC,CACnF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,235 +1,249 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- vi.mock('./qdrant/client.js');
3
- vi.mock('./embeddings/openai.js');
4
- describe('MCP Server Tool Schemas', () => {
5
- describe('CreateCollectionSchema', () => {
6
- it('should validate correct collection creation input', async () => {
7
- const { z } = await import('zod');
1
+ import { describe, it, expect, vi } from "vitest";
2
+ vi.mock("./qdrant/client.js");
3
+ vi.mock("./embeddings/openai.js");
4
+ vi.mock("./logger.js", () => ({
5
+ default: {
6
+ info: vi.fn(),
7
+ warn: vi.fn(),
8
+ error: vi.fn(),
9
+ debug: vi.fn(),
10
+ fatal: vi.fn(),
11
+ trace: vi.fn(),
12
+ child: vi.fn().mockReturnThis(),
13
+ },
14
+ }));
15
+ describe("MCP Server Tool Schemas", () => {
16
+ describe("CreateCollectionSchema", () => {
17
+ it("should validate correct collection creation input", async () => {
18
+ const { z } = await import("zod");
8
19
  const CreateCollectionSchema = z.object({
9
20
  name: z.string(),
10
- distance: z.enum(['Cosine', 'Euclid', 'Dot']).optional(),
21
+ distance: z.enum(["Cosine", "Euclid", "Dot"]).optional(),
11
22
  });
12
- const validInput = { name: 'test-collection' };
23
+ const validInput = { name: "test-collection" };
13
24
  expect(() => CreateCollectionSchema.parse(validInput)).not.toThrow();
14
- const validInputWithDistance = { name: 'test-collection', distance: 'Cosine' };
25
+ const validInputWithDistance = {
26
+ name: "test-collection",
27
+ distance: "Cosine",
28
+ };
15
29
  expect(() => CreateCollectionSchema.parse(validInputWithDistance)).not.toThrow();
16
30
  });
17
- it('should reject invalid distance metric', async () => {
18
- const { z } = await import('zod');
31
+ it("should reject invalid distance metric", async () => {
32
+ const { z } = await import("zod");
19
33
  const CreateCollectionSchema = z.object({
20
34
  name: z.string(),
21
- distance: z.enum(['Cosine', 'Euclid', 'Dot']).optional(),
35
+ distance: z.enum(["Cosine", "Euclid", "Dot"]).optional(),
22
36
  });
23
- const invalidInput = { name: 'test', distance: 'Invalid' };
37
+ const invalidInput = { name: "test", distance: "Invalid" };
24
38
  expect(() => CreateCollectionSchema.parse(invalidInput)).toThrow();
25
39
  });
26
- it('should require name field', async () => {
27
- const { z } = await import('zod');
40
+ it("should require name field", async () => {
41
+ const { z } = await import("zod");
28
42
  const CreateCollectionSchema = z.object({
29
43
  name: z.string(),
30
- distance: z.enum(['Cosine', 'Euclid', 'Dot']).optional(),
44
+ distance: z.enum(["Cosine", "Euclid", "Dot"]).optional(),
31
45
  });
32
- const invalidInput = { distance: 'Cosine' };
46
+ const invalidInput = { distance: "Cosine" };
33
47
  expect(() => CreateCollectionSchema.parse(invalidInput)).toThrow();
34
48
  });
35
49
  });
36
- describe('AddDocumentsSchema', () => {
37
- it('should validate correct document addition input', async () => {
38
- const { z } = await import('zod');
50
+ describe("AddDocumentsSchema", () => {
51
+ it("should validate correct document addition input", async () => {
52
+ const { z } = await import("zod");
39
53
  const AddDocumentsSchema = z.object({
40
54
  collection: z.string(),
41
55
  documents: z.array(z.object({
42
56
  id: z.union([z.string(), z.number()]),
43
57
  text: z.string(),
44
- metadata: z.record(z.any()).optional(),
58
+ metadata: z.record(z.string(), z.any()).optional(),
45
59
  })),
46
60
  });
47
61
  const validInput = {
48
- collection: 'test-collection',
62
+ collection: "test-collection",
49
63
  documents: [
50
- { id: 1, text: 'test document' },
51
- { id: 'doc-2', text: 'another document', metadata: { type: 'test' } },
64
+ { id: 1, text: "test document" },
65
+ { id: "doc-2", text: "another document", metadata: { type: "test" } },
52
66
  ],
53
67
  };
54
68
  expect(() => AddDocumentsSchema.parse(validInput)).not.toThrow();
55
69
  });
56
- it('should accept both string and number IDs', async () => {
57
- const { z } = await import('zod');
70
+ it("should accept both string and number IDs", async () => {
71
+ const { z } = await import("zod");
58
72
  const AddDocumentsSchema = z.object({
59
73
  collection: z.string(),
60
74
  documents: z.array(z.object({
61
75
  id: z.union([z.string(), z.number()]),
62
76
  text: z.string(),
63
- metadata: z.record(z.any()).optional(),
77
+ metadata: z.record(z.string(), z.any()).optional(),
64
78
  })),
65
79
  });
66
80
  const stringIdInput = {
67
- collection: 'test',
68
- documents: [{ id: 'string-id', text: 'test' }],
81
+ collection: "test",
82
+ documents: [{ id: "string-id", text: "test" }],
69
83
  };
70
84
  expect(() => AddDocumentsSchema.parse(stringIdInput)).not.toThrow();
71
85
  const numberIdInput = {
72
- collection: 'test',
73
- documents: [{ id: 123, text: 'test' }],
86
+ collection: "test",
87
+ documents: [{ id: 123, text: "test" }],
74
88
  };
75
89
  expect(() => AddDocumentsSchema.parse(numberIdInput)).not.toThrow();
76
90
  });
77
- it('should require text field in documents', async () => {
78
- const { z } = await import('zod');
91
+ it("should require text field in documents", async () => {
92
+ const { z } = await import("zod");
79
93
  const AddDocumentsSchema = z.object({
80
94
  collection: z.string(),
81
95
  documents: z.array(z.object({
82
96
  id: z.union([z.string(), z.number()]),
83
97
  text: z.string(),
84
- metadata: z.record(z.any()).optional(),
98
+ metadata: z.record(z.string(), z.any()).optional(),
85
99
  })),
86
100
  });
87
101
  const invalidInput = {
88
- collection: 'test',
102
+ collection: "test",
89
103
  documents: [{ id: 1, metadata: {} }],
90
104
  };
91
105
  expect(() => AddDocumentsSchema.parse(invalidInput)).toThrow();
92
106
  });
93
107
  });
94
- describe('SemanticSearchSchema', () => {
95
- it('should validate correct search input', async () => {
96
- const { z } = await import('zod');
108
+ describe("SemanticSearchSchema", () => {
109
+ it("should validate correct search input", async () => {
110
+ const { z } = await import("zod");
97
111
  const SemanticSearchSchema = z.object({
98
112
  collection: z.string(),
99
113
  query: z.string(),
100
114
  limit: z.number().optional(),
101
- filter: z.record(z.any()).optional(),
115
+ filter: z.record(z.string(), z.any()).optional(),
102
116
  });
103
117
  const validInput = {
104
- collection: 'test-collection',
105
- query: 'search query',
118
+ collection: "test-collection",
119
+ query: "search query",
106
120
  limit: 10,
107
- filter: { category: 'test' },
121
+ filter: { category: "test" },
108
122
  };
109
123
  expect(() => SemanticSearchSchema.parse(validInput)).not.toThrow();
110
124
  });
111
- it('should work with minimal input', async () => {
112
- const { z } = await import('zod');
125
+ it("should work with minimal input", async () => {
126
+ const { z } = await import("zod");
113
127
  const SemanticSearchSchema = z.object({
114
128
  collection: z.string(),
115
129
  query: z.string(),
116
130
  limit: z.number().optional(),
117
- filter: z.record(z.any()).optional(),
131
+ filter: z.record(z.string(), z.any()).optional(),
118
132
  });
119
133
  const minimalInput = {
120
- collection: 'test',
121
- query: 'search',
134
+ collection: "test",
135
+ query: "search",
122
136
  };
123
137
  expect(() => SemanticSearchSchema.parse(minimalInput)).not.toThrow();
124
138
  });
125
- it('should require collection and query', async () => {
126
- const { z } = await import('zod');
139
+ it("should require collection and query", async () => {
140
+ const { z } = await import("zod");
127
141
  const SemanticSearchSchema = z.object({
128
142
  collection: z.string(),
129
143
  query: z.string(),
130
144
  limit: z.number().optional(),
131
- filter: z.record(z.any()).optional(),
145
+ filter: z.record(z.string(), z.any()).optional(),
132
146
  });
133
- const missingQuery = { collection: 'test', limit: 5 };
147
+ const missingQuery = { collection: "test", limit: 5 };
134
148
  expect(() => SemanticSearchSchema.parse(missingQuery)).toThrow();
135
- const missingCollection = { query: 'test', limit: 5 };
149
+ const missingCollection = { query: "test", limit: 5 };
136
150
  expect(() => SemanticSearchSchema.parse(missingCollection)).toThrow();
137
151
  });
138
152
  });
139
- describe('DeleteCollectionSchema', () => {
140
- it('should validate correct delete input', async () => {
141
- const { z } = await import('zod');
153
+ describe("DeleteCollectionSchema", () => {
154
+ it("should validate correct delete input", async () => {
155
+ const { z } = await import("zod");
142
156
  const DeleteCollectionSchema = z.object({
143
157
  name: z.string(),
144
158
  });
145
- const validInput = { name: 'test-collection' };
159
+ const validInput = { name: "test-collection" };
146
160
  expect(() => DeleteCollectionSchema.parse(validInput)).not.toThrow();
147
161
  });
148
- it('should require name field', async () => {
149
- const { z } = await import('zod');
162
+ it("should require name field", async () => {
163
+ const { z } = await import("zod");
150
164
  const DeleteCollectionSchema = z.object({
151
165
  name: z.string(),
152
166
  });
153
167
  expect(() => DeleteCollectionSchema.parse({})).toThrow();
154
168
  });
155
169
  });
156
- describe('GetCollectionInfoSchema', () => {
157
- it('should validate correct input', async () => {
158
- const { z } = await import('zod');
170
+ describe("GetCollectionInfoSchema", () => {
171
+ it("should validate correct input", async () => {
172
+ const { z } = await import("zod");
159
173
  const GetCollectionInfoSchema = z.object({
160
174
  name: z.string(),
161
175
  });
162
- const validInput = { name: 'test-collection' };
176
+ const validInput = { name: "test-collection" };
163
177
  expect(() => GetCollectionInfoSchema.parse(validInput)).not.toThrow();
164
178
  });
165
179
  });
166
- describe('DeleteDocumentsSchema', () => {
167
- it('should validate correct delete documents input', async () => {
168
- const { z } = await import('zod');
180
+ describe("DeleteDocumentsSchema", () => {
181
+ it("should validate correct delete documents input", async () => {
182
+ const { z } = await import("zod");
169
183
  const DeleteDocumentsSchema = z.object({
170
184
  collection: z.string(),
171
185
  ids: z.array(z.union([z.string(), z.number()])),
172
186
  });
173
187
  const validInput = {
174
- collection: 'test-collection',
175
- ids: [1, 'doc-2', 3],
188
+ collection: "test-collection",
189
+ ids: [1, "doc-2", 3],
176
190
  };
177
191
  expect(() => DeleteDocumentsSchema.parse(validInput)).not.toThrow();
178
192
  });
179
- it('should accept string and number IDs', async () => {
180
- const { z } = await import('zod');
193
+ it("should accept string and number IDs", async () => {
194
+ const { z } = await import("zod");
181
195
  const DeleteDocumentsSchema = z.object({
182
196
  collection: z.string(),
183
197
  ids: z.array(z.union([z.string(), z.number()])),
184
198
  });
185
- const stringIds = { collection: 'test', ids: ['a', 'b', 'c'] };
199
+ const stringIds = { collection: "test", ids: ["a", "b", "c"] };
186
200
  expect(() => DeleteDocumentsSchema.parse(stringIds)).not.toThrow();
187
- const numberIds = { collection: 'test', ids: [1, 2, 3] };
201
+ const numberIds = { collection: "test", ids: [1, 2, 3] };
188
202
  expect(() => DeleteDocumentsSchema.parse(numberIds)).not.toThrow();
189
- const mixedIds = { collection: 'test', ids: [1, 'b', 3] };
203
+ const mixedIds = { collection: "test", ids: [1, "b", 3] };
190
204
  expect(() => DeleteDocumentsSchema.parse(mixedIds)).not.toThrow();
191
205
  });
192
- it('should require both collection and ids', async () => {
193
- const { z } = await import('zod');
206
+ it("should require both collection and ids", async () => {
207
+ const { z } = await import("zod");
194
208
  const DeleteDocumentsSchema = z.object({
195
209
  collection: z.string(),
196
210
  ids: z.array(z.union([z.string(), z.number()])),
197
211
  });
198
- const missingIds = { collection: 'test' };
212
+ const missingIds = { collection: "test" };
199
213
  expect(() => DeleteDocumentsSchema.parse(missingIds)).toThrow();
200
214
  const missingCollection = { ids: [1, 2, 3] };
201
215
  expect(() => DeleteDocumentsSchema.parse(missingCollection)).toThrow();
202
216
  });
203
217
  });
204
218
  });
205
- describe('MCP Server Resource URIs', () => {
206
- it('should match collections URI pattern', () => {
207
- const collectionsUri = 'qdrant://collections';
219
+ describe("MCP Server Resource URIs", () => {
220
+ it("should match collections URI pattern", () => {
221
+ const collectionsUri = "qdrant://collections";
208
222
  expect(collectionsUri).toMatch(/^qdrant:\/\/collections$/);
209
223
  });
210
- it('should match collection detail URI pattern', () => {
211
- const collectionUri = 'qdrant://collection/my-collection';
224
+ it("should match collection detail URI pattern", () => {
225
+ const collectionUri = "qdrant://collection/my-collection";
212
226
  const match = collectionUri.match(/^qdrant:\/\/collection\/(.+)$/);
213
227
  expect(match).not.toBeNull();
214
- expect(match[1]).toBe('my-collection');
228
+ expect(match[1]).toBe("my-collection");
215
229
  });
216
- it('should extract collection name from URI', () => {
230
+ it("should extract collection name from URI", () => {
217
231
  const testCases = [
218
- { uri: 'qdrant://collection/test', expected: 'test' },
219
- { uri: 'qdrant://collection/my-docs', expected: 'my-docs' },
220
- { uri: 'qdrant://collection/collection-123', expected: 'collection-123' },
232
+ { uri: "qdrant://collection/test", expected: "test" },
233
+ { uri: "qdrant://collection/my-docs", expected: "my-docs" },
234
+ { uri: "qdrant://collection/collection-123", expected: "collection-123" },
221
235
  ];
222
236
  testCases.forEach(({ uri, expected }) => {
223
237
  const match = uri.match(/^qdrant:\/\/collection\/(.+)$/);
224
238
  expect(match[1]).toBe(expected);
225
239
  });
226
240
  });
227
- it('should not match invalid URIs', () => {
241
+ it("should not match invalid URIs", () => {
228
242
  const invalidUris = [
229
- 'qdrant://invalid',
230
- 'http://collections',
231
- 'qdrant://collection/',
232
- 'qdrant:collections',
243
+ "qdrant://invalid",
244
+ "http://collections",
245
+ "qdrant://collection/",
246
+ "qdrant:collections",
233
247
  ];
234
248
  invalidUris.forEach((uri) => {
235
249
  const collectionsMatch = uri.match(/^qdrant:\/\/collections$/);