From 857da47326236c26232b311abb5efdaa9f4291c5 Mon Sep 17 00:00:00 2001 From: George Harker Date: Sun, 8 Feb 2026 09:49:20 -0800 Subject: [PATCH] feat(acp): add server options for acp mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit acp takes —connect parameter to connect to specified backend server --- packages/opencode/src/cli/cmd/acp.ts | 37 ++++++++++++++++++++-------- packages/opencode/src/flag/flag.ts | 1 + 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/packages/opencode/src/cli/cmd/acp.ts b/packages/opencode/src/cli/cmd/acp.ts index 99a9a81ab9cd..318fd4c05629 100644 --- a/packages/opencode/src/cli/cmd/acp.ts +++ b/packages/opencode/src/cli/cmd/acp.ts @@ -6,6 +6,7 @@ import { ACP } from "@/acp/agent" import { Server } from "@/server/server" import { createOpencodeClient } from "@opencode-ai/sdk/v2" import { withNetworkOptions, resolveNetworkOptions } from "../network" +import { Flag } from "@/flag/flag" const log = Log.create({ service: "acp-command" }) @@ -13,21 +14,37 @@ export const AcpCommand = cmd({ command: "acp", describe: "start ACP (Agent Client Protocol) server", builder: (yargs) => { - return withNetworkOptions(yargs).option("cwd", { - describe: "working directory", - type: "string", - default: process.cwd(), - }) + return withNetworkOptions(yargs) + .option("cwd", { + describe: "working directory", + type: "string", + default: process.cwd(), + }) + .option("connect", { + describe: "URL of an existing OpenCode server to connect to (can also use OPENCODE_SERVER_URL env var)", + type: "string", + }) }, handler: async (args) => { process.env.OPENCODE_CLIENT = "acp" await bootstrap(process.cwd(), async () => { - const opts = await resolveNetworkOptions(args) - const server = Server.listen(opts) + // Check for external server URL from CLI flag or environment variable + const externalServerUrl = args.connect || Flag.OPENCODE_SERVER_URL - const sdk = createOpencodeClient({ - baseUrl: `http://${server.hostname}:${server.port}`, - }) + let serverUrl: string + let ownedServer: ReturnType | null = null + + if (externalServerUrl) { + log.info(`Connecting to external OpenCode server at ${externalServerUrl}`) + serverUrl = externalServerUrl + } else { + const opts = await resolveNetworkOptions(args) + ownedServer = Server.listen(opts) + serverUrl = `http://${ownedServer.hostname}:${ownedServer.port}` + log.info(`Started embedded OpenCode server at ${serverUrl}`) + } + + const sdk = createOpencodeClient({ baseUrl: serverUrl }) const input = new WritableStream({ write(chunk) { diff --git a/packages/opencode/src/flag/flag.ts b/packages/opencode/src/flag/flag.ts index b11058b34058..b820e3778e41 100644 --- a/packages/opencode/src/flag/flag.ts +++ b/packages/opencode/src/flag/flag.ts @@ -30,6 +30,7 @@ export namespace Flag { export declare const OPENCODE_CLIENT: string export const OPENCODE_SERVER_PASSWORD = process.env["OPENCODE_SERVER_PASSWORD"] export const OPENCODE_SERVER_USERNAME = process.env["OPENCODE_SERVER_USERNAME"] + export const OPENCODE_SERVER_URL = process.env["OPENCODE_SERVER_URL"] // Experimental export const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL")