fix(acp): ensure JSON-RPC response ID matching and improve SSE error reporting

This commit is contained in:
Haitao Pan 2026-04-16 16:26:33 +08:00
parent 73fbe57460
commit 1fe7de82a9
2 changed files with 12 additions and 10 deletions

View File

@ -327,26 +327,30 @@ class AcpServer:
try:
if method == "acp.capabilities":
return JsonRpcResponse(id=request.id, result=self.get_capabilities())
response = JsonRpcResponse(id=request.id, result=self.get_capabilities())
elif method == "session.start":
return await self._handle_session_start(request, notify)
response = await self._handle_session_start(request, notify)
elif method == "session.message":
return await self._handle_session_message(request, notify)
response = await self._handle_session_message(request, notify)
elif method == "session.cancel":
return self._handle_session_cancel(request)
response = self._handle_session_cancel(request)
elif method == "session.close":
return self._handle_session_close(request)
response = self._handle_session_close(request)
else:
return JsonRpcResponse(
response = JsonRpcResponse(
id=request.id,
error={"code": -32601, "message": f"Unknown method: {method}"}
)
if response and response.id is None:
response.id = request.id
return response
except asyncio.CancelledError:
raise
except Exception as e:
@ -486,7 +490,6 @@ class AcpServer:
"error": True
}, notify)
return JsonRpcResponse(
id=None,
error={"code": -32602, "message": f"Unknown provider: {provider_name}"}
)
@ -499,7 +502,6 @@ class AcpServer:
"error": True
}, notify)
return JsonRpcResponse(
id=None,
error={"code": -32602, "message": f"Provider not available: {provider_name}"}
)

View File

@ -801,8 +801,8 @@ class GatewayAcpClient {
consumeEventPayload(eventLines.join('\n'));
}
if (!completer.isCompleted) {
throw const GatewayAcpException(
'ACP SSE ended without JSON-RPC response',
throw GatewayAcpException(
'ACP SSE ended without JSON-RPC response for request $requestId',
code: 'ACP_SSE_NO_RESULT',
);
}