@joeytheman/gemini-mcp-tool 1.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 (123) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +239 -0
  3. package/dist/__tests__/ask-gemini.test.d.ts +2 -0
  4. package/dist/__tests__/ask-gemini.test.d.ts.map +1 -0
  5. package/dist/__tests__/ask-gemini.test.js +165 -0
  6. package/dist/__tests__/ask-gemini.test.js.map +1 -0
  7. package/dist/__tests__/server.test.d.ts +2 -0
  8. package/dist/__tests__/server.test.d.ts.map +1 -0
  9. package/dist/__tests__/server.test.js +72 -0
  10. package/dist/__tests__/server.test.js.map +1 -0
  11. package/dist/__tests__/tools.test.d.ts +2 -0
  12. package/dist/__tests__/tools.test.d.ts.map +1 -0
  13. package/dist/__tests__/tools.test.js +131 -0
  14. package/dist/__tests__/tools.test.js.map +1 -0
  15. package/dist/__tests__/utils/changeModeChunker.test.d.ts +2 -0
  16. package/dist/__tests__/utils/changeModeChunker.test.d.ts.map +1 -0
  17. package/dist/__tests__/utils/changeModeChunker.test.js +137 -0
  18. package/dist/__tests__/utils/changeModeChunker.test.js.map +1 -0
  19. package/dist/__tests__/utils/changeModeParser.test.d.ts +2 -0
  20. package/dist/__tests__/utils/changeModeParser.test.d.ts.map +1 -0
  21. package/dist/__tests__/utils/changeModeParser.test.js +254 -0
  22. package/dist/__tests__/utils/changeModeParser.test.js.map +1 -0
  23. package/dist/__tests__/utils/changeModeTranslator.test.d.ts +2 -0
  24. package/dist/__tests__/utils/changeModeTranslator.test.d.ts.map +1 -0
  25. package/dist/__tests__/utils/changeModeTranslator.test.js +112 -0
  26. package/dist/__tests__/utils/changeModeTranslator.test.js.map +1 -0
  27. package/dist/__tests__/utils/chunkCache.test.d.ts +2 -0
  28. package/dist/__tests__/utils/chunkCache.test.d.ts.map +1 -0
  29. package/dist/__tests__/utils/chunkCache.test.js +140 -0
  30. package/dist/__tests__/utils/chunkCache.test.js.map +1 -0
  31. package/dist/__tests__/utils/commandExecutor.test.d.ts +2 -0
  32. package/dist/__tests__/utils/commandExecutor.test.d.ts.map +1 -0
  33. package/dist/__tests__/utils/commandExecutor.test.js +139 -0
  34. package/dist/__tests__/utils/commandExecutor.test.js.map +1 -0
  35. package/dist/__tests__/utils/geminiExecutor.test.d.ts +2 -0
  36. package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +1 -0
  37. package/dist/__tests__/utils/geminiExecutor.test.js +337 -0
  38. package/dist/__tests__/utils/geminiExecutor.test.js.map +1 -0
  39. package/dist/__tests__/utils/responseCache.test.d.ts +2 -0
  40. package/dist/__tests__/utils/responseCache.test.d.ts.map +1 -0
  41. package/dist/__tests__/utils/responseCache.test.js +98 -0
  42. package/dist/__tests__/utils/responseCache.test.js.map +1 -0
  43. package/dist/__tests__/utils/test-helpers.d.ts +17 -0
  44. package/dist/__tests__/utils/test-helpers.d.ts.map +1 -0
  45. package/dist/__tests__/utils/test-helpers.js +50 -0
  46. package/dist/__tests__/utils/test-helpers.js.map +1 -0
  47. package/dist/constants.d.ts +96 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +89 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +186 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  56. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  57. package/dist/tools/ask-gemini.tool.js +65 -0
  58. package/dist/tools/ask-gemini.tool.js.map +1 -0
  59. package/dist/tools/brainstorm.tool.d.ts +3 -0
  60. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  61. package/dist/tools/brainstorm.tool.js +147 -0
  62. package/dist/tools/brainstorm.tool.js.map +1 -0
  63. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  64. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  65. package/dist/tools/fetch-chunk.tool.js +67 -0
  66. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  67. package/dist/tools/index.d.ts +2 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +10 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/registry.d.ts +43 -0
  72. package/dist/tools/registry.d.ts.map +1 -0
  73. package/dist/tools/registry.js +81 -0
  74. package/dist/tools/registry.js.map +1 -0
  75. package/dist/tools/simple-tools.d.ts +4 -0
  76. package/dist/tools/simple-tools.d.ts.map +1 -0
  77. package/dist/tools/simple-tools.js +42 -0
  78. package/dist/tools/simple-tools.js.map +1 -0
  79. package/dist/tools/test-tool.example.d.ts +13 -0
  80. package/dist/tools/test-tool.example.d.ts.map +1 -0
  81. package/dist/tools/test-tool.example.js +32 -0
  82. package/dist/tools/test-tool.example.js.map +1 -0
  83. package/dist/tools/timeout-test.tool.d.ts +3 -0
  84. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  85. package/dist/tools/timeout-test.tool.js +36 -0
  86. package/dist/tools/timeout-test.tool.js.map +1 -0
  87. package/dist/utils/changeModeChunker.d.ts +11 -0
  88. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  89. package/dist/utils/changeModeChunker.js +89 -0
  90. package/dist/utils/changeModeChunker.js.map +1 -0
  91. package/dist/utils/changeModeParser.d.ts +15 -0
  92. package/dist/utils/changeModeParser.d.ts.map +1 -0
  93. package/dist/utils/changeModeParser.js +67 -0
  94. package/dist/utils/changeModeParser.js.map +1 -0
  95. package/dist/utils/changeModeTranslator.d.ts +8 -0
  96. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  97. package/dist/utils/changeModeTranslator.js +70 -0
  98. package/dist/utils/changeModeTranslator.js.map +1 -0
  99. package/dist/utils/chunkCache.d.ts +22 -0
  100. package/dist/utils/chunkCache.d.ts.map +1 -0
  101. package/dist/utils/chunkCache.js +161 -0
  102. package/dist/utils/chunkCache.js.map +1 -0
  103. package/dist/utils/commandExecutor.d.ts +2 -0
  104. package/dist/utils/commandExecutor.d.ts.map +1 -0
  105. package/dist/utils/commandExecutor.js +79 -0
  106. package/dist/utils/commandExecutor.js.map +1 -0
  107. package/dist/utils/geminiExecutor.d.ts +17 -0
  108. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  109. package/dist/utils/geminiExecutor.js +238 -0
  110. package/dist/utils/geminiExecutor.js.map +1 -0
  111. package/dist/utils/logger.d.ts +13 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +42 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/responseCache.d.ts +33 -0
  116. package/dist/utils/responseCache.d.ts.map +1 -0
  117. package/dist/utils/responseCache.js +87 -0
  118. package/dist/utils/responseCache.js.map +1 -0
  119. package/dist/utils/timeoutManager.d.ts +2 -0
  120. package/dist/utils/timeoutManager.d.ts.map +1 -0
  121. package/dist/utils/timeoutManager.js +2 -0
  122. package/dist/utils/timeoutManager.js.map +1 -0
  123. package/package.json +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,YAAY,CAAC;AAGpC,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAGX,eAAO,MAAM,eAAe;;;;;;;;;CAUlB,CAAC;AAGX,eAAO,MAAM,MAAM;;;CAGT,CAAC;AAGX,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAIX,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCN,CAAC;AAIX,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAGzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACjE"}
