Skip to content

Commit b9cbbed

Browse files
committed
refactor: modularize error handling
1 parent be65ae7 commit b9cbbed

18 files changed

Lines changed: 133 additions & 99 deletions

File tree

docs/migration-guide.md

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,10 @@ tenant-prefixed routes (`/:tenant/tasks/:taskId`, etc.) and validates the
269269

270270
The monolithic `A2AError` class with static factory methods is removed. Errors
271271
now form a shared transport-agnostic hierarchy — one `A2AError` base with
272-
semantic subclasses (`TaskNotFoundError`, `RequestMalformedError`, …) — and
273-
live at the SDK root, not under `/client` or `/server`:
272+
semantic subclasses (`TaskNotFoundError`, `RequestMalformedError`, …). They
273+
live at `@a2a-js/sdk/errors`; gRPC-specific error helpers live at
274+
`@a2a-js/sdk/errors/grpc` so consumers who don't use gRPC don't pull in
275+
`@bufbuild/protobuf`.
274276

275277
```typescript
276278
// v0.3
@@ -279,7 +281,7 @@ throw A2AError.taskNotFound('task-1');
279281
throw A2AError.invalidParams('bad input');
280282

281283
// v1.0
282-
import { TaskNotFoundError, RequestMalformedError } from '@a2a-js/sdk';
284+
import { TaskNotFoundError, RequestMalformedError } from '@a2a-js/sdk/errors';
283285
throw new TaskNotFoundError({ message: 'task-1' });
284286
throw new RequestMalformedError({ message: 'bad input' });
285287
```
@@ -296,7 +298,7 @@ Per-transport variants (`RestTaskNotFoundError`, `GrpcTaskNotFoundError`,
296298
API surfaces are on the base:
297299

298300
```typescript
299-
import { isRestError, TaskNotFoundError } from '@a2a-js/sdk';
301+
import { isRestError, TaskNotFoundError } from '@a2a-js/sdk/errors';
300302

301303
try {
302304
await client.getTask({ id });
@@ -310,9 +312,16 @@ try {
310312
}
311313
```
312314

315+
For gRPC callers, the transport variant + guard live in a separate subpath:
316+
317+
```typescript
318+
import { isGrpcError, TaskNotFoundError } from '@a2a-js/sdk/errors/grpc';
319+
```
320+
313321
Error codes and gRPC/HTTP status mappings are defined in the
314322
[spec](https://a2a-protocol.org/v1.0.0/specification/#54-error-code-mappings)
315-
and live in a single registry (`A2A_ERROR_SPECS`) exported from `@a2a-js/sdk`.
323+
and live in a single registry (`A2A_ERROR_SPECS`) exported from
324+
`@a2a-js/sdk/errors`.
316325

317326
### 3.3 `ServerCallContext` -- Now Mandatory
318327

@@ -469,11 +478,11 @@ await verify(agentCard);
469478

470479
## 5. Import Path Changes
471480

472-
| v0.3 Import | v1.0 Import |
473-
| ------------------------------------------------------------ | ------------------------------------------------------ |
474-
| `import { A2AClient } from '@a2a-js/sdk/client'` | Removed -- use `ClientFactory` + `Client` |
475-
| `import { TextPart, FilePart, DataPart } from '@a2a-js/sdk'` | Removed -- use `Part` |
476-
| `import { MessageSendParams } from '@a2a-js/sdk'` | `import { SendMessageRequest } from '@a2a-js/sdk'` |
477-
| `import { TaskQueryParams } from '@a2a-js/sdk'` | `import { GetTaskRequest } from '@a2a-js/sdk'` |
478-
| `import { TaskIdParams } from '@a2a-js/sdk'` | `import { CancelTaskRequest } from '@a2a-js/sdk'` |
479-
| `import { A2AError } from '@a2a-js/sdk/server'` | `import { TaskNotFoundError, ... } from '@a2a-js/sdk'` |
481+
| v0.3 Import | v1.0 Import |
482+
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- |
483+
| `import { A2AClient } from '@a2a-js/sdk/client'` | Removed -- use `ClientFactory` + `Client` |
484+
| `import { TextPart, FilePart, DataPart } from '@a2a-js/sdk'` | Removed -- use `Part` |
485+
| `import { MessageSendParams } from '@a2a-js/sdk'` | `import { SendMessageRequest } from '@a2a-js/sdk'` |
486+
| `import { TaskQueryParams } from '@a2a-js/sdk'` | `import { GetTaskRequest } from '@a2a-js/sdk'` |
487+
| `import { TaskIdParams } from '@a2a-js/sdk'` | `import { CancelTaskRequest } from '@a2a-js/sdk'` |
488+
| `import { A2AError } from '@a2a-js/sdk/server'` | `import { TaskNotFoundError, ... } from '@a2a-js/sdk/errors'` (or `@a2a-js/sdk/errors/grpc` for gRPC helpers) |

package.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
"type": "module",
1616
"typesVersions": {
1717
"*": {
18+
"errors": [
19+
"./dist/errors/index.d.ts"
20+
],
21+
"errors/grpc": [
22+
"./dist/errors/grpc/index.d.ts"
23+
],
1824
"server": [
1925
"./dist/server/index.d.ts"
2026
],
@@ -56,6 +62,16 @@
5662
"import": "./dist/index.js",
5763
"require": "./dist/index.cjs"
5864
},
65+
"./errors": {
66+
"types": "./dist/errors/index.d.ts",
67+
"import": "./dist/errors/index.js",
68+
"require": "./dist/errors/index.cjs"
69+
},
70+
"./errors/grpc": {
71+
"types": "./dist/errors/grpc/index.d.ts",
72+
"import": "./dist/errors/grpc/index.js",
73+
"require": "./dist/errors/grpc/index.cjs"
74+
},
5975
"./server": {
6076
"types": "./dist/server/index.d.ts",
6177
"import": "./dist/server/index.js",
@@ -154,7 +170,7 @@
154170
"coverage": "vitest run --coverage",
155171
"generate": "curl https://raw.githubusercontent.com/google-a2a/A2A/refs/heads/main/specification/json/a2a.json > spec.json && node scripts/generateTypes.js && rm spec.json",
156172
"generate:compat": "curl https://raw.githubusercontent.com/a2aproject/A2A/v0.3.0/specification/json/a2a.json > compat_spec.json && node scripts/generateCompatTypes.js && rm compat_spec.json",
157-
"test-build": "esbuild ./dist/client/index.js ./dist/server/index.js ./dist/index.js ./dist/compat/v0_3/index.js ./dist/compat/v0_3/client/index.js ./dist/compat/v0_3/server/index.js --bundle --platform=neutral --outdir=dist/tmp-checks --outbase=./dist",
173+
"test-build": "esbuild ./dist/client/index.js ./dist/server/index.js ./dist/index.js ./dist/errors/index.js ./dist/errors/grpc/index.js ./dist/compat/v0_3/index.js ./dist/compat/v0_3/client/index.js ./dist/compat/v0_3/server/index.js --bundle --platform=neutral --outdir=dist/tmp-checks --outbase=./dist",
158174
"itk-agent": "tsx itk/itk_agent.ts"
159175
},
160176
"dependencies": {

src/client/transports/grpc/grpc_transport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { RequestOptions } from '../../multitransport-client.js';
2424
import { Transport, TransportFactory } from '../transport.js';
2525
import { FromProto } from '../../../types/converters/from_proto.js';
2626

27-
import { fromGrpcError } from '../../../errors/index.js';
27+
import { fromGrpcError } from '../../../errors/grpc/index.js';
2828
import { LegacyGrpcTransport } from '../../../compat/v0_3/client/transports/grpc/index.js';
2929
import { isLegacyVersion } from '../../../version_utils.js';
3030
import { pickMatchingInterface } from '../pick_interface.js';

src/compat/v0_3/client/transports/grpc/grpc_transport.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717

1818
import * as grpc from '@grpc/grpc-js';
1919
import { TransportProtocolName } from '../../../../../core.js';
20-
import { fromGrpcError, UnsupportedOperationError } from '../../../../../errors/index.js';
20+
import { UnsupportedOperationError } from '../../../../../errors/index.js';
21+
import { fromGrpcError } from '../../../../../errors/grpc/index.js';
2122
import { A2A_LEGACY_PROTOCOL_VERSION } from '../../../../../constants.js';
2223
import type { SendMessageResult } from '../../../../../index.js';
2324
import type { RequestOptions } from '../../../../../client/multitransport-client.js';

src/compat/v0_3/server/grpc/grpc_service.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,12 @@ import { UserBuilder } from './common.js';
3939
import { A2A_VERSION_HEADER, HTTP_EXTENSION_HEADER } from '../../../../constants.js';
4040
import { LEGACY_HTTP_EXTENSION_HEADER } from '../../constants.js';
4141
import {
42+
A2A_STATUS_CODE,
4243
A2AError,
43-
buildGrpcErrorMetadata,
44-
GRPC_STATUS,
45-
grpcStatusFor,
4644
InvalidAgentResponseError,
4745
isJsonRpcError,
4846
} from '../../../../errors/index.js';
47+
import { buildGrpcErrorMetadata, grpcStatusFor } from '../../../../errors/grpc/index.js';
4948
import { validateVersion } from '../../../../server/version.js';
5049
import { FromProto } from '../../types/converters/from_proto.js';
5150
import { ToProto } from '../../types/converters/to_proto.js';
@@ -448,7 +447,7 @@ const mapToError = (error: unknown): Partial<grpc.ServiceError> => {
448447
} else if (error instanceof A2AError) {
449448
code = grpcStatusFor(error);
450449
} else {
451-
code = GRPC_STATUS.UNKNOWN;
450+
code = A2A_STATUS_CODE.UNKNOWN;
452451
}
453452
const message = error instanceof Error ? error.message : 'Internal server error';
454453
const result: Partial<grpc.ServiceError> = { code, details: message };

src/errors/base.ts

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,14 @@ export const HTTP_STATUS = {
4545
NOT_IMPLEMENTED: 501,
4646
} as const;
4747

48-
/** gRPC status codes referenced by the registry. Mirrors `@grpc/grpc-js`'s `status` enum. */
49-
export const GRPC_STATUS = {
48+
/**
49+
* Canonical numeric status codes used by the semantic-error registry
50+
* to describe the spec-mapped status per §5.4. The numeric namespace
51+
* matches gRPC's `status` enum (so the gRPC transport can emit them
52+
* directly) and the string form (see {@link A2A_STATUS_NAME}) fills
53+
* the REST body's `status` field per §11.6.
54+
*/
55+
export const A2A_STATUS_CODE = {
5056
OK: 0,
5157
CANCELLED: 1,
5258
UNKNOWN: 2,
@@ -66,25 +72,28 @@ export const GRPC_STATUS = {
6672
UNAUTHENTICATED: 16,
6773
} as const;
6874

69-
/** Names of the gRPC status codes, for `google.rpc.Status.status`. */
70-
export const GRPC_STATUS_NAME: Readonly<Record<number, string>> = {
71-
[GRPC_STATUS.OK]: 'OK',
72-
[GRPC_STATUS.CANCELLED]: 'CANCELLED',
73-
[GRPC_STATUS.UNKNOWN]: 'UNKNOWN',
74-
[GRPC_STATUS.INVALID_ARGUMENT]: 'INVALID_ARGUMENT',
75-
[GRPC_STATUS.DEADLINE_EXCEEDED]: 'DEADLINE_EXCEEDED',
76-
[GRPC_STATUS.NOT_FOUND]: 'NOT_FOUND',
77-
[GRPC_STATUS.ALREADY_EXISTS]: 'ALREADY_EXISTS',
78-
[GRPC_STATUS.PERMISSION_DENIED]: 'PERMISSION_DENIED',
79-
[GRPC_STATUS.RESOURCE_EXHAUSTED]: 'RESOURCE_EXHAUSTED',
80-
[GRPC_STATUS.FAILED_PRECONDITION]: 'FAILED_PRECONDITION',
81-
[GRPC_STATUS.ABORTED]: 'ABORTED',
82-
[GRPC_STATUS.OUT_OF_RANGE]: 'OUT_OF_RANGE',
83-
[GRPC_STATUS.UNIMPLEMENTED]: 'UNIMPLEMENTED',
84-
[GRPC_STATUS.INTERNAL]: 'INTERNAL',
85-
[GRPC_STATUS.UNAVAILABLE]: 'UNAVAILABLE',
86-
[GRPC_STATUS.DATA_LOSS]: 'DATA_LOSS',
87-
[GRPC_STATUS.UNAUTHENTICATED]: 'UNAUTHENTICATED',
75+
/**
76+
* String form of {@link A2A_STATUS_CODE}, used in the REST body's
77+
* `status` field per §11.6. Names follow the gRPC enum form.
78+
*/
79+
export const A2A_STATUS_NAME: Readonly<Record<number, string>> = {
80+
[A2A_STATUS_CODE.OK]: 'OK',
81+
[A2A_STATUS_CODE.CANCELLED]: 'CANCELLED',
82+
[A2A_STATUS_CODE.UNKNOWN]: 'UNKNOWN',
83+
[A2A_STATUS_CODE.INVALID_ARGUMENT]: 'INVALID_ARGUMENT',
84+
[A2A_STATUS_CODE.DEADLINE_EXCEEDED]: 'DEADLINE_EXCEEDED',
85+
[A2A_STATUS_CODE.NOT_FOUND]: 'NOT_FOUND',
86+
[A2A_STATUS_CODE.ALREADY_EXISTS]: 'ALREADY_EXISTS',
87+
[A2A_STATUS_CODE.PERMISSION_DENIED]: 'PERMISSION_DENIED',
88+
[A2A_STATUS_CODE.RESOURCE_EXHAUSTED]: 'RESOURCE_EXHAUSTED',
89+
[A2A_STATUS_CODE.FAILED_PRECONDITION]: 'FAILED_PRECONDITION',
90+
[A2A_STATUS_CODE.ABORTED]: 'ABORTED',
91+
[A2A_STATUS_CODE.OUT_OF_RANGE]: 'OUT_OF_RANGE',
92+
[A2A_STATUS_CODE.UNIMPLEMENTED]: 'UNIMPLEMENTED',
93+
[A2A_STATUS_CODE.INTERNAL]: 'INTERNAL',
94+
[A2A_STATUS_CODE.UNAVAILABLE]: 'UNAVAILABLE',
95+
[A2A_STATUS_CODE.DATA_LOSS]: 'DATA_LOSS',
96+
[A2A_STATUS_CODE.UNAUTHENTICATED]: 'UNAUTHENTICATED',
8897
};
8998

9099
/** A structured detail object included in error responses. */
@@ -177,87 +186,87 @@ const specs: A2AErrorSpec[] = [
177186
name: 'TaskNotFoundError',
178187
reason: 'TASK_NOT_FOUND',
179188
code: A2A_ERROR_CODE.TASK_NOT_FOUND,
180-
grpcStatus: GRPC_STATUS.NOT_FOUND,
189+
grpcStatus: A2A_STATUS_CODE.NOT_FOUND,
181190
httpStatus: HTTP_STATUS.NOT_FOUND,
182191
defaultMessage: 'Task not found',
183192
},
184193
{
185194
name: 'TaskNotCancelableError',
186195
reason: 'TASK_NOT_CANCELABLE',
187196
code: A2A_ERROR_CODE.TASK_NOT_CANCELABLE,
188-
grpcStatus: GRPC_STATUS.FAILED_PRECONDITION,
197+
grpcStatus: A2A_STATUS_CODE.FAILED_PRECONDITION,
189198
httpStatus: HTTP_STATUS.BAD_REQUEST,
190199
defaultMessage: 'Task cannot be canceled',
191200
},
192201
{
193202
name: 'PushNotificationNotSupportedError',
194203
reason: 'PUSH_NOTIFICATION_NOT_SUPPORTED',
195204
code: A2A_ERROR_CODE.PUSH_NOTIFICATION_NOT_SUPPORTED,
196-
grpcStatus: GRPC_STATUS.FAILED_PRECONDITION,
205+
grpcStatus: A2A_STATUS_CODE.FAILED_PRECONDITION,
197206
httpStatus: HTTP_STATUS.BAD_REQUEST,
198207
defaultMessage: 'Push Notification is not supported',
199208
},
200209
{
201210
name: 'UnsupportedOperationError',
202211
reason: 'UNSUPPORTED_OPERATION',
203212
code: A2A_ERROR_CODE.UNSUPPORTED_OPERATION,
204-
grpcStatus: GRPC_STATUS.FAILED_PRECONDITION,
213+
grpcStatus: A2A_STATUS_CODE.FAILED_PRECONDITION,
205214
httpStatus: HTTP_STATUS.BAD_REQUEST,
206215
defaultMessage: 'This operation is not supported',
207216
},
208217
{
209218
name: 'ContentTypeNotSupportedError',
210219
reason: 'CONTENT_TYPE_NOT_SUPPORTED',
211220
code: A2A_ERROR_CODE.CONTENT_TYPE_NOT_SUPPORTED,
212-
grpcStatus: GRPC_STATUS.INVALID_ARGUMENT,
221+
grpcStatus: A2A_STATUS_CODE.INVALID_ARGUMENT,
213222
httpStatus: HTTP_STATUS.BAD_REQUEST,
214223
defaultMessage: 'Incompatible content types',
215224
},
216225
{
217226
name: 'InvalidAgentResponseError',
218227
reason: 'INVALID_AGENT_RESPONSE',
219228
code: A2A_ERROR_CODE.INVALID_AGENT_RESPONSE,
220-
grpcStatus: GRPC_STATUS.INTERNAL,
229+
grpcStatus: A2A_STATUS_CODE.INTERNAL,
221230
httpStatus: HTTP_STATUS.INTERNAL_SERVER_ERROR,
222231
defaultMessage: 'Invalid agent response type',
223232
},
224233
{
225234
name: 'ExtendedAgentCardNotConfiguredError',
226235
reason: 'EXTENDED_AGENT_CARD_NOT_CONFIGURED',
227236
code: A2A_ERROR_CODE.EXTENDED_CARD_NOT_CONFIGURED,
228-
grpcStatus: GRPC_STATUS.FAILED_PRECONDITION,
237+
grpcStatus: A2A_STATUS_CODE.FAILED_PRECONDITION,
229238
httpStatus: HTTP_STATUS.BAD_REQUEST,
230239
defaultMessage: 'Extended Agent Card not configured',
231240
},
232241
{
233242
name: 'ExtensionSupportRequiredError',
234243
reason: 'EXTENSION_SUPPORT_REQUIRED',
235244
code: A2A_ERROR_CODE.EXTENSION_SUPPORT_REQUIRED,
236-
grpcStatus: GRPC_STATUS.FAILED_PRECONDITION,
245+
grpcStatus: A2A_STATUS_CODE.FAILED_PRECONDITION,
237246
httpStatus: HTTP_STATUS.BAD_REQUEST,
238247
defaultMessage: 'Extension support required',
239248
},
240249
{
241250
name: 'VersionNotSupportedError',
242251
reason: 'VERSION_NOT_SUPPORTED',
243252
code: A2A_ERROR_CODE.VERSION_NOT_SUPPORTED,
244-
grpcStatus: GRPC_STATUS.FAILED_PRECONDITION,
253+
grpcStatus: A2A_STATUS_CODE.FAILED_PRECONDITION,
245254
httpStatus: HTTP_STATUS.BAD_REQUEST,
246255
defaultMessage: 'Version not supported',
247256
},
248257
{
249258
name: 'RequestMalformedError',
250259
reason: 'INVALID_PARAMS',
251260
code: A2A_ERROR_CODE.INVALID_PARAMS,
252-
grpcStatus: GRPC_STATUS.INVALID_ARGUMENT,
261+
grpcStatus: A2A_STATUS_CODE.INVALID_ARGUMENT,
253262
httpStatus: HTTP_STATUS.BAD_REQUEST,
254263
defaultMessage: 'Request malformed',
255264
},
256265
{
257266
name: 'GenericError',
258267
reason: 'INTERNAL_ERROR',
259268
code: A2A_ERROR_CODE.INTERNAL_ERROR,
260-
grpcStatus: GRPC_STATUS.INTERNAL,
269+
grpcStatus: A2A_STATUS_CODE.INTERNAL,
261270
httpStatus: HTTP_STATUS.INTERNAL_SERVER_ERROR,
262271
defaultMessage: 'An unexpected error occurred.',
263272
},
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import {
1313
A2A_ERROR_DOMAIN,
1414
A2A_ERROR_SPECS,
1515
A2A_ERROR_SPECS_BY_REASON,
16+
A2A_STATUS_CODE,
1617
A2AError,
1718
type A2AErrorOptions,
1819
ERROR_INFO_TYPE,
19-
GRPC_STATUS,
20-
} from './base.js';
21-
import { Any } from '../grpc/pb/google/protobuf/any.js';
22-
import { ErrorInfo } from '../grpc/pb/google/rpc/error_details.js';
23-
import { Status } from '../grpc/pb/google/rpc/status.js';
20+
} from '../base.js';
21+
import { Any } from '../../grpc/pb/google/protobuf/any.js';
22+
import { ErrorInfo } from '../../grpc/pb/google/rpc/error_details.js';
23+
import { Status } from '../../grpc/pb/google/rpc/status.js';
2424

2525
/** Trailing metadata key for `google.rpc.Status`. */
2626
export const GRPC_STATUS_DETAILS_BIN = 'grpc-status-details-bin';
@@ -129,8 +129,8 @@ export const GRPC_ERROR_CLASSES: Readonly<
129129
export function grpcStatusFor(error: unknown): number {
130130
if (isGrpcError(error)) return error.status;
131131
if (error instanceof A2AError)
132-
return A2A_ERROR_SPECS[error.name]?.grpcStatus ?? GRPC_STATUS.UNKNOWN;
133-
return GRPC_STATUS.UNKNOWN;
132+
return A2A_ERROR_SPECS[error.name]?.grpcStatus ?? A2A_STATUS_CODE.UNKNOWN;
133+
return A2A_STATUS_CODE.UNKNOWN;
134134
}
135135

136136
/** Encodes a `google.rpc.Status` + `ErrorInfo` blob for `grpc-status-details-bin`. */
@@ -229,9 +229,9 @@ export function fromGrpcError(error: grpc.ServiceError, method?: string): GrpcA2
229229
const suffix = method ? ` for ${method}` : '';
230230
return new GrpcGenericError({
231231
message:
232-
`gRPC error${suffix}: ${error.code ?? GRPC_STATUS.UNKNOWN} ${error.details ?? ''}`.trim(),
232+
`gRPC error${suffix}: ${error.code ?? A2A_STATUS_CODE.UNKNOWN} ${error.details ?? ''}`.trim(),
233233
cause: error,
234-
status: error.code ?? GRPC_STATUS.UNKNOWN,
234+
status: error.code ?? A2A_STATUS_CODE.UNKNOWN,
235235
statusDetailsBin,
236236
});
237237
}

src/errors/index.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
/** Barrel for the transport-agnostic A2A error hierarchy. */
1+
/**
2+
* Transport-agnostic A2A error hierarchy: base class, semantic
3+
* subclasses, plus the REST and JSON-RPC transport variants (both
4+
* Workers-safe, no pb runtime dependency).
5+
*
6+
* gRPC errors live at `@a2a-js/sdk/errors/grpc` because their
7+
* encode/decode helpers pull `@bufbuild/protobuf`.
8+
*/
29

310
export * from './base.js';
411
export * from './rest.js';
5-
export * from './grpc.js';
612
export * from './json_rpc.js';

src/errors/rest.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
type A2AErrorOptions,
1616
ERROR_INFO_TYPE,
1717
type ErrorDetail,
18-
GRPC_STATUS_NAME,
18+
A2A_STATUS_NAME,
1919
HTTP_STATUS,
2020
type RestErrorBody,
2121
} from './base.js';
@@ -150,7 +150,7 @@ export function toRestErrorBody(error: unknown, httpStatus: number): RestErrorBo
150150
if (error instanceof A2AError) {
151151
details.push(error.toErrorInfo());
152152
const spec = A2A_ERROR_SPECS[error.name];
153-
statusName = spec ? (GRPC_STATUS_NAME[spec.grpcStatus] ?? 'UNKNOWN') : 'UNKNOWN';
153+
statusName = spec ? (A2A_STATUS_NAME[spec.grpcStatus] ?? 'UNKNOWN') : 'UNKNOWN';
154154
} else if (httpStatus === HTTP_STATUS.NOT_FOUND) statusName = 'NOT_FOUND';
155155
else if (httpStatus === HTTP_STATUS.INTERNAL_SERVER_ERROR) statusName = 'INTERNAL';
156156
else if (httpStatus === HTTP_STATUS.BAD_REQUEST) statusName = 'INVALID_ARGUMENT';

0 commit comments

Comments
 (0)