Remove duplicate CLI tools module, remove the global tool registry (#89)

This commit is contained in:
Jaana Dogan
2025-04-21 12:59:31 -07:00
committed by GitHub
parent 2571e07175
commit baf39042c8
11 changed files with 46 additions and 148 deletions

View File

@@ -8,6 +8,15 @@ import * as dotenv from 'dotenv';
import * as fs from 'node:fs';
import * as path from 'node:path';
import process from 'node:process';
import { ToolRegistry } from '../tools/tool-registry.js';
import { LSTool } from '../tools/ls.js';
import { ReadFileTool } from '../tools/read-file.js';
import { GrepTool } from '../tools/grep.js';
import { GlobTool } from '../tools/glob.js';
import { EditTool } from '../tools/edit.js';
import { TerminalTool } from '../tools/terminal.js';
import { WriteFileTool } from '../tools/write-file.js';
import { WebFetchTool } from '../tools/web-fetch.js';
const DEFAULT_PASSTHROUGH_COMMANDS = ['ls', 'git', 'npm'];
@@ -15,6 +24,7 @@ export class Config {
private apiKey: string;
private model: string;
private targetDir: string;
private toolRegistry: ToolRegistry;
private debugMode: boolean;
private passthroughCommands: string[];
@@ -31,6 +41,8 @@ export class Config {
this.debugMode = debugMode;
this.passthroughCommands =
passthroughCommands || DEFAULT_PASSTHROUGH_COMMANDS;
this.toolRegistry = createToolRegistry(this);
}
getApiKey(): string {
@@ -45,6 +57,10 @@ export class Config {
return this.targetDir;
}
getToolRegistry(): ToolRegistry {
return this.toolRegistry;
}
getDebugMode(): boolean {
return this.debugMode;
}
@@ -92,3 +108,23 @@ export function createServerConfig(
passthroughCommands,
);
}
function createToolRegistry(config: Config): ToolRegistry {
const registry = new ToolRegistry();
const targetDir = config.getTargetDir();
const tools = [
new LSTool(targetDir),
new ReadFileTool(targetDir),
new GrepTool(targetDir),
new GlobTool(targetDir),
new EditTool(targetDir),
new TerminalTool(targetDir, config),
new WriteFileTool(targetDir),
new WebFetchTool(), // Note: WebFetchTool takes no arguments
];
for (const tool of tools) {
registry.registerTool(tool);
}
return registry;
}

View File

@@ -22,6 +22,7 @@ export * from './utils/getFolderStructure.js';
// Export base tool definitions
export * from './tools/tools.js';
export * from './tools/tool-registry.js';
// Export specific tool logic
export * from './tools/read-file.js';

View File

@@ -17,8 +17,8 @@ import {
SchemaValidator,
getErrorMessage,
isNodeError,
Config,
} from '@gemini-code/server';
import { Config } from '../config/config.js';
import {
BaseTool,
ToolCallConfirmationDetails,

View File

@@ -0,0 +1,72 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { ToolListUnion, FunctionDeclaration } from '@google/genai';
import { Tool } from './tools.js';
export class ToolRegistry {
private tools: Map<string, Tool> = new Map();
/**
* Registers a tool definition.
* @param tool - The tool object containing schema and execution logic.
*/
registerTool(tool: Tool): void {
if (this.tools.has(tool.name)) {
// Decide on behavior: throw error, log warning, or allow overwrite
console.warn(
`Tool with name "${tool.name}" is already registered. Overwriting.`,
);
}
this.tools.set(tool.name, tool);
}
/**
* Retrieves the list of tool schemas (FunctionDeclaration array).
* Extracts the declarations from the ToolListUnion structure.
* @returns An array of FunctionDeclarations.
*/
getFunctionDeclarations(): FunctionDeclaration[] {
const declarations: FunctionDeclaration[] = [];
this.tools.forEach((tool) => {
declarations.push(tool.schema);
});
return declarations;
}
/**
* Deprecated/Internal? Retrieves schemas in the ToolListUnion format.
* Kept for reference, prefer getFunctionDeclarations.
*/
getToolSchemas(): ToolListUnion {
const declarations = this.getFunctionDeclarations();
if (declarations.length === 0) {
return [];
}
return [{ functionDeclarations: declarations }];
}
/**
* Returns an array of all registered tool instances.
*/
getAllTools(): Tool[] {
return Array.from(this.tools.values());
}
/**
* Optional: Get a list of registered tool names.
*/
listAvailableTools(): string[] {
return Array.from(this.tools.keys());
}
/**
* Get the definition of a specific tool.
*/
getTool(name: string): Tool | undefined {
return this.tools.get(name);
}
}

View File

@@ -6,11 +6,11 @@
import { Content, SchemaUnion, Type } from '@google/genai';
import {
Config,
getErrorMessage,
isNodeError,
GeminiClient,
} from '@gemini-code/server';
import { Config } from '../config/config.js';
import { promises as fs } from 'fs';
import { exec as _exec } from 'child_process';
import { promisify } from 'util';