diff --git a/lib/runtime/go_task_service_client.dart b/lib/runtime/go_task_service_client.dart index d8deb780..d1c1c112 100644 --- a/lib/runtime/go_task_service_client.dart +++ b/lib/runtime/go_task_service_client.dart @@ -723,8 +723,8 @@ GoTaskServiceResult goTaskServiceResultFromAcpResponse( .map((item) => item['id']?.toString().trim() ?? '') .where((item) => item.isNotEmpty) .toList(growable: false); + final success = _boolValue(result['success']) ?? true; final fallbackFailureText = () { - final success = _boolValue(result['success']) ?? true; if (success) { return ''; } @@ -751,12 +751,20 @@ GoTaskServiceResult goTaskServiceResultFromAcpResponse( ? streamedText.trim() : '') .trim(); + final directErrorMessage = result['error']?.toString().trim() ?? ''; + final effectiveErrorMessage = success + ? directErrorMessage + : fallbackFailureText.isNotEmpty + ? fallbackFailureText + : primaryText.isNotEmpty + ? primaryText + : directErrorMessage; return GoTaskServiceResult( - success: _boolValue(result['success']) ?? true, + success: success, message: primaryText, turnId: result['turnId']?.toString().trim() ?? '', raw: result, - errorMessage: result['error']?.toString() ?? '', + errorMessage: effectiveErrorMessage, resolvedModel: result['model']?.toString().trim() ?? result['resolvedModel']?.toString().trim() ?? diff --git a/test/runtime/gateway_acp_client_auth_test.dart b/test/runtime/gateway_acp_client_auth_test.dart index 44e02c5e..0c467b0b 100644 --- a/test/runtime/gateway_acp_client_auth_test.dart +++ b/test/runtime/gateway_acp_client_auth_test.dart @@ -79,6 +79,22 @@ void main() { expect(result.success, isFalse); expect(result.message, 'codex returned no displayable output'); + expect(result.errorMessage, 'codex returned no displayable output'); + }); + + test('uses bridge failure message when error field is absent', () { + final result = goTaskServiceResultFromAcpResponse({ + 'jsonrpc': '2.0', + 'id': 'request-id', + 'result': { + 'success': false, + 'message': 'OpenClaw gateway returned artifact_missing', + }, + }, route: GoTaskServiceRoute.externalAcpSingle); + + expect(result.success, isFalse); + expect(result.message, 'OpenClaw gateway returned artifact_missing'); + expect(result.errorMessage, 'OpenClaw gateway returned artifact_missing'); }); test('uses unavailable message when bridge reports provider failure', () { @@ -93,6 +109,7 @@ void main() { expect(result.success, isFalse); expect(result.message, 'codex execution environment is unavailable'); + expect(result.errorMessage, 'codex execution environment is unavailable'); }); test('keeps provider failure diagnostics for empty upstream output', () { @@ -113,6 +130,10 @@ void main() { result.message, 'hermes upstream returned empty response (code: PROVIDER_EMPTY_RESPONSE, upstream: session/prompt)', ); + expect( + result.errorMessage, + 'hermes upstream returned empty response (code: PROVIDER_EMPTY_RESPONSE, upstream: session/prompt)', + ); }); test('keeps bridge message and inline artifacts together', () {