From fb26308bc70a3d515480edf435994e43752c72c8 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Fri, 10 Apr 2026 21:12:22 +0000 Subject: [PATCH] chore: generate --- packages/opencode/src/tool/edit.ts | 112 +++++++++++------------ packages/opencode/src/tool/multiedit.ts | 8 +- packages/opencode/test/tool/edit.test.ts | 4 +- 3 files changed, 64 insertions(+), 60 deletions(-) diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts index 8ead6c9eea..e0b54bc115 100644 --- a/packages/opencode/src/tool/edit.ts +++ b/packages/opencode/src/tool/edit.ts @@ -70,50 +70,10 @@ export const EditTool = Tool.defineEffect( let contentOld = "" let contentNew = "" yield* filetime.withLock(filePath, async () => { - if (params.oldString === "") { - const existed = await Filesystem.exists(filePath) - contentNew = params.newString - diff = trimDiff(createTwoFilesPatch(filePath, filePath, contentOld, contentNew)) - await ctx.ask({ - permission: "edit", - patterns: [path.relative(Instance.worktree, filePath)], - always: ["*"], - metadata: { - filepath: filePath, - diff, - }, - }) - await Filesystem.write(filePath, params.newString) - await Format.file(filePath) - Bus.publish(File.Event.Edited, { file: filePath }) - await Bus.publish(FileWatcher.Event.Updated, { - file: filePath, - event: existed ? "change" : "add", - }) - await FileTime.read(ctx.sessionID, filePath) - return - } - - const stats = Filesystem.stat(filePath) - if (!stats) throw new Error(`File ${filePath} not found`) - if (stats.isDirectory()) throw new Error(`Path is a directory, not a file: ${filePath}`) - await FileTime.assert(ctx.sessionID, filePath) - contentOld = await Filesystem.readText(filePath) - - const ending = detectLineEnding(contentOld) - const old = convertToLineEnding(normalizeLineEndings(params.oldString), ending) - const next = convertToLineEnding(normalizeLineEndings(params.newString), ending) - - contentNew = replace(contentOld, old, next, params.replaceAll) - - diff = trimDiff( - createTwoFilesPatch( - filePath, - filePath, - normalizeLineEndings(contentOld), - normalizeLineEndings(contentNew), - ), - ) + if (params.oldString === "") { + const existed = await Filesystem.exists(filePath) + contentNew = params.newString + diff = trimDiff(createTwoFilesPatch(filePath, filePath, contentOld, contentNew)) await ctx.ask({ permission: "edit", patterns: [path.relative(Instance.worktree, filePath)], @@ -123,26 +83,66 @@ export const EditTool = Tool.defineEffect( diff, }, }) - - await Filesystem.write(filePath, contentNew) + await Filesystem.write(filePath, params.newString) await Format.file(filePath) Bus.publish(File.Event.Edited, { file: filePath }) await Bus.publish(FileWatcher.Event.Updated, { file: filePath, - event: "change", + event: existed ? "change" : "add", }) - contentNew = await Filesystem.readText(filePath) - diff = trimDiff( - createTwoFilesPatch( - filePath, - filePath, - normalizeLineEndings(contentOld), - normalizeLineEndings(contentNew), - ), - ) await FileTime.read(ctx.sessionID, filePath) + return + } + + const stats = Filesystem.stat(filePath) + if (!stats) throw new Error(`File ${filePath} not found`) + if (stats.isDirectory()) throw new Error(`Path is a directory, not a file: ${filePath}`) + await FileTime.assert(ctx.sessionID, filePath) + contentOld = await Filesystem.readText(filePath) + + const ending = detectLineEnding(contentOld) + const old = convertToLineEnding(normalizeLineEndings(params.oldString), ending) + const next = convertToLineEnding(normalizeLineEndings(params.newString), ending) + + contentNew = replace(contentOld, old, next, params.replaceAll) + + diff = trimDiff( + createTwoFilesPatch( + filePath, + filePath, + normalizeLineEndings(contentOld), + normalizeLineEndings(contentNew), + ), + ) + await ctx.ask({ + permission: "edit", + patterns: [path.relative(Instance.worktree, filePath)], + always: ["*"], + metadata: { + filepath: filePath, + diff, + }, }) + await Filesystem.write(filePath, contentNew) + await Format.file(filePath) + Bus.publish(File.Event.Edited, { file: filePath }) + await Bus.publish(FileWatcher.Event.Updated, { + file: filePath, + event: "change", + }) + contentNew = await Filesystem.readText(filePath) + diff = trimDiff( + createTwoFilesPatch( + filePath, + filePath, + normalizeLineEndings(contentOld), + normalizeLineEndings(contentNew), + ), + ) + await FileTime.read(ctx.sessionID, filePath) + }) + const filediff: Snapshot.FileDiff = { file: filePath, patch: diff, diff --git a/packages/opencode/src/tool/multiedit.ts b/packages/opencode/src/tool/multiedit.ts index 5a52d0f0af..f84ddaf039 100644 --- a/packages/opencode/src/tool/multiedit.ts +++ b/packages/opencode/src/tool/multiedit.ts @@ -27,7 +27,13 @@ export const MultiEditTool = Tool.defineEffect( ) .describe("Array of edit operations to perform sequentially on the file"), }), - execute: (params: { filePath: string; edits: Array<{ filePath: string; oldString: string; newString: string; replaceAll?: boolean }> }, ctx: Tool.Context) => + execute: ( + params: { + filePath: string + edits: Array<{ filePath: string; oldString: string; newString: string; replaceAll?: boolean }> + }, + ctx: Tool.Context, + ) => Effect.gen(function* () { const results = [] for (const [, entry] of params.edits.entries()) { diff --git a/packages/opencode/test/tool/edit.test.ts b/packages/opencode/test/tool/edit.test.ts index 220fe299b3..feb0f592bc 100644 --- a/packages/opencode/test/tool/edit.test.ts +++ b/packages/opencode/test/tool/edit.test.ts @@ -29,9 +29,7 @@ async function touch(file: string, time: number) { await fs.utimes(file, date, date) } -const runtime = ManagedRuntime.make( - Layer.mergeAll(LSP.defaultLayer, FileTime.defaultLayer), -) +const runtime = ManagedRuntime.make(Layer.mergeAll(LSP.defaultLayer, FileTime.defaultLayer)) afterAll(async () => { await runtime.dispose()