diff --git a/src/acp/server.ts b/src/acp/server.ts index e47c292df82..e8085bd6fb3 100644 --- a/src/acp/server.ts +++ b/src/acp/server.ts @@ -12,7 +12,7 @@ import { readSecretFromFile } from "./secret-file.js"; import { AcpGatewayAgent } from "./translator.js"; import type { AcpServerOptions } from "./types.js"; -export function serveAcpGateway(opts: AcpServerOptions = {}): Promise { +export async function serveAcpGateway(opts: AcpServerOptions = {}): Promise { const cfg = loadConfig(); const connection = buildGatewayConnectionDetails({ config: cfg, @@ -80,6 +80,21 @@ export function serveAcpGateway(opts: AcpServerOptions = {}): Promise { process.once("SIGINT", shutdown); process.once("SIGTERM", shutdown); + // Start gateway first and wait for connection before processing ACP messages + gateway.start(); + + // Use a promise to wait for hello (connection established) + const helloReceived = new Promise((resolve) => { + const originalOnHelloOk = gateway.opts.onHelloOk; + gateway.opts.onHelloOk = (hello) => { + originalOnHelloOk?.(hello); + resolve(); + }; + }); + + // Wait for gateway connection before creating AgentSideConnection + await helloReceived; + const input = Writable.toWeb(process.stdout); const output = Readable.toWeb(process.stdin) as unknown as ReadableStream; const stream = ndJsonStream(input, output); @@ -90,7 +105,6 @@ export function serveAcpGateway(opts: AcpServerOptions = {}): Promise { return agent; }, stream); - gateway.start(); return closed; }