@@ -0,0 +1,89 @@
1
+ // Logging
2
+ export const LOG_PREFIX = "[GMCPT]";
3
+ // Error messages
4
+ export const ERROR_MESSAGES = {
5
+ QUOTA_EXCEEDED: "RESOURCE_EXHAUSTED",
6
+ QUOTA_EXCEEDED_SHORT: "⚠️ Gemini Pro daily quota exceeded. Please retry with model: 'gemini-3-flash-preview'",
7
+ TOOL_NOT_FOUND: "not found in registry",
8
+ NO_PROMPT_PROVIDED: "Please provide a prompt for analysis. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions",
9
+ };
10
+ // Status messages
11
+ export const STATUS_MESSAGES = {
12
+ QUOTA_SWITCHING: "🚫 Gemini Pro quota exceeded, switching to Flash model...",
13
+ FLASH_RETRY: "⚡ Retrying with Gemini Flash...",
14
+ FLASH_SUCCESS: "✅ Flash model completed successfully",
15
+ SANDBOX_EXECUTING: "🔒 Executing Gemini CLI command in sandbox mode...",
16
+ GEMINI_RESPONSE: "Gemini response:",
17
+ // Timeout prevention messages
18
+ PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)",
19
+ PROCESSING_CONTINUE: "⏳ Still processing... Gemini is working on your request",
20
+ PROCESSING_COMPLETE: "✅ Analysis completed successfully",
21
+ };
22
+ // Models
23
+ export const MODELS = {
24
+ PRO: "gemini-3.1-pro-preview",
25
+ FLASH: "gemini-3-flash-preview",
26
+ };
27
+ // MCP Protocol Constants
28
+ export const PROTOCOL = {
29
+ // Message roles
30
+ ROLES: {
31
+ USER: "user",
32
+ ASSISTANT: "assistant",
33
+ },
34
+ // Content types
35
+ CONTENT_TYPES: {
36
+ TEXT: "text",
37
+ },
38
+ // Status codes
39
+ STATUS: {
40
+ SUCCESS: "success",
41
+ ERROR: "error",
42
+ FAILED: "failed",
43
+ REPORT: "report",
44
+ },
45
+ // Notification methods
46
+ NOTIFICATIONS: {
47
+ PROGRESS: "notifications/progress",
48
+ },
49
+ // Timeout prevention
50
+ KEEPALIVE_INTERVAL: 25000, // 25 seconds
51
+ };
52
+ // CLI Constants
53
+ export const CLI = {
54
+ // Command names
55
+ COMMANDS: {
56
+ GEMINI: "gemini",
57
+ ECHO: "echo",
58
+ },
59
+ // Command flags
60
+ FLAGS: {
61
+ MODEL: "-m",
62
+ SANDBOX: "-s",
63
+ PROMPT: "-p",
64
+ HELP: "-help",
65
+ // Phase 1: Critical flags
66
+ YOLO: "-y",
67
+ APPROVAL_MODE: "--approval-mode",
68
+ OUTPUT_FORMAT: "-o",
69
+ INCLUDE_DIRECTORIES: "--include-directories",
70
+ DEBUG: "-d",
71
+ // Phase 2: Enhanced features
72
+ PROMPT_INTERACTIVE: "-i",
73
+ EXTENSIONS: "-e",
74
+ RESUME: "-r",
75
+ },
76
+ // Default values
77
+ DEFAULTS: {
78
+ MODEL: "default", // Fallback model used when no specific model is provided
79
+ BOOLEAN_TRUE: "true",
80
+ BOOLEAN_FALSE: "false",
81
+ APPROVAL_MODE_DEFAULT: "default",
82
+ APPROVAL_MODE_AUTO_EDIT: "auto_edit",
83
+ APPROVAL_MODE_YOLO: "yolo",
84
+ OUTPUT_FORMAT_TEXT: "text",
85
+ OUTPUT_FORMAT_JSON: "json",
86
+ OUTPUT_FORMAT_STREAM_JSON: "stream-json",
87
+ },
88
+ };
89
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,UAAU;AACV,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,oBAAoB;IACpC,oBAAoB,EAAE,uFAAuF;IAC7G,cAAc,EAAE,uBAAuB;IACvC,kBAAkB,EAAE,6IAA6I;CACzJ,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe,EAAE,2DAA2D;IAC5E,WAAW,EAAE,iCAAiC;IAC9C,aAAa,EAAE,sCAAsC;IACrD,iBAAiB,EAAE,oDAAoD;IACvE,eAAe,EAAE,kBAAkB;IACnC,8BAA8B;IAC9B,gBAAgB,EAAE,kEAAkE;IACpF,mBAAmB,EAAE,yDAAyD;IAC9E,mBAAmB,EAAE,mCAAmC;CAChD,CAAC;AAEX,SAAS;AACT,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,wBAAwB;IAC7B,KAAK,EAAE,wBAAwB;CACvB,CAAC;AAEX,yBAAyB;AACzB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,gBAAgB;IAChB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;KACvB;IACD,gBAAgB;IAChB,aAAa,EAAE;QACb,IAAI,EAAE,MAAM;KACb;IACD,eAAe;IACf,MAAM,EAAE;QACN,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;KACjB;IACD,uBAAuB;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,wBAAwB;KACnC;IACD,qBAAqB;IACrB,kBAAkB,EAAE,KAAK,EAAE,aAAa;CAChC,CAAC;AAGX,gBAAgB;AAChB,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,gBAAgB;IAChB,QAAQ,EAAE;QACR,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;KACb;IACD,gBAAgB;IAChB,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,OAAO;QACb,0BAA0B;QAC1B,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,iBAAiB;QAChC,aAAa,EAAE,IAAI;QACnB,mBAAmB,EAAE,uBAAuB;QAC5C,KAAK,EAAE,IAAI;QACX,6BAA6B;QAC7B,kBAAkB,EAAE,IAAI;QACxB,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,IAAI;KACb;IACD,iBAAiB;IACjB,QAAQ,EAAE;QACR,KAAK,EAAE,SAAS,EAAE,yDAAyD;QAC3E,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,OAAO;QACtB,qBAAqB,EAAE,SAAS;QAChC,uBAAuB,EAAE,WAAW;QACpC,kBAAkB,EAAE,MAAM;QAC1B,kBAAkB,EAAE,MAAM;QAC1B,kBAAkB,EAAE,MAAM;QAC1B,yBAAyB,EAAE,aAAa;KACzC;CACO,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { Logger } from "./utils/logger.js";
6
+ import { PROTOCOL } from "./constants.js";
7
+ import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage } from "./tools/index.js";
8
+ const server = new Server({
9
+ name: "gemini-cli-mcp",
10
+ version: "1.1.4",
11
+ }, {
12
+ capabilities: {
13
+ tools: {},
14
+ prompts: {},
15
+ },
16
+ });
17
+ let isProcessing = false;
18
+ let currentOperationName = "";
19
+ let latestOutput = "";
20
+ async function sendNotification(method, params) {
21
+ try {
22
+ await server.notification({ method, params });
23
+ }
24
+ catch (error) {
25
+ Logger.error("notification failed: ", error);
26
+ }
27
+ }
28
+ /**
29
+ * @param progressToken The progress token provided by the client
30
+ * @param progress The current progress value
31
+ * @param total Optional total value
32
+ * @param message Optional status message
33
+ */
34
+ async function sendProgressNotification(progressToken, progress, total, message) {
35
+ if (!progressToken)
36
+ return; // Only send if client requested progress
37
+ try {
38
+ const params = {
39
+ progressToken,
40
+ progress
41
+ };
42
+ if (total !== undefined)
43
+ params.total = total; // future cache progress
44
+ if (message)
45
+ params.message = message;
46
+ await server.notification({
47
+ method: PROTOCOL.NOTIFICATIONS.PROGRESS,
48
+ params
49
+ });
50
+ }
51
+ catch (error) {
52
+ Logger.error("Failed to send progress notification:", error);
53
+ }
54
+ }
55
+ function startProgressUpdates(operationName, progressToken) {
56
+ isProcessing = true;
57
+ currentOperationName = operationName;
58
+ latestOutput = ""; // Reset latest output
59
+ const progressMessages = [
60
+ `🧠 ${operationName} - Gemini is analyzing your request...`,
61
+ `📊 ${operationName} - Processing files and generating insights...`,
62
+ `✨ ${operationName} - Creating structured response for your review...`,
63
+ `⏱️ ${operationName} - Large analysis in progress (this is normal for big requests)...`,
64
+ `🔍 ${operationName} - Still working... Gemini takes time for quality results...`,
65
+ ];
66
+ let messageIndex = 0;
67
+ let progress = 0;
68
+ // Send immediate acknowledgment if progress requested
69
+ if (progressToken) {
70
+ sendProgressNotification(progressToken, 0, undefined, // No total - indeterminate progress
71
+ `🔍 Starting ${operationName}`);
72
+ }
73
+ // Keep client alive with periodic updates
74
+ const progressInterval = setInterval(async () => {
75
+ if (isProcessing && progressToken) {
76
+ // Simply increment progress value
77
+ progress += 1;
78
+ // Include latest output if available
79
+ const baseMessage = progressMessages[messageIndex % progressMessages.length];
80
+ const outputPreview = latestOutput.slice(-150).trim(); // Last 150 chars
81
+ const message = outputPreview
82
+ ? `${baseMessage}\n📝 Output: ...${outputPreview}`
83
+ : baseMessage;
84
+ await sendProgressNotification(progressToken, progress, undefined, // No total - indeterminate progress
85
+ message);
86
+ messageIndex++;
87
+ }
88
+ else if (!isProcessing) {
89
+ clearInterval(progressInterval);
90
+ }
91
+ }, PROTOCOL.KEEPALIVE_INTERVAL); // Every 25 seconds
92
+ return { interval: progressInterval, progressToken };
93
+ }
94
+ function stopProgressUpdates(progressData, success = true) {
95
+ const operationName = currentOperationName; // Store before clearing
96
+ isProcessing = false;
97
+ currentOperationName = "";
98
+ clearInterval(progressData.interval);
99
+ // Send final progress notification if client requested progress
100
+ if (progressData.progressToken) {
101
+ sendProgressNotification(progressData.progressToken, 100, 100, success ? `✅ ${operationName} completed successfully` : `❌ ${operationName} failed`);
102
+ }
103
+ }
104
+ // tools/list
105
+ server.setRequestHandler(ListToolsRequestSchema, async (request) => {
106
+ return { tools: getToolDefinitions() };
107
+ });
108
+ // tools/get
109
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
110
+ const toolName = request.params.name;
111
+ if (toolExists(toolName)) {
112
+ // Check if client requested progress updates
113
+ const progressToken = request.params._meta?.progressToken;
114
+ // Start progress updates if client requested them
115
+ const progressData = startProgressUpdates(toolName, progressToken);
116
+ try {
117
+ // Get prompt and other parameters from arguments with proper typing
118
+ const args = request.params.arguments || {};
119
+ Logger.toolInvocation(toolName, request.params.arguments);
120
+ // Execute the tool using the unified registry with progress callback
121
+ const result = await executeTool(toolName, args, (newOutput) => {
122
+ latestOutput = newOutput;
123
+ });
124
+ // Stop progress updates
125
+ stopProgressUpdates(progressData, true);
126
+ return {
127
+ content: [
128
+ {
129
+ type: "text",
130
+ text: result,
131
+ },
132
+ ],
133
+ isError: false,
134
+ };
135
+ }
136
+ catch (error) {
137
+ // Stop progress updates on error
138
+ stopProgressUpdates(progressData, false);
139
+ Logger.error(`Error in tool '${toolName}':`, error);
140
+ const errorMessage = error instanceof Error ? error.message : String(error);
141
+ return {
142
+ content: [
143
+ {
144
+ type: "text",
145
+ text: `Error executing ${toolName}: ${errorMessage}`,
146
+ },
147
+ ],
148
+ isError: true,
149
+ };
150
+ }
151
+ }
152
+ else {
153
+ throw new Error(`Unknown tool: ${request.params.name}`);
154
+ }
155
+ });
156
+ // prompts/list
157
+ server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
158
+ return { prompts: getPromptDefinitions() };
159
+ });
160
+ // prompts/get
161
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
162
+ const promptName = request.params.name;
163
+ const args = request.params.arguments || {};
164
+ const promptMessage = getPromptMessage(promptName, args);
165
+ if (!promptMessage) {
166
+ throw new Error(`Unknown prompt: ${promptName}`);
167
+ }
168
+ return {
169
+ messages: [{
170
+ role: "user",
171
+ content: {
172
+ type: "text",
173
+ text: promptMessage
174
+ }
175
+ }]
176
+ };
177
+ });
178
+ // Start the server
179
+ async function main() {
180
+ Logger.debug("init gemini-mcp-tool");
181
+ const transport = new StdioServerTransport();
182
+ await server.connect(transport);
183
+ Logger.debug("gemini-mcp-tool listening on stdio");
184
+ }
185
+ main().catch((error) => { Logger.error("Fatal error:", error); process.exit(1); });
186
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const askGeminiTool: UnifiedTool;
3
+ //# sourceMappingURL=ask-gemini.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-gemini.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask-gemini.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA6B5C,eAAO,MAAM,aAAa,EAAE,WA0D3B,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ import { executeGeminiCLI, processChangeModeOutput } from '../utils/geminiExecutor.js';
3
+ import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
4
+ const askGeminiArgsSchema = z.object({
5
+ prompt: z.string().min(1).describe("Analysis request. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions"),
6
+ model: z.string().optional().describe("Optional model to use (e.g., 'gemini-3-flash-preview'). If not specified, uses the default model (gemini-3.1-pro-preview)."),
7
+ sandbox: z.boolean().default(false).describe("Use sandbox mode (-s flag) to safely test code changes, execute scripts, or run potentially risky operations in an isolated environment"),
8
+ changeMode: z.boolean().default(false).describe("Enable structured change mode - formats prompts to prevent tool errors and returns structured edit suggestions that Claude can apply directly"),
9
+ chunkIndex: z.union([z.number(), z.string()]).optional().describe("Which chunk to return (1-based)"),
10
+ chunkCacheKey: z.string().optional().describe("Optional cache key for continuation"),
11
+ workingDirectory: z.string().optional().describe("Working directory to run Gemini from. Use drive root (e.g., 'C:/' or 'D:/') to access files on that drive."),
12
+ // Phase 1: Critical flags
13
+ yolo: z.boolean().default(false).describe("Auto-accept all actions (YOLO mode). Automatically approves all confirmations without prompting. Use with caution in automated workflows."),
14
+ approvalMode: z.enum(["default", "auto_edit", "yolo"]).optional().describe("Set approval mode: 'default' (prompt for approval), 'auto_edit' (auto-approve edit tools only), 'yolo' (auto-approve all tools). Overrides yolo flag if both are set."),
15
+ outputFormat: z.enum(["text", "json", "stream-json"]).optional().describe("Output format: 'text' (default human-readable), 'json' (structured JSON), 'stream-json' (streaming JSON for real-time processing)"),
16
+ includeDirectories: z.union([z.string(), z.array(z.string())]).optional().describe("Additional directories to include in workspace (comma-separated string or array). Example: 'src,tests' or ['src', 'tests']"),
17
+ debug: z.boolean().default(false).describe("Enable debug mode for verbose logging and troubleshooting"),
18
+ // Phase 2: Enhanced features (for future implementation)
19
+ promptInteractive: z.string().optional().describe("Execute the provided prompt and continue in interactive mode"),
20
+ extensions: z.union([z.string(), z.array(z.string())]).optional().describe("Specific extensions to use (comma-separated or array). If not provided, all extensions are used."),
21
+ resume: z.string().optional().describe("Resume a previous session. Use 'latest' for most recent or session index number"),
22
+ });
23
+ export const askGeminiTool = {
24
+ name: "ask-gemini",
25
+ description: "Ask Google Gemini with full CLI support: model selection [-m], sandbox [-s], YOLO mode [-y], approval modes, output formats, and more",
26
+ zodSchema: askGeminiArgsSchema,
27
+ prompt: {
28
+ description: "Execute Gemini CLI with advanced options. Supports file analysis (@syntax), YOLO mode, different approval levels, output formats (text/json), debug mode, and structured change mode for edit suggestions.",
29
+ },
30
+ category: 'gemini',
31
+ annotations: {
32
+ title: "Ask Gemini",
33
+ readOnlyHint: true,
34
+ openWorldHint: true,
35
+ },
36
+ execute: async (args, onProgress) => {
37
+ const { prompt, model, sandbox, changeMode, chunkIndex, chunkCacheKey, workingDirectory, yolo, approvalMode, outputFormat, includeDirectories, debug, promptInteractive, extensions, resume } = args;
38
+ if (!prompt?.trim()) {
39
+ throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
40
+ }
41
+ if (changeMode && chunkIndex && chunkCacheKey) {
42
+ return processChangeModeOutput('', // empty for cache...
43
+ chunkIndex, chunkCacheKey, prompt);
44
+ }
45
+ const result = await executeGeminiCLI(prompt, {
46
+ model: model,
47
+ sandbox: !!sandbox,
48
+ changeMode: !!changeMode,
49
+ yolo: !!yolo,
50
+ approvalMode: approvalMode,
51
+ outputFormat: outputFormat,
52
+ includeDirectories: includeDirectories,
53
+ debug: !!debug,
54
+ promptInteractive: promptInteractive,
55
+ extensions: extensions,
56
+ resume: resume,
57
+ cwd: workingDirectory,
58
+ }, onProgress);
59
+ if (changeMode) {
60
+ return processChangeModeOutput(result, args.chunkIndex, undefined, prompt);
61
+ }
62
+ return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n${result}`; // changeMode false
63
+ }
64
+ };
65
+ //# sourceMappingURL=ask-gemini.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-gemini.tool.js","sourceRoot":"","sources":["../../src/tools/ask-gemini.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const brainstormTool: UnifiedTool;
3
+ //# sourceMappingURL=brainstorm.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brainstorm.tool.d.ts","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgI5C,eAAO,MAAM,cAAc,EAAE,WAyD5B,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { z } from 'zod';
2
+ import { Logger } from '../utils/logger.js';
3
+ import { executeGeminiCLI } from '../utils/geminiExecutor.js';
4
+ function buildBrainstormPrompt(config) {
5
+ const { prompt, methodology, domain, constraints, existingContext, ideaCount, includeAnalysis } = config;
6
+ // Select methodology framework
7
+ let frameworkInstructions = getMethodologyInstructions(methodology, domain);
8
+ let enhancedPrompt = `# BRAINSTORMING SESSION
9
+
10
+ ## Core Challenge
11
+ ${prompt}
12
+
13
+ ## Methodology Framework
14
+ ${frameworkInstructions}
15
+
16
+ ## Context Engineering
17
+ *Use the following context to inform your reasoning:*
18
+ ${domain ? `**Domain Focus:** ${domain} - Apply domain-specific knowledge, terminology, and best practices.` : ''}
19
+ ${constraints ? `**Constraints & Boundaries:** ${constraints}` : ''}
20
+ ${existingContext ? `**Background Context:** ${existingContext}` : ''}
21
+
22
+ ## Output Requirements
23
+ - Generate ${ideaCount} distinct, creative ideas
24
+ - Each idea should be unique and non-obvious
25
+ - Focus on actionable, implementable concepts
26
+ - Use clear, descriptive naming
27
+ - Provide brief explanations for each idea
28
+
29
+ ${includeAnalysis ? `
30
+ ## Analysis Framework
31
+ For each idea, provide:
32
+ - **Feasibility:** Implementation difficulty (1-5 scale)
33
+ - **Impact:** Potential value/benefit (1-5 scale)
34
+ - **Innovation:** Uniqueness/creativity (1-5 scale)
35
+ - **Quick Assessment:** One-sentence evaluation
36
+ ` : ''}
37
+
38
+ ## Format
39
+ Present ideas in a structured format:
40
+
41
+ ### Idea [N]: [Creative Name]
42
+ **Description:** [2-3 sentence explanation]
43
+ ${includeAnalysis ? '**Feasibility:** [1-5] | **Impact:** [1-5] | **Innovation:** [1-5]\n**Assessment:** [Brief evaluation]' : ''}
44
+
45
+ ---
46
+
47
+ **Before finalizing, review the list: remove near-duplicates and ensure each idea satisfies the constraints.**
48
+
49
+ Begin brainstorming session:`;
50
+ return enhancedPrompt;
51
+ }
52
+ /**
53
+ * Returns methodology-specific instructions for structured brainstorming
54
+ */
55
+ function getMethodologyInstructions(methodology, domain) {
56
+ const methodologies = {
57
+ 'divergent': `**Divergent Thinking Approach:**
58
+ - Generate maximum quantity of ideas without self-censoring
59
+ - Build on wild or seemingly impractical ideas
60
+ - Combine unrelated concepts for unexpected solutions
61
+ - Use "Yes, and..." thinking to expand each concept
62
+ - Postpone evaluation until all ideas are generated`,
63
+ 'convergent': `**Convergent Thinking Approach:**
64
+ - Focus on refining and improving existing concepts
65
+ - Synthesize related ideas into stronger solutions
66
+ - Apply critical evaluation criteria
67
+ - Prioritize based on feasibility and impact
68
+ - Develop implementation pathways for top ideas`,
69
+ 'scamper': `**SCAMPER Creative Triggers:**
70
+ - **Substitute:** What can be substituted or replaced?
71
+ - **Combine:** What can be combined or merged?
72
+ - **Adapt:** What can be adapted from other domains?
73
+ - **Modify:** What can be magnified, minimized, or altered?
74
+ - **Put to other use:** How else can this be used?
75
+ - **Eliminate:** What can be removed or simplified?
76
+ - **Reverse:** What can be rearranged or reversed?`,
77
+ 'design-thinking': `**Human-Centered Design Thinking:**
78
+ - **Empathize:** Consider user needs, pain points, and contexts
79
+ - **Define:** Frame problems from user perspective
80
+ - **Ideate:** Generate user-focused solutions
81
+ - **Consider Journey:** Think through complete user experience
82
+ - **Prototype Mindset:** Focus on testable, iterative concepts`,
83
+ 'lateral': `**Lateral Thinking Approach:**
84
+ - Make unexpected connections between unrelated fields
85
+ - Challenge fundamental assumptions
86
+ - Use random word association to trigger new directions
87
+ - Apply metaphors and analogies from other domains
88
+ - Reverse conventional thinking patterns`,
89
+ 'auto': `**AI-Optimized Approach:**
90
+ ${domain ? `Given the ${domain} domain, I'll apply the most effective combination of:` : 'I\'ll intelligently combine multiple methodologies:'}
91
+ - Divergent exploration with domain-specific knowledge
92
+ - SCAMPER triggers and lateral thinking
93
+ - Human-centered perspective for practical value`
94
+ };
95
+ return methodologies[methodology] || methodologies['auto'];
96
+ }
97
+ const brainstormArgsSchema = z.object({
98
+ prompt: z.string().min(1).describe("Primary brainstorming challenge or question to explore"),
99
+ model: z.string().optional().describe("Optional model to use (e.g., 'gemini-3-flash-preview'). If not specified, uses the default model (gemini-3.1-pro-preview)."),
100
+ methodology: z.enum(['divergent', 'convergent', 'scamper', 'design-thinking', 'lateral', 'auto']).default('auto').describe("Brainstorming framework: 'divergent' (generate many ideas), 'convergent' (refine existing), 'scamper' (systematic triggers), 'design-thinking' (human-centered), 'lateral' (unexpected connections), 'auto' (AI selects best)"),
101
+ domain: z.string().optional().describe("Domain context for specialized brainstorming (e.g., 'software', 'business', 'creative', 'research', 'product', 'marketing')"),
102
+ constraints: z.string().optional().describe("Known limitations, requirements, or boundaries (budget, time, technical, legal, etc.)"),
103
+ existingContext: z.string().optional().describe("Background information, previous attempts, or current state to build upon"),
104
+ ideaCount: z.number().int().positive().default(12).describe("Target number of ideas to generate (default: 10-15)"),
105
+ includeAnalysis: z.boolean().default(true).describe("Include feasibility, impact, and implementation analysis for generated ideas"),
106
+ workingDirectory: z.string().optional().describe("Working directory to run Gemini from."),
107
+ });
108
+ export const brainstormTool = {
109
+ name: "brainstorm",
110
+ description: "Generate novel ideas with dynamic context gathering. --> Creative frameworks (SCAMPER, Design Thinking, etc.), domain context integration, idea clustering, feasibility analysis, and iterative refinement.",
111
+ zodSchema: brainstormArgsSchema,
112
+ prompt: {
113
+ description: "Generate structured brainstorming prompt with methodology-driven ideation, domain context integration, and analytical evaluation framework",
114
+ },
115
+ category: 'gemini',
116
+ annotations: {
117
+ title: "Brainstorm",
118
+ readOnlyHint: true,
119
+ openWorldHint: true,
120
+ },
121
+ execute: async (args, onProgress) => {
122
+ const { prompt, model, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true, workingDirectory } = args;
123
+ if (!prompt?.trim()) {
124
+ throw new Error("You must provide a valid brainstorming challenge or question to explore");
125
+ }
126
+ let enhancedPrompt = buildBrainstormPrompt({
127
+ prompt: prompt.trim(),
128
+ methodology: methodology,
129
+ domain: domain,
130
+ constraints: constraints,
131
+ existingContext: existingContext,
132
+ ideaCount: ideaCount,
133
+ includeAnalysis: includeAnalysis
134
+ });
135
+ Logger.debug(`Brainstorm: Using methodology '${methodology}' for domain '${domain || 'general'}'`);
136
+ // Report progress to user
137
+ onProgress?.(`Generating ${ideaCount} ideas via ${methodology} methodology...`);
138
+ // Execute with Gemini
139
+ return await executeGeminiCLI(enhancedPrompt, {
140
+ model: model,
141
+ sandbox: false,
142
+ changeMode: false,
143
+ cwd: workingDirectory,
144
+ }, onProgress);
145
+ }
146
+ };
147
+ //# sourceMappingURL=brainstorm.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brainstorm.tool.js","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const fetchChunkTool: UnifiedTool;
3
+ //# sourceMappingURL=fetch-chunk.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-chunk.tool.d.ts","sourceRoot":"","sources":["../../src/tools/fetch-chunk.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,eAAO,MAAM,cAAc,EAAE,WAyE5B,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ import { getChunks } from '../utils/chunkCache.js';
3
+ import { formatChangeModeResponse, summarizeChangeModeEdits } from '../utils/changeModeTranslator.js';
4
+ import { Logger } from '../utils/logger.js';
5
+ const inputSchema = z.object({
6
+ cacheKey: z.string().describe("The cache key provided in the initial changeMode response"),
7
+ chunkIndex: z.number().min(1).describe("Which chunk to retrieve (1-based index)")
8
+ });
9
+ export const fetchChunkTool = {
10
+ name: 'fetch-chunk',
11
+ description: 'Retrieves cached chunks from a changeMode response. Use this to get subsequent chunks after receiving a partial changeMode response.',
12
+ zodSchema: inputSchema,
13
+ prompt: {
14
+ description: 'Fetch the next chunk of a response',
15
+ arguments: [
16
+ {
17
+ name: 'prompt',
18
+ description: 'fetch-chunk cacheKey=<key> chunkIndex=<number>',
19
+ required: true
20
+ }
21
+ ]
22
+ },
23
+ category: 'utility',
24
+ annotations: {
25
+ title: "Fetch Chunk",
26
+ readOnlyHint: true,
27
+ idempotentHint: true,
28
+ },
29
+ execute: async (args, onProgress) => {
30
+ const { cacheKey, chunkIndex } = args;
31
+ Logger.toolInvocation('fetch-chunk', args);
32
+ Logger.debug(`Fetching chunk ${chunkIndex} with cache key: ${cacheKey}`);
33
+ // Retrieve cached chunks
34
+ const chunks = getChunks(cacheKey);
35
+ if (!chunks) {
36
+ return `❌ Cache miss: No chunks found for cache key "${cacheKey}".
37
+
38
+ Possible reasons:
39
+ 1. The cache key is incorrect, Have you ran ask-gemini with changeMode enabled?
40
+ 2. The cache has expired (10 minute TTL)
41
+ 3. The MCP server was restarted and the file-based cache was cleared
42
+
43
+ Please re-run the original changeMode request to regenerate the chunks.`;
44
+ }
45
+ // Validate chunk index
46
+ if (chunkIndex < 1 || chunkIndex > chunks.length) {
47
+ return `❌ Invalid chunk index: ${chunkIndex}
48
+
49
+ Available chunks: 1 to ${chunks.length}
50
+ You requested: ${chunkIndex}
51
+
52
+ Please use a valid chunk index.`;
53
+ }
54
+ // Get the requested chunk
55
+ const chunk = chunks[chunkIndex - 1];
56
+ // Format the response
57
+ let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: chunks.length, cacheKey });
58
+ // Add summary for first chunk
59
+ if (chunkIndex === 1 && chunks.length > 1) {
60
+ const allEdits = chunks.flatMap(c => c.edits);
61
+ result = summarizeChangeModeEdits(allEdits, true) + '\n\n' + result;
62
+ }
63
+ Logger.debug(`Returning chunk ${chunkIndex} of ${chunks.length} with ${chunk.edits.length} edits`);
64
+ return result;
65
+ }
66
+ };
67
+ //# 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,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACtG,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IAC1F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAClF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,sIAAsI;IAEnJ,SAAS,EAAE,WAAW;IAEtB,MAAM,EAAE;QACN,WAAW,EAAE,oCAAoC;QACjD,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;gBAC7D,QAAQ,EAAE,IAAI;aACf;SACF;KACF;IAED,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE;QACX,KAAK,EAAE,aAAa;QACpB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;KACrB;IAED,OAAO,EAAE,KAAK,EAAE,IAAS,EAAE,UAAwC,EAAmB,EAAE;QACtF,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAEtC,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAEzE,yBAAyB;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,gDAAgD,QAAQ;;;;;;;wEAOG,CAAC;QACrE,CAAC;QAED,uBAAuB;QACvB,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,0BAA0B,UAAU;;yBAExB,MAAM,CAAC,MAAM;iBACrB,UAAU;;gCAEK,CAAC;QAC7B,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAErC,sBAAsB;QACtB,IAAI,MAAM,GAAG,wBAAwB,CACnC,KAAK,CAAC,KAAK,EACX,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CACxD,CAAC;QAEF,8BAA8B;QAC9B,IAAI,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;QACtE,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,OAAO,MAAM,CAAC,MAAM,SAAS,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnG,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './registry.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAiBA,cAAc,eAAe,CAAC"}