gemini-as-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.
- package/LICENSE +28 -0
- package/README.md +303 -0
- package/dist/constants.d.ts +74 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +73 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +187 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +36 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +136 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/codebase-tools.d.ts +4 -0
- package/dist/tools/codebase-tools.d.ts.map +1 -0
- package/dist/tools/codebase-tools.js +104 -0
- package/dist/tools/codebase-tools.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +62 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +80 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +4 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +32 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +32 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/tools/web-tools.d.ts +4 -0
- package/dist/tools/web-tools.d.ts.map +1 -0
- package/dist/tools/web-tools.js +78 -0
- package/dist/tools/web-tools.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +161 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +74 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +3 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +170 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAgB5C,eAAO,MAAM,aAAa,EAAE,WAsC3B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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. Supports: 1) @ syntax for files/dirs (e.g., '@src/' or '@file.js'), 2) Web search ('search for latest React 19 features'), 3) URL fetching ('summarize https://example.com'), 4) Code execution in sandbox mode, 5) General questions. Gemini automatically uses web_search and web_fetch tools when needed."),
|
|
6
|
+
model: z.string().optional().describe("Optional model to use (e.g., 'gemini-2.5-flash'). If not specified, uses the default model (gemini-2.5-pro)."),
|
|
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
|
+
});
|
|
12
|
+
export const askGeminiTool = {
|
|
13
|
+
name: "ask-gemini",
|
|
14
|
+
description: "Ask Gemini with massive 2M+ token context. Automatically uses built-in tools: web search, URL fetching, file analysis via @ syntax. Supports sandbox mode for code execution and changeMode for structured edits.",
|
|
15
|
+
zodSchema: askGeminiArgsSchema,
|
|
16
|
+
prompt: {
|
|
17
|
+
description: "Execute Gemini CLI with your prompt. Gemini automatically uses web_search for current info, web_fetch for URLs, and processes files via @ syntax. Ideal for: large codebase analysis, fetching latest docs/APIs, web research, and code execution.",
|
|
18
|
+
},
|
|
19
|
+
category: 'gemini',
|
|
20
|
+
execute: async (args, onProgress) => {
|
|
21
|
+
const { prompt, model, sandbox, changeMode, chunkIndex, chunkCacheKey } = args;
|
|
22
|
+
if (!prompt?.trim()) {
|
|
23
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
24
|
+
}
|
|
25
|
+
if (changeMode && chunkIndex && chunkCacheKey) {
|
|
26
|
+
return processChangeModeOutput('', // empty for cache...
|
|
27
|
+
chunkIndex, chunkCacheKey, prompt);
|
|
28
|
+
}
|
|
29
|
+
const result = await executeGeminiCLI(prompt, model, !!sandbox, !!changeMode, onProgress);
|
|
30
|
+
if (changeMode) {
|
|
31
|
+
return processChangeModeOutput(result, args.chunkIndex, undefined, prompt);
|
|
32
|
+
}
|
|
33
|
+
return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n${result}`; // changeMode false
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
//# 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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACvF,OAAO,EACL,cAAc,EACd,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gUAAgU,CAAC;IACpW,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8GAA8G,CAAC;IACrJ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,yIAAyI,CAAC;IACvL,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,+IAA+I,CAAC;IAChM,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACpG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACrF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,mNAAmN;IAChO,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE;QACN,WAAW,EAAE,oPAAoP;KAClQ;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAAC,CAAC;QAE5J,IAAI,UAAU,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;YAC9C,OAAO,uBAAuB,CAC5B,EAAE,EAAE,qBAAqB;YACzB,UAAoB,EACpB,aAAuB,EACvB,MAAgB,CACjB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,MAAgB,EAChB,KAA2B,EAC3B,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,UAAU,EACZ,UAAU,CACX,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,uBAAuB,CAC5B,MAAM,EACN,IAAI,CAAC,UAAgC,EACrC,SAAS,EACT,MAAgB,CACjB,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,eAAe,CAAC,eAAe,KAAK,MAAM,EAAE,CAAC,CAAC,mBAAmB;IAC7E,CAAC;CACF,CAAC"}
|
|
@@ -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;AA+H5C,eAAO,MAAM,cAAc,EAAE,WA0C5B,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
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-2.5-flash'). If not specified, uses the default model (gemini-2.5-pro)."),
|
|
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
|
+
});
|
|
107
|
+
export const brainstormTool = {
|
|
108
|
+
name: "brainstorm",
|
|
109
|
+
description: "Generate novel ideas with dynamic context gathering. --> Creative frameworks (SCAMPER, Design Thinking, etc.), domain context integration, idea clustering, feasibility analysis, and iterative refinement.",
|
|
110
|
+
zodSchema: brainstormArgsSchema,
|
|
111
|
+
prompt: {
|
|
112
|
+
description: "Generate structured brainstorming prompt with methodology-driven ideation, domain context integration, and analytical evaluation framework",
|
|
113
|
+
},
|
|
114
|
+
category: 'gemini',
|
|
115
|
+
execute: async (args, onProgress) => {
|
|
116
|
+
const { prompt, model, methodology = 'auto', domain, constraints, existingContext, ideaCount = 12, includeAnalysis = true } = args;
|
|
117
|
+
if (!prompt?.trim()) {
|
|
118
|
+
throw new Error("You must provide a valid brainstorming challenge or question to explore");
|
|
119
|
+
}
|
|
120
|
+
let enhancedPrompt = buildBrainstormPrompt({
|
|
121
|
+
prompt: prompt.trim(),
|
|
122
|
+
methodology: methodology,
|
|
123
|
+
domain: domain,
|
|
124
|
+
constraints: constraints,
|
|
125
|
+
existingContext: existingContext,
|
|
126
|
+
ideaCount: ideaCount,
|
|
127
|
+
includeAnalysis: includeAnalysis
|
|
128
|
+
});
|
|
129
|
+
Logger.debug(`Brainstorm: Using methodology '${methodology}' for domain '${domain || 'general'}'`);
|
|
130
|
+
// Report progress to user
|
|
131
|
+
onProgress?.(`Generating ${ideaCount} ideas via ${methodology} methodology...`);
|
|
132
|
+
// Execute with Gemini
|
|
133
|
+
return await executeGeminiCLI(enhancedPrompt, model, false, false, onProgress);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"codebase-tools.d.ts","sourceRoot":"","sources":["../../src/tools/codebase-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,eAAO,MAAM,oBAAoB,EAAE,WAgDlC,CAAC;AAUF,eAAO,MAAM,8BAA8B,EAAE,WA4D5C,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeGeminiCLI } from '../utils/geminiExecutor.js';
|
|
3
|
+
import { ERROR_MESSAGES, STATUS_MESSAGES } from '../constants.js';
|
|
4
|
+
// Codebase Analysis Tool - Optimized for large codebase analysis
|
|
5
|
+
const codebaseAnalysisArgsSchema = z.object({
|
|
6
|
+
paths: z.union([z.string(), z.array(z.string())]).describe("File or directory paths to analyze. Use @ syntax: '@src/', '@package.json', '@./'. Can be single path or array of paths."),
|
|
7
|
+
question: z.string().describe("What you want to know about the codebase (e.g., 'explain the architecture', 'find all API endpoints', 'summarize the auth flow')"),
|
|
8
|
+
model: z.string().optional().describe("Optional model to use (default: gemini-2.5-pro)"),
|
|
9
|
+
});
|
|
10
|
+
export const codebaseAnalysisTool = {
|
|
11
|
+
name: "analyze-codebase",
|
|
12
|
+
description: "Analyze large codebases using Gemini's 2M+ token context window. Handles entire directories, multiple files, or whole projects. Perfect for: understanding architecture, finding patterns, analyzing dependencies, code review.",
|
|
13
|
+
zodSchema: codebaseAnalysisArgsSchema,
|
|
14
|
+
prompt: {
|
|
15
|
+
description: "Use Gemini to analyze entire codebases or large files that would exceed Claude's context. Gemini reads all files and provides comprehensive analysis.",
|
|
16
|
+
},
|
|
17
|
+
category: 'gemini',
|
|
18
|
+
execute: async (args, onProgress) => {
|
|
19
|
+
const { paths, question, model } = args;
|
|
20
|
+
if (!paths) {
|
|
21
|
+
throw new Error("Paths are required");
|
|
22
|
+
}
|
|
23
|
+
if (!question || typeof question !== 'string' || !question.trim()) {
|
|
24
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
25
|
+
}
|
|
26
|
+
// Convert to array if single path
|
|
27
|
+
const pathArray = Array.isArray(paths) ? paths : [paths];
|
|
28
|
+
// Ensure paths use @ syntax
|
|
29
|
+
const formattedPaths = pathArray.map(p => {
|
|
30
|
+
const trimmed = p.trim();
|
|
31
|
+
return trimmed.startsWith('@') ? trimmed : `@${trimmed}`;
|
|
32
|
+
});
|
|
33
|
+
// Build comprehensive prompt
|
|
34
|
+
const pathsList = formattedPaths.join(' ');
|
|
35
|
+
const prompt = `${pathsList}
|
|
36
|
+
|
|
37
|
+
Analyze the above codebase and answer the following:
|
|
38
|
+
|
|
39
|
+
${question}
|
|
40
|
+
|
|
41
|
+
Please provide a comprehensive analysis with specific file references, code examples where relevant, and clear explanations.`;
|
|
42
|
+
const result = await executeGeminiCLI(prompt, model, false, // no sandbox
|
|
43
|
+
false, // no changeMode
|
|
44
|
+
onProgress);
|
|
45
|
+
return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n\n${result}`;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
// Implementation Verification Tool
|
|
49
|
+
const implementationVerificationArgsSchema = z.object({
|
|
50
|
+
paths: z.union([z.string(), z.array(z.string())]).describe("Directories/files to search in. Use @ syntax: '@src/', '@lib/', '@./'. Can be single path or array."),
|
|
51
|
+
feature: z.string().describe("Feature or pattern to check for (e.g., 'JWT authentication', 'dark mode', 'rate limiting', 'WebSocket connections', 'Redis caching')"),
|
|
52
|
+
details: z.string().optional().describe("Optional: Specific aspects to verify (e.g., 'Show me the middleware functions', 'List all endpoints', 'Check error handling')"),
|
|
53
|
+
model: z.string().optional().describe("Optional model to use (default: gemini-2.5-pro)"),
|
|
54
|
+
});
|
|
55
|
+
export const implementationVerificationTool = {
|
|
56
|
+
name: "verify-implementation",
|
|
57
|
+
description: "Verify if features, patterns, or security measures are implemented in a codebase. Uses Gemini's large context to search entire project. Returns specific files, functions, and implementation details.",
|
|
58
|
+
zodSchema: implementationVerificationArgsSchema,
|
|
59
|
+
prompt: {
|
|
60
|
+
description: "Check if specific features, coding patterns, or security measures exist in your codebase. Gemini searches through all files and provides detailed findings with file paths.",
|
|
61
|
+
},
|
|
62
|
+
category: 'gemini',
|
|
63
|
+
execute: async (args, onProgress) => {
|
|
64
|
+
const { paths, feature, details, model } = args;
|
|
65
|
+
if (!paths) {
|
|
66
|
+
throw new Error("Paths are required");
|
|
67
|
+
}
|
|
68
|
+
if (!feature || typeof feature !== 'string' || !feature.trim()) {
|
|
69
|
+
throw new Error("Feature to verify is required");
|
|
70
|
+
}
|
|
71
|
+
// Convert to array if single path
|
|
72
|
+
const pathArray = Array.isArray(paths) ? paths : [paths];
|
|
73
|
+
// Ensure paths use @ syntax
|
|
74
|
+
const formattedPaths = pathArray.map(p => {
|
|
75
|
+
const trimmed = p.trim();
|
|
76
|
+
return trimmed.startsWith('@') ? trimmed : `@${trimmed}`;
|
|
77
|
+
});
|
|
78
|
+
// Build verification prompt
|
|
79
|
+
const pathsList = formattedPaths.join(' ');
|
|
80
|
+
const detailsSection = details ? `\n\nSpecific aspects to check: ${details}` : '';
|
|
81
|
+
const prompt = `${pathsList}
|
|
82
|
+
|
|
83
|
+
TASK: Verify if the following feature/pattern is implemented in the codebase:
|
|
84
|
+
"${feature}"${detailsSection}
|
|
85
|
+
|
|
86
|
+
Please provide:
|
|
87
|
+
1. YES/NO answer with confidence level
|
|
88
|
+
2. If YES:
|
|
89
|
+
- List all relevant files with exact paths
|
|
90
|
+
- Show specific functions, classes, or components involved
|
|
91
|
+
- Provide code snippets demonstrating the implementation
|
|
92
|
+
- Explain how it's implemented
|
|
93
|
+
3. If NO or PARTIAL:
|
|
94
|
+
- Explain what's missing
|
|
95
|
+
- Suggest what would be needed for full implementation
|
|
96
|
+
|
|
97
|
+
Be specific and thorough. Include file paths and line numbers where possible.`;
|
|
98
|
+
const result = await executeGeminiCLI(prompt, model, false, // no sandbox
|
|
99
|
+
false, // no changeMode
|
|
100
|
+
onProgress);
|
|
101
|
+
return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n\n${result}`;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=codebase-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebase-tools.js","sourceRoot":"","sources":["../../src/tools/codebase-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,WAoE5B,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
execute: async (args, onProgress) => {
|
|
25
|
+
const { cacheKey, chunkIndex } = args;
|
|
26
|
+
Logger.toolInvocation('fetch-chunk', args);
|
|
27
|
+
Logger.debug(`Fetching chunk ${chunkIndex} with cache key: ${cacheKey}`);
|
|
28
|
+
// Retrieve cached chunks
|
|
29
|
+
const chunks = getChunks(cacheKey);
|
|
30
|
+
if (!chunks) {
|
|
31
|
+
return `❌ Cache miss: No chunks found for cache key "${cacheKey}".
|
|
32
|
+
|
|
33
|
+
Possible reasons:
|
|
34
|
+
1. The cache key is incorrect, Have you ran ask-gemini with changeMode enabled?
|
|
35
|
+
2. The cache has expired (10 minute TTL)
|
|
36
|
+
3. The MCP server was restarted and the file-based cache was cleared
|
|
37
|
+
|
|
38
|
+
Please re-run the original changeMode request to regenerate the chunks.`;
|
|
39
|
+
}
|
|
40
|
+
// Validate chunk index
|
|
41
|
+
if (chunkIndex < 1 || chunkIndex > chunks.length) {
|
|
42
|
+
return `❌ Invalid chunk index: ${chunkIndex}
|
|
43
|
+
|
|
44
|
+
Available chunks: 1 to ${chunks.length}
|
|
45
|
+
You requested: ${chunkIndex}
|
|
46
|
+
|
|
47
|
+
Please use a valid chunk index.`;
|
|
48
|
+
}
|
|
49
|
+
// Get the requested chunk
|
|
50
|
+
const chunk = chunks[chunkIndex - 1];
|
|
51
|
+
// Format the response
|
|
52
|
+
let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: chunks.length, cacheKey });
|
|
53
|
+
// Add summary for first chunk
|
|
54
|
+
if (chunkIndex === 1 && chunks.length > 1) {
|
|
55
|
+
const allEdits = chunks.flatMap(c => c.edits);
|
|
56
|
+
result = summarizeChangeModeEdits(allEdits, true) + '\n\n' + result;
|
|
57
|
+
}
|
|
58
|
+
Logger.debug(`Returning chunk ${chunkIndex} of ${chunks.length} with ${chunk.edits.length} edits`);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
//# 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;IAEnB,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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAuBA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Tool Registry Index - Registers all tools
|
|
2
|
+
import { toolRegistry } from './registry.js';
|
|
3
|
+
import { askGeminiTool } from './ask-gemini.tool.js';
|
|
4
|
+
import { pingTool, helpTool } from './simple-tools.js';
|
|
5
|
+
import { brainstormTool } from './brainstorm.tool.js';
|
|
6
|
+
import { fetchChunkTool } from './fetch-chunk.tool.js';
|
|
7
|
+
import { timeoutTestTool } from './timeout-test.tool.js';
|
|
8
|
+
import { webSearchTool, webFetchTool } from './web-tools.js';
|
|
9
|
+
import { codebaseAnalysisTool, implementationVerificationTool } from './codebase-tools.js';
|
|
10
|
+
toolRegistry.push(askGeminiTool, webSearchTool, webFetchTool, codebaseAnalysisTool, implementationVerificationTool, pingTool, helpTool, brainstormTool, fetchChunkTool, timeoutTestTool);
|
|
11
|
+
export * from './registry.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAE3F,YAAY,CAAC,IAAI,CACf,aAAa,EACb,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,8BAA8B,EAC9B,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,cAAc,EACd,eAAe,CAChB,CAAC;AAEF,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Tool, Prompt } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { ToolArguments } from "../constants.js";
|
|
3
|
+
import { ZodTypeAny } from "zod";
|
|
4
|
+
export interface UnifiedTool {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
zodSchema: ZodTypeAny;
|
|
8
|
+
prompt?: {
|
|
9
|
+
description: string;
|
|
10
|
+
arguments?: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
required: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
};
|
|
16
|
+
execute: (args: ToolArguments, onProgress?: (newOutput: string) => void) => Promise<string>;
|
|
17
|
+
category?: 'simple' | 'gemini' | 'utility';
|
|
18
|
+
}
|
|
19
|
+
export declare const toolRegistry: UnifiedTool[];
|
|
20
|
+
export declare function toolExists(toolName: string): boolean;
|
|
21
|
+
export declare function getToolDefinitions(): Tool[];
|
|
22
|
+
export declare function getPromptDefinitions(): Prompt[];
|
|
23
|
+
export declare function executeTool(toolName: string, args: ToolArguments, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
24
|
+
export declare function getPromptMessage(toolName: string, args: Record<string, any>): string;
|
|
25
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAY,MAAM,KAAK,CAAC;AAG3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IAEtB,MAAM,CAAC,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5F,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAC9C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AACD,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAgB3C;AAcD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAQ/C;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlI;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAsBpF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ZodError } from "zod";
|
|
2
|
+
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
3
|
+
export const toolRegistry = [];
|
|
4
|
+
export function toolExists(toolName) {
|
|
5
|
+
return toolRegistry.some(t => t.name === toolName);
|
|
6
|
+
}
|
|
7
|
+
export function getToolDefinitions() {
|
|
8
|
+
return toolRegistry.map(tool => {
|
|
9
|
+
const raw = zodToJsonSchema(tool.zodSchema, tool.name);
|
|
10
|
+
const def = raw.definitions?.[tool.name] ?? raw;
|
|
11
|
+
const inputSchema = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: def.properties || {},
|
|
14
|
+
required: def.required || [],
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
name: tool.name,
|
|
18
|
+
description: tool.description,
|
|
19
|
+
inputSchema,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function extractPromptArguments(zodSchema) {
|
|
24
|
+
const jsonSchema = zodToJsonSchema(zodSchema);
|
|
25
|
+
const properties = jsonSchema.properties || {};
|
|
26
|
+
const required = jsonSchema.required || [];
|
|
27
|
+
return Object.entries(properties).map(([name, prop]) => ({
|
|
28
|
+
name,
|
|
29
|
+
description: prop.description || `${name} parameter`,
|
|
30
|
+
required: required.includes(name)
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
export function getPromptDefinitions() {
|
|
34
|
+
return toolRegistry
|
|
35
|
+
.filter(tool => tool.prompt)
|
|
36
|
+
.map(tool => ({
|
|
37
|
+
name: tool.name,
|
|
38
|
+
description: tool.prompt.description,
|
|
39
|
+
arguments: tool.prompt.arguments || extractPromptArguments(tool.zodSchema),
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
export async function executeTool(toolName, args, onProgress) {
|
|
43
|
+
const tool = toolRegistry.find(t => t.name === toolName);
|
|
44
|
+
if (!tool) {
|
|
45
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const validatedArgs = tool.zodSchema.parse(args);
|
|
49
|
+
return tool.execute(validatedArgs, onProgress);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof ZodError) {
|
|
53
|
+
const issues = error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join(', ');
|
|
54
|
+
throw new Error(`Invalid arguments for ${toolName}: ${issues}`);
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function getPromptMessage(toolName, args) {
|
|
60
|
+
const tool = toolRegistry.find(t => t.name === toolName);
|
|
61
|
+
if (!tool?.prompt) {
|
|
62
|
+
throw new Error(`No prompt defined for tool: ${toolName}`);
|
|
63
|
+
}
|
|
64
|
+
const paramStrings = [];
|
|
65
|
+
if (args.prompt) {
|
|
66
|
+
paramStrings.push(args.prompt);
|
|
67
|
+
}
|
|
68
|
+
Object.entries(args).forEach(([key, value]) => {
|
|
69
|
+
if (key !== 'prompt' && value !== undefined && value !== null && value !== false) {
|
|
70
|
+
if (typeof value === 'boolean' && value) {
|
|
71
|
+
paramStrings.push(`[${key}]`);
|
|
72
|
+
}
|
|
73
|
+
else if (typeof value !== 'boolean') {
|
|
74
|
+
paramStrings.push(`(${key}: ${value})`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return `Use the ${toolName} tool${paramStrings.length > 0 ? ': ' + paramStrings.join(' ') : ''}`;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-tools.d.ts","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAO5C,eAAO,MAAM,QAAQ,EAAE,WAYtB,CAAC;AAIF,eAAO,MAAM,QAAQ,EAAE,WAWtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCommand } from '../utils/commandExecutor.js';
|
|
3
|
+
const pingArgsSchema = z.object({
|
|
4
|
+
prompt: z.string().default('').describe("Message to echo "),
|
|
5
|
+
});
|
|
6
|
+
export const pingTool = {
|
|
7
|
+
name: "ping",
|
|
8
|
+
description: "Echo",
|
|
9
|
+
zodSchema: pingArgsSchema,
|
|
10
|
+
prompt: {
|
|
11
|
+
description: "Echo test message with structured response.",
|
|
12
|
+
},
|
|
13
|
+
category: 'simple',
|
|
14
|
+
execute: async (args, onProgress) => {
|
|
15
|
+
const message = args.prompt || args.message || "Pong!";
|
|
16
|
+
return executeCommand("echo", [message], onProgress);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const helpArgsSchema = z.object({});
|
|
20
|
+
export const helpTool = {
|
|
21
|
+
name: "Help",
|
|
22
|
+
description: "receive help information",
|
|
23
|
+
zodSchema: helpArgsSchema,
|
|
24
|
+
prompt: {
|
|
25
|
+
description: "receive help information",
|
|
26
|
+
},
|
|
27
|
+
category: 'simple',
|
|
28
|
+
execute: async (args, onProgress) => {
|
|
29
|
+
return executeCommand("gemini", ["-help"], onProgress);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=simple-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-tools.js","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,6CAA6C;KAC3D;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACvD,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC,OAAiB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,0BAA0B;KACxC;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Adding a new tool with the unified registry
|
|
3
|
+
* To add this tool:
|
|
4
|
+
* 1. Rename this file to remove .example (test-tool.ts)
|
|
5
|
+
* 2. Import and register in src/tools/index.ts:
|
|
6
|
+
* import { testTool } from './test-tool.js';
|
|
7
|
+
* toolRegistry.push(testTool);
|
|
8
|
+
*
|
|
9
|
+
* That's it! No more editing multiple files.
|
|
10
|
+
*/
|
|
11
|
+
import { UnifiedTool } from './registry.js';
|
|
12
|
+
export declare const testTool: UnifiedTool;
|
|
13
|
+
//# sourceMappingURL=test-tool.example.d.ts.map
|