@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.
- package/LICENSE +25 -0
- package/README.md +381 -0
- package/dist/constants.d.ts +58 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +64 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +57 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +19 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +166 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyze-media.tool.d.ts +3 -0
- package/dist/tools/analyze-media.tool.d.ts.map +1 -0
- package/dist/tools/analyze-media.tool.js +102 -0
- package/dist/tools/analyze-media.tool.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 +86 -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 +220 -0
- package/dist/tools/brainstorm.tool.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 +85 -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 +19 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +26 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +74 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.tool.d.ts +3 -0
- package/dist/tools/search.tool.d.ts.map +1 -0
- package/dist/tools/search.tool.js +86 -0
- package/dist/tools/search.tool.js.map +1 -0
- package/dist/tools/shell.tool.d.ts +3 -0
- package/dist/tools/shell.tool.d.ts.map +1 -0
- package/dist/tools/shell.tool.js +106 -0
- package/dist/tools/shell.tool.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 +48 -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 +44 -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 +45 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.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 +95 -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 +73 -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 +163 -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 +182 -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 +1 -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 +68 -0
|
@@ -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;AAkB5C,eAAO,MAAM,cAAc,EAAE,WA0F5B,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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 fetchChunkArgsSchema = z.object({
|
|
6
|
+
cacheKey: z
|
|
7
|
+
.string()
|
|
8
|
+
.describe('The cache key provided in the initial changeMode response'),
|
|
9
|
+
chunkIndex: z
|
|
10
|
+
.number()
|
|
11
|
+
.min(1)
|
|
12
|
+
.describe('Which chunk to retrieve (1-based index)'),
|
|
13
|
+
});
|
|
14
|
+
export const fetchChunkTool = {
|
|
15
|
+
name: 'fetch-chunk',
|
|
16
|
+
description: 'Retrieves cached chunks from a changeMode response. Use this to get subsequent chunks after receiving a partial changeMode response.',
|
|
17
|
+
zodSchema: fetchChunkArgsSchema,
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
cacheKey: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'The cache key provided in the initial changeMode response',
|
|
24
|
+
},
|
|
25
|
+
chunkIndex: {
|
|
26
|
+
type: 'number',
|
|
27
|
+
description: 'Which chunk to retrieve (1-based index)',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ['cacheKey', 'chunkIndex'],
|
|
31
|
+
},
|
|
32
|
+
prompt: {
|
|
33
|
+
description: 'Fetch the next chunk of a response',
|
|
34
|
+
arguments: [
|
|
35
|
+
{
|
|
36
|
+
name: 'prompt',
|
|
37
|
+
description: 'fetch-chunk cacheKey=<key> chunkIndex=<number>',
|
|
38
|
+
required: true,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
category: 'utility',
|
|
43
|
+
execute: async (args, _onProgress) => {
|
|
44
|
+
const { cacheKey, chunkIndex } = args;
|
|
45
|
+
Logger.toolInvocation('fetch-chunk', args);
|
|
46
|
+
Logger.debug(`Fetching chunk ${chunkIndex} with cache key: ${cacheKey}`);
|
|
47
|
+
// Retrieve cached chunks
|
|
48
|
+
const chunks = getChunks(cacheKey);
|
|
49
|
+
if (!chunks) {
|
|
50
|
+
return `❌ Cache miss: No chunks found for cache key "${cacheKey}".
|
|
51
|
+
|
|
52
|
+
Possible reasons:
|
|
53
|
+
1. The cache key is incorrect, Have you ran ask-gemini with changeMode enabled?
|
|
54
|
+
2. The cache has expired (10 minute TTL)
|
|
55
|
+
3. The MCP server was restarted and the file-based cache was cleared
|
|
56
|
+
|
|
57
|
+
Please re-run the original changeMode request to regenerate the chunks.`;
|
|
58
|
+
}
|
|
59
|
+
// Validate chunk index
|
|
60
|
+
if (chunkIndex < 1 || chunkIndex > chunks.length) {
|
|
61
|
+
return `❌ Invalid chunk index: ${chunkIndex}
|
|
62
|
+
|
|
63
|
+
Available chunks: 1 to ${chunks.length}
|
|
64
|
+
You requested: ${chunkIndex}
|
|
65
|
+
|
|
66
|
+
Please use a valid chunk index.`;
|
|
67
|
+
}
|
|
68
|
+
// Get the requested chunk
|
|
69
|
+
const chunk = chunks[chunkIndex - 1];
|
|
70
|
+
// Format the response
|
|
71
|
+
let result = formatChangeModeResponse(chunk.edits, {
|
|
72
|
+
current: chunkIndex,
|
|
73
|
+
total: chunks.length,
|
|
74
|
+
cacheKey,
|
|
75
|
+
});
|
|
76
|
+
// Add summary for first chunk
|
|
77
|
+
if (chunkIndex === 1 && chunks.length > 1) {
|
|
78
|
+
const allEdits = chunks.flatMap((c) => c.edits);
|
|
79
|
+
result = summarizeChangeModeEdits(allEdits, true) + '\n\n' + result;
|
|
80
|
+
}
|
|
81
|
+
Logger.debug(`Returning chunk ${chunkIndex} of ${chunks.length} with ${chunk.edits.length} edits`);
|
|
82
|
+
return result;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
//# 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,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,2DAA2D,CAAC;IACxE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,yCAAyC,CAAC;CACvD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,sIAAsI;IAExI,SAAS,EAAE,oBAAoB;IAC/B,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,2DAA2D;aAC9D;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;KACrC;IAED,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,EACZ,IAAS,EACT,WAAyC,EACxB,EAAE;QACnB,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,CAAC,KAAK,CAAC,KAAK,EAAE;YACjD,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,QAAQ;SACT,CAAC,CAAC;QAEH,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,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;QACtE,CAAC;QAED,MAAM,CAAC,KAAK,CACV,mBAAmB,UAAU,OAAO,MAAM,CAAC,MAAM,SAAS,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CACrF,CAAC;QAEF,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":"AA4BA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 { searchTool } from './search.tool.js';
|
|
9
|
+
import { analyzeMediaTool } from './analyze-media.tool.js';
|
|
10
|
+
import { shellTool } from './shell.tool.js';
|
|
11
|
+
toolRegistry.push(
|
|
12
|
+
// Core Gemini tools
|
|
13
|
+
askGeminiTool, searchTool, analyzeMediaTool, shellTool, brainstormTool,
|
|
14
|
+
// Utility tools
|
|
15
|
+
fetchChunkTool, pingTool, helpTool,
|
|
16
|
+
// Testing tools
|
|
17
|
+
timeoutTestTool);
|
|
18
|
+
export * from './registry.js';
|
|
19
|
+
//# 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,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,YAAY,CAAC,IAAI;AACf,oBAAoB;AACpB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,cAAc;AAEd,gBAAgB;AAChB,cAAc,EACd,QAAQ,EACR,QAAQ;AAER,gBAAgB;AAChB,eAAe,CAChB,CAAC;AAEF,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
inputSchema: Tool['inputSchema'];
|
|
9
|
+
prompt?: {
|
|
10
|
+
description: string;
|
|
11
|
+
arguments?: Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
required: boolean;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
execute: (args: ToolArguments, onProgress?: (newOutput: string) => void) => Promise<string>;
|
|
18
|
+
category?: 'simple' | 'gemini' | 'utility';
|
|
19
|
+
}
|
|
20
|
+
export declare const toolRegistry: UnifiedTool[];
|
|
21
|
+
export declare function toolExists(toolName: string): boolean;
|
|
22
|
+
export declare function getToolDefinitions(): Tool[];
|
|
23
|
+
export declare function getPromptDefinitions(): Prompt[];
|
|
24
|
+
export declare function executeTool(toolName: string, args: ToolArguments, onProgress?: (newOutput: string) => void): Promise<string>;
|
|
25
|
+
export declare function getPromptMessage(toolName: string, args: Record<string, unknown>): string;
|
|
26
|
+
//# 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;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAY,MAAM,KAAK,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAEjC,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,CACP,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KACrC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAE9C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAM3C;AAkBD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAc/C;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACvC,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CA2BR"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ZodError } from 'zod';
|
|
2
|
+
export const toolRegistry = [];
|
|
3
|
+
export function toolExists(toolName) {
|
|
4
|
+
return toolRegistry.some((t) => t.name === toolName);
|
|
5
|
+
}
|
|
6
|
+
export function getToolDefinitions() {
|
|
7
|
+
return toolRegistry.map((tool) => ({
|
|
8
|
+
name: tool.name,
|
|
9
|
+
description: tool.description,
|
|
10
|
+
inputSchema: tool.inputSchema,
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
function extractPromptArguments(inputSchema) {
|
|
14
|
+
const properties = (inputSchema.properties || {});
|
|
15
|
+
const required = (inputSchema.required || []);
|
|
16
|
+
return Object.entries(properties).map(([name, prop]) => ({
|
|
17
|
+
name,
|
|
18
|
+
description: prop.description || `${name} parameter`,
|
|
19
|
+
required: required.includes(name),
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
export function getPromptDefinitions() {
|
|
23
|
+
return toolRegistry
|
|
24
|
+
.filter((tool) => !!tool.prompt)
|
|
25
|
+
.map((tool) => ({
|
|
26
|
+
name: tool.name,
|
|
27
|
+
description: tool.prompt.description,
|
|
28
|
+
arguments: tool.prompt.arguments || extractPromptArguments(tool.inputSchema),
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
export async function executeTool(toolName, args, onProgress) {
|
|
32
|
+
const tool = toolRegistry.find((t) => t.name === toolName);
|
|
33
|
+
if (!tool) {
|
|
34
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const validatedArgs = tool.zodSchema.parse(args);
|
|
38
|
+
return tool.execute(validatedArgs, onProgress);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof ZodError) {
|
|
42
|
+
const issues = error.issues
|
|
43
|
+
.map((issue) => `${issue.path.join('.')}: ${issue.message}`)
|
|
44
|
+
.join(', ');
|
|
45
|
+
throw new Error(`Invalid arguments for ${toolName}: ${issues}`);
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function getPromptMessage(toolName, args) {
|
|
51
|
+
const tool = toolRegistry.find((t) => t.name === toolName);
|
|
52
|
+
if (!tool?.prompt) {
|
|
53
|
+
throw new Error(`No prompt defined for tool: ${toolName}`);
|
|
54
|
+
}
|
|
55
|
+
const paramStrings = [];
|
|
56
|
+
if (args.prompt) {
|
|
57
|
+
paramStrings.push(String(args.prompt));
|
|
58
|
+
}
|
|
59
|
+
Object.entries(args).forEach(([key, value]) => {
|
|
60
|
+
if (key !== 'prompt' &&
|
|
61
|
+
value !== undefined &&
|
|
62
|
+
value !== null &&
|
|
63
|
+
value !== false) {
|
|
64
|
+
if (typeof value === 'boolean' && value) {
|
|
65
|
+
paramStrings.push(`[${key}]`);
|
|
66
|
+
}
|
|
67
|
+
else if (typeof value !== 'boolean') {
|
|
68
|
+
paramStrings.push(`(${key}: ${value})`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
return `Use the ${toolName} tool${paramStrings.length > 0 ? ': ' + paramStrings.join(' ') : ''}`;
|
|
73
|
+
}
|
|
74
|
+
//# 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":"search.tool.d.ts","sourceRoot":"","sources":["../../src/tools/search.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAoB5C,eAAO,MAAM,UAAU,EAAE,WAqFxB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCommand } from '../utils/commandExecutor.js';
|
|
3
|
+
import { CLI, MODELS, ERROR_MESSAGES } from '../constants.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
const searchArgsSchema = z.object({
|
|
6
|
+
query: z
|
|
7
|
+
.string()
|
|
8
|
+
.min(1)
|
|
9
|
+
.describe('Search query to find information on the web'),
|
|
10
|
+
summarize: z
|
|
11
|
+
.boolean()
|
|
12
|
+
.default(true)
|
|
13
|
+
.describe('Summarize the search results (default: true)'),
|
|
14
|
+
model: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Model to use (default: gemini-3-flash-preview for speed)'),
|
|
18
|
+
});
|
|
19
|
+
export const searchTool = {
|
|
20
|
+
name: 'web-search',
|
|
21
|
+
description: 'Search the web using Gemini with Google Search grounding for real-time information.',
|
|
22
|
+
zodSchema: searchArgsSchema,
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
properties: {
|
|
26
|
+
query: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Search query to find information on the web',
|
|
29
|
+
},
|
|
30
|
+
summarize: {
|
|
31
|
+
type: 'boolean',
|
|
32
|
+
default: true,
|
|
33
|
+
description: 'Summarize the search results (default: true)',
|
|
34
|
+
},
|
|
35
|
+
model: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Model to use (default: gemini-3-flash-preview for speed)',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ['query'],
|
|
41
|
+
},
|
|
42
|
+
prompt: {
|
|
43
|
+
description: 'Search the web for real-time information using Google Search grounding.',
|
|
44
|
+
},
|
|
45
|
+
category: 'gemini',
|
|
46
|
+
execute: async (args, onProgress) => {
|
|
47
|
+
const { query, summarize, model } = args;
|
|
48
|
+
if (!query?.toString().trim()) {
|
|
49
|
+
throw new Error('Please provide a search query');
|
|
50
|
+
}
|
|
51
|
+
const searchPrompt = summarize
|
|
52
|
+
? `Search the web for: "${query}". Provide a comprehensive summary of the findings with key facts, dates, and sources.`
|
|
53
|
+
: `Search the web for: "${query}". Return the raw search results with sources.`;
|
|
54
|
+
const cmdArgs = [];
|
|
55
|
+
// Use Gemini 3 Flash by default for faster search results
|
|
56
|
+
cmdArgs.push(CLI.FLAGS.MODEL, model || MODELS.FLASH);
|
|
57
|
+
cmdArgs.push(CLI.FLAGS.PROMPT, searchPrompt);
|
|
58
|
+
try {
|
|
59
|
+
Logger.debug(`Executing search: ${query}`);
|
|
60
|
+
const result = await executeCommand(CLI.COMMANDS.GEMINI, cmdArgs, onProgress);
|
|
61
|
+
return `Search results for "${query}":\n\n${result}`;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
65
|
+
// Try with pro model if flash fails
|
|
66
|
+
if (errorMessage.includes(ERROR_MESSAGES.QUOTA_EXCEEDED)) {
|
|
67
|
+
Logger.warn('Flash quota exceeded, trying Pro model...');
|
|
68
|
+
const fallbackArgs = [
|
|
69
|
+
CLI.FLAGS.MODEL,
|
|
70
|
+
MODELS.PRO,
|
|
71
|
+
CLI.FLAGS.PROMPT,
|
|
72
|
+
searchPrompt,
|
|
73
|
+
];
|
|
74
|
+
try {
|
|
75
|
+
const result = await executeCommand(CLI.COMMANDS.GEMINI, fallbackArgs, onProgress);
|
|
76
|
+
return `Search results for "${query}":\n\n${result}`;
|
|
77
|
+
}
|
|
78
|
+
catch (fallbackError) {
|
|
79
|
+
throw new Error(`Search failed: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw new Error(`Search failed: ${errorMessage}`);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=search.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.tool.js","sourceRoot":"","sources":["../../src/tools/search.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.tool.d.ts","sourceRoot":"","sources":["../../src/tools/shell.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA8B5C,eAAO,MAAM,SAAS,EAAE,WAoGvB,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCommand } from '../utils/commandExecutor.js';
|
|
3
|
+
import { CLI, MODELS, STATUS_MESSAGES } from '../constants.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
const shellArgsSchema = z.object({
|
|
6
|
+
task: z
|
|
7
|
+
.string()
|
|
8
|
+
.min(1)
|
|
9
|
+
.describe('Description of the shell task to perform (e.g., "list all TypeScript files", "find large files over 10MB")'),
|
|
10
|
+
workingDirectory: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Working directory for command execution (use @ syntax, e.g., @src/)'),
|
|
14
|
+
dryRun: z
|
|
15
|
+
.boolean()
|
|
16
|
+
.default(true)
|
|
17
|
+
.describe('If true, Gemini will explain the commands without executing. If false, uses sandbox mode for safe execution.'),
|
|
18
|
+
model: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Model to use (default: gemini-3-flash-preview)'),
|
|
22
|
+
});
|
|
23
|
+
export const shellTool = {
|
|
24
|
+
name: 'shell',
|
|
25
|
+
description: 'Generate and optionally execute shell commands using Gemini. By default runs in dry-run mode (explains commands). Set dryRun=false to execute in sandbox.',
|
|
26
|
+
zodSchema: shellArgsSchema,
|
|
27
|
+
inputSchema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
task: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Description of the shell task to perform (e.g., "list all TypeScript files", "find large files over 10MB")',
|
|
33
|
+
},
|
|
34
|
+
workingDirectory: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Working directory for command execution (use @ syntax, e.g., @src/)',
|
|
37
|
+
},
|
|
38
|
+
dryRun: {
|
|
39
|
+
type: 'boolean',
|
|
40
|
+
default: true,
|
|
41
|
+
description: 'If true, Gemini will explain the commands without executing. If false, uses sandbox mode for safe execution.',
|
|
42
|
+
},
|
|
43
|
+
model: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Model to use (default: gemini-3-flash-preview)',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
required: ['task'],
|
|
49
|
+
},
|
|
50
|
+
prompt: {
|
|
51
|
+
description: 'Generate shell commands for a task, optionally executing in sandbox mode',
|
|
52
|
+
},
|
|
53
|
+
category: 'gemini',
|
|
54
|
+
execute: async (args, onProgress) => {
|
|
55
|
+
const { task, workingDirectory, dryRun, model } = args;
|
|
56
|
+
if (!task?.toString().trim()) {
|
|
57
|
+
throw new Error('Please provide a task description');
|
|
58
|
+
}
|
|
59
|
+
let shellPrompt;
|
|
60
|
+
if (dryRun) {
|
|
61
|
+
shellPrompt = `Generate shell commands for the following task. Do NOT execute them, just explain what commands would be needed and what they do:
|
|
62
|
+
|
|
63
|
+
Task: ${task}
|
|
64
|
+
${workingDirectory ? `Working directory: ${workingDirectory}` : ''}
|
|
65
|
+
|
|
66
|
+
Provide:
|
|
67
|
+
1. The exact command(s) to run
|
|
68
|
+
2. Explanation of what each command does
|
|
69
|
+
3. Any prerequisites or warnings
|
|
70
|
+
4. Expected output`;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
shellPrompt = `Execute the following task using shell commands in sandbox mode:
|
|
74
|
+
|
|
75
|
+
Task: ${task}
|
|
76
|
+
${workingDirectory ? `Working directory: ${workingDirectory}` : ''}
|
|
77
|
+
|
|
78
|
+
Execute the necessary commands and provide:
|
|
79
|
+
1. Commands executed
|
|
80
|
+
2. Output/results
|
|
81
|
+
3. Any errors encountered
|
|
82
|
+
4. Summary of what was accomplished`;
|
|
83
|
+
}
|
|
84
|
+
const cmdArgs = [];
|
|
85
|
+
// Use Gemini 3 Flash for speed
|
|
86
|
+
cmdArgs.push(CLI.FLAGS.MODEL, model || MODELS.FLASH);
|
|
87
|
+
// Use sandbox mode when actually executing commands
|
|
88
|
+
if (!dryRun) {
|
|
89
|
+
cmdArgs.push(CLI.FLAGS.SANDBOX);
|
|
90
|
+
}
|
|
91
|
+
cmdArgs.push(CLI.FLAGS.PROMPT, shellPrompt);
|
|
92
|
+
try {
|
|
93
|
+
Logger.debug(`Shell task (dryRun=${dryRun}): ${task}`);
|
|
94
|
+
const result = await executeCommand(CLI.COMMANDS.GEMINI, cmdArgs, onProgress);
|
|
95
|
+
const header = dryRun
|
|
96
|
+
? 'Shell Commands (Dry Run - Not Executed)'
|
|
97
|
+
: 'Shell Execution Results (Sandbox Mode)';
|
|
98
|
+
return `${STATUS_MESSAGES.GEMINI_RESPONSE}\n\n**${header}**\n\nTask: ${task}\n\n${result}`;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
102
|
+
throw new Error(`Shell task failed: ${errorMessage}`);
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=shell.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.tool.js","sourceRoot":"","sources":["../../src/tools/shell.tool.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,WAuBtB,CAAC;AAIF,eAAO,MAAM,QAAQ,EAAE,WAgBtB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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: 'Test connectivity by echoing a message back.',
|
|
9
|
+
zodSchema: pingArgsSchema,
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
prompt: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
default: '',
|
|
16
|
+
description: 'Message to echo',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
required: [],
|
|
20
|
+
},
|
|
21
|
+
prompt: {
|
|
22
|
+
description: 'Echo a test message to verify connectivity.',
|
|
23
|
+
},
|
|
24
|
+
category: 'simple',
|
|
25
|
+
execute: async (args, onProgress) => {
|
|
26
|
+
const message = args.prompt || args.message || 'Pong!';
|
|
27
|
+
return executeCommand('echo', [message], onProgress);
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
const helpArgsSchema = z.object({});
|
|
31
|
+
export const helpTool = {
|
|
32
|
+
name: 'help',
|
|
33
|
+
description: 'Display Gemini CLI help and available options.',
|
|
34
|
+
zodSchema: helpArgsSchema,
|
|
35
|
+
inputSchema: {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: {},
|
|
38
|
+
required: [],
|
|
39
|
+
},
|
|
40
|
+
prompt: {
|
|
41
|
+
description: 'Display Gemini CLI help information.',
|
|
42
|
+
},
|
|
43
|
+
category: 'simple',
|
|
44
|
+
execute: async (_args, onProgress) => {
|
|
45
|
+
return executeCommand('gemini', ['-help'], onProgress);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
//# 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,8CAA8C;IAC3D,SAAS,EAAE,cAAc;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,iBAAiB;aAC/B;SACF;QACD,QAAQ,EAAE,EAAE;KACb;IACD,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,gDAAgD;IAC7D,SAAS,EAAE,cAAc;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;IACD,MAAM,EAAE;QACN,WAAW,EAAE,sCAAsC;KACpD;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QACnC,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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-tool.example.d.ts","sourceRoot":"","sources":["../../src/tools/test-tool.example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,eAAO,MAAM,QAAQ,EAAE,WA4BtB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
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 { z } from 'zod';
|
|
12
|
+
const testToolArgsSchema = z.object({
|
|
13
|
+
message: z.string().describe('Test message to echo'), // Required field (no .optional())
|
|
14
|
+
});
|
|
15
|
+
export const testTool = {
|
|
16
|
+
name: 'test-tool',
|
|
17
|
+
description: 'A test tool demonstrating the simplified registration',
|
|
18
|
+
zodSchema: testToolArgsSchema,
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
properties: {
|
|
22
|
+
message: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Test message to echo',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: ['message'],
|
|
28
|
+
},
|
|
29
|
+
prompt: {
|
|
30
|
+
description: 'Test the new unified tool registration',
|
|
31
|
+
arguments: [
|
|
32
|
+
{
|
|
33
|
+
name: 'message',
|
|
34
|
+
description: 'Message to test with',
|
|
35
|
+
required: true,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
category: 'utility',
|
|
40
|
+
execute: async (args) => {
|
|
41
|
+
return `Test tool received: ${args.message}`;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=test-tool.example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-tool.example.js","sourceRoot":"","sources":["../../src/tools/test-tool.example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,kCAAkC;CACzF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,uDAAuD;IACpE,SAAS,EAAE,kBAAkB;IAC7B,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,MAAM,EAAE;QACN,WAAW,EAAE,wCAAwC;QACrD,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sBAAsB;gBACnC,QAAQ,EAAE,IAAI;aACf;SACF;KACF;IACD,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,OAAO,uBAAuB,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-test.tool.d.ts","sourceRoot":"","sources":["../../src/tools/timeout-test.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,eAAO,MAAM,eAAe,EAAE,WA6C7B,CAAC"}
|