From 7499e0f6195200de5b401c33d3407d2f457e606c Mon Sep 17 00:00:00 2001 From: janckerchen Date: Sun, 22 Feb 2026 16:43:18 +0800 Subject: [PATCH] fix(acp): wait for gateway connection before processing ACP messages - Move gateway.start() before AgentSideConnection creation - Wait for hello message to confirm connection is established - This fixes issues where messages were processed before gateway was ready Co-Authored-By: Claude Opus 4.6 --- src/acp/server.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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; }