46 lines · 1.5 KB · TypeScript
RawDownload
import z from "zod"import { Tool } from "./tool"import { EditTool } from "./edit"import DESCRIPTION from "./multiedit.txt"import path from "path"import { Instance } from "../project/instance" export const MultiEditTool = Tool.define("multiedit", {  description: DESCRIPTION,  parameters: z.object({    filePath: z.string().describe("The absolute path to the file to modify"),    edits: z      .array(        z.object({          filePath: z.string().describe("The absolute path to the file to modify"),          oldString: z.string().describe("The text to replace"),          newString: z.string().describe("The text to replace it with (must be different from oldString)"),          replaceAll: z.boolean().optional().describe("Replace all occurrences of oldString (default false)"),        }),      )      .describe("Array of edit operations to perform sequentially on the file"),  }),  async execute(params, ctx) {    const tool = await EditTool.init()    const results = []    for (const [, edit] of params.edits.entries()) {      const result = await tool.execute(        {          filePath: params.filePath,          oldString: edit.oldString,          newString: edit.newString,          replaceAll: edit.replaceAll,        },        ctx,      )      results.push(result)    }    return {      title: path.relative(Instance.worktree, params.filePath),      metadata: {        results: results.map((r) => r.metadata),      },      output: results.at(-1)!.output,    }  },})