From f810946c040c2e358a11266eec5375de352ee8e6 Mon Sep 17 00:00:00 2001 From: Max Dillon Date: Sat, 28 Feb 2026 13:08:02 -0800 Subject: [PATCH 1/3] fix(acp): add diff context to acp edit event --- packages/opencode/src/acp/agent.ts | 33 +++++++++++++++++------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts index 8b338f1b5716..2a527cb390e0 100644 --- a/packages/opencode/src/acp/agent.ts +++ b/packages/opencode/src/acp/agent.ts @@ -190,6 +190,18 @@ export namespace ACP { .then(async () => { const directory = session.cwd + let diffContent: ToolCallContent | undefined + if (permission.permission === "edit") { + const metadata = permission.metadata || {} + const filepath = typeof metadata["filepath"] === "string" ? metadata["filepath"] : "" + const diff = typeof metadata["diff"] === "string" ? metadata["diff"] : "" + if (filepath && diff) { + const oldText = (await Filesystem.exists(filepath)) ? await Filesystem.readText(filepath) : "" + const newText = getNewContent(content, diff) + diffContext = { type: "diff", path: filepath, oldText, newText } + } + } + const res = await this.connection .requestPermission({ sessionId: permission.sessionID, @@ -200,6 +212,7 @@ export namespace ACP { rawInput: permission.metadata, kind: toToolKind(permission.permission), locations: toLocations(permission.permission, permission.metadata), + ...(diffContent && { content: [diffContent] }) }, options: this.permissionOptions, }) @@ -227,20 +240,12 @@ export namespace ACP { return } - if (res.outcome.optionId !== "reject" && permission.permission == "edit") { - const metadata = permission.metadata || {} - const filepath = typeof metadata["filepath"] === "string" ? metadata["filepath"] : "" - const diff = typeof metadata["diff"] === "string" ? metadata["diff"] : "" - const content = (await Filesystem.exists(filepath)) ? await Filesystem.readText(filepath) : "" - const newContent = getNewContent(content, diff) - - if (newContent) { - this.connection.writeTextFile({ - sessionId: session.id, - path: filepath, - content: newContent, - }) - } + if (res.outcome.optionId !== "reject" && diffContent?.type == "diff" && diffContent.newText) { + this.connection.writeTextFile({ + sessionId: session.id, + path: diffContent.path, + content: diffContent.newText, + }) } await this.sdk.permission.reply({ From 697ced9dfbb7399f97b8237a9471f27ae1cdcc76 Mon Sep 17 00:00:00 2001 From: Max Dillon Date: Sat, 28 Feb 2026 14:06:36 -0800 Subject: [PATCH 2/3] fix(acp): create newText from oldText and diff --- packages/opencode/src/acp/agent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts index 2a527cb390e0..933a549161ce 100644 --- a/packages/opencode/src/acp/agent.ts +++ b/packages/opencode/src/acp/agent.ts @@ -197,7 +197,7 @@ export namespace ACP { const diff = typeof metadata["diff"] === "string" ? metadata["diff"] : "" if (filepath && diff) { const oldText = (await Filesystem.exists(filepath)) ? await Filesystem.readText(filepath) : "" - const newText = getNewContent(content, diff) + const newText = getNewContent(oldText, diff) diffContext = { type: "diff", path: filepath, oldText, newText } } } From 091e246ee7b968ac516d00e1e8013c6afe311de8 Mon Sep 17 00:00:00 2001 From: Max Dillon Date: Sat, 28 Feb 2026 18:14:55 -0800 Subject: [PATCH 3/3] fix(acp): diffContent not diffContext --- packages/opencode/src/acp/agent.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts index 933a549161ce..37e33028b4fe 100644 --- a/packages/opencode/src/acp/agent.ts +++ b/packages/opencode/src/acp/agent.ts @@ -197,8 +197,8 @@ export namespace ACP { const diff = typeof metadata["diff"] === "string" ? metadata["diff"] : "" if (filepath && diff) { const oldText = (await Filesystem.exists(filepath)) ? await Filesystem.readText(filepath) : "" - const newText = getNewContent(oldText, diff) - diffContext = { type: "diff", path: filepath, oldText, newText } + const newText = getNewContent(oldText, diff) ?? "" + diffContent = { type: "diff", path: filepath, oldText, newText } } }