@tuannvm/gemini-mcp-server 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.
Files changed (99) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +381 -0
  3. package/dist/constants.d.ts +58 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +64 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/errors.d.ts +24 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +57 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +24 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server.d.ts +19 -0
  16. package/dist/server.d.ts.map +1 -0
  17. package/dist/server.js +166 -0
  18. package/dist/server.js.map +1 -0
  19. package/dist/tools/analyze-media.tool.d.ts +3 -0
  20. package/dist/tools/analyze-media.tool.d.ts.map +1 -0
  21. package/dist/tools/analyze-media.tool.js +102 -0
  22. package/dist/tools/analyze-media.tool.js.map +1 -0
  23. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  24. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  25. package/dist/tools/ask-gemini.tool.js +86 -0
  26. package/dist/tools/ask-gemini.tool.js.map +1 -0
  27. package/dist/tools/brainstorm.tool.d.ts +3 -0
  28. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  29. package/dist/tools/brainstorm.tool.js +220 -0
  30. package/dist/tools/brainstorm.tool.js.map +1 -0
  31. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  32. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  33. package/dist/tools/fetch-chunk.tool.js +85 -0
  34. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  35. package/dist/tools/index.d.ts +2 -0
  36. package/dist/tools/index.d.ts.map +1 -0
  37. package/dist/tools/index.js +19 -0
  38. package/dist/tools/index.js.map +1 -0
  39. package/dist/tools/registry.d.ts +26 -0
  40. package/dist/tools/registry.d.ts.map +1 -0
  41. package/dist/tools/registry.js +74 -0
  42. package/dist/tools/registry.js.map +1 -0
  43. package/dist/tools/search.tool.d.ts +3 -0
  44. package/dist/tools/search.tool.d.ts.map +1 -0
  45. package/dist/tools/search.tool.js +86 -0
  46. package/dist/tools/search.tool.js.map +1 -0
  47. package/dist/tools/shell.tool.d.ts +3 -0
  48. package/dist/tools/shell.tool.d.ts.map +1 -0
  49. package/dist/tools/shell.tool.js +106 -0
  50. package/dist/tools/shell.tool.js.map +1 -0
  51. package/dist/tools/simple-tools.d.ts +4 -0
  52. package/dist/tools/simple-tools.d.ts.map +1 -0
  53. package/dist/tools/simple-tools.js +48 -0
  54. package/dist/tools/simple-tools.js.map +1 -0
  55. package/dist/tools/test-tool.example.d.ts +13 -0
  56. package/dist/tools/test-tool.example.d.ts.map +1 -0
  57. package/dist/tools/test-tool.example.js +44 -0
  58. package/dist/tools/test-tool.example.js.map +1 -0
  59. package/dist/tools/timeout-test.tool.d.ts +3 -0
  60. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  61. package/dist/tools/timeout-test.tool.js +45 -0
  62. package/dist/tools/timeout-test.tool.js.map +1 -0
  63. package/dist/types.d.ts +43 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +22 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/utils/changeModeChunker.d.ts +11 -0
  68. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  69. package/dist/utils/changeModeChunker.js +95 -0
  70. package/dist/utils/changeModeChunker.js.map +1 -0
  71. package/dist/utils/changeModeParser.d.ts +15 -0
  72. package/dist/utils/changeModeParser.d.ts.map +1 -0
  73. package/dist/utils/changeModeParser.js +67 -0
  74. package/dist/utils/changeModeParser.js.map +1 -0
  75. package/dist/utils/changeModeTranslator.d.ts +8 -0
  76. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  77. package/dist/utils/changeModeTranslator.js +73 -0
  78. package/dist/utils/changeModeTranslator.js.map +1 -0
  79. package/dist/utils/chunkCache.d.ts +22 -0
  80. package/dist/utils/chunkCache.d.ts.map +1 -0
  81. package/dist/utils/chunkCache.js +163 -0
  82. package/dist/utils/chunkCache.js.map +1 -0
  83. package/dist/utils/commandExecutor.d.ts +2 -0
  84. package/dist/utils/commandExecutor.d.ts.map +1 -0
  85. package/dist/utils/commandExecutor.js +74 -0
  86. package/dist/utils/commandExecutor.js.map +1 -0
  87. package/dist/utils/geminiExecutor.d.ts +3 -0
  88. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  89. package/dist/utils/geminiExecutor.js +182 -0
  90. package/dist/utils/geminiExecutor.js.map +1 -0
  91. package/dist/utils/logger.d.ts +13 -0
  92. package/dist/utils/logger.d.ts.map +1 -0
  93. package/dist/utils/logger.js +42 -0
  94. package/dist/utils/logger.js.map +1 -0
  95. package/dist/utils/timeoutManager.d.ts +1 -0
  96. package/dist/utils/timeoutManager.d.ts.map +1 -0
  97. package/dist/utils/timeoutManager.js +2 -0
  98. package/dist/utils/timeoutManager.js.map +1 -0
  99. package/package.json +68 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Gemini MCP Server implementation
