diff options
Diffstat (limited to 'packages/server/src')
| -rw-r--r-- | packages/server/src/config/config.ts | 36 | ||||
| -rw-r--r-- | packages/server/src/index.ts | 1 | ||||
| -rw-r--r-- | packages/server/src/tools/terminal.ts | 2 | ||||
| -rw-r--r-- | packages/server/src/tools/tool-registry.ts | 72 | ||||
| -rw-r--r-- | packages/server/src/utils/BackgroundTerminalAnalyzer.ts | 2 |
5 files changed, 111 insertions, 2 deletions
diff --git a/packages/server/src/config/config.ts b/packages/server/src/config/config.ts index fad219b5..e842cd29 100644 --- a/packages/server/src/config/config.ts +++ b/packages/server/src/config/config.ts @@ -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; +} diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 258ec795..2cbfbe6b 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -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'; diff --git a/packages/server/src/tools/terminal.ts b/packages/server/src/tools/terminal.ts index eab170ab..bd002c52 100644 --- a/packages/server/src/tools/terminal.ts +++ b/packages/server/src/tools/terminal.ts @@ -17,8 +17,8 @@ import { SchemaValidator, getErrorMessage, isNodeError, - Config, } from '@gemini-code/server'; +import { Config } from '../config/config.js'; import { BaseTool, ToolCallConfirmationDetails, diff --git a/packages/server/src/tools/tool-registry.ts b/packages/server/src/tools/tool-registry.ts new file mode 100644 index 00000000..387a7d29 --- /dev/null +++ b/packages/server/src/tools/tool-registry.ts @@ -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); + } +} diff --git a/packages/server/src/utils/BackgroundTerminalAnalyzer.ts b/packages/server/src/utils/BackgroundTerminalAnalyzer.ts index 5ff29997..8e56398c 100644 --- a/packages/server/src/utils/BackgroundTerminalAnalyzer.ts +++ b/packages/server/src/utils/BackgroundTerminalAnalyzer.ts @@ -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'; |
