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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 46 additions and 148 deletions

View File

@ -7,26 +7,11 @@
import React from 'react';
import { render } from 'ink';
import { App } from './ui/App.js';
import { toolRegistry } from './tools/tool-registry.js';
import { loadCliConfig } from './config/config.js';
import {
LSTool,
ReadFileTool,
GrepTool,
GlobTool,
EditTool,
TerminalTool,
WriteFileTool,
WebFetchTool,
} from '@gemini-code/server';
async function main() {
// Load configuration
const config = loadCliConfig();
// Configure tools using the loaded config
registerTools(config.getTargetDir());
// Render UI, passing necessary config values
render(
React.createElement(App, {
@ -81,24 +66,3 @@ main().catch((error) => {
}
process.exit(1);
});
function registerTools(targetDir: string) {
const config = loadCliConfig();
const lsTool = new LSTool(targetDir);
const readFileTool = new ReadFileTool(targetDir);
const grepTool = new GrepTool(targetDir);
const globTool = new GlobTool(targetDir);
const editTool = new EditTool(targetDir);
const terminalTool = new TerminalTool(targetDir, config);
const writeFileTool = new WriteFileTool(targetDir);
const webFetchTool = new WebFetchTool();
toolRegistry.registerTool(lsTool);
toolRegistry.registerTool(readFileTool);
toolRegistry.registerTool(grepTool);
toolRegistry.registerTool(globTool);
toolRegistry.registerTool(editTool);
toolRegistry.registerTool(terminalTool);
toolRegistry.registerTool(writeFileTool);
toolRegistry.registerTool(webFetchTool);
}

View File

@ -1,15 +0,0 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { describe, it, expect } from 'vitest';
import { toolRegistry } from './tools/tool-registry.js';
describe('cli tests', () => {
it('should have a tool registry', () => {
expect(toolRegistry).toBeDefined();
expect(typeof toolRegistry.registerTool).toBe('function');
});
});

View File

@ -1,87 +0,0 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { ToolCallConfirmationDetails } from '@gemini-code/server';
import { FunctionDeclaration } from '@google/genai';
/**
* Interface representing the base Tool functionality
*/
export interface Tool<
TParams = unknown,
TResult extends ToolResult = ToolResult,
> {
/**
* The internal name of the tool (used for API calls)
*/
name: string;
/**
* The user-friendly display name of the tool
*/
displayName: string;
/**
* Description of what the tool does
*/
description: string;
/**
* Function declaration schema from @google/genai
*/
schema: FunctionDeclaration;
/**
* Validates the parameters for the tool
* @param params Parameters to validate
* @returns An error message string if invalid, null otherwise
*/
validateToolParams(params: TParams): string | null;
/**
* Gets a pre-execution description of the tool operation
* @param params Parameters for the tool execution
* @returns A markdown string describing what the tool will do
* Optional for backward compatibility
*/
getDescription(params: TParams): string;
/**
* Determines if the tool should prompt for confirmation before execution
* @param params Parameters for the tool execution
* @returns Whether execute should be confirmed.
*/
shouldConfirmExecute(
params: TParams,
): Promise<ToolCallConfirmationDetails | false>;
/**
* Executes the tool with the given parameters
* @param params Parameters for the tool execution
* @returns Result of the tool execution
*/
execute(params: TParams): Promise<TResult>;
}
export interface ToolResult {
/**
* Content meant to be included in LLM history.
* This should represent the factual outcome of the tool execution.
*/
llmContent: string;
/**
* Markdown string for user display.
* This provides a user-friendly summary or visualization of the result.
*/
returnDisplay: ToolResultDisplay;
}
export type ToolResultDisplay = string | FileDiff;
export interface FileDiff {
fileDiff: string;
}

View File

@ -9,7 +9,7 @@ import { Box, Text } from 'ink';
import Spinner from 'ink-spinner';
import { IndividualToolCallDisplay, ToolCallStatus } from '../../types.js';
import { DiffRenderer } from './DiffRenderer.js';
import { FileDiff, ToolResultDisplay } from '../../../tools/tools.js';
import { FileDiff, ToolResultDisplay } from '@gemini-code/server';
import { Colors } from '../../colors.js';
export const ToolMessage: React.FC<IndividualToolCallDisplay> = ({

View File

@ -35,7 +35,6 @@ import {
IndividualToolCallDisplay,
ToolCallStatus,
} from '../types.js';
import { toolRegistry } from '../../tools/tool-registry.js';
const addHistoryItem = (
setHistory: React.Dispatch<React.SetStateAction<HistoryItem[]>>,
@ -53,6 +52,7 @@ export const useGeminiStream = (
setHistory: React.Dispatch<React.SetStateAction<HistoryItem[]>>,
config: Config,
) => {
const toolRegistry = config.getToolRegistry();
const [streamingState, setStreamingState] = useState<StreamingState>(
StreamingState.Idle,
);

View File

@ -4,8 +4,10 @@
* SPDX-License-Identifier: Apache-2.0
*/
import { ToolCallConfirmationDetails } from '@gemini-code/server';
import { ToolResultDisplay } from '../tools/tools.js';
import {
ToolCallConfirmationDetails,
ToolResultDisplay,
} from '@gemini-code/server';
// Only defining the state enum needed by the UI
export enum StreamingState {

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

@ -7,7 +7,7 @@
import { ToolListUnion, FunctionDeclaration } from '@google/genai';
import { Tool } from './tools.js';
class ToolRegistry {
export class ToolRegistry {
private tools: Map<string, Tool> = new Map();
/**
@ -70,6 +70,3 @@ class ToolRegistry {
return this.tools.get(name);
}
}
// Export a singleton instance of the registry
export const toolRegistry = new ToolRegistry();

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';