summaryrefslogtreecommitdiff
path: root/packages/server/src/tools/read-file.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/server/src/tools/read-file.ts')
-rw-r--r--packages/server/src/tools/read-file.ts131
1 files changed, 0 insertions, 131 deletions
diff --git a/packages/server/src/tools/read-file.ts b/packages/server/src/tools/read-file.ts
deleted file mode 100644
index 4bb3bd56..00000000
--- a/packages/server/src/tools/read-file.ts
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import path from 'path';
-import { SchemaValidator } from '../utils/schemaValidator.js';
-import { makeRelative, shortenPath } from '../utils/paths.js';
-import { BaseTool, ToolResult } from './tools.js';
-import { isWithinRoot, processSingleFileContent } from '../utils/fileUtils.js';
-
-/**
- * Parameters for the ReadFile tool
- */
-export interface ReadFileToolParams {
- /**
- * The absolute path to the file to read
- */
- path: string;
-
- /**
- * The line number to start reading from (optional)
- */
- offset?: number;
-
- /**
- * The number of lines to read (optional)
- */
- limit?: number;
-}
-
-/**
- * Implementation of the ReadFile tool logic
- */
-export class ReadFileTool extends BaseTool<ReadFileToolParams, ToolResult> {
- static readonly Name: string = 'read_file';
-
- constructor(private rootDirectory: string) {
- super(
- ReadFileTool.Name,
- 'ReadFile',
- 'Reads and returns the content of a specified file from the local filesystem. Handles text, images (PNG, JPG, GIF, WEBP, SVG, BMP), and PDF files. For text files, it can read specific line ranges.',
- {
- properties: {
- path: {
- description:
- "The absolute path to the file to read (e.g., '/home/user/project/file.txt'). Relative paths are not supported.",
- type: 'string',
- },
- offset: {
- description:
- "Optional: For text files, the 0-based line number to start reading from. Requires 'limit' to be set. Use for paginating through large files.",
- type: 'number',
- },
- limit: {
- description:
- "Optional: For text files, maximum number of lines to read. Use with 'offset' to paginate through large files. If omitted, reads the entire file (if feasible, up to a default limit).",
- type: 'number',
- },
- },
- required: ['path'],
- type: 'object',
- },
- );
- this.rootDirectory = path.resolve(rootDirectory);
- }
-
- validateToolParams(params: ReadFileToolParams): string | null {
- if (
- this.schema.parameters &&
- !SchemaValidator.validate(
- this.schema.parameters as Record<string, unknown>,
- params,
- )
- ) {
- return 'Parameters failed schema validation.';
- }
- const filePath = params.path;
- if (!path.isAbsolute(filePath)) {
- return `File path must be absolute: ${filePath}`;
- }
- if (!isWithinRoot(filePath, this.rootDirectory)) {
- return `File path must be within the root directory (${this.rootDirectory}): ${filePath}`;
- }
- if (params.offset !== undefined && params.offset < 0) {
- return 'Offset must be a non-negative number';
- }
- if (params.limit !== undefined && params.limit <= 0) {
- return 'Limit must be a positive number';
- }
- return null;
- }
-
- getDescription(params: ReadFileToolParams): string {
- const relativePath = makeRelative(params.path, this.rootDirectory);
- return shortenPath(relativePath);
- }
-
- async execute(
- params: ReadFileToolParams,
- _signal: AbortSignal,
- ): Promise<ToolResult> {
- const validationError = this.validateToolParams(params);
- if (validationError) {
- return {
- llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
- returnDisplay: validationError,
- };
- }
-
- const result = await processSingleFileContent(
- params.path,
- this.rootDirectory,
- params.offset,
- params.limit,
- );
-
- if (result.error) {
- return {
- llmContent: result.error, // The detailed error for LLM
- returnDisplay: result.returnDisplay, // User-friendly error
- };
- }
-
- return {
- llmContent: result.llmContent,
- returnDisplay: result.returnDisplay,
- };
- }
-}