3
+ */
4
+ import { ServerConfig } from './types.js';
5
+ export declare class GeminiMcpServer {
6
+ private readonly server;
7
+ private readonly config;
8
+ private isProcessing;
9
+ private currentOperationName;
10
+ private latestOutput;
11
+ constructor(config: ServerConfig);
12
+ private setupHandlers;
13
+ private sendNotification;
14
+ private sendProgressNotification;
15
+ private startProgressUpdates;
16
+ private stopProgressUpdates;
17
+ start(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAUzD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,YAAY,CAAM;gBAEd,MAAM,EAAE,YAAY;IAkBhC,OAAO,CAAC,aAAa;YA0EP,gBAAgB;YAQhB,wBAAwB;IAsBtC,OAAO,CAAC,oBAAoB;IA0C5B,OAAO,CAAC,mBAAmB;IAmBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
package/dist/server.js ADDED
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Gemini MCP Server implementation
3
+ */
4
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
7
+ import { Logger } from './utils/logger.js';
8
+ import { PROTOCOL } from './constants.js';
9
+ import { handleError } from './errors.js';
10
+ import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage, } from './tools/index.js';
11
+ export class GeminiMcpServer {
12
+ server;
13
+ config;
14
+ isProcessing = false;
15
+ currentOperationName = '';
16
+ latestOutput = '';
17
+ constructor(config) {
18
+ this.config = config;
19
+ this.server = new Server({
20
+ name: config.name,
21
+ version: config.version,
22
+ }, {
23
+ capabilities: {
24
+ tools: {},
25
+ prompts: {},
26
+ logging: {},
27
+ },
28
+ });
29
+ this.setupHandlers();
30
+ }
31
+ setupHandlers() {
32
+ // tools/list
33
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
34
+ return { tools: getToolDefinitions() };
35
+ });
36
+ // tools/call
37
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
38
+ const toolName = request.params.name;
39
+ if (!toolExists(toolName)) {
40
+ throw new Error(`Unknown tool: ${toolName}`);
41
+ }
42
+ const progressToken = request.params._meta?.progressToken;
43
+ const progressData = this.startProgressUpdates(toolName, progressToken);
44
+ try {
45
+ const args = request.params.arguments || {};
46
+ Logger.toolInvocation(toolName, request.params.arguments);
47
+ const result = await executeTool(toolName, args, (newOutput) => {
48
+ this.latestOutput = newOutput;
49
+ });
50
+ this.stopProgressUpdates(progressData, true);
51
+ return {
52
+ content: [{ type: 'text', text: result }],
53
+ isError: false,
54
+ };
55
+ }
56
+ catch (error) {
57
+ this.stopProgressUpdates(progressData, false);
58
+ Logger.error(`Error in tool '${toolName}':`, error);
59
+ const errorMessage = handleError(error, toolName);
60
+ return {
61
+ content: [{ type: 'text', text: errorMessage }],
62
+ isError: true,
63
+ };
64
+ }
65
+ });
66
+ // prompts/list
67
+ this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
68
+ return { prompts: getPromptDefinitions() };
69
+ });
70
+ // prompts/get
71
+ this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
72
+ const promptName = request.params.name;
73
+ const args = request.params.arguments || {};
74
+ const promptMessage = getPromptMessage(promptName, args);
75
+ if (!promptMessage) {
76
+ throw new Error(`Unknown prompt: ${promptName}`);
77
+ }
78
+ return {
79
+ messages: [
80
+ {
81
+ role: 'user',
82
+ content: {
83
+ type: 'text',
84
+ text: promptMessage,
85
+ },
86
+ },
87
+ ],
88
+ };
89
+ });
90
+ }
91
+ async sendNotification(method, params) {
92
+ try {
93
+ await this.server.notification({ method, params });
94
+ }
95
+ catch (error) {
96
+ Logger.error('Notification failed:', error);
97
+ }
98
+ }
99
+ async sendProgressNotification(progressToken, progress, total, message) {
100
+ if (!progressToken)
101
+ return;
102
+ try {
103
+ const params = { progressToken, progress };
104
+ if (total !== undefined)
105
+ params.total = total;
106
+ if (message)
107
+ params.message = message;
108
+ await this.server.notification({
109
+ method: PROTOCOL.NOTIFICATIONS.PROGRESS,
110
+ params,
111
+ });
112
+ }
113
+ catch (error) {
114
+ Logger.error('Failed to send progress notification:', error);
115
+ }
116
+ }
117
+ startProgressUpdates(operationName, progressToken) {
118
+ this.isProcessing = true;
119
+ this.currentOperationName = operationName;
120
+ this.latestOutput = '';
121
+ const progressMessages = [
122
+ `Processing ${operationName} - Gemini is analyzing your request...`,
123
+ `Processing ${operationName} - Processing files and generating insights...`,
124
+ `Processing ${operationName} - Creating structured response...`,
125
+ `Processing ${operationName} - Large analysis in progress...`,
126
+ `Processing ${operationName} - Still working on quality results...`,
127
+ ];
128
+ let messageIndex = 0;
129
+ let progress = 0;
130
+ if (progressToken) {
131
+ this.sendProgressNotification(progressToken, 0, undefined, `Starting ${operationName}`);
132
+ }
133
+ const progressInterval = setInterval(async () => {
134
+ if (this.isProcessing && progressToken) {
135
+ progress += 1;
136
+ const baseMessage = progressMessages[messageIndex % progressMessages.length];
137
+ const outputPreview = this.latestOutput.slice(-150).trim();
138
+ const message = outputPreview
139
+ ? `${baseMessage}\nOutput: ...${outputPreview}`
140
+ : baseMessage;
141
+ await this.sendProgressNotification(progressToken, progress, undefined, message);
142
+ messageIndex++;
143
+ }
144
+ else if (!this.isProcessing) {
145
+ clearInterval(progressInterval);
146
+ }
147
+ }, PROTOCOL.KEEPALIVE_INTERVAL);
148
+ return { interval: progressInterval, progressToken };
149
+ }
150
+ stopProgressUpdates(progressData, success = true) {
151
+ const operationName = this.currentOperationName;
152
+ this.isProcessing = false;
153
+ this.currentOperationName = '';
154
+ clearInterval(progressData.interval);
155
+ if (progressData.progressToken) {
156
+ this.sendProgressNotification(progressData.progressToken, 100, 100, success ? `${operationName} completed successfully` : `${operationName} failed`);
157
+ }
158
+ }
159
+ async start() {
160
+ Logger.debug(`Starting ${this.config.name} v${this.config.version}`);
161
+ const transport = new StdioServerTransport();
162
+ await this.server.connect(transport);
163
+ Logger.debug(`${this.config.name} listening on stdio`);
164
+ }
165
+ }
166
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const analyzeMediaTool: UnifiedTool;
3
+ //# sourceMappingURL=analyze-media.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-media.tool.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-media.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA0B5C,eAAO,MAAM,gBAAgB,EAAE,WAuG9B,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { z } from 'zod';
2
+ import { executeCommand } from '../utils/commandExecutor.js';
3
+ import { CLI, MODELS, ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
4
+ import { Logger } from '../utils/logger.js';
5
+ const analyzeMediaArgsSchema = z.object({
6
+ filePath: z
7
+ .string()
8
+ .min(1)
9
+ .describe('Path to the image or PDF file to analyze. Use @ syntax (e.g., @image.png, @document.pdf)'),
10
+ prompt: z
11
+ .string()
12
+ .min(1)
13
+ .describe('What to analyze or extract from the media file'),
14
+ model: z
15
+ .string()
16
+ .optional()
17
+ .describe('Model to use (default: gemini-3-pro-preview for multimodal)'),
18
+ detailed: z
19
+ .boolean()
20
+ .default(false)
21
+ .describe('Provide detailed analysis with more context'),
22
+ });
23
+ export const analyzeMediaTool = {
24
+ name: 'analyze-media',
25
+ description: 'Analyze images, PDFs, or other media files using Gemini multimodal capabilities. Supports screenshots, diagrams, documents, and more.',
26
+ zodSchema: analyzeMediaArgsSchema,
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ filePath: {
31
+ type: 'string',
32
+ description: 'Path to the image or PDF file to analyze. Use @ syntax (e.g., @image.png, @document.pdf)',
33
+ },
34
+ prompt: {
35
+ type: 'string',
36
+ description: 'What to analyze or extract from the media file',
37
+ },
38
+ model: {
39
+ type: 'string',
40
+ description: 'Model to use (default: gemini-3-pro-preview for multimodal)',
41
+ },
42
+ detailed: {
43
+ type: 'boolean',
44
+ default: false,
45
+ description: 'Provide detailed analysis with more context',
46
+ },
47
+ },
48
+ required: ['filePath', 'prompt'],
49
+ },
50
+ prompt: {
51
+ description: 'Analyze media files (images, PDFs) using Gemini multimodal AI',
52
+ },
53
+ category: 'gemini',
54
+ execute: async (args, onProgress) => {
55
+ const { filePath, prompt, model, detailed } = args;
56
+ if (!filePath?.toString().trim()) {
57
+ throw new Error('Please provide a file path to analyze');
58
+ }
59
+ if (!prompt?.toString().trim()) {
60
+ throw new Error('Please provide a prompt describing what to analyze');
61
+ }
62
+ // Ensure @ prefix for file reference
63
+ const fileRef = filePath.startsWith('@')
64
+ ? filePath
65
+ : `@${filePath}`;
66
+ const analysisPrompt = detailed
67
+ ? `Analyze this file in detail: ${fileRef}\n\nProvide a comprehensive analysis including:\n1. Overview/Summary\n2. Key elements and their significance\n3. Technical details (if applicable)\n4. Notable observations\n5. Recommendations or insights\n\nUser request: ${prompt}`
68
+ : `Analyze: ${fileRef}\n\n${prompt}`;
69
+ const cmdArgs = [];
70
+ // Use Gemini 3 Pro by default for better multimodal understanding
71
+ cmdArgs.push(CLI.FLAGS.MODEL, model || MODELS.PRO);
72
+ cmdArgs.push(CLI.FLAGS.PROMPT, analysisPrompt);
73
+ try {
74
+ Logger.debug(`Analyzing media: ${fileRef}`);
75
+ const result = await executeCommand(CLI.COMMANDS.GEMINI, cmdArgs, onProgress);
76
+ return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n\n**File:** ${fileRef}\n\n${result}`;
77
+ }
78
+ catch (error) {
79
+ const errorMessage = error instanceof Error ? error.message : String(error);
80
+ // Fallback to flash if pro quota exceeded
81
+ if (errorMessage.includes(ERROR_MESSAGES.QUOTA_EXCEEDED) &&
82
+ model !== MODELS.FLASH) {
83
+ Logger.warn('Pro quota exceeded, trying Flash model...');
84
+ const fallbackArgs = [
85
+ CLI.FLAGS.MODEL,
86
+ MODELS.FLASH,
87
+ CLI.FLAGS.PROMPT,
88
+ analysisPrompt,
89
+ ];
90
+ try {
91
+ const result = await executeCommand(CLI.COMMANDS.GEMINI, fallbackArgs, onProgress);
92
+ return `${STATUS_MESSAGES.GEMINI_RESPONSE} (using Flash model)\n\n**File:** ${fileRef}\n\n${result}`;
93
+ }
94
+ catch (fallbackError) {
95
+ throw new Error(`Media analysis failed: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
96
+ }
97
+ }
98
+ throw new Error(`Media analysis failed: ${errorMessage}`);
99
+ }
100
+ },
101
+ };
102
+ //# sourceMappingURL=analyze-media.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-media.tool.js","sourceRoot":"","sources":["../../src/tools/analyze-media.tool.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;AA0C5C,eAAO,MAAM,aAAa,EAAE,WAgF3B,CAAC"}
@@ -0,0 +1,86 @@
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
6
+ .string()
7
+ .min(1)
8
+ .describe("Analysis request. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions"),
9
+ model: z
10
+ .string()
11
+ .optional()
12
+ .describe("Optional model to use (e.g., 'gemini-3-flash-preview'). If not specified, uses the default model (gemini-3-pro-preview)."),
13
+ sandbox: z
14
+ .boolean()
15
+ .default(false)
16
+ .describe('Use sandbox mode (-s flag) to safely test code changes, execute scripts, or run potentially risky operations in an isolated environment'),
17
+ changeMode: z
18
+ .boolean()
19
+ .default(false)
20
+ .describe('Enable structured change mode - formats prompts to prevent tool errors and returns structured edit suggestions that Claude can apply directly'),
21
+ chunkIndex: z
22
+ .union([z.number(), z.string()])
23
+ .optional()
24
+ .describe('Which chunk to return (1-based)'),
25
+ chunkCacheKey: z
26
+ .string()
27
+ .optional()
28
+ .describe('Optional cache key for continuation'),
29
+ });
30
+ export const askGeminiTool = {
31
+ name: 'gemini',
32
+ description: 'Query Gemini AI. Supports model selection, sandbox mode for safe code execution, and structured change mode for applying edits.',
33
+ zodSchema: askGeminiArgsSchema,
34
+ inputSchema: {
35
+ type: 'object',
36
+ properties: {
37
+ prompt: {
38
+ type: 'string',
39
+ description: "Analysis request. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions",
40
+ },
41
+ model: {
42
+ type: 'string',
43
+ description: "Optional model to use (e.g., 'gemini-3-flash-preview'). If not specified, uses the default model (gemini-3-pro-preview).",
44
+ },
45
+ sandbox: {
46
+ type: 'boolean',
47
+ default: false,
48
+ description: 'Use sandbox mode (-s flag) to safely test code changes, execute scripts, or run potentially risky operations in an isolated environment',
49
+ },
50
+ changeMode: {
51
+ type: 'boolean',
52
+ default: false,
53
+ description: 'Enable structured change mode - formats prompts to prevent tool errors and returns structured edit suggestions that Claude can apply directly',
54
+ },
55
+ chunkIndex: {
56
+ type: ['number', 'string'],
57
+ description: 'Which chunk to return (1-based)',
58
+ },
59
+ chunkCacheKey: {
60
+ type: 'string',
61
+ description: 'Optional cache key for continuation',
62
+ },
63
+ },
64
+ required: ['prompt'],
65
+ },
66
+ prompt: {
67
+ description: 'Query Gemini AI with optional sandbox execution and structured change mode.',
68
+ },
69
+ category: 'gemini',
70
+ execute: async (args, onProgress) => {
71
+ const { prompt, model, sandbox, changeMode, chunkIndex, chunkCacheKey } = args;
72
+ if (!prompt?.trim()) {
73
+ throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
74
+ }
75
+ if (changeMode && chunkIndex && chunkCacheKey) {
76
+ return processChangeModeOutput('', // empty for cache...
77
+ chunkIndex, chunkCacheKey, prompt);
78
+ }
79
+ const result = await executeGeminiCLI(prompt, model, !!sandbox, !!changeMode, onProgress);
80
+ if (changeMode) {
81
+ return processChangeModeOutput(result, args.chunkIndex, undefined, prompt);
82
+ }
83
+ return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n${result}`; // changeMode false
84
+ },
85
+ };
86
+ //# 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;AA2L5C,eAAO,MAAM,cAAc,EAAE,WA+G5B,CAAC"}
@@ -0,0 +1,220 @@
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
+ ? `
31
+ ## Analysis Framework
32
+ For each idea, provide:
33
+ - **Feasibility:** Implementation difficulty (1-5 scale)
34
+ - **Impact:** Potential value/benefit (1-5 scale)
35
+ - **Innovation:** Uniqueness/creativity (1-5 scale)
36
+ - **Quick Assessment:** One-sentence evaluation
37
+ `
38
+ : ''}
39
+
40
+ ## Format
41
+ Present ideas in a structured format:
42
+
43
+ ### Idea [N]: [Creative Name]
44
+ **Description:** [2-3 sentence explanation]
45
+ ${includeAnalysis ? '**Feasibility:** [1-5] | **Impact:** [1-5] | **Innovation:** [1-5]\n**Assessment:** [Brief evaluation]' : ''}
46
+
47
+ ---
48
+
49
+ **Before finalizing, review the list: remove near-duplicates and ensure each idea satisfies the constraints.**
50
+
51
+ Begin brainstorming session:`;
52
+ return enhancedPrompt;
53
+ }
54
+ /**
55
+ * Returns methodology-specific instructions for structured brainstorming
56
+ */
57
+ function getMethodologyInstructions(methodology, domain) {
58
+ const methodologies = {
59
+ divergent: `**Divergent Thinking Approach:**
60
+ - Generate maximum quantity of ideas without self-censoring
61
+ - Build on wild or seemingly impractical ideas
62
+ - Combine unrelated concepts for unexpected solutions
63
+ - Use "Yes, and..." thinking to expand each concept
64
+ - Postpone evaluation until all ideas are generated`,
65
+ convergent: `**Convergent Thinking Approach:**
66
+ - Focus on refining and improving existing concepts
67
+ - Synthesize related ideas into stronger solutions
68
+ - Apply critical evaluation criteria
69
+ - Prioritize based on feasibility and impact
70
+ - Develop implementation pathways for top ideas`,
71
+ scamper: `**SCAMPER Creative Triggers:**
72
+ - **Substitute:** What can be substituted or replaced?
73
+ - **Combine:** What can be combined or merged?
74
+ - **Adapt:** What can be adapted from other domains?
75
+ - **Modify:** What can be magnified, minimized, or altered?
76
+ - **Put to other use:** How else can this be used?
77
+ - **Eliminate:** What can be removed or simplified?
78
+ - **Reverse:** What can be rearranged or reversed?`,
79
+ 'design-thinking': `**Human-Centered Design Thinking:**
80
+ - **Empathize:** Consider user needs, pain points, and contexts
81
+ - **Define:** Frame problems from user perspective
82
+ - **Ideate:** Generate user-focused solutions
83
+ - **Consider Journey:** Think through complete user experience
84
+ - **Prototype Mindset:** Focus on testable, iterative concepts`,
85
+ lateral: `**Lateral Thinking Approach:**
86
+ - Make unexpected connections between unrelated fields
87
+ - Challenge fundamental assumptions
88
+ - Use random word association to trigger new directions
89
+ - Apply metaphors and analogies from other domains
90
+ - Reverse conventional thinking patterns`,
91
+ auto: `**AI-Optimized Approach:**
92
+ ${domain ? `Given the ${domain} domain, I'll apply the most effective combination of:` : "I'll intelligently combine multiple methodologies:"}
93
+ - Divergent exploration with domain-specific knowledge
94
+ - SCAMPER triggers and lateral thinking
95
+ - Human-centered perspective for practical value`,
96
+ };
97
+ return methodologies[methodology] || methodologies['auto'];
98
+ }
99
+ const brainstormArgsSchema = z.object({
100
+ prompt: z
101
+ .string()
102
+ .min(1)
103
+ .describe('Primary brainstorming challenge or question to explore'),
104
+ model: z
105
+ .string()
106
+ .optional()
107
+ .describe("Optional model to use (e.g., 'gemini-3-flash-preview'). If not specified, uses the default model (gemini-3-pro-preview)."),
108
+ methodology: z
109
+ .enum([
110
+ 'divergent',
111
+ 'convergent',
112
+ 'scamper',
113
+ 'design-thinking',
114
+ 'lateral',
115
+ 'auto',
116
+ ])
117
+ .default('auto')
118
+ .describe("Brainstorming framework: 'divergent' (generate many ideas), 'convergent' (refine existing), 'scamper' (systematic triggers), 'design-thinking' (human-centered), 'lateral' (unexpected connections), 'auto' (AI selects best)"),
119
+ domain: z
120
+ .string()
121
+ .optional()
122
+ .describe("Domain context for specialized brainstorming (e.g., 'software', 'business', 'creative', 'research', 'product', 'marketing')"),
123
+ constraints: z
124
+ .string()
125
+ .optional()
126
+ .describe('Known limitations, requirements, or boundaries (budget, time, technical, legal, etc.)'),
127
+ existingContext: z
128
+ .string()
129
+ .optional()
130
+ .describe('Background information, previous attempts, or current state to build upon'),
131
+ ideaCount: z
132
+ .number()
133
+ .int()
134
+ .positive()
135
+ .default(12)
136
+ .describe('Target number of ideas to generate (default: 10-15)'),
137
+ includeAnalysis: z
138
+ .boolean()
139
+ .default(true)
140
+ .describe('Include feasibility, impact, and implementation analysis for generated ideas'),
141
+ });
142
+ export const brainstormTool = {
143
+ name: 'brainstorm',
144
+ description: 'Generate creative ideas using structured frameworks (SCAMPER, Design Thinking, etc.) with domain context, feasibility analysis, and iterative refinement.',
145
+ zodSchema: brainstormArgsSchema,
146
+ inputSchema: {
147
+ type: 'object',
148
+ properties: {
149
+ prompt: {
150
+ type: 'string',
151
+ description: 'Primary brainstorming challenge or question to explore',
152
+ },
153
+ model: {
154
+ type: 'string',
155
+ description: "Optional model to use (e.g., 'gemini-3-flash-preview'). If not specified, uses the default model (gemini-3-pro-preview).",
156
+ },
157
+ methodology: {
158
+ type: 'string',
159
+ enum: [
160
+ 'divergent',
161
+ 'convergent',
162
+ 'scamper',
163
+ 'design-thinking',
164
+ 'lateral',
165
+ 'auto',
166
+ ],
167
+ default: 'auto',
168
+ description: "Brainstorming framework: 'divergent' (generate many ideas), 'convergent' (refine existing), 'scamper' (systematic triggers), 'design-thinking' (human-centered), 'lateral' (unexpected connections), 'auto' (AI selects best)",
169
+ },
170
+ domain: {
171
+ type: 'string',
172
+ description: "Domain context for specialized brainstorming (e.g., 'software', 'business', 'creative', 'research', 'product', 'marketing')",
173
+ },
174
+ constraints: {
175
+ type: 'string',
176
+ description: 'Known limitations, requirements, or boundaries (budget, time, technical, legal, etc.)',
177
+ },
178
+ existingContext: {
179
+ type: 'string',
180
+ description: 'Background information, previous attempts, or current state to build upon',
181
+ },
182
+ ideaCount: {
183
+ type: 'integer',
184
+ default: 12,
185
+ description: 'Target number of ideas to generate (default: 10-15)',
186
+ },
187
+ includeAnalysis: {
188
+ type: 'boolean',
189
+ default: true,
190
+ description: 'Include feasibility, impact, and implementation analysis for generated ideas',
191
+ },
192
+ },
193
+ required: ['prompt'],
194
+ },
195
+ prompt: {
196
+ description: 'Generate creative ideas using structured brainstorming methodologies.',
197
+ },
198
+ category: 'gemini',
199
+ execute: async (args, onProgress) => {
200
+ const { prompt, model, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true, } = args;
201
+ if (!prompt?.trim()) {
202
+ throw new Error('You must provide a valid brainstorming challenge or question to explore');
203
+ }
204
+ let enhancedPrompt = buildBrainstormPrompt({
205
+ prompt: prompt.trim(),
206
+ methodology: methodology,
207
+ domain: domain,
208
+ constraints: constraints,
209
+ existingContext: existingContext,
210
+ ideaCount: ideaCount,
211
+ includeAnalysis: includeAnalysis,
212
+ });
213
+ Logger.debug(`Brainstorm: Using methodology '${methodology}' for domain '${domain || 'general'}'`);
214
+ // Report progress to user
215
+ onProgress?.(`Generating ${ideaCount} ideas via ${methodology} methodology...`);
216
+ // Execute with Gemini
217
+ return await executeGeminiCLI(enhancedPrompt, model, false, false, onProgress);
218
+ },
219
+ };
220
+ //# 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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"}