diff --git a/packages/core/src/tool/plugin/edit.ts b/packages/core/src/tool/plugin/edit.ts index ccab3ff8eb2..4fe50ed30ab 100644 --- a/packages/core/src/tool/plugin/edit.ts +++ b/packages/core/src/tool/plugin/edit.ts @@ -10,13 +10,13 @@ import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin import { ToolFailure } from "@opencode-ai/ai" import { FileDiff } from "@opencode-ai/schema/file-diff" import { Bom } from "@opencode-ai/util/bom" -import { createTwoFilesPatch, diffLines } from "diff" import { Effect, Schema } from "effect" import { FileMutation } from "../../file-mutation" import { Formatter } from "../../formatter" import { FSUtil } from "@opencode-ai/util/fs-util" import { LocationMutation } from "../../location-mutation" import { Permission } from "../../permission" +import { fileDiff } from "./file-diff" export const name = "edit" @@ -238,19 +238,3 @@ export const Plugin = { .pipe(Effect.orDie) }), } - -function fileDiff(file: string, before: string, after: string): typeof FileDiff.Info.Type { - const counts = diffLines(before, after).reduce( - (result, item) => ({ - additions: result.additions + (item.added ? (item.count ?? 0) : 0), - deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0), - }), - { additions: 0, deletions: 0 }, - ) - return { - file, - patch: createTwoFilesPatch(file, file, before, after), - status: "modified", - ...counts, - } -} diff --git a/packages/core/src/tool/plugin/file-diff.ts b/packages/core/src/tool/plugin/file-diff.ts new file mode 100644 index 00000000000..250390c0f4a --- /dev/null +++ b/packages/core/src/tool/plugin/file-diff.ts @@ -0,0 +1,23 @@ +import { FileDiff } from "@opencode-ai/schema/file-diff" +import { createTwoFilesPatch, diffLines } from "diff" + +export function fileDiff( + file: string, + before: string, + after: string, + status: typeof FileDiff.Info.Type.status = "modified", +): typeof FileDiff.Info.Type { + const counts = diffLines(before, after).reduce( + (result, item) => ({ + additions: result.additions + (item.added ? (item.count ?? 0) : 0), + deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0), + }), + { additions: 0, deletions: 0 }, + ) + return { + file, + patch: createTwoFilesPatch(file, file, before, after), + status, + ...counts, + } +} diff --git a/packages/core/src/tool/plugin/write.ts b/packages/core/src/tool/plugin/write.ts index 0d91d6db029..332ade279e1 100644 --- a/packages/core/src/tool/plugin/write.ts +++ b/packages/core/src/tool/plugin/write.ts @@ -8,15 +8,14 @@ export * as WriteTool from "./write" import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin" import { ToolFailure } from "@opencode-ai/ai" -import { FileDiff } from "@opencode-ai/schema/file-diff" import { Effect, Schema } from "effect" -import { createTwoFilesPatch, diffLines } from "diff" import { Bom } from "@opencode-ai/util/bom" import { FSUtil } from "@opencode-ai/util/fs-util" import { FileMutation } from "../../file-mutation" import { Formatter } from "../../formatter" import { LocationMutation } from "../../location-mutation" import { Permission } from "../../permission" +import { fileDiff } from "./file-diff" export const name = "write" @@ -83,19 +82,12 @@ export const Plugin = { Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)), ) const next = Bom.split(input.content) - const counts = diffLines(current?.text ?? "", next.text).reduce( - (result, item) => ({ - additions: result.additions + (item.added ? (item.count ?? 0) : 0), - deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0), - }), - { additions: 0, deletions: 0 }, + const preview = fileDiff( + target.resource, + current?.text ?? "", + next.text, + current ? "modified" : "added", ) - const preview: typeof FileDiff.Info.Type = { - file: target.resource, - patch: createTwoFilesPatch(target.resource, target.resource, current?.text ?? "", next.text), - status: current ? "modified" : "added", - ...counts, - } yield* permission.assert({ action: "edit", resources: [target.resource],