summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/tool/edit.ts112
-rw-r--r--packages/opencode/src/tool/multiedit.ts8
-rw-r--r--packages/opencode/test/tool/edit.test.ts4
3 files changed, 64 insertions, 60 deletions
diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts
index 8ead6c9ee..e0b54bc11 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,25 +83,65 @@ 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,
diff --git a/packages/opencode/src/tool/multiedit.ts b/packages/opencode/src/tool/multiedit.ts
index 5a52d0f0a..f84ddaf03 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 220fe299b..feb0f592b 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()