better-gemini-mcp 1.0.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.
Potentially problematic release.
This version of better-gemini-mcp might be problematic. Click here for more details.
- package/CHANGELOG.md +57 -0
- package/LICENSE.md +13 -0
- package/README.md +291 -0
- package/dist/constants.d.ts +148 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +295 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +280 -0
- package/dist/index.js.map +1 -0
- package/dist/setup/index.d.ts +7 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +6 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/wizard.d.ts +39 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +222 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/tools/analyze-directory.tool.d.ts +8 -0
- package/dist/tools/analyze-directory.tool.d.ts.map +1 -0
- package/dist/tools/analyze-directory.tool.js +195 -0
- package/dist/tools/analyze-directory.tool.js.map +1 -0
- package/dist/tools/deep-research.tool.d.ts +8 -0
- package/dist/tools/deep-research.tool.d.ts.map +1 -0
- package/dist/tools/deep-research.tool.js +153 -0
- package/dist/tools/deep-research.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +8 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +123 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/health-check.tool.d.ts +8 -0
- package/dist/tools/health-check.tool.d.ts.map +1 -0
- package/dist/tools/health-check.tool.js +113 -0
- package/dist/tools/health-check.tool.js.map +1 -0
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +35 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/quick-query.tool.d.ts +8 -0
- package/dist/tools/quick-query.tool.d.ts.map +1 -0
- package/dist/tools/quick-query.tool.js +154 -0
- package/dist/tools/quick-query.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +52 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +95 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/validate-paths.tool.d.ts +8 -0
- package/dist/tools/validate-paths.tool.d.ts.map +1 -0
- package/dist/tools/validate-paths.tool.js +64 -0
- package/dist/tools/validate-paths.tool.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +28 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +105 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +71 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +281 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/ignorePatterns.d.ts +69 -0
- package/dist/utils/ignorePatterns.d.ts.map +1 -0
- package/dist/utils/ignorePatterns.js +178 -0
- package/dist/utils/ignorePatterns.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +160 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pathValidator.d.ts +55 -0
- package/dist/utils/pathValidator.d.ts.map +1 -0
- package/dist/utils/pathValidator.js +137 -0
- package/dist/utils/pathValidator.js.map +1 -0
- package/dist/utils/responseCache.d.ts +80 -0
- package/dist/utils/responseCache.d.ts.map +1 -0
- package/dist/utils/responseCache.js +179 -0
- package/dist/utils/responseCache.js.map +1 -0
- package/dist/utils/responseChunker.d.ts +36 -0
- package/dist/utils/responseChunker.d.ts.map +1 -0
- package/dist/utils/responseChunker.js +96 -0
- package/dist/utils/responseChunker.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch Chunk Tool
|
|
3
|
+
* Retrieve a specific chunk of a large response that was previously split
|
|
4
|
+
* (PRD §5.7)
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { ERROR_CODES, ERROR_MESSAGES } from "../constants.js";
|
|
8
|
+
import { getResponse, getChunk, getCacheMetadata, Logger } from "../utils/index.js";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Schema
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const fetchChunkSchema = z.object({
|
|
13
|
+
cacheKey: z.string().describe("Cache key returned in initial chunked response"),
|
|
14
|
+
chunkIndex: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.positive()
|
|
18
|
+
.describe("1-based index of chunk to retrieve"),
|
|
19
|
+
});
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Tool Implementation
|
|
22
|
+
// ============================================================================
|
|
23
|
+
export const fetchChunkTool = {
|
|
24
|
+
name: "fetch_chunk",
|
|
25
|
+
description: "Retrieve continuation of a large response. Use when a previous tool response included 'chunks' metadata indicating more content available. Example: {cacheKey: 'cache_abc123', chunkIndex: 2}",
|
|
26
|
+
zodSchema: fetchChunkSchema,
|
|
27
|
+
category: "utility",
|
|
28
|
+
execute: async (args, _onProgress) => {
|
|
29
|
+
const { cacheKey, chunkIndex } = args;
|
|
30
|
+
Logger.info(`fetch_chunk: Fetching chunk ${chunkIndex} for cacheKey=${cacheKey}`);
|
|
31
|
+
// Validate cacheKey
|
|
32
|
+
if (!cacheKey || typeof cacheKey !== "string") {
|
|
33
|
+
return JSON.stringify({
|
|
34
|
+
error: {
|
|
35
|
+
code: ERROR_CODES.INVALID_ARGUMENT,
|
|
36
|
+
message: "cacheKey must be a non-empty string",
|
|
37
|
+
details: { field: "cacheKey" },
|
|
38
|
+
},
|
|
39
|
+
}, null, 2);
|
|
40
|
+
}
|
|
41
|
+
// Validate chunkIndex
|
|
42
|
+
if (!Number.isInteger(chunkIndex) || chunkIndex < 1) {
|
|
43
|
+
return JSON.stringify({
|
|
44
|
+
error: {
|
|
45
|
+
code: ERROR_CODES.INVALID_ARGUMENT,
|
|
46
|
+
message: "chunkIndex must be a positive integer (1-based)",
|
|
47
|
+
details: { field: "chunkIndex", provided: chunkIndex },
|
|
48
|
+
},
|
|
49
|
+
}, null, 2);
|
|
50
|
+
}
|
|
51
|
+
// Check if cache entry exists
|
|
52
|
+
const cacheEntry = getResponse(cacheKey);
|
|
53
|
+
if (!cacheEntry) {
|
|
54
|
+
Logger.warn(`fetch_chunk: Cache key not found or expired: ${cacheKey}`);
|
|
55
|
+
return JSON.stringify({
|
|
56
|
+
error: {
|
|
57
|
+
code: ERROR_CODES.CACHE_EXPIRED,
|
|
58
|
+
message: ERROR_MESSAGES.CACHE_EXPIRED,
|
|
59
|
+
details: {
|
|
60
|
+
cacheKey,
|
|
61
|
+
nextStep: "Cache expired (1-hour TTL). Re-run the original query to regenerate the response.",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
}, null, 2);
|
|
65
|
+
}
|
|
66
|
+
// Get cache metadata for total chunks
|
|
67
|
+
const metadata = getCacheMetadata(cacheKey);
|
|
68
|
+
if (!metadata) {
|
|
69
|
+
return JSON.stringify({
|
|
70
|
+
error: {
|
|
71
|
+
code: ERROR_CODES.CACHE_EXPIRED,
|
|
72
|
+
message: ERROR_MESSAGES.CACHE_EXPIRED,
|
|
73
|
+
details: {
|
|
74
|
+
cacheKey,
|
|
75
|
+
nextStep: "Cache expired (1-hour TTL). Re-run the original query to regenerate the response.",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
}, null, 2);
|
|
79
|
+
}
|
|
80
|
+
// Validate chunk index is within range
|
|
81
|
+
if (chunkIndex > metadata.totalChunks) {
|
|
82
|
+
Logger.warn(`fetch_chunk: Chunk index ${chunkIndex} out of range (total: ${metadata.totalChunks})`);
|
|
83
|
+
return JSON.stringify({
|
|
84
|
+
error: {
|
|
85
|
+
code: ERROR_CODES.INVALID_CHUNK_INDEX,
|
|
86
|
+
message: ERROR_MESSAGES.INVALID_CHUNK_INDEX,
|
|
87
|
+
details: {
|
|
88
|
+
requestedIndex: chunkIndex,
|
|
89
|
+
totalChunks: metadata.totalChunks,
|
|
90
|
+
nextStep: `Request a chunk index between 1 and ${metadata.totalChunks}`,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
}, null, 2);
|
|
94
|
+
}
|
|
95
|
+
// Get the specific chunk
|
|
96
|
+
const chunk = getChunk(cacheKey, chunkIndex);
|
|
97
|
+
if (!chunk) {
|
|
98
|
+
return JSON.stringify({
|
|
99
|
+
error: {
|
|
100
|
+
code: ERROR_CODES.INTERNAL,
|
|
101
|
+
message: "Failed to retrieve chunk from cache",
|
|
102
|
+
details: { cacheKey, chunkIndex },
|
|
103
|
+
},
|
|
104
|
+
}, null, 2);
|
|
105
|
+
}
|
|
106
|
+
// Build response
|
|
107
|
+
const response = {
|
|
108
|
+
tool: "fetch_chunk",
|
|
109
|
+
cacheKey,
|
|
110
|
+
chunk: {
|
|
111
|
+
index: chunkIndex,
|
|
112
|
+
total: metadata.totalChunks,
|
|
113
|
+
content: chunk.content,
|
|
114
|
+
},
|
|
115
|
+
meta: {
|
|
116
|
+
expiresAt: metadata.expiresAt.toISOString(),
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
Logger.info(`fetch_chunk: Successfully retrieved chunk ${chunkIndex}/${metadata.totalChunks}`);
|
|
120
|
+
return JSON.stringify(response, null, 2);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=fetch-chunk.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-chunk.tool.js","sourceRoot":"","sources":["../../src/tools/fetch-chunk.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEpF,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IAC/E,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;CAClD,CAAC,CAAC;AAEH,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,+LAA+L;IACjM,SAAS,EAAE,gBAAgB;IAC3B,QAAQ,EAAE,SAAS;IAEnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE;QACnC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAsB,CAAC;QAExD,MAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QAElF,oBAAoB;QACpB,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,gBAAgB;oBAClC,OAAO,EAAE,qCAAqC;oBAC9C,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;iBAC/B;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,gBAAgB;oBAClC,OAAO,EAAE,iDAAiD;oBAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE;iBACvD;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,gDAAgD,QAAQ,EAAE,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,aAAa;oBAC/B,OAAO,EAAE,cAAc,CAAC,aAAa;oBACrC,OAAO,EAAE;wBACP,QAAQ;wBACR,QAAQ,EAAE,mFAAmF;qBAC9F;iBACF;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,aAAa;oBAC/B,OAAO,EAAE,cAAc,CAAC,aAAa;oBACrC,OAAO,EAAE;wBACP,QAAQ;wBACR,QAAQ,EAAE,mFAAmF;qBAC9F;iBACF;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,IAAI,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,4BAA4B,UAAU,yBAAyB,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC;YACpG,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,mBAAmB;oBACrC,OAAO,EAAE,cAAc,CAAC,mBAAmB;oBAC3C,OAAO,EAAE;wBACP,cAAc,EAAE,UAAU;wBAC1B,WAAW,EAAE,QAAQ,CAAC,WAAW;wBACjC,QAAQ,EAAE,uCAAuC,QAAQ,CAAC,WAAW,EAAE;qBACxE;iBACF;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,QAAQ;oBAC1B,OAAO,EAAE,qCAAqC;oBAC9C,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE;iBAClC;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,aAAa;YACnB,QAAQ;YACR,KAAK,EAAE;gBACL,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,QAAQ,CAAC,WAAW;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;YACD,IAAI,EAAE;gBACJ,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE;aAC5C;SACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,6CAA6C,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Check Tool
|
|
3
|
+
* Confirm the MCP server is running and validate Gemini CLI setup
|
|
4
|
+
* (PRD §5.6)
|
|
5
|
+
*/
|
|
6
|
+
import type { UnifiedTool } from "./registry.js";
|
|
7
|
+
export declare const healthCheckTool: UnifiedTool;
|
|
8
|
+
//# sourceMappingURL=health-check.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check.tool.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA2BjD,eAAO,MAAM,eAAe,EAAE,WA8G7B,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Check Tool
|
|
3
|
+
* Confirm the MCP server is running and validate Gemini CLI setup
|
|
4
|
+
* (PRD §5.6)
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { SERVER_INFO, ERROR_CODES } from "../constants.js";
|
|
8
|
+
import { isGeminiCLIInstalled, getGeminiVersion, checkGeminiAuth, getProjectRoot, Logger, } from "../utils/index.js";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Schema
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const healthCheckSchema = z.object({
|
|
13
|
+
includeDiagnostics: z
|
|
14
|
+
.boolean()
|
|
15
|
+
.optional()
|
|
16
|
+
.default(false)
|
|
17
|
+
.describe("Include detailed diagnostics (Gemini CLI version, auth status, etc.)"),
|
|
18
|
+
});
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Tool Implementation
|
|
21
|
+
// ============================================================================
|
|
22
|
+
export const healthCheckTool = {
|
|
23
|
+
name: "health_check",
|
|
24
|
+
description: "Verify server status and Gemini CLI configuration. Use for troubleshooting connection issues or confirming setup. Example: {includeDiagnostics: true}",
|
|
25
|
+
zodSchema: healthCheckSchema,
|
|
26
|
+
category: "utility",
|
|
27
|
+
execute: async (args, _onProgress) => {
|
|
28
|
+
const { includeDiagnostics } = args;
|
|
29
|
+
const projectRoot = getProjectRoot();
|
|
30
|
+
Logger.info(`health_check: Starting with includeDiagnostics=${includeDiagnostics}`);
|
|
31
|
+
// Basic health check - just verify the server is running
|
|
32
|
+
const baseResponse = {
|
|
33
|
+
tool: "health_check",
|
|
34
|
+
status: "ok",
|
|
35
|
+
server: {
|
|
36
|
+
name: SERVER_INFO.NAME,
|
|
37
|
+
version: SERVER_INFO.VERSION,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
// If diagnostics not requested, return basic response
|
|
41
|
+
if (!includeDiagnostics) {
|
|
42
|
+
Logger.info("health_check: Basic check completed successfully");
|
|
43
|
+
return JSON.stringify(baseResponse, null, 2);
|
|
44
|
+
}
|
|
45
|
+
// Run diagnostics
|
|
46
|
+
Logger.debug("health_check: Running diagnostics...");
|
|
47
|
+
try {
|
|
48
|
+
// Check Gemini CLI installation
|
|
49
|
+
const geminiOnPath = await isGeminiCLIInstalled();
|
|
50
|
+
// Get version if installed
|
|
51
|
+
let geminiVersion = null;
|
|
52
|
+
if (geminiOnPath) {
|
|
53
|
+
geminiVersion = await getGeminiVersion();
|
|
54
|
+
}
|
|
55
|
+
// Check authentication
|
|
56
|
+
let authConfigured = false;
|
|
57
|
+
let authMethod;
|
|
58
|
+
if (geminiOnPath) {
|
|
59
|
+
const auth = await checkGeminiAuth();
|
|
60
|
+
authConfigured = auth.configured;
|
|
61
|
+
authMethod = auth.method;
|
|
62
|
+
}
|
|
63
|
+
// Build diagnostics response
|
|
64
|
+
const diagnostics = {
|
|
65
|
+
projectRoot,
|
|
66
|
+
geminiOnPath,
|
|
67
|
+
geminiVersion,
|
|
68
|
+
authConfigured,
|
|
69
|
+
readOnlyModeEnforced: true, // We never use --yolo flag
|
|
70
|
+
};
|
|
71
|
+
// Add auth method if available
|
|
72
|
+
if (authMethod) {
|
|
73
|
+
diagnostics.authMethod = authMethod;
|
|
74
|
+
}
|
|
75
|
+
// Add warnings if there are issues
|
|
76
|
+
const warnings = [];
|
|
77
|
+
if (!geminiOnPath) {
|
|
78
|
+
warnings.push("Gemini CLI not found on PATH. Install with: npm install -g @google/gemini-cli");
|
|
79
|
+
}
|
|
80
|
+
if (geminiOnPath && !authConfigured) {
|
|
81
|
+
warnings.push("Gemini CLI authentication not configured. Run 'gemini' and select 'Login with Google'.");
|
|
82
|
+
}
|
|
83
|
+
if (warnings.length > 0) {
|
|
84
|
+
diagnostics.warnings = warnings;
|
|
85
|
+
}
|
|
86
|
+
// Determine overall status
|
|
87
|
+
const status = geminiOnPath && authConfigured ? "ok" : "degraded";
|
|
88
|
+
const response = {
|
|
89
|
+
tool: "health_check",
|
|
90
|
+
status,
|
|
91
|
+
server: {
|
|
92
|
+
name: SERVER_INFO.NAME,
|
|
93
|
+
version: SERVER_INFO.VERSION,
|
|
94
|
+
},
|
|
95
|
+
diagnostics,
|
|
96
|
+
};
|
|
97
|
+
Logger.info(`health_check: Diagnostics completed - status=${status}`);
|
|
98
|
+
return JSON.stringify(response, null, 2);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
102
|
+
Logger.error(`health_check: Diagnostics failed - ${errorMessage}`);
|
|
103
|
+
return JSON.stringify({
|
|
104
|
+
error: {
|
|
105
|
+
code: ERROR_CODES.INTERNAL,
|
|
106
|
+
message: `Health check failed: ${errorMessage}`,
|
|
107
|
+
details: { phase: "diagnostics" },
|
|
108
|
+
},
|
|
109
|
+
}, null, 2);
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=health-check.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check.tool.js","sourceRoot":"","sources":["../../src/tools/health-check.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry Exports for Better Gemini MCP Server
|
|
3
|
+
*
|
|
4
|
+
* This file registers all tools and exports registry functions.
|
|
5
|
+
* Tools are imported and added to the toolRegistry array here.
|
|
6
|
+
*/
|
|
7
|
+
import { toolRegistry } from "./registry.js";
|
|
8
|
+
export * from "./registry.js";
|
|
9
|
+
export { toolRegistry };
|
|
10
|
+
export { quickQueryTool } from "./quick-query.tool.js";
|
|
11
|
+
export { deepResearchTool } from "./deep-research.tool.js";
|
|
12
|
+
export { analyzeDirectoryTool } from "./analyze-directory.tool.js";
|
|
13
|
+
export { validatePathsTool } from "./validate-paths.tool.js";
|
|
14
|
+
export { healthCheckTool } from "./health-check.tool.js";
|
|
15
|
+
export { fetchChunkTool } from "./fetch-chunk.tool.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA+B7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry Exports for Better Gemini MCP Server
|
|
3
|
+
*
|
|
4
|
+
* This file registers all tools and exports registry functions.
|
|
5
|
+
* Tools are imported and added to the toolRegistry array here.
|
|
6
|
+
*/
|
|
7
|
+
import { toolRegistry } from "./registry.js";
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Tool Imports
|
|
10
|
+
// ============================================================================
|
|
11
|
+
import { quickQueryTool } from "./quick-query.tool.js";
|
|
12
|
+
import { deepResearchTool } from "./deep-research.tool.js";
|
|
13
|
+
import { analyzeDirectoryTool } from "./analyze-directory.tool.js";
|
|
14
|
+
import { validatePathsTool } from "./validate-paths.tool.js";
|
|
15
|
+
import { healthCheckTool } from "./health-check.tool.js";
|
|
16
|
+
import { fetchChunkTool } from "./fetch-chunk.tool.js";
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Tool Registration
|
|
19
|
+
// ============================================================================
|
|
20
|
+
toolRegistry.push(quickQueryTool, deepResearchTool, analyzeDirectoryTool, validatePathsTool, healthCheckTool, fetchChunkTool);
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Exports
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Re-export everything from registry
|
|
25
|
+
export * from "./registry.js";
|
|
26
|
+
// Export the registry for direct access if needed
|
|
27
|
+
export { toolRegistry };
|
|
28
|
+
// Export individual tools for direct access
|
|
29
|
+
export { quickQueryTool } from "./quick-query.tool.js";
|
|
30
|
+
export { deepResearchTool } from "./deep-research.tool.js";
|
|
31
|
+
export { analyzeDirectoryTool } from "./analyze-directory.tool.js";
|
|
32
|
+
export { validatePathsTool } from "./validate-paths.tool.js";
|
|
33
|
+
export { healthCheckTool } from "./health-check.tool.js";
|
|
34
|
+
export { fetchChunkTool } from "./fetch-chunk.tool.js";
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,YAAY,CAAC,IAAI,CACf,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,cAAc,CACf,CAAC;AAEF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,qCAAqC;AACrC,cAAc,eAAe,CAAC;AAE9B,kDAAkD;AAClD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,4CAA4C;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick Query Tool
|
|
3
|
+
* Send a lightweight research prompt to Gemini CLI for fast analysis
|
|
4
|
+
* Uses flash model for speed (PRD §5.2)
|
|
5
|
+
*/
|
|
6
|
+
import type { UnifiedTool } from "./registry.js";
|
|
7
|
+
export declare const quickQueryTool: UnifiedTool;
|
|
8
|
+
//# sourceMappingURL=quick-query.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-query.tool.d.ts","sourceRoot":"","sources":["../../src/tools/quick-query.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAwDjD,eAAO,MAAM,cAAc,EAAE,WAuI5B,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick Query Tool
|
|
3
|
+
* Send a lightweight research prompt to Gemini CLI for fast analysis
|
|
4
|
+
* Uses flash model for speed (PRD §5.2)
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { ERROR_CODES, ERROR_MESSAGES } from "../constants.js";
|
|
8
|
+
import { executeGeminiCLI, getProjectRoot, checkPromptPathsValid, chunkResponse, needsChunking, cacheResponse, Logger, } from "../utils/index.js";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Schema
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const quickQuerySchema = z.object({
|
|
13
|
+
prompt: z.string().describe("Research question or analysis request"),
|
|
14
|
+
focus: z
|
|
15
|
+
.enum(["security", "architecture", "performance", "general"])
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Optional focus area to guide analysis"),
|
|
18
|
+
responseStyle: z
|
|
19
|
+
.enum(["concise", "normal", "detailed"])
|
|
20
|
+
.optional()
|
|
21
|
+
.default("normal")
|
|
22
|
+
.describe("Desired verbosity of response"),
|
|
23
|
+
});
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Focus Area Instructions
|
|
26
|
+
// ============================================================================
|
|
27
|
+
const FOCUS_INSTRUCTIONS = {
|
|
28
|
+
security: "Focus on security implications, vulnerabilities, attack vectors, and security best practices.",
|
|
29
|
+
architecture: "Focus on architectural patterns, design decisions, component relationships, and structural concerns.",
|
|
30
|
+
performance: "Focus on performance characteristics, bottlenecks, optimization opportunities, and efficiency.",
|
|
31
|
+
general: "", // No additional focus instructions
|
|
32
|
+
};
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Response Style Instructions
|
|
35
|
+
// ============================================================================
|
|
36
|
+
const STYLE_INSTRUCTIONS = {
|
|
37
|
+
concise: "Provide a brief, focused response with only essential information.",
|
|
38
|
+
normal: "Provide a balanced response with key details and explanations.",
|
|
39
|
+
detailed: "Provide a comprehensive response with thorough analysis and examples.",
|
|
40
|
+
};
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Tool Implementation
|
|
43
|
+
// ============================================================================
|
|
44
|
+
export const quickQueryTool = {
|
|
45
|
+
name: "quick_query",
|
|
46
|
+
description: "Analyze code/files quickly using Gemini's large context window. Preferred when questions mention specific files or require reading repository code. Example: {prompt: 'Explain @src/auth.ts security approach', focus: 'security', responseStyle: 'concise'}",
|
|
47
|
+
zodSchema: quickQuerySchema,
|
|
48
|
+
category: "query",
|
|
49
|
+
execute: async (args, onProgress) => {
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
const { prompt, focus, responseStyle } = args;
|
|
52
|
+
const projectRoot = getProjectRoot();
|
|
53
|
+
Logger.info(`quick_query: Starting with focus=${focus || "none"}, style=${responseStyle || "normal"}`);
|
|
54
|
+
// Validate prompt
|
|
55
|
+
if (!prompt || prompt.trim().length === 0) {
|
|
56
|
+
return JSON.stringify({
|
|
57
|
+
error: {
|
|
58
|
+
code: ERROR_CODES.INVALID_ARGUMENT,
|
|
59
|
+
message: ERROR_MESSAGES.NO_PROMPT_PROVIDED,
|
|
60
|
+
details: { field: "prompt" },
|
|
61
|
+
},
|
|
62
|
+
}, null, 2);
|
|
63
|
+
}
|
|
64
|
+
// Pre-validate @path references (optional but recommended)
|
|
65
|
+
const pathValidation = checkPromptPathsValid(prompt, projectRoot);
|
|
66
|
+
if (!pathValidation.isValid) {
|
|
67
|
+
return JSON.stringify({
|
|
68
|
+
error: {
|
|
69
|
+
code: ERROR_CODES.PATH_NOT_ALLOWED,
|
|
70
|
+
message: "Invalid @path references in prompt",
|
|
71
|
+
details: {
|
|
72
|
+
invalidPaths: pathValidation.invalidPaths,
|
|
73
|
+
nextStep: "Use validate_paths tool to check which paths are accessible, or adjust paths to be within project root",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
}, null, 2);
|
|
77
|
+
}
|
|
78
|
+
// Build the full prompt with focus and style instructions
|
|
79
|
+
let fullPrompt = prompt;
|
|
80
|
+
if (focus && focus !== "general") {
|
|
81
|
+
fullPrompt = `${FOCUS_INSTRUCTIONS[focus]}\n\n${fullPrompt}`;
|
|
82
|
+
}
|
|
83
|
+
if (responseStyle && responseStyle !== "normal") {
|
|
84
|
+
fullPrompt = `${STYLE_INSTRUCTIONS[responseStyle]}\n\n${fullPrompt}`;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
// Execute Gemini CLI
|
|
88
|
+
const result = await executeGeminiCLI(fullPrompt, "quick_query", onProgress);
|
|
89
|
+
// Handle chunking if needed
|
|
90
|
+
let answer = result.answer;
|
|
91
|
+
let chunks;
|
|
92
|
+
if (needsChunking(result.answer)) {
|
|
93
|
+
const chunked = chunkResponse(result.answer);
|
|
94
|
+
const cacheKey = cacheResponse(chunked);
|
|
95
|
+
chunks = { cacheKey, current: 1, total: chunked.length };
|
|
96
|
+
answer = chunked[0].content;
|
|
97
|
+
Logger.debug(`quick_query: Response chunked into ${chunked.length} chunks, cacheKey=${cacheKey}`);
|
|
98
|
+
}
|
|
99
|
+
const latencyMs = Date.now() - startTime;
|
|
100
|
+
// Build response
|
|
101
|
+
const response = {
|
|
102
|
+
tool: "quick_query",
|
|
103
|
+
model: result.model,
|
|
104
|
+
focus: focus || "general",
|
|
105
|
+
responseStyle: responseStyle || "normal",
|
|
106
|
+
answer,
|
|
107
|
+
filesAccessed: result.filesAccessed,
|
|
108
|
+
stats: {
|
|
109
|
+
tokensUsed: result.stats.tokensUsed,
|
|
110
|
+
toolCalls: result.stats.toolCalls,
|
|
111
|
+
latencyMs,
|
|
112
|
+
},
|
|
113
|
+
...(chunks && { chunks }),
|
|
114
|
+
meta: {
|
|
115
|
+
projectRoot,
|
|
116
|
+
truncated: false,
|
|
117
|
+
warnings: chunks ? ["Response chunked due to size. Use fetch_chunk tool to retrieve remaining content."] : [],
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
Logger.info(`quick_query: Completed in ${latencyMs}ms`);
|
|
121
|
+
return JSON.stringify(response, null, 2);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
125
|
+
Logger.error(`quick_query: Failed - ${errorMessage}`);
|
|
126
|
+
// Determine error code and provide recovery hints
|
|
127
|
+
let code = ERROR_CODES.GEMINI_CLI_ERROR;
|
|
128
|
+
let nextStep = "Check server logs for details";
|
|
129
|
+
if (errorMessage.includes("not found") || errorMessage.includes("ENOENT")) {
|
|
130
|
+
code = ERROR_CODES.GEMINI_CLI_NOT_FOUND;
|
|
131
|
+
nextStep = "Install Gemini CLI: npm install -g @google/gemini-cli, or run setup wizard: npx better-gemini-mcp init";
|
|
132
|
+
}
|
|
133
|
+
else if (errorMessage.includes("auth") || errorMessage.includes("login")) {
|
|
134
|
+
code = ERROR_CODES.AUTH_MISSING;
|
|
135
|
+
nextStep = "Authenticate Gemini CLI: run 'gemini' and select 'Login with Google', or set GEMINI_API_KEY environment variable";
|
|
136
|
+
}
|
|
137
|
+
else if (errorMessage.includes("quota")) {
|
|
138
|
+
code = ERROR_CODES.QUOTA_EXCEEDED;
|
|
139
|
+
nextStep = "Quota exhausted after fallback. Wait for quota reset or upgrade plan. Consider using quick_query for lighter tasks.";
|
|
140
|
+
}
|
|
141
|
+
return JSON.stringify({
|
|
142
|
+
error: {
|
|
143
|
+
code,
|
|
144
|
+
message: errorMessage,
|
|
145
|
+
details: {
|
|
146
|
+
tool: "quick_query",
|
|
147
|
+
nextStep,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
}, null, 2);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=quick-query.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-query.tool.js","sourceRoot":"","sources":["../../src/tools/quick-query.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry for Better Gemini MCP Server
|
|
3
|
+
* Defines the UnifiedTool interface and provides tool execution functionality
|
|
4
|
+
*/
|
|
5
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
+
import type { ZodTypeAny } from "zod";
|
|
7
|
+
import type { ToolArguments, ProgressCallback } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Unified tool definition interface
|
|
10
|
+
* Each tool in the registry follows this structure
|
|
11
|
+
*/
|
|
12
|
+
export interface UnifiedTool {
|
|
13
|
+
/** Tool name (snake_case, e.g., 'quick_query') */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Human-readable description for MCP tools/list */
|
|
16
|
+
description: string;
|
|
17
|
+
/** Zod schema for input validation */
|
|
18
|
+
zodSchema: ZodTypeAny;
|
|
19
|
+
/** Execute the tool with validated arguments */
|
|
20
|
+
execute: (args: ToolArguments, onProgress?: ProgressCallback) => Promise<string>;
|
|
21
|
+
/** Optional category for grouping */
|
|
22
|
+
category?: "query" | "utility";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Registry of all available tools
|
|
26
|
+
* Tools are added to this array in src/tools/index.ts
|
|
27
|
+
*/
|
|
28
|
+
export declare const toolRegistry: UnifiedTool[];
|
|
29
|
+
/**
|
|
30
|
+
* Check if a tool exists in the registry
|
|
31
|
+
*/
|
|
32
|
+
export declare function toolExists(toolName: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Get MCP Tool definitions from the registry
|
|
35
|
+
* Converts Zod schemas to JSON Schema format for MCP protocol
|
|
36
|
+
*/
|
|
37
|
+
export declare function getToolDefinitions(): Tool[];
|
|
38
|
+
/**
|
|
39
|
+
* Execute a tool by name with the given arguments
|
|
40
|
+
* Validates arguments against the tool's Zod schema before execution
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeTool(toolName: string, args: ToolArguments, onProgress?: ProgressCallback): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Get a tool by name from the registry
|
|
45
|
+
*/
|
|
46
|
+
export declare function getTool(toolName: string): UnifiedTool | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Register a new tool in the registry
|
|
49
|
+
* This is an alternative to directly pushing to toolRegistry
|
|
50
|
+
*/
|
|
51
|
+
export declare function registerTool(tool: UnifiedTool): void;
|
|
52
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,KAAK,CAAC;AAEhD,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAMnE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IAEb,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,SAAS,EAAE,UAAU,CAAC;IAEtB,gDAAgD;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjF,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAMD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAM9C;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAsB3C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAcD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEjE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKpD"}
|