refactor(core): share file diff construction (#39586)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
This commit is contained in:
parent
b1a5e8a6ae
commit
97786afdd8
3 changed files with 30 additions and 31 deletions
|
|
@ -10,13 +10,13 @@ import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin
|
||||||
import { ToolFailure } from "@opencode-ai/ai"
|
import { ToolFailure } from "@opencode-ai/ai"
|
||||||
import { FileDiff } from "@opencode-ai/schema/file-diff"
|
import { FileDiff } from "@opencode-ai/schema/file-diff"
|
||||||
import { Bom } from "@opencode-ai/util/bom"
|
import { Bom } from "@opencode-ai/util/bom"
|
||||||
import { createTwoFilesPatch, diffLines } from "diff"
|
|
||||||
import { Effect, Schema } from "effect"
|
import { Effect, Schema } from "effect"
|
||||||
import { FileMutation } from "../../file-mutation"
|
import { FileMutation } from "../../file-mutation"
|
||||||
import { Formatter } from "../../formatter"
|
import { Formatter } from "../../formatter"
|
||||||
import { FSUtil } from "@opencode-ai/util/fs-util"
|
import { FSUtil } from "@opencode-ai/util/fs-util"
|
||||||
import { LocationMutation } from "../../location-mutation"
|
import { LocationMutation } from "../../location-mutation"
|
||||||
import { Permission } from "../../permission"
|
import { Permission } from "../../permission"
|
||||||
|
import { fileDiff } from "./file-diff"
|
||||||
|
|
||||||
export const name = "edit"
|
export const name = "edit"
|
||||||
|
|
||||||
|
|
@ -238,19 +238,3 @@ export const Plugin = {
|
||||||
.pipe(Effect.orDie)
|
.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,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
23
packages/core/src/tool/plugin/file-diff.ts
Normal file
23
packages/core/src/tool/plugin/file-diff.ts
Normal file
|
|
@ -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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,15 +8,14 @@ export * as WriteTool from "./write"
|
||||||
|
|
||||||
import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin"
|
import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin"
|
||||||
import { ToolFailure } from "@opencode-ai/ai"
|
import { ToolFailure } from "@opencode-ai/ai"
|
||||||
import { FileDiff } from "@opencode-ai/schema/file-diff"
|
|
||||||
import { Effect, Schema } from "effect"
|
import { Effect, Schema } from "effect"
|
||||||
import { createTwoFilesPatch, diffLines } from "diff"
|
|
||||||
import { Bom } from "@opencode-ai/util/bom"
|
import { Bom } from "@opencode-ai/util/bom"
|
||||||
import { FSUtil } from "@opencode-ai/util/fs-util"
|
import { FSUtil } from "@opencode-ai/util/fs-util"
|
||||||
import { FileMutation } from "../../file-mutation"
|
import { FileMutation } from "../../file-mutation"
|
||||||
import { Formatter } from "../../formatter"
|
import { Formatter } from "../../formatter"
|
||||||
import { LocationMutation } from "../../location-mutation"
|
import { LocationMutation } from "../../location-mutation"
|
||||||
import { Permission } from "../../permission"
|
import { Permission } from "../../permission"
|
||||||
|
import { fileDiff } from "./file-diff"
|
||||||
|
|
||||||
export const name = "write"
|
export const name = "write"
|
||||||
|
|
||||||
|
|
@ -83,19 +82,12 @@ export const Plugin = {
|
||||||
Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)),
|
Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)),
|
||||||
)
|
)
|
||||||
const next = Bom.split(input.content)
|
const next = Bom.split(input.content)
|
||||||
const counts = diffLines(current?.text ?? "", next.text).reduce(
|
const preview = fileDiff(
|
||||||
(result, item) => ({
|
target.resource,
|
||||||
additions: result.additions + (item.added ? (item.count ?? 0) : 0),
|
current?.text ?? "",
|
||||||
deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0),
|
next.text,
|
||||||
}),
|
current ? "modified" : "added",
|
||||||
{ additions: 0, deletions: 0 },
|
|
||||||
)
|
)
|
||||||
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({
|
yield* permission.assert({
|
||||||
action: "edit",
|
action: "edit",
|
||||||
resources: [target.resource],
|
resources: [target.resource],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue