import { readFileSync } from "node:fs"; import { type } from "arktype"; import type { ToolContext } from "./server.ts"; import { execute, tool } from "./shared.ts"; export const ReadFileParams = type({ path: type.string.describe("absolute path to the file to read"), "start_line?": type.number.describe("start line, 1-based inclusive (default: 1)"), "end_line?": type.number.describe("end line, 1-based inclusive (default: end of file)"), }); export function ReadFileTool(_ctx: ToolContext) { return tool({ name: "read_file", description: "Read lines from a file. Use this to read sections of the PR diff returned by checkout_pr. " + "Example: `read_file({ path: diffPath, start_line: 5, end_line: 42 })`.", parameters: ReadFileParams, execute: execute(async ({ path, start_line, end_line }) => { let content: string; try { content = readFileSync(path, "utf-8"); } catch (err) { const msg = err instanceof Error ? err.message : String(err); throw new Error(`failed to read ${path}: ${msg}`); } if (start_line === undefined && end_line === undefined) { return { content }; } const lines = content.split("\n"); const start = Math.max(0, (start_line ?? 1) - 1); const end = Math.min(lines.length, end_line ?? lines.length); return { content: lines.slice(start, end).join("\n") }; }), }); }