Skip to content

Commit e4f4bbe

Browse files
committed
refactor ACP tools
take PR feedback into account: - Import existing tools and only modify `execute()` - No prompt change needed, reads, edits, and writes are executed as-is with a different interface - Keep permissions refactor ACP tools
1 parent f14d314 commit e4f4bbe

6 files changed

Lines changed: 98 additions & 324 deletions

File tree

packages/opencode/src/acp/agent.ts

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ import { MCP } from "@/mcp"
4242
import { Todo } from "@/session/todo"
4343
import { z } from "zod"
4444
import { LoadAPIKeyError } from "ai"
45-
import { createACPTools } from "./tools"
46-
import { ToolRegistry } from "../tool/registry"
4745

4846
export namespace ACP {
4947
const log = Log.create({ service: "acp-agent" })
@@ -470,14 +468,6 @@ export namespace ACP {
470468
}
471469
}
472470

473-
if (this.clientCapabilities?.fs?.writeTextFile) {
474-
log.info("Client has writeTextFile capability, registering ACP tools")
475-
const acpTools = createACPTools(this, sessionId)
476-
for (const tool of acpTools) {
477-
await ToolRegistry.register(tool)
478-
}
479-
}
480-
481471
await Promise.all(
482472
Object.entries(mcpServers).map(async ([key, mcp]) => {
483473
await MCP.add(key, mcp)
@@ -619,13 +609,6 @@ export namespace ACP {
619609
}
620610

621611
if (!cmd) {
622-
const tools = acpSession.hasACPTools
623-
? {
624-
edit: false,
625-
write: false,
626-
read: false,
627-
}
628-
: undefined
629612
await SessionPrompt.prompt({
630613
sessionID,
631614
model: {
@@ -634,7 +617,7 @@ export namespace ACP {
634617
},
635618
parts,
636619
agent,
637-
tools,
620+
acpAgent: acpSession.hasACPTools ? this : undefined,
638621
})
639622
return done
640623
}

packages/opencode/src/acp/tools.ts

Lines changed: 0 additions & 294 deletions
This file was deleted.

packages/opencode/src/session/prompt.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { SessionRevert } from "./revert"
99
import { Session } from "."
1010
import { Agent } from "../agent/agent"
1111
import { Provider } from "../provider/provider"
12+
import type { ACP } from "../acp/agent"
1213
import {
1314
generateText,
1415
streamText,
@@ -109,6 +110,7 @@ export namespace SessionPrompt {
109110
noReply: z.boolean().optional(),
110111
system: z.string().optional(),
111112
tools: z.record(z.string(), z.boolean()).optional(),
113+
acpAgent: z.custom<ACP.Agent>().optional(),
112114
parts: z.array(
113115
z.discriminatedUnion("type", [
114116
MessageV2.TextPart.omit({
@@ -192,6 +194,7 @@ export namespace SessionPrompt {
192194
agent: agent.name,
193195
system,
194196
abort: abort.signal,
197+
acpAgent: input.acpAgent,
195198
})
196199

197200
const tools = await resolveTools({
@@ -201,6 +204,7 @@ export namespace SessionPrompt {
201204
providerID: model.providerID,
202205
tools: input.tools,
203206
processor,
207+
acpAgent: input.acpAgent,
204208
})
205209

206210
const params = await Plugin.trigger(
@@ -518,6 +522,7 @@ export namespace SessionPrompt {
518522
providerID: string
519523
tools?: Record<string, boolean>
520524
processor: Processor
525+
acpAgent?: ACP.Agent
521526
}) {
522527
const tools: Record<string, AITool> = {}
523528
const enabledTools = pipe(
@@ -556,6 +561,7 @@ export namespace SessionPrompt {
556561
extra: {
557562
modelID: input.modelID,
558563
providerID: input.providerID,
564+
acpAgent: input.acpAgent,
559565
},
560566
agent: input.agent.name,
561567
metadata: async (val) => {
@@ -951,6 +957,7 @@ export namespace SessionPrompt {
951957
system: string[]
952958
agent: string
953959
abort: AbortSignal
960+
acpAgent?: ACP.Agent
954961
}) {
955962
const toolcalls: Record<string, MessageV2.ToolPart> = {}
956963
let snapshot: string | undefined

0 commit comments

Comments
 (0)