@a2a-js/sdk 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,15 +21,24 @@ var client_exports = {};
21
21
  __export(client_exports, {
22
22
  A2AClient: () => A2AClient,
23
23
  AgentCardResolver: () => AgentCardResolver,
24
+ AuthenticatedExtendedCardNotConfiguredError: () => AuthenticatedExtendedCardNotConfiguredError,
24
25
  Client: () => Client,
25
26
  ClientCallContext: () => ClientCallContext,
26
27
  ClientCallContextKey: () => ClientCallContextKey,
27
28
  ClientFactory: () => ClientFactory,
28
29
  ClientFactoryOptions: () => ClientFactoryOptions,
30
+ ContentTypeNotSupportedError: () => ContentTypeNotSupportedError,
29
31
  DefaultAgentCardResolver: () => DefaultAgentCardResolver,
32
+ InvalidAgentResponseError: () => InvalidAgentResponseError,
30
33
  JsonRpcTransport: () => JsonRpcTransport,
31
34
  JsonRpcTransportFactory: () => JsonRpcTransportFactory,
35
+ PushNotificationNotSupportedError: () => PushNotificationNotSupportedError,
36
+ RestTransport: () => RestTransport,
37
+ RestTransportFactory: () => RestTransportFactory,
32
38
  ServiceParameters: () => ServiceParameters,
39
+ TaskNotCancelableError: () => TaskNotCancelableError,
40
+ TaskNotFoundError: () => TaskNotFoundError,
41
+ UnsupportedOperationError: () => UnsupportedOperationError,
33
42
  createAuthenticatingFetchWithRetry: () => createAuthenticatingFetchWithRetry,
34
43
  withA2AExtensions: () => withA2AExtensions
35
44
  });
@@ -40,6 +49,20 @@ var AGENT_CARD_PATH = ".well-known/agent-card.json";
40
49
  var HTTP_EXTENSION_HEADER = "X-A2A-Extensions";
41
50
 
42
51
  // src/errors.ts
52
+ var A2A_ERROR_CODE = {
53
+ PARSE_ERROR: -32700,
54
+ INVALID_REQUEST: -32600,
55
+ METHOD_NOT_FOUND: -32601,
56
+ INVALID_PARAMS: -32602,
57
+ INTERNAL_ERROR: -32603,
58
+ TASK_NOT_FOUND: -32001,
59
+ TASK_NOT_CANCELABLE: -32002,
60
+ PUSH_NOTIFICATION_NOT_SUPPORTED: -32003,
61
+ UNSUPPORTED_OPERATION: -32004,
62
+ CONTENT_TYPE_NOT_SUPPORTED: -32005,
63
+ INVALID_AGENT_RESPONSE: -32006,
64
+ AUTHENTICATED_EXTENDED_CARD_NOT_CONFIGURED: -32007
65
+ };
43
66
  var TaskNotFoundError = class extends Error {
44
67
  constructor(message) {
45
68
  super(message ?? "Task not found");
@@ -83,6 +106,38 @@ var AuthenticatedExtendedCardNotConfiguredError = class extends Error {
83
106
  }
84
107
  };
85
108
 
109
+ // src/sse_utils.ts
110
+ async function* parseSseStream(response) {
111
+ if (!response.body) {
112
+ throw new Error("SSE response body is undefined. Cannot read stream.");
113
+ }
114
+ let buffer = "";
115
+ let eventType = "message";
116
+ let eventData = "";
117
+ for await (const value of response.body.pipeThrough(new TextDecoderStream())) {
118
+ buffer += value;
119
+ let lineEndIndex;
120
+ while ((lineEndIndex = buffer.indexOf("\n")) >= 0) {
121
+ const line = buffer.substring(0, lineEndIndex).trim();
122
+ buffer = buffer.substring(lineEndIndex + 1);
123
+ if (line === "") {
124
+ if (eventData) {
125
+ yield { type: eventType, data: eventData };
126
+ eventData = "";
127
+ eventType = "message";
128
+ }
129
+ } else if (line.startsWith("event:")) {
130
+ eventType = line.substring("event:".length).trim();
131
+ } else if (line.startsWith("data:")) {
132
+ eventData = line.substring("data:".length).trim();
133
+ }
134
+ }
135
+ }
136
+ if (eventData) {
137
+ yield { type: eventType, data: eventData };
138
+ }
139
+ }
140
+
86
141
  // src/client/transports/json_rpc_transport.ts
87
142
  var JsonRpcTransport = class _JsonRpcTransport {
88
143
  customFetchImpl;
@@ -251,55 +306,8 @@ var JsonRpcTransport = class _JsonRpcTransport {
251
306
  `Invalid response Content-Type for SSE stream for ${method}. Expected 'text/event-stream'.`
252
307
  );
253
308
  }
254
- yield* this._parseA2ASseStream(response, clientRequestId);
255
- }
256
- async *_parseA2ASseStream(response, originalRequestId) {
257
- if (!response.body) {
258
- throw new Error("SSE response body is undefined. Cannot read stream.");
259
- }
260
- const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
261
- let buffer = "";
262
- let eventDataBuffer = "";
263
- try {
264
- while (true) {
265
- const { done, value } = await reader.read();
266
- if (done) {
267
- if (eventDataBuffer.trim()) {
268
- const result = this._processSseEventData(
269
- eventDataBuffer,
270
- originalRequestId
271
- );
272
- yield result;
273
- }
274
- break;
275
- }
276
- buffer += value;
277
- let lineEndIndex;
278
- while ((lineEndIndex = buffer.indexOf("\n")) >= 0) {
279
- const line = buffer.substring(0, lineEndIndex).trim();
280
- buffer = buffer.substring(lineEndIndex + 1);
281
- if (line === "") {
282
- if (eventDataBuffer) {
283
- const result = this._processSseEventData(
284
- eventDataBuffer,
285
- originalRequestId
286
- );
287
- yield result;
288
- eventDataBuffer = "";
289
- }
290
- } else if (line.startsWith("data:")) {
291
- eventDataBuffer += line.substring(5).trimStart() + "\n";
292
- }
293
- }
294
- }
295
- } catch (error) {
296
- console.error(
297
- "Error reading or parsing SSE stream:",
298
- error instanceof Error && error.message || "Error unknown"
299
- );
300
- throw error;
301
- } finally {
302
- reader.releaseLock();
309
+ for await (const event of parseSseStream(response)) {
310
+ yield this._processSseEventData(event.data, clientRequestId);
303
311
  }
304
312
  }
305
313
  _processSseEventData(jsonData, originalRequestId) {
@@ -307,7 +315,7 @@ var JsonRpcTransport = class _JsonRpcTransport {
307
315
  throw new Error("Attempted to process empty SSE event data.");
308
316
  }
309
317
  try {
310
- const sseJsonRpcResponse = JSON.parse(jsonData.replace(/\n$/, ""));
318
+ const sseJsonRpcResponse = JSON.parse(jsonData);
311
319
  const a2aStreamResponse = sseJsonRpcResponse;
312
320
  if (a2aStreamResponse.id !== originalRequestId) {
313
321
  console.warn(
@@ -1107,144 +1115,2496 @@ var Client = class {
1107
1115
  }
1108
1116
  };
1109
1117
 
1110
- // src/client/factory.ts
1111
- var ClientFactoryOptions = {
1118
+ // src/server/error.ts
1119
+ var A2AError = class _A2AError extends Error {
1120
+ code;
1121
+ data;
1122
+ taskId;
1123
+ // Optional task ID context
1124
+ constructor(code, message, data, taskId) {
1125
+ super(message);
1126
+ this.name = "A2AError";
1127
+ this.code = code;
1128
+ this.data = data;
1129
+ this.taskId = taskId;
1130
+ }
1112
1131
  /**
1113
- * SDK default options for {@link ClientFactory}.
1132
+ * Formats the error into a standard JSON-RPC error object structure.
1114
1133
  */
1115
- default: {
1116
- transports: [new JsonRpcTransportFactory()]
1134
+ toJSONRPCError() {
1135
+ const errorObject = {
1136
+ code: this.code,
1137
+ message: this.message
1138
+ };
1139
+ if (this.data !== void 0) {
1140
+ errorObject.data = this.data;
1141
+ }
1142
+ return errorObject;
1143
+ }
1144
+ // Static factory methods for common errors
1145
+ static parseError(message, data) {
1146
+ return new _A2AError(-32700, message, data);
1147
+ }
1148
+ static invalidRequest(message, data) {
1149
+ return new _A2AError(-32600, message, data);
1150
+ }
1151
+ static methodNotFound(method) {
1152
+ return new _A2AError(-32601, `Method not found: ${method}`);
1153
+ }
1154
+ static invalidParams(message, data) {
1155
+ return new _A2AError(-32602, message, data);
1156
+ }
1157
+ static internalError(message, data) {
1158
+ return new _A2AError(-32603, message, data);
1159
+ }
1160
+ static taskNotFound(taskId) {
1161
+ return new _A2AError(-32001, `Task not found: ${taskId}`, void 0, taskId);
1162
+ }
1163
+ static taskNotCancelable(taskId) {
1164
+ return new _A2AError(-32002, `Task not cancelable: ${taskId}`, void 0, taskId);
1165
+ }
1166
+ static pushNotificationNotSupported() {
1167
+ return new _A2AError(-32003, "Push Notification is not supported");
1168
+ }
1169
+ static unsupportedOperation(operation) {
1170
+ return new _A2AError(-32004, `Unsupported operation: ${operation}`);
1171
+ }
1172
+ static authenticatedExtendedCardNotConfigured() {
1173
+ return new _A2AError(-32007, `Extended card not configured.`);
1174
+ }
1175
+ };
1176
+
1177
+ // src/types/pb/google/protobuf/timestamp.ts
1178
+ var Timestamp = {
1179
+ fromJSON(object) {
1180
+ return {
1181
+ seconds: isSet(object.seconds) ? globalThis.Number(object.seconds) : 0,
1182
+ nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0
1183
+ };
1117
1184
  },
1118
- /**
1119
- * Creates new options by merging an original and an override object.
1120
- * Transports are merged based on `TransportFactory.protocolName`,
1121
- * interceptors are concatenated, other fields are overriden.
1122
- *
1123
- * @example
1124
- * ```ts
1125
- * const options = ClientFactoryOptions.createFrom(ClientFactoryOptions.default, {
1126
- * transports: [new MyCustomTransportFactory()], // adds a custom transport
1127
- * clientConfig: { interceptors: [new MyInterceptor()] }, // adds a custom interceptor
1128
- * });
1129
- * ```
1130
- */
1131
- createFrom(original, overrides) {
1185
+ toJSON(message) {
1186
+ const obj = {};
1187
+ if (message.seconds !== 0) {
1188
+ obj.seconds = Math.round(message.seconds);
1189
+ }
1190
+ if (message.nanos !== 0) {
1191
+ obj.nanos = Math.round(message.nanos);
1192
+ }
1193
+ return obj;
1194
+ }
1195
+ };
1196
+ function isSet(value) {
1197
+ return value !== null && value !== void 0;
1198
+ }
1199
+
1200
+ // src/types/pb/a2a.ts
1201
+ function taskStateFromJSON(object) {
1202
+ switch (object) {
1203
+ case 0:
1204
+ case "TASK_STATE_UNSPECIFIED":
1205
+ return 0 /* TASK_STATE_UNSPECIFIED */;
1206
+ case 1:
1207
+ case "TASK_STATE_SUBMITTED":
1208
+ return 1 /* TASK_STATE_SUBMITTED */;
1209
+ case 2:
1210
+ case "TASK_STATE_WORKING":
1211
+ return 2 /* TASK_STATE_WORKING */;
1212
+ case 3:
1213
+ case "TASK_STATE_COMPLETED":
1214
+ return 3 /* TASK_STATE_COMPLETED */;
1215
+ case 4:
1216
+ case "TASK_STATE_FAILED":
1217
+ return 4 /* TASK_STATE_FAILED */;
1218
+ case 5:
1219
+ case "TASK_STATE_CANCELLED":
1220
+ return 5 /* TASK_STATE_CANCELLED */;
1221
+ case 6:
1222
+ case "TASK_STATE_INPUT_REQUIRED":
1223
+ return 6 /* TASK_STATE_INPUT_REQUIRED */;
1224
+ case 7:
1225
+ case "TASK_STATE_REJECTED":
1226
+ return 7 /* TASK_STATE_REJECTED */;
1227
+ case 8:
1228
+ case "TASK_STATE_AUTH_REQUIRED":
1229
+ return 8 /* TASK_STATE_AUTH_REQUIRED */;
1230
+ case -1:
1231
+ case "UNRECOGNIZED":
1232
+ default:
1233
+ return -1 /* UNRECOGNIZED */;
1234
+ }
1235
+ }
1236
+ function taskStateToJSON(object) {
1237
+ switch (object) {
1238
+ case 0 /* TASK_STATE_UNSPECIFIED */:
1239
+ return "TASK_STATE_UNSPECIFIED";
1240
+ case 1 /* TASK_STATE_SUBMITTED */:
1241
+ return "TASK_STATE_SUBMITTED";
1242
+ case 2 /* TASK_STATE_WORKING */:
1243
+ return "TASK_STATE_WORKING";
1244
+ case 3 /* TASK_STATE_COMPLETED */:
1245
+ return "TASK_STATE_COMPLETED";
1246
+ case 4 /* TASK_STATE_FAILED */:
1247
+ return "TASK_STATE_FAILED";
1248
+ case 5 /* TASK_STATE_CANCELLED */:
1249
+ return "TASK_STATE_CANCELLED";
1250
+ case 6 /* TASK_STATE_INPUT_REQUIRED */:
1251
+ return "TASK_STATE_INPUT_REQUIRED";
1252
+ case 7 /* TASK_STATE_REJECTED */:
1253
+ return "TASK_STATE_REJECTED";
1254
+ case 8 /* TASK_STATE_AUTH_REQUIRED */:
1255
+ return "TASK_STATE_AUTH_REQUIRED";
1256
+ case -1 /* UNRECOGNIZED */:
1257
+ default:
1258
+ return "UNRECOGNIZED";
1259
+ }
1260
+ }
1261
+ function roleFromJSON(object) {
1262
+ switch (object) {
1263
+ case 0:
1264
+ case "ROLE_UNSPECIFIED":
1265
+ return 0 /* ROLE_UNSPECIFIED */;
1266
+ case 1:
1267
+ case "ROLE_USER":
1268
+ return 1 /* ROLE_USER */;
1269
+ case 2:
1270
+ case "ROLE_AGENT":
1271
+ return 2 /* ROLE_AGENT */;
1272
+ case -1:
1273
+ case "UNRECOGNIZED":
1274
+ default:
1275
+ return -1 /* UNRECOGNIZED */;
1276
+ }
1277
+ }
1278
+ function roleToJSON(object) {
1279
+ switch (object) {
1280
+ case 0 /* ROLE_UNSPECIFIED */:
1281
+ return "ROLE_UNSPECIFIED";
1282
+ case 1 /* ROLE_USER */:
1283
+ return "ROLE_USER";
1284
+ case 2 /* ROLE_AGENT */:
1285
+ return "ROLE_AGENT";
1286
+ case -1 /* UNRECOGNIZED */:
1287
+ default:
1288
+ return "UNRECOGNIZED";
1289
+ }
1290
+ }
1291
+ var SendMessageConfiguration = {
1292
+ fromJSON(object) {
1132
1293
  return {
1133
- ...original,
1134
- ...overrides,
1135
- transports: mergeTransports(original.transports, overrides.transports),
1136
- clientConfig: {
1137
- ...original.clientConfig ?? {},
1138
- ...overrides.clientConfig ?? {},
1139
- interceptors: mergeArrays(
1140
- original.clientConfig?.interceptors,
1141
- overrides.clientConfig?.interceptors
1142
- ),
1143
- acceptedOutputModes: overrides.clientConfig?.acceptedOutputModes ?? original.clientConfig?.acceptedOutputModes
1144
- },
1145
- preferredTransports: overrides.preferredTransports ?? original.preferredTransports
1294
+ acceptedOutputModes: globalThis.Array.isArray(object?.acceptedOutputModes) ? object.acceptedOutputModes.map((e) => globalThis.String(e)) : globalThis.Array.isArray(object?.accepted_output_modes) ? object.accepted_output_modes.map(
1295
+ (e) => globalThis.String(e)
1296
+ ) : [],
1297
+ pushNotification: isSet2(object.pushNotification) ? PushNotificationConfig.fromJSON(object.pushNotification) : isSet2(object.push_notification) ? PushNotificationConfig.fromJSON(object.push_notification) : void 0,
1298
+ historyLength: isSet2(object.historyLength) ? globalThis.Number(object.historyLength) : isSet2(object.history_length) ? globalThis.Number(object.history_length) : void 0,
1299
+ blocking: isSet2(object.blocking) ? globalThis.Boolean(object.blocking) : void 0
1146
1300
  };
1301
+ },
1302
+ toJSON(message) {
1303
+ const obj = {};
1304
+ if (message.acceptedOutputModes?.length) {
1305
+ obj.acceptedOutputModes = message.acceptedOutputModes;
1306
+ }
1307
+ if (message.pushNotification !== void 0) {
1308
+ obj.pushNotification = PushNotificationConfig.toJSON(message.pushNotification);
1309
+ }
1310
+ if (message.historyLength !== void 0) {
1311
+ obj.historyLength = Math.round(message.historyLength);
1312
+ }
1313
+ if (message.blocking !== void 0) {
1314
+ obj.blocking = message.blocking;
1315
+ }
1316
+ return obj;
1147
1317
  }
1148
1318
  };
1149
- var ClientFactory = class {
1150
- constructor(options = ClientFactoryOptions.default) {
1151
- this.options = options;
1152
- if (!options.transports || options.transports.length === 0) {
1153
- throw new Error("No transports provided");
1319
+ var Task = {
1320
+ fromJSON(object) {
1321
+ return {
1322
+ id: isSet2(object.id) ? globalThis.String(object.id) : void 0,
1323
+ contextId: isSet2(object.contextId) ? globalThis.String(object.contextId) : isSet2(object.context_id) ? globalThis.String(object.context_id) : void 0,
1324
+ status: isSet2(object.status) ? TaskStatus.fromJSON(object.status) : void 0,
1325
+ artifacts: globalThis.Array.isArray(object?.artifacts) ? object.artifacts.map((e) => Artifact.fromJSON(e)) : [],
1326
+ history: globalThis.Array.isArray(object?.history) ? object.history.map((e) => Message.fromJSON(e)) : [],
1327
+ metadata: isObject(object.metadata) ? object.metadata : void 0
1328
+ };
1329
+ },
1330
+ toJSON(message) {
1331
+ const obj = {};
1332
+ if (message.id !== void 0) {
1333
+ obj.id = message.id;
1154
1334
  }
1155
- this.transportsByName = transportsByName(options.transports);
1156
- for (const transport of options.preferredTransports ?? []) {
1157
- const factory = this.options.transports.find((t) => t.protocolName === transport);
1158
- if (!factory) {
1159
- throw new Error(
1160
- `Unknown preferred transport: ${transport}, available transports: ${[...this.transportsByName.keys()].join()}`
1161
- );
1162
- }
1335
+ if (message.contextId !== void 0) {
1336
+ obj.contextId = message.contextId;
1163
1337
  }
1164
- this.agentCardResolver = options.cardResolver ?? AgentCardResolver.default;
1338
+ if (message.status !== void 0) {
1339
+ obj.status = TaskStatus.toJSON(message.status);
1340
+ }
1341
+ if (message.artifacts?.length) {
1342
+ obj.artifacts = message.artifacts.map((e) => Artifact.toJSON(e));
1343
+ }
1344
+ if (message.history?.length) {
1345
+ obj.history = message.history.map((e) => Message.toJSON(e));
1346
+ }
1347
+ if (message.metadata !== void 0) {
1348
+ obj.metadata = message.metadata;
1349
+ }
1350
+ return obj;
1165
1351
  }
1166
- transportsByName;
1167
- agentCardResolver;
1168
- /**
1169
- * Creates a new client from the provided agent card.
1170
- */
1171
- async createFromAgentCard(agentCard) {
1172
- const agentCardPreferred = agentCard.preferredTransport ?? JsonRpcTransportFactory.name;
1173
- const additionalInterfaces = agentCard.additionalInterfaces ?? [];
1174
- const urlsPerAgentTransports = new Map([
1175
- [agentCardPreferred, agentCard.url],
1176
- ...additionalInterfaces.map((i) => [i.transport, i.url])
1177
- ]);
1178
- const transportsByPreference = [
1179
- ...this.options.preferredTransports ?? [],
1180
- agentCardPreferred,
1181
- ...additionalInterfaces.map((i) => i.transport)
1182
- ];
1183
- for (const transport of transportsByPreference) {
1184
- if (!urlsPerAgentTransports.has(transport)) {
1185
- continue;
1186
- }
1187
- const factory = this.transportsByName.get(transport);
1188
- if (!factory) {
1189
- continue;
1190
- }
1191
- return new Client(
1192
- await factory.create(urlsPerAgentTransports.get(transport), agentCard),
1193
- agentCard,
1194
- this.options.clientConfig
1195
- );
1352
+ };
1353
+ var TaskStatus = {
1354
+ fromJSON(object) {
1355
+ return {
1356
+ state: isSet2(object.state) ? taskStateFromJSON(object.state) : void 0,
1357
+ update: isSet2(object.message) ? Message.fromJSON(object.message) : isSet2(object.update) ? Message.fromJSON(object.update) : void 0,
1358
+ timestamp: isSet2(object.timestamp) ? fromJsonTimestamp(object.timestamp) : void 0
1359
+ };
1360
+ },
1361
+ toJSON(message) {
1362
+ const obj = {};
1363
+ if (message.state !== void 0) {
1364
+ obj.state = taskStateToJSON(message.state);
1196
1365
  }
1197
- throw new Error(
1198
- "No compatible transport found, available transports: " + [...this.transportsByName.keys()].join()
1199
- );
1366
+ if (message.update !== void 0) {
1367
+ obj.message = Message.toJSON(message.update);
1368
+ }
1369
+ if (message.timestamp !== void 0) {
1370
+ obj.timestamp = message.timestamp.toISOString();
1371
+ }
1372
+ return obj;
1200
1373
  }
1201
- /**
1202
- * Downloads agent card using AgentCardResolver from options
1203
- * and creates a new client from the downloaded card.
1204
- *
1205
- * @example
1206
- * ```ts
1207
- * const factory = new ClientFactory(); // use default options and default {@link AgentCardResolver}.
1208
- * const client1 = await factory.createFromUrl('https://example.com'); // /.well-known/agent-card.json is used by default
1209
- * const client2 = await factory.createFromUrl('https://example.com', '/my-agent-card.json'); // specify custom path
1210
- * const client3 = await factory.createFromUrl('https://example.com/my-agent-card.json', ''); // specify full URL and set path to empty
1211
- * ```
1212
- */
1213
- async createFromUrl(baseUrl, path) {
1214
- const agentCard = await this.agentCardResolver.resolve(baseUrl, path);
1215
- return this.createFromAgentCard(agentCard);
1374
+ };
1375
+ var Part = {
1376
+ fromJSON(object) {
1377
+ return {
1378
+ part: isSet2(object.text) ? { $case: "text", value: globalThis.String(object.text) } : isSet2(object.file) ? { $case: "file", value: FilePart.fromJSON(object.file) } : isSet2(object.data) ? { $case: "data", value: DataPart.fromJSON(object.data) } : void 0
1379
+ };
1380
+ },
1381
+ toJSON(message) {
1382
+ const obj = {};
1383
+ if (message.part?.$case === "text") {
1384
+ obj.text = message.part.value;
1385
+ } else if (message.part?.$case === "file") {
1386
+ obj.file = FilePart.toJSON(message.part.value);
1387
+ } else if (message.part?.$case === "data") {
1388
+ obj.data = DataPart.toJSON(message.part.value);
1389
+ }
1390
+ return obj;
1216
1391
  }
1217
1392
  };
1218
- function mergeTransports(original, overrides) {
1219
- if (!overrides) {
1220
- return original;
1393
+ var FilePart = {
1394
+ fromJSON(object) {
1395
+ return {
1396
+ file: isSet2(object.fileWithUri) ? { $case: "fileWithUri", value: globalThis.String(object.fileWithUri) } : isSet2(object.file_with_uri) ? { $case: "fileWithUri", value: globalThis.String(object.file_with_uri) } : isSet2(object.fileWithBytes) ? { $case: "fileWithBytes", value: Buffer.from(bytesFromBase64(object.fileWithBytes)) } : isSet2(object.file_with_bytes) ? { $case: "fileWithBytes", value: Buffer.from(bytesFromBase64(object.file_with_bytes)) } : void 0,
1397
+ mimeType: isSet2(object.mimeType) ? globalThis.String(object.mimeType) : isSet2(object.mime_type) ? globalThis.String(object.mime_type) : void 0
1398
+ };
1399
+ },
1400
+ toJSON(message) {
1401
+ const obj = {};
1402
+ if (message.file?.$case === "fileWithUri") {
1403
+ obj.fileWithUri = message.file.value;
1404
+ } else if (message.file?.$case === "fileWithBytes") {
1405
+ obj.fileWithBytes = base64FromBytes(message.file.value);
1406
+ }
1407
+ if (message.mimeType !== void 0) {
1408
+ obj.mimeType = message.mimeType;
1409
+ }
1410
+ return obj;
1221
1411
  }
1222
- const result = transportsByName(original);
1223
- const overridesByName = transportsByName(overrides);
1224
- for (const [name, factory] of overridesByName) {
1225
- result.set(name, factory);
1412
+ };
1413
+ var DataPart = {
1414
+ fromJSON(object) {
1415
+ return { data: isObject(object.data) ? object.data : void 0 };
1416
+ },
1417
+ toJSON(message) {
1418
+ const obj = {};
1419
+ if (message.data !== void 0) {
1420
+ obj.data = message.data;
1421
+ }
1422
+ return obj;
1226
1423
  }
1227
- return Array.from(result.values());
1228
- }
1229
- function transportsByName(transports) {
1230
- const result = /* @__PURE__ */ new Map();
1231
- if (!transports) {
1232
- return result;
1424
+ };
1425
+ var Message = {
1426
+ fromJSON(object) {
1427
+ return {
1428
+ messageId: isSet2(object.messageId) ? globalThis.String(object.messageId) : isSet2(object.message_id) ? globalThis.String(object.message_id) : void 0,
1429
+ contextId: isSet2(object.contextId) ? globalThis.String(object.contextId) : isSet2(object.context_id) ? globalThis.String(object.context_id) : void 0,
1430
+ taskId: isSet2(object.taskId) ? globalThis.String(object.taskId) : isSet2(object.task_id) ? globalThis.String(object.task_id) : void 0,
1431
+ role: isSet2(object.role) ? roleFromJSON(object.role) : void 0,
1432
+ content: globalThis.Array.isArray(object?.content) ? object.content.map((e) => Part.fromJSON(e)) : [],
1433
+ metadata: isObject(object.metadata) ? object.metadata : void 0,
1434
+ extensions: globalThis.Array.isArray(object?.extensions) ? object.extensions.map((e) => globalThis.String(e)) : []
1435
+ };
1436
+ },
1437
+ toJSON(message) {
1438
+ const obj = {};
1439
+ if (message.messageId !== void 0) {
1440
+ obj.messageId = message.messageId;
1441
+ }
1442
+ if (message.contextId !== void 0) {
1443
+ obj.contextId = message.contextId;
1444
+ }
1445
+ if (message.taskId !== void 0) {
1446
+ obj.taskId = message.taskId;
1447
+ }
1448
+ if (message.role !== void 0) {
1449
+ obj.role = roleToJSON(message.role);
1450
+ }
1451
+ if (message.content?.length) {
1452
+ obj.content = message.content.map((e) => Part.toJSON(e));
1453
+ }
1454
+ if (message.metadata !== void 0) {
1455
+ obj.metadata = message.metadata;
1456
+ }
1457
+ if (message.extensions?.length) {
1458
+ obj.extensions = message.extensions;
1459
+ }
1460
+ return obj;
1233
1461
  }
1234
- for (const t of transports) {
1235
- if (result.has(t.protocolName)) {
1236
- throw new Error(`Duplicate protocol name: ${t.protocolName}`);
1462
+ };
1463
+ var Artifact = {
1464
+ fromJSON(object) {
1465
+ return {
1466
+ artifactId: isSet2(object.artifactId) ? globalThis.String(object.artifactId) : isSet2(object.artifact_id) ? globalThis.String(object.artifact_id) : void 0,
1467
+ name: isSet2(object.name) ? globalThis.String(object.name) : void 0,
1468
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1469
+ parts: globalThis.Array.isArray(object?.parts) ? object.parts.map((e) => Part.fromJSON(e)) : [],
1470
+ metadata: isObject(object.metadata) ? object.metadata : void 0,
1471
+ extensions: globalThis.Array.isArray(object?.extensions) ? object.extensions.map((e) => globalThis.String(e)) : []
1472
+ };
1473
+ },
1474
+ toJSON(message) {
1475
+ const obj = {};
1476
+ if (message.artifactId !== void 0) {
1477
+ obj.artifactId = message.artifactId;
1237
1478
  }
1238
- result.set(t.protocolName, t);
1479
+ if (message.name !== void 0) {
1480
+ obj.name = message.name;
1481
+ }
1482
+ if (message.description !== void 0) {
1483
+ obj.description = message.description;
1484
+ }
1485
+ if (message.parts?.length) {
1486
+ obj.parts = message.parts.map((e) => Part.toJSON(e));
1487
+ }
1488
+ if (message.metadata !== void 0) {
1489
+ obj.metadata = message.metadata;
1490
+ }
1491
+ if (message.extensions?.length) {
1492
+ obj.extensions = message.extensions;
1493
+ }
1494
+ return obj;
1239
1495
  }
1240
- return result;
1241
- }
1242
- function mergeArrays(a1, a2) {
1243
- if (!a1 && !a2) {
1244
- return void 0;
1496
+ };
1497
+ var TaskStatusUpdateEvent = {
1498
+ fromJSON(object) {
1499
+ return {
1500
+ taskId: isSet2(object.taskId) ? globalThis.String(object.taskId) : isSet2(object.task_id) ? globalThis.String(object.task_id) : void 0,
1501
+ contextId: isSet2(object.contextId) ? globalThis.String(object.contextId) : isSet2(object.context_id) ? globalThis.String(object.context_id) : void 0,
1502
+ status: isSet2(object.status) ? TaskStatus.fromJSON(object.status) : void 0,
1503
+ final: isSet2(object.final) ? globalThis.Boolean(object.final) : void 0,
1504
+ metadata: isObject(object.metadata) ? object.metadata : void 0
1505
+ };
1506
+ },
1507
+ toJSON(message) {
1508
+ const obj = {};
1509
+ if (message.taskId !== void 0) {
1510
+ obj.taskId = message.taskId;
1511
+ }
1512
+ if (message.contextId !== void 0) {
1513
+ obj.contextId = message.contextId;
1514
+ }
1515
+ if (message.status !== void 0) {
1516
+ obj.status = TaskStatus.toJSON(message.status);
1517
+ }
1518
+ if (message.final !== void 0) {
1519
+ obj.final = message.final;
1520
+ }
1521
+ if (message.metadata !== void 0) {
1522
+ obj.metadata = message.metadata;
1523
+ }
1524
+ return obj;
1245
1525
  }
1246
- return [...a1 ?? [], ...a2 ?? []];
1247
- }
1526
+ };
1527
+ var TaskArtifactUpdateEvent = {
1528
+ fromJSON(object) {
1529
+ return {
1530
+ taskId: isSet2(object.taskId) ? globalThis.String(object.taskId) : isSet2(object.task_id) ? globalThis.String(object.task_id) : void 0,
1531
+ contextId: isSet2(object.contextId) ? globalThis.String(object.contextId) : isSet2(object.context_id) ? globalThis.String(object.context_id) : void 0,
1532
+ artifact: isSet2(object.artifact) ? Artifact.fromJSON(object.artifact) : void 0,
1533
+ append: isSet2(object.append) ? globalThis.Boolean(object.append) : void 0,
1534
+ lastChunk: isSet2(object.lastChunk) ? globalThis.Boolean(object.lastChunk) : isSet2(object.last_chunk) ? globalThis.Boolean(object.last_chunk) : void 0,
1535
+ metadata: isObject(object.metadata) ? object.metadata : void 0
1536
+ };
1537
+ },
1538
+ toJSON(message) {
1539
+ const obj = {};
1540
+ if (message.taskId !== void 0) {
1541
+ obj.taskId = message.taskId;
1542
+ }
1543
+ if (message.contextId !== void 0) {
1544
+ obj.contextId = message.contextId;
1545
+ }
1546
+ if (message.artifact !== void 0) {
1547
+ obj.artifact = Artifact.toJSON(message.artifact);
1548
+ }
1549
+ if (message.append !== void 0) {
1550
+ obj.append = message.append;
1551
+ }
1552
+ if (message.lastChunk !== void 0) {
1553
+ obj.lastChunk = message.lastChunk;
1554
+ }
1555
+ if (message.metadata !== void 0) {
1556
+ obj.metadata = message.metadata;
1557
+ }
1558
+ return obj;
1559
+ }
1560
+ };
1561
+ var PushNotificationConfig = {
1562
+ fromJSON(object) {
1563
+ return {
1564
+ id: isSet2(object.id) ? globalThis.String(object.id) : void 0,
1565
+ url: isSet2(object.url) ? globalThis.String(object.url) : void 0,
1566
+ token: isSet2(object.token) ? globalThis.String(object.token) : void 0,
1567
+ authentication: isSet2(object.authentication) ? AuthenticationInfo.fromJSON(object.authentication) : void 0
1568
+ };
1569
+ },
1570
+ toJSON(message) {
1571
+ const obj = {};
1572
+ if (message.id !== void 0) {
1573
+ obj.id = message.id;
1574
+ }
1575
+ if (message.url !== void 0) {
1576
+ obj.url = message.url;
1577
+ }
1578
+ if (message.token !== void 0) {
1579
+ obj.token = message.token;
1580
+ }
1581
+ if (message.authentication !== void 0) {
1582
+ obj.authentication = AuthenticationInfo.toJSON(message.authentication);
1583
+ }
1584
+ return obj;
1585
+ }
1586
+ };
1587
+ var AuthenticationInfo = {
1588
+ fromJSON(object) {
1589
+ return {
1590
+ schemes: globalThis.Array.isArray(object?.schemes) ? object.schemes.map((e) => globalThis.String(e)) : [],
1591
+ credentials: isSet2(object.credentials) ? globalThis.String(object.credentials) : void 0
1592
+ };
1593
+ },
1594
+ toJSON(message) {
1595
+ const obj = {};
1596
+ if (message.schemes?.length) {
1597
+ obj.schemes = message.schemes;
1598
+ }
1599
+ if (message.credentials !== void 0) {
1600
+ obj.credentials = message.credentials;
1601
+ }
1602
+ return obj;
1603
+ }
1604
+ };
1605
+ var AgentInterface = {
1606
+ fromJSON(object) {
1607
+ return {
1608
+ url: isSet2(object.url) ? globalThis.String(object.url) : void 0,
1609
+ transport: isSet2(object.transport) ? globalThis.String(object.transport) : void 0
1610
+ };
1611
+ },
1612
+ toJSON(message) {
1613
+ const obj = {};
1614
+ if (message.url !== void 0) {
1615
+ obj.url = message.url;
1616
+ }
1617
+ if (message.transport !== void 0) {
1618
+ obj.transport = message.transport;
1619
+ }
1620
+ return obj;
1621
+ }
1622
+ };
1623
+ var AgentCard = {
1624
+ fromJSON(object) {
1625
+ return {
1626
+ protocolVersion: isSet2(object.protocolVersion) ? globalThis.String(object.protocolVersion) : isSet2(object.protocol_version) ? globalThis.String(object.protocol_version) : void 0,
1627
+ name: isSet2(object.name) ? globalThis.String(object.name) : void 0,
1628
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1629
+ url: isSet2(object.url) ? globalThis.String(object.url) : void 0,
1630
+ preferredTransport: isSet2(object.preferredTransport) ? globalThis.String(object.preferredTransport) : isSet2(object.preferred_transport) ? globalThis.String(object.preferred_transport) : void 0,
1631
+ additionalInterfaces: globalThis.Array.isArray(object?.additionalInterfaces) ? object.additionalInterfaces.map((e) => AgentInterface.fromJSON(e)) : globalThis.Array.isArray(object?.additional_interfaces) ? object.additional_interfaces.map((e) => AgentInterface.fromJSON(e)) : [],
1632
+ provider: isSet2(object.provider) ? AgentProvider.fromJSON(object.provider) : void 0,
1633
+ version: isSet2(object.version) ? globalThis.String(object.version) : void 0,
1634
+ documentationUrl: isSet2(object.documentationUrl) ? globalThis.String(object.documentationUrl) : isSet2(object.documentation_url) ? globalThis.String(object.documentation_url) : void 0,
1635
+ capabilities: isSet2(object.capabilities) ? AgentCapabilities.fromJSON(object.capabilities) : void 0,
1636
+ securitySchemes: isObject(object.securitySchemes) ? globalThis.Object.entries(object.securitySchemes).reduce(
1637
+ (acc, [key, value]) => {
1638
+ acc[key] = SecurityScheme.fromJSON(value);
1639
+ return acc;
1640
+ },
1641
+ {}
1642
+ ) : isObject(object.security_schemes) ? globalThis.Object.entries(object.security_schemes).reduce(
1643
+ (acc, [key, value]) => {
1644
+ acc[key] = SecurityScheme.fromJSON(value);
1645
+ return acc;
1646
+ },
1647
+ {}
1648
+ ) : {},
1649
+ security: globalThis.Array.isArray(object?.security) ? object.security.map((e) => Security.fromJSON(e)) : [],
1650
+ defaultInputModes: globalThis.Array.isArray(object?.defaultInputModes) ? object.defaultInputModes.map((e) => globalThis.String(e)) : globalThis.Array.isArray(object?.default_input_modes) ? object.default_input_modes.map((e) => globalThis.String(e)) : [],
1651
+ defaultOutputModes: globalThis.Array.isArray(object?.defaultOutputModes) ? object.defaultOutputModes.map((e) => globalThis.String(e)) : globalThis.Array.isArray(object?.default_output_modes) ? object.default_output_modes.map((e) => globalThis.String(e)) : [],
1652
+ skills: globalThis.Array.isArray(object?.skills) ? object.skills.map((e) => AgentSkill.fromJSON(e)) : [],
1653
+ supportsAuthenticatedExtendedCard: isSet2(object.supportsAuthenticatedExtendedCard) ? globalThis.Boolean(object.supportsAuthenticatedExtendedCard) : isSet2(object.supports_authenticated_extended_card) ? globalThis.Boolean(object.supports_authenticated_extended_card) : void 0,
1654
+ signatures: globalThis.Array.isArray(object?.signatures) ? object.signatures.map((e) => AgentCardSignature.fromJSON(e)) : []
1655
+ };
1656
+ },
1657
+ toJSON(message) {
1658
+ const obj = {};
1659
+ if (message.protocolVersion !== void 0) {
1660
+ obj.protocolVersion = message.protocolVersion;
1661
+ }
1662
+ if (message.name !== void 0) {
1663
+ obj.name = message.name;
1664
+ }
1665
+ if (message.description !== void 0) {
1666
+ obj.description = message.description;
1667
+ }
1668
+ if (message.url !== void 0) {
1669
+ obj.url = message.url;
1670
+ }
1671
+ if (message.preferredTransport !== void 0) {
1672
+ obj.preferredTransport = message.preferredTransport;
1673
+ }
1674
+ if (message.additionalInterfaces?.length) {
1675
+ obj.additionalInterfaces = message.additionalInterfaces.map((e) => AgentInterface.toJSON(e));
1676
+ }
1677
+ if (message.provider !== void 0) {
1678
+ obj.provider = AgentProvider.toJSON(message.provider);
1679
+ }
1680
+ if (message.version !== void 0) {
1681
+ obj.version = message.version;
1682
+ }
1683
+ if (message.documentationUrl !== void 0) {
1684
+ obj.documentationUrl = message.documentationUrl;
1685
+ }
1686
+ if (message.capabilities !== void 0) {
1687
+ obj.capabilities = AgentCapabilities.toJSON(message.capabilities);
1688
+ }
1689
+ if (message.securitySchemes) {
1690
+ const entries = globalThis.Object.entries(message.securitySchemes);
1691
+ if (entries.length > 0) {
1692
+ obj.securitySchemes = {};
1693
+ entries.forEach(([k, v]) => {
1694
+ obj.securitySchemes[k] = SecurityScheme.toJSON(v);
1695
+ });
1696
+ }
1697
+ }
1698
+ if (message.security?.length) {
1699
+ obj.security = message.security.map((e) => Security.toJSON(e));
1700
+ }
1701
+ if (message.defaultInputModes?.length) {
1702
+ obj.defaultInputModes = message.defaultInputModes;
1703
+ }
1704
+ if (message.defaultOutputModes?.length) {
1705
+ obj.defaultOutputModes = message.defaultOutputModes;
1706
+ }
1707
+ if (message.skills?.length) {
1708
+ obj.skills = message.skills.map((e) => AgentSkill.toJSON(e));
1709
+ }
1710
+ if (message.supportsAuthenticatedExtendedCard !== void 0) {
1711
+ obj.supportsAuthenticatedExtendedCard = message.supportsAuthenticatedExtendedCard;
1712
+ }
1713
+ if (message.signatures?.length) {
1714
+ obj.signatures = message.signatures.map((e) => AgentCardSignature.toJSON(e));
1715
+ }
1716
+ return obj;
1717
+ }
1718
+ };
1719
+ var AgentProvider = {
1720
+ fromJSON(object) {
1721
+ return {
1722
+ url: isSet2(object.url) ? globalThis.String(object.url) : void 0,
1723
+ organization: isSet2(object.organization) ? globalThis.String(object.organization) : void 0
1724
+ };
1725
+ },
1726
+ toJSON(message) {
1727
+ const obj = {};
1728
+ if (message.url !== void 0) {
1729
+ obj.url = message.url;
1730
+ }
1731
+ if (message.organization !== void 0) {
1732
+ obj.organization = message.organization;
1733
+ }
1734
+ return obj;
1735
+ }
1736
+ };
1737
+ var AgentCapabilities = {
1738
+ fromJSON(object) {
1739
+ return {
1740
+ streaming: isSet2(object.streaming) ? globalThis.Boolean(object.streaming) : void 0,
1741
+ pushNotifications: isSet2(object.pushNotifications) ? globalThis.Boolean(object.pushNotifications) : isSet2(object.push_notifications) ? globalThis.Boolean(object.push_notifications) : void 0,
1742
+ extensions: globalThis.Array.isArray(object?.extensions) ? object.extensions.map((e) => AgentExtension.fromJSON(e)) : []
1743
+ };
1744
+ },
1745
+ toJSON(message) {
1746
+ const obj = {};
1747
+ if (message.streaming !== void 0) {
1748
+ obj.streaming = message.streaming;
1749
+ }
1750
+ if (message.pushNotifications !== void 0) {
1751
+ obj.pushNotifications = message.pushNotifications;
1752
+ }
1753
+ if (message.extensions?.length) {
1754
+ obj.extensions = message.extensions.map((e) => AgentExtension.toJSON(e));
1755
+ }
1756
+ return obj;
1757
+ }
1758
+ };
1759
+ var AgentExtension = {
1760
+ fromJSON(object) {
1761
+ return {
1762
+ uri: isSet2(object.uri) ? globalThis.String(object.uri) : void 0,
1763
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1764
+ required: isSet2(object.required) ? globalThis.Boolean(object.required) : void 0,
1765
+ params: isObject(object.params) ? object.params : void 0
1766
+ };
1767
+ },
1768
+ toJSON(message) {
1769
+ const obj = {};
1770
+ if (message.uri !== void 0) {
1771
+ obj.uri = message.uri;
1772
+ }
1773
+ if (message.description !== void 0) {
1774
+ obj.description = message.description;
1775
+ }
1776
+ if (message.required !== void 0) {
1777
+ obj.required = message.required;
1778
+ }
1779
+ if (message.params !== void 0) {
1780
+ obj.params = message.params;
1781
+ }
1782
+ return obj;
1783
+ }
1784
+ };
1785
+ var AgentSkill = {
1786
+ fromJSON(object) {
1787
+ return {
1788
+ id: isSet2(object.id) ? globalThis.String(object.id) : void 0,
1789
+ name: isSet2(object.name) ? globalThis.String(object.name) : void 0,
1790
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1791
+ tags: globalThis.Array.isArray(object?.tags) ? object.tags.map((e) => globalThis.String(e)) : [],
1792
+ examples: globalThis.Array.isArray(object?.examples) ? object.examples.map((e) => globalThis.String(e)) : [],
1793
+ inputModes: globalThis.Array.isArray(object?.inputModes) ? object.inputModes.map((e) => globalThis.String(e)) : globalThis.Array.isArray(object?.input_modes) ? object.input_modes.map((e) => globalThis.String(e)) : [],
1794
+ outputModes: globalThis.Array.isArray(object?.outputModes) ? object.outputModes.map((e) => globalThis.String(e)) : globalThis.Array.isArray(object?.output_modes) ? object.output_modes.map((e) => globalThis.String(e)) : [],
1795
+ security: globalThis.Array.isArray(object?.security) ? object.security.map((e) => Security.fromJSON(e)) : []
1796
+ };
1797
+ },
1798
+ toJSON(message) {
1799
+ const obj = {};
1800
+ if (message.id !== void 0) {
1801
+ obj.id = message.id;
1802
+ }
1803
+ if (message.name !== void 0) {
1804
+ obj.name = message.name;
1805
+ }
1806
+ if (message.description !== void 0) {
1807
+ obj.description = message.description;
1808
+ }
1809
+ if (message.tags?.length) {
1810
+ obj.tags = message.tags;
1811
+ }
1812
+ if (message.examples?.length) {
1813
+ obj.examples = message.examples;
1814
+ }
1815
+ if (message.inputModes?.length) {
1816
+ obj.inputModes = message.inputModes;
1817
+ }
1818
+ if (message.outputModes?.length) {
1819
+ obj.outputModes = message.outputModes;
1820
+ }
1821
+ if (message.security?.length) {
1822
+ obj.security = message.security.map((e) => Security.toJSON(e));
1823
+ }
1824
+ return obj;
1825
+ }
1826
+ };
1827
+ var AgentCardSignature = {
1828
+ fromJSON(object) {
1829
+ return {
1830
+ protected: isSet2(object.protected) ? globalThis.String(object.protected) : void 0,
1831
+ signature: isSet2(object.signature) ? globalThis.String(object.signature) : void 0,
1832
+ header: isObject(object.header) ? object.header : void 0
1833
+ };
1834
+ },
1835
+ toJSON(message) {
1836
+ const obj = {};
1837
+ if (message.protected !== void 0) {
1838
+ obj.protected = message.protected;
1839
+ }
1840
+ if (message.signature !== void 0) {
1841
+ obj.signature = message.signature;
1842
+ }
1843
+ if (message.header !== void 0) {
1844
+ obj.header = message.header;
1845
+ }
1846
+ return obj;
1847
+ }
1848
+ };
1849
+ var TaskPushNotificationConfig = {
1850
+ fromJSON(object) {
1851
+ return {
1852
+ name: isSet2(object.name) ? globalThis.String(object.name) : void 0,
1853
+ pushNotificationConfig: isSet2(object.pushNotificationConfig) ? PushNotificationConfig.fromJSON(object.pushNotificationConfig) : isSet2(object.push_notification_config) ? PushNotificationConfig.fromJSON(object.push_notification_config) : void 0
1854
+ };
1855
+ },
1856
+ toJSON(message) {
1857
+ const obj = {};
1858
+ if (message.name !== void 0) {
1859
+ obj.name = message.name;
1860
+ }
1861
+ if (message.pushNotificationConfig !== void 0) {
1862
+ obj.pushNotificationConfig = PushNotificationConfig.toJSON(message.pushNotificationConfig);
1863
+ }
1864
+ return obj;
1865
+ }
1866
+ };
1867
+ var StringList = {
1868
+ fromJSON(object) {
1869
+ return { list: globalThis.Array.isArray(object?.list) ? object.list.map((e) => globalThis.String(e)) : [] };
1870
+ },
1871
+ toJSON(message) {
1872
+ const obj = {};
1873
+ if (message.list?.length) {
1874
+ obj.list = message.list;
1875
+ }
1876
+ return obj;
1877
+ }
1878
+ };
1879
+ var Security = {
1880
+ fromJSON(object) {
1881
+ return {
1882
+ schemes: isObject(object.schemes) ? globalThis.Object.entries(object.schemes).reduce(
1883
+ (acc, [key, value]) => {
1884
+ acc[key] = StringList.fromJSON(value);
1885
+ return acc;
1886
+ },
1887
+ {}
1888
+ ) : {}
1889
+ };
1890
+ },
1891
+ toJSON(message) {
1892
+ const obj = {};
1893
+ if (message.schemes) {
1894
+ const entries = globalThis.Object.entries(message.schemes);
1895
+ if (entries.length > 0) {
1896
+ obj.schemes = {};
1897
+ entries.forEach(([k, v]) => {
1898
+ obj.schemes[k] = StringList.toJSON(v);
1899
+ });
1900
+ }
1901
+ }
1902
+ return obj;
1903
+ }
1904
+ };
1905
+ var SecurityScheme = {
1906
+ fromJSON(object) {
1907
+ return {
1908
+ scheme: isSet2(object.apiKeySecurityScheme) ? { $case: "apiKeySecurityScheme", value: APIKeySecurityScheme.fromJSON(object.apiKeySecurityScheme) } : isSet2(object.api_key_security_scheme) ? { $case: "apiKeySecurityScheme", value: APIKeySecurityScheme.fromJSON(object.api_key_security_scheme) } : isSet2(object.httpAuthSecurityScheme) ? { $case: "httpAuthSecurityScheme", value: HTTPAuthSecurityScheme.fromJSON(object.httpAuthSecurityScheme) } : isSet2(object.http_auth_security_scheme) ? { $case: "httpAuthSecurityScheme", value: HTTPAuthSecurityScheme.fromJSON(object.http_auth_security_scheme) } : isSet2(object.oauth2SecurityScheme) ? { $case: "oauth2SecurityScheme", value: OAuth2SecurityScheme.fromJSON(object.oauth2SecurityScheme) } : isSet2(object.oauth2_security_scheme) ? { $case: "oauth2SecurityScheme", value: OAuth2SecurityScheme.fromJSON(object.oauth2_security_scheme) } : isSet2(object.openIdConnectSecurityScheme) ? {
1909
+ $case: "openIdConnectSecurityScheme",
1910
+ value: OpenIdConnectSecurityScheme.fromJSON(object.openIdConnectSecurityScheme)
1911
+ } : isSet2(object.open_id_connect_security_scheme) ? {
1912
+ $case: "openIdConnectSecurityScheme",
1913
+ value: OpenIdConnectSecurityScheme.fromJSON(object.open_id_connect_security_scheme)
1914
+ } : isSet2(object.mtlsSecurityScheme) ? { $case: "mtlsSecurityScheme", value: MutualTlsSecurityScheme.fromJSON(object.mtlsSecurityScheme) } : isSet2(object.mtls_security_scheme) ? { $case: "mtlsSecurityScheme", value: MutualTlsSecurityScheme.fromJSON(object.mtls_security_scheme) } : void 0
1915
+ };
1916
+ },
1917
+ toJSON(message) {
1918
+ const obj = {};
1919
+ if (message.scheme?.$case === "apiKeySecurityScheme") {
1920
+ obj.apiKeySecurityScheme = APIKeySecurityScheme.toJSON(message.scheme.value);
1921
+ } else if (message.scheme?.$case === "httpAuthSecurityScheme") {
1922
+ obj.httpAuthSecurityScheme = HTTPAuthSecurityScheme.toJSON(message.scheme.value);
1923
+ } else if (message.scheme?.$case === "oauth2SecurityScheme") {
1924
+ obj.oauth2SecurityScheme = OAuth2SecurityScheme.toJSON(message.scheme.value);
1925
+ } else if (message.scheme?.$case === "openIdConnectSecurityScheme") {
1926
+ obj.openIdConnectSecurityScheme = OpenIdConnectSecurityScheme.toJSON(message.scheme.value);
1927
+ } else if (message.scheme?.$case === "mtlsSecurityScheme") {
1928
+ obj.mtlsSecurityScheme = MutualTlsSecurityScheme.toJSON(message.scheme.value);
1929
+ }
1930
+ return obj;
1931
+ }
1932
+ };
1933
+ var APIKeySecurityScheme = {
1934
+ fromJSON(object) {
1935
+ return {
1936
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1937
+ location: isSet2(object.location) ? globalThis.String(object.location) : void 0,
1938
+ name: isSet2(object.name) ? globalThis.String(object.name) : void 0
1939
+ };
1940
+ },
1941
+ toJSON(message) {
1942
+ const obj = {};
1943
+ if (message.description !== void 0) {
1944
+ obj.description = message.description;
1945
+ }
1946
+ if (message.location !== void 0) {
1947
+ obj.location = message.location;
1948
+ }
1949
+ if (message.name !== void 0) {
1950
+ obj.name = message.name;
1951
+ }
1952
+ return obj;
1953
+ }
1954
+ };
1955
+ var HTTPAuthSecurityScheme = {
1956
+ fromJSON(object) {
1957
+ return {
1958
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1959
+ scheme: isSet2(object.scheme) ? globalThis.String(object.scheme) : void 0,
1960
+ bearerFormat: isSet2(object.bearerFormat) ? globalThis.String(object.bearerFormat) : isSet2(object.bearer_format) ? globalThis.String(object.bearer_format) : void 0
1961
+ };
1962
+ },
1963
+ toJSON(message) {
1964
+ const obj = {};
1965
+ if (message.description !== void 0) {
1966
+ obj.description = message.description;
1967
+ }
1968
+ if (message.scheme !== void 0) {
1969
+ obj.scheme = message.scheme;
1970
+ }
1971
+ if (message.bearerFormat !== void 0) {
1972
+ obj.bearerFormat = message.bearerFormat;
1973
+ }
1974
+ return obj;
1975
+ }
1976
+ };
1977
+ var OAuth2SecurityScheme = {
1978
+ fromJSON(object) {
1979
+ return {
1980
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
1981
+ flows: isSet2(object.flows) ? OAuthFlows.fromJSON(object.flows) : void 0,
1982
+ oauth2MetadataUrl: isSet2(object.oauth2MetadataUrl) ? globalThis.String(object.oauth2MetadataUrl) : isSet2(object.oauth2_metadata_url) ? globalThis.String(object.oauth2_metadata_url) : void 0
1983
+ };
1984
+ },
1985
+ toJSON(message) {
1986
+ const obj = {};
1987
+ if (message.description !== void 0) {
1988
+ obj.description = message.description;
1989
+ }
1990
+ if (message.flows !== void 0) {
1991
+ obj.flows = OAuthFlows.toJSON(message.flows);
1992
+ }
1993
+ if (message.oauth2MetadataUrl !== void 0) {
1994
+ obj.oauth2MetadataUrl = message.oauth2MetadataUrl;
1995
+ }
1996
+ return obj;
1997
+ }
1998
+ };
1999
+ var OpenIdConnectSecurityScheme = {
2000
+ fromJSON(object) {
2001
+ return {
2002
+ description: isSet2(object.description) ? globalThis.String(object.description) : void 0,
2003
+ openIdConnectUrl: isSet2(object.openIdConnectUrl) ? globalThis.String(object.openIdConnectUrl) : isSet2(object.open_id_connect_url) ? globalThis.String(object.open_id_connect_url) : void 0
2004
+ };
2005
+ },
2006
+ toJSON(message) {
2007
+ const obj = {};
2008
+ if (message.description !== void 0) {
2009
+ obj.description = message.description;
2010
+ }
2011
+ if (message.openIdConnectUrl !== void 0) {
2012
+ obj.openIdConnectUrl = message.openIdConnectUrl;
2013
+ }
2014
+ return obj;
2015
+ }
2016
+ };
2017
+ var MutualTlsSecurityScheme = {
2018
+ fromJSON(object) {
2019
+ return { description: isSet2(object.description) ? globalThis.String(object.description) : void 0 };
2020
+ },
2021
+ toJSON(message) {
2022
+ const obj = {};
2023
+ if (message.description !== void 0) {
2024
+ obj.description = message.description;
2025
+ }
2026
+ return obj;
2027
+ }
2028
+ };
2029
+ var OAuthFlows = {
2030
+ fromJSON(object) {
2031
+ return {
2032
+ flow: isSet2(object.authorizationCode) ? { $case: "authorizationCode", value: AuthorizationCodeOAuthFlow.fromJSON(object.authorizationCode) } : isSet2(object.authorization_code) ? { $case: "authorizationCode", value: AuthorizationCodeOAuthFlow.fromJSON(object.authorization_code) } : isSet2(object.clientCredentials) ? { $case: "clientCredentials", value: ClientCredentialsOAuthFlow.fromJSON(object.clientCredentials) } : isSet2(object.client_credentials) ? { $case: "clientCredentials", value: ClientCredentialsOAuthFlow.fromJSON(object.client_credentials) } : isSet2(object.implicit) ? { $case: "implicit", value: ImplicitOAuthFlow.fromJSON(object.implicit) } : isSet2(object.password) ? { $case: "password", value: PasswordOAuthFlow.fromJSON(object.password) } : void 0
2033
+ };
2034
+ },
2035
+ toJSON(message) {
2036
+ const obj = {};
2037
+ if (message.flow?.$case === "authorizationCode") {
2038
+ obj.authorizationCode = AuthorizationCodeOAuthFlow.toJSON(message.flow.value);
2039
+ } else if (message.flow?.$case === "clientCredentials") {
2040
+ obj.clientCredentials = ClientCredentialsOAuthFlow.toJSON(message.flow.value);
2041
+ } else if (message.flow?.$case === "implicit") {
2042
+ obj.implicit = ImplicitOAuthFlow.toJSON(message.flow.value);
2043
+ } else if (message.flow?.$case === "password") {
2044
+ obj.password = PasswordOAuthFlow.toJSON(message.flow.value);
2045
+ }
2046
+ return obj;
2047
+ }
2048
+ };
2049
+ var AuthorizationCodeOAuthFlow = {
2050
+ fromJSON(object) {
2051
+ return {
2052
+ authorizationUrl: isSet2(object.authorizationUrl) ? globalThis.String(object.authorizationUrl) : isSet2(object.authorization_url) ? globalThis.String(object.authorization_url) : void 0,
2053
+ tokenUrl: isSet2(object.tokenUrl) ? globalThis.String(object.tokenUrl) : isSet2(object.token_url) ? globalThis.String(object.token_url) : void 0,
2054
+ refreshUrl: isSet2(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet2(object.refresh_url) ? globalThis.String(object.refresh_url) : void 0,
2055
+ scopes: isObject(object.scopes) ? globalThis.Object.entries(object.scopes).reduce(
2056
+ (acc, [key, value]) => {
2057
+ acc[key] = globalThis.String(value);
2058
+ return acc;
2059
+ },
2060
+ {}
2061
+ ) : {}
2062
+ };
2063
+ },
2064
+ toJSON(message) {
2065
+ const obj = {};
2066
+ if (message.authorizationUrl !== void 0) {
2067
+ obj.authorizationUrl = message.authorizationUrl;
2068
+ }
2069
+ if (message.tokenUrl !== void 0) {
2070
+ obj.tokenUrl = message.tokenUrl;
2071
+ }
2072
+ if (message.refreshUrl !== void 0) {
2073
+ obj.refreshUrl = message.refreshUrl;
2074
+ }
2075
+ if (message.scopes) {
2076
+ const entries = globalThis.Object.entries(message.scopes);
2077
+ if (entries.length > 0) {
2078
+ obj.scopes = {};
2079
+ entries.forEach(([k, v]) => {
2080
+ obj.scopes[k] = v;
2081
+ });
2082
+ }
2083
+ }
2084
+ return obj;
2085
+ }
2086
+ };
2087
+ var ClientCredentialsOAuthFlow = {
2088
+ fromJSON(object) {
2089
+ return {
2090
+ tokenUrl: isSet2(object.tokenUrl) ? globalThis.String(object.tokenUrl) : isSet2(object.token_url) ? globalThis.String(object.token_url) : void 0,
2091
+ refreshUrl: isSet2(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet2(object.refresh_url) ? globalThis.String(object.refresh_url) : void 0,
2092
+ scopes: isObject(object.scopes) ? globalThis.Object.entries(object.scopes).reduce(
2093
+ (acc, [key, value]) => {
2094
+ acc[key] = globalThis.String(value);
2095
+ return acc;
2096
+ },
2097
+ {}
2098
+ ) : {}
2099
+ };
2100
+ },
2101
+ toJSON(message) {
2102
+ const obj = {};
2103
+ if (message.tokenUrl !== void 0) {
2104
+ obj.tokenUrl = message.tokenUrl;
2105
+ }
2106
+ if (message.refreshUrl !== void 0) {
2107
+ obj.refreshUrl = message.refreshUrl;
2108
+ }
2109
+ if (message.scopes) {
2110
+ const entries = globalThis.Object.entries(message.scopes);
2111
+ if (entries.length > 0) {
2112
+ obj.scopes = {};
2113
+ entries.forEach(([k, v]) => {
2114
+ obj.scopes[k] = v;
2115
+ });
2116
+ }
2117
+ }
2118
+ return obj;
2119
+ }
2120
+ };
2121
+ var ImplicitOAuthFlow = {
2122
+ fromJSON(object) {
2123
+ return {
2124
+ authorizationUrl: isSet2(object.authorizationUrl) ? globalThis.String(object.authorizationUrl) : isSet2(object.authorization_url) ? globalThis.String(object.authorization_url) : void 0,
2125
+ refreshUrl: isSet2(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet2(object.refresh_url) ? globalThis.String(object.refresh_url) : void 0,
2126
+ scopes: isObject(object.scopes) ? globalThis.Object.entries(object.scopes).reduce(
2127
+ (acc, [key, value]) => {
2128
+ acc[key] = globalThis.String(value);
2129
+ return acc;
2130
+ },
2131
+ {}
2132
+ ) : {}
2133
+ };
2134
+ },
2135
+ toJSON(message) {
2136
+ const obj = {};
2137
+ if (message.authorizationUrl !== void 0) {
2138
+ obj.authorizationUrl = message.authorizationUrl;
2139
+ }
2140
+ if (message.refreshUrl !== void 0) {
2141
+ obj.refreshUrl = message.refreshUrl;
2142
+ }
2143
+ if (message.scopes) {
2144
+ const entries = globalThis.Object.entries(message.scopes);
2145
+ if (entries.length > 0) {
2146
+ obj.scopes = {};
2147
+ entries.forEach(([k, v]) => {
2148
+ obj.scopes[k] = v;
2149
+ });
2150
+ }
2151
+ }
2152
+ return obj;
2153
+ }
2154
+ };
2155
+ var PasswordOAuthFlow = {
2156
+ fromJSON(object) {
2157
+ return {
2158
+ tokenUrl: isSet2(object.tokenUrl) ? globalThis.String(object.tokenUrl) : isSet2(object.token_url) ? globalThis.String(object.token_url) : void 0,
2159
+ refreshUrl: isSet2(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet2(object.refresh_url) ? globalThis.String(object.refresh_url) : void 0,
2160
+ scopes: isObject(object.scopes) ? globalThis.Object.entries(object.scopes).reduce(
2161
+ (acc, [key, value]) => {
2162
+ acc[key] = globalThis.String(value);
2163
+ return acc;
2164
+ },
2165
+ {}
2166
+ ) : {}
2167
+ };
2168
+ },
2169
+ toJSON(message) {
2170
+ const obj = {};
2171
+ if (message.tokenUrl !== void 0) {
2172
+ obj.tokenUrl = message.tokenUrl;
2173
+ }
2174
+ if (message.refreshUrl !== void 0) {
2175
+ obj.refreshUrl = message.refreshUrl;
2176
+ }
2177
+ if (message.scopes) {
2178
+ const entries = globalThis.Object.entries(message.scopes);
2179
+ if (entries.length > 0) {
2180
+ obj.scopes = {};
2181
+ entries.forEach(([k, v]) => {
2182
+ obj.scopes[k] = v;
2183
+ });
2184
+ }
2185
+ }
2186
+ return obj;
2187
+ }
2188
+ };
2189
+ var SendMessageRequest = {
2190
+ fromJSON(object) {
2191
+ return {
2192
+ request: isSet2(object.message) ? Message.fromJSON(object.message) : isSet2(object.request) ? Message.fromJSON(object.request) : void 0,
2193
+ configuration: isSet2(object.configuration) ? SendMessageConfiguration.fromJSON(object.configuration) : void 0,
2194
+ metadata: isObject(object.metadata) ? object.metadata : void 0
2195
+ };
2196
+ },
2197
+ toJSON(message) {
2198
+ const obj = {};
2199
+ if (message.request !== void 0) {
2200
+ obj.message = Message.toJSON(message.request);
2201
+ }
2202
+ if (message.configuration !== void 0) {
2203
+ obj.configuration = SendMessageConfiguration.toJSON(message.configuration);
2204
+ }
2205
+ if (message.metadata !== void 0) {
2206
+ obj.metadata = message.metadata;
2207
+ }
2208
+ return obj;
2209
+ }
2210
+ };
2211
+ var SendMessageResponse = {
2212
+ fromJSON(object) {
2213
+ return {
2214
+ payload: isSet2(object.task) ? { $case: "task", value: Task.fromJSON(object.task) } : isSet2(object.message) ? { $case: "msg", value: Message.fromJSON(object.message) } : isSet2(object.msg) ? { $case: "msg", value: Message.fromJSON(object.msg) } : void 0
2215
+ };
2216
+ },
2217
+ toJSON(message) {
2218
+ const obj = {};
2219
+ if (message.payload?.$case === "task") {
2220
+ obj.task = Task.toJSON(message.payload.value);
2221
+ } else if (message.payload?.$case === "msg") {
2222
+ obj.message = Message.toJSON(message.payload.value);
2223
+ }
2224
+ return obj;
2225
+ }
2226
+ };
2227
+ var StreamResponse = {
2228
+ fromJSON(object) {
2229
+ return {
2230
+ payload: isSet2(object.task) ? { $case: "task", value: Task.fromJSON(object.task) } : isSet2(object.message) ? { $case: "msg", value: Message.fromJSON(object.message) } : isSet2(object.msg) ? { $case: "msg", value: Message.fromJSON(object.msg) } : isSet2(object.statusUpdate) ? { $case: "statusUpdate", value: TaskStatusUpdateEvent.fromJSON(object.statusUpdate) } : isSet2(object.status_update) ? { $case: "statusUpdate", value: TaskStatusUpdateEvent.fromJSON(object.status_update) } : isSet2(object.artifactUpdate) ? { $case: "artifactUpdate", value: TaskArtifactUpdateEvent.fromJSON(object.artifactUpdate) } : isSet2(object.artifact_update) ? { $case: "artifactUpdate", value: TaskArtifactUpdateEvent.fromJSON(object.artifact_update) } : void 0
2231
+ };
2232
+ },
2233
+ toJSON(message) {
2234
+ const obj = {};
2235
+ if (message.payload?.$case === "task") {
2236
+ obj.task = Task.toJSON(message.payload.value);
2237
+ } else if (message.payload?.$case === "msg") {
2238
+ obj.message = Message.toJSON(message.payload.value);
2239
+ } else if (message.payload?.$case === "statusUpdate") {
2240
+ obj.statusUpdate = TaskStatusUpdateEvent.toJSON(message.payload.value);
2241
+ } else if (message.payload?.$case === "artifactUpdate") {
2242
+ obj.artifactUpdate = TaskArtifactUpdateEvent.toJSON(message.payload.value);
2243
+ }
2244
+ return obj;
2245
+ }
2246
+ };
2247
+ var ListTaskPushNotificationConfigResponse = {
2248
+ fromJSON(object) {
2249
+ return {
2250
+ configs: globalThis.Array.isArray(object?.configs) ? object.configs.map((e) => TaskPushNotificationConfig.fromJSON(e)) : [],
2251
+ nextPageToken: isSet2(object.nextPageToken) ? globalThis.String(object.nextPageToken) : isSet2(object.next_page_token) ? globalThis.String(object.next_page_token) : void 0
2252
+ };
2253
+ },
2254
+ toJSON(message) {
2255
+ const obj = {};
2256
+ if (message.configs?.length) {
2257
+ obj.configs = message.configs.map((e) => TaskPushNotificationConfig.toJSON(e));
2258
+ }
2259
+ if (message.nextPageToken !== void 0) {
2260
+ obj.nextPageToken = message.nextPageToken;
2261
+ }
2262
+ return obj;
2263
+ }
2264
+ };
2265
+ function bytesFromBase64(b64) {
2266
+ return Uint8Array.from(globalThis.Buffer.from(b64, "base64"));
2267
+ }
2268
+ function base64FromBytes(arr) {
2269
+ return globalThis.Buffer.from(arr).toString("base64");
2270
+ }
2271
+ function fromTimestamp(t) {
2272
+ let millis = (t.seconds || 0) * 1e3;
2273
+ millis += (t.nanos || 0) / 1e6;
2274
+ return new globalThis.Date(millis);
2275
+ }
2276
+ function fromJsonTimestamp(o) {
2277
+ if (o instanceof globalThis.Date) {
2278
+ return o;
2279
+ } else if (typeof o === "string") {
2280
+ return new globalThis.Date(o);
2281
+ } else {
2282
+ return fromTimestamp(Timestamp.fromJSON(o));
2283
+ }
2284
+ }
2285
+ function isObject(value) {
2286
+ return typeof value === "object" && value !== null;
2287
+ }
2288
+ function isSet2(value) {
2289
+ return value !== null && value !== void 0;
2290
+ }
2291
+
2292
+ // src/types/converters/id_decoding.ts
2293
+ var CONFIG_REGEX = /^tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)$/;
2294
+ var TASK_ONLY_REGEX = /^tasks\/([^/]+)(?:\/|$)/;
2295
+ var extractTaskId = (name) => {
2296
+ const match = name.match(TASK_ONLY_REGEX);
2297
+ if (!match) {
2298
+ throw A2AError.invalidParams(`Invalid or missing task ID in: "${name}"`);
2299
+ }
2300
+ return match[1];
2301
+ };
2302
+ var generateTaskName = (taskId) => {
2303
+ return `tasks/${taskId}`;
2304
+ };
2305
+ var extractTaskAndPushNotificationConfigId = (name) => {
2306
+ const match = name.match(CONFIG_REGEX);
2307
+ if (!match) {
2308
+ throw A2AError.invalidParams(`Invalid or missing config ID in: "${name}"`);
2309
+ }
2310
+ return { taskId: match[1], configId: match[2] };
2311
+ };
2312
+ var generatePushNotificationConfigName = (taskId, configId) => {
2313
+ return `tasks/${taskId}/pushNotificationConfigs/${configId}`;
2314
+ };
2315
+
2316
+ // src/types/converters/to_proto.ts
2317
+ var ToProto = class _ToProto {
2318
+ static agentCard(agentCard) {
2319
+ return {
2320
+ protocolVersion: agentCard.protocolVersion,
2321
+ name: agentCard.name,
2322
+ description: agentCard.description,
2323
+ url: agentCard.url,
2324
+ preferredTransport: agentCard.preferredTransport,
2325
+ additionalInterfaces: agentCard.additionalInterfaces?.map((i) => _ToProto.agentInterface(i)) ?? [],
2326
+ provider: _ToProto.agentProvider(agentCard.provider),
2327
+ version: agentCard.version,
2328
+ documentationUrl: agentCard.documentationUrl,
2329
+ capabilities: _ToProto.agentCapabilities(agentCard.capabilities),
2330
+ securitySchemes: agentCard.securitySchemes ? Object.fromEntries(
2331
+ Object.entries(agentCard.securitySchemes).map(([key, value]) => [
2332
+ key,
2333
+ _ToProto.securityScheme(value)
2334
+ ])
2335
+ ) : {},
2336
+ security: agentCard.security?.map((s) => _ToProto.security(s)) ?? [],
2337
+ defaultInputModes: agentCard.defaultInputModes,
2338
+ defaultOutputModes: agentCard.defaultOutputModes,
2339
+ skills: agentCard.skills.map((s) => _ToProto.agentSkill(s)),
2340
+ supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard,
2341
+ signatures: agentCard.signatures?.map((s) => _ToProto.agentCardSignature(s)) ?? []
2342
+ };
2343
+ }
2344
+ static agentCardSignature(signatures) {
2345
+ return {
2346
+ protected: signatures.protected,
2347
+ signature: signatures.signature,
2348
+ header: signatures.header
2349
+ };
2350
+ }
2351
+ static agentSkill(skill) {
2352
+ return {
2353
+ id: skill.id,
2354
+ name: skill.name,
2355
+ description: skill.description,
2356
+ tags: skill.tags ?? [],
2357
+ examples: skill.examples ?? [],
2358
+ inputModes: skill.inputModes ?? [],
2359
+ outputModes: skill.outputModes ?? [],
2360
+ security: skill.security ? skill.security.map((s) => _ToProto.security(s)) : []
2361
+ };
2362
+ }
2363
+ static security(security) {
2364
+ return {
2365
+ schemes: Object.fromEntries(
2366
+ Object.entries(security).map(([key, value]) => {
2367
+ return [key, { list: value }];
2368
+ })
2369
+ )
2370
+ };
2371
+ }
2372
+ static securityScheme(scheme) {
2373
+ switch (scheme.type) {
2374
+ case "apiKey":
2375
+ return {
2376
+ scheme: {
2377
+ $case: "apiKeySecurityScheme",
2378
+ value: {
2379
+ name: scheme.name,
2380
+ location: scheme.in,
2381
+ description: scheme.description
2382
+ }
2383
+ }
2384
+ };
2385
+ case "http":
2386
+ return {
2387
+ scheme: {
2388
+ $case: "httpAuthSecurityScheme",
2389
+ value: {
2390
+ description: scheme.description,
2391
+ scheme: scheme.scheme,
2392
+ bearerFormat: scheme.bearerFormat
2393
+ }
2394
+ }
2395
+ };
2396
+ case "mutualTLS":
2397
+ return {
2398
+ scheme: {
2399
+ $case: "mtlsSecurityScheme",
2400
+ value: {
2401
+ description: scheme.description
2402
+ }
2403
+ }
2404
+ };
2405
+ case "oauth2":
2406
+ return {
2407
+ scheme: {
2408
+ $case: "oauth2SecurityScheme",
2409
+ value: {
2410
+ description: scheme.description,
2411
+ flows: _ToProto.oauthFlows(scheme.flows),
2412
+ oauth2MetadataUrl: scheme.oauth2MetadataUrl
2413
+ }
2414
+ }
2415
+ };
2416
+ case "openIdConnect":
2417
+ return {
2418
+ scheme: {
2419
+ $case: "openIdConnectSecurityScheme",
2420
+ value: {
2421
+ description: scheme.description,
2422
+ openIdConnectUrl: scheme.openIdConnectUrl
2423
+ }
2424
+ }
2425
+ };
2426
+ default:
2427
+ throw A2AError.internalError(`Unsupported security scheme type`);
2428
+ }
2429
+ }
2430
+ static oauthFlows(flows) {
2431
+ if (flows.implicit) {
2432
+ return {
2433
+ flow: {
2434
+ $case: "implicit",
2435
+ value: {
2436
+ authorizationUrl: flows.implicit.authorizationUrl,
2437
+ scopes: flows.implicit.scopes,
2438
+ refreshUrl: flows.implicit.refreshUrl
2439
+ }
2440
+ }
2441
+ };
2442
+ } else if (flows.password) {
2443
+ return {
2444
+ flow: {
2445
+ $case: "password",
2446
+ value: {
2447
+ tokenUrl: flows.password.tokenUrl,
2448
+ scopes: flows.password.scopes,
2449
+ refreshUrl: flows.password.refreshUrl
2450
+ }
2451
+ }
2452
+ };
2453
+ } else if (flows.clientCredentials) {
2454
+ return {
2455
+ flow: {
2456
+ $case: "clientCredentials",
2457
+ value: {
2458
+ tokenUrl: flows.clientCredentials.tokenUrl,
2459
+ scopes: flows.clientCredentials.scopes,
2460
+ refreshUrl: flows.clientCredentials.refreshUrl
2461
+ }
2462
+ }
2463
+ };
2464
+ } else if (flows.authorizationCode) {
2465
+ return {
2466
+ flow: {
2467
+ $case: "authorizationCode",
2468
+ value: {
2469
+ authorizationUrl: flows.authorizationCode.authorizationUrl,
2470
+ tokenUrl: flows.authorizationCode.tokenUrl,
2471
+ scopes: flows.authorizationCode.scopes,
2472
+ refreshUrl: flows.authorizationCode.refreshUrl
2473
+ }
2474
+ }
2475
+ };
2476
+ } else {
2477
+ throw A2AError.internalError(`Unsupported OAuth flows`);
2478
+ }
2479
+ }
2480
+ static agentInterface(agentInterface) {
2481
+ return {
2482
+ transport: agentInterface.transport,
2483
+ url: agentInterface.url
2484
+ };
2485
+ }
2486
+ static agentProvider(agentProvider) {
2487
+ if (!agentProvider) {
2488
+ return void 0;
2489
+ }
2490
+ return {
2491
+ url: agentProvider.url,
2492
+ organization: agentProvider.organization
2493
+ };
2494
+ }
2495
+ static agentCapabilities(capabilities) {
2496
+ return {
2497
+ streaming: capabilities.streaming,
2498
+ pushNotifications: capabilities.pushNotifications,
2499
+ extensions: capabilities.extensions ? capabilities.extensions.map((e) => _ToProto.agentExtension(e)) : []
2500
+ };
2501
+ }
2502
+ static agentExtension(extension) {
2503
+ return {
2504
+ uri: extension.uri,
2505
+ description: extension.description,
2506
+ required: extension.required,
2507
+ params: extension.params
2508
+ };
2509
+ }
2510
+ static listTaskPushNotificationConfig(config) {
2511
+ return {
2512
+ configs: config.map((c) => _ToProto.taskPushNotificationConfig(c)),
2513
+ nextPageToken: ""
2514
+ };
2515
+ }
2516
+ static getTaskPushNotificationConfigParams(config) {
2517
+ return {
2518
+ name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId)
2519
+ };
2520
+ }
2521
+ static listTaskPushNotificationConfigParams(config) {
2522
+ return {
2523
+ parent: generateTaskName(config.id),
2524
+ pageToken: "",
2525
+ pageSize: 0
2526
+ };
2527
+ }
2528
+ static deleteTaskPushNotificationConfigParams(config) {
2529
+ return {
2530
+ name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId)
2531
+ };
2532
+ }
2533
+ static taskPushNotificationConfig(config) {
2534
+ return {
2535
+ name: generatePushNotificationConfigName(
2536
+ config.taskId,
2537
+ config.pushNotificationConfig.id ?? ""
2538
+ ),
2539
+ pushNotificationConfig: _ToProto.pushNotificationConfig(config.pushNotificationConfig)
2540
+ };
2541
+ }
2542
+ static taskPushNotificationConfigCreate(config) {
2543
+ return {
2544
+ parent: generateTaskName(config.taskId),
2545
+ config: _ToProto.taskPushNotificationConfig(config),
2546
+ configId: config.pushNotificationConfig.id
2547
+ };
2548
+ }
2549
+ static pushNotificationConfig(config) {
2550
+ if (!config) {
2551
+ return void 0;
2552
+ }
2553
+ return {
2554
+ id: config.id,
2555
+ url: config.url,
2556
+ token: config.token,
2557
+ authentication: _ToProto.pushNotificationAuthenticationInfo(config.authentication)
2558
+ };
2559
+ }
2560
+ static pushNotificationAuthenticationInfo(authInfo) {
2561
+ if (!authInfo) {
2562
+ return void 0;
2563
+ }
2564
+ return {
2565
+ schemes: authInfo.schemes,
2566
+ credentials: authInfo.credentials
2567
+ };
2568
+ }
2569
+ static messageStreamResult(event) {
2570
+ if (event.kind === "message") {
2571
+ return {
2572
+ payload: {
2573
+ $case: "msg",
2574
+ value: _ToProto.message(event)
2575
+ }
2576
+ };
2577
+ } else if (event.kind === "task") {
2578
+ return {
2579
+ payload: {
2580
+ $case: "task",
2581
+ value: _ToProto.task(event)
2582
+ }
2583
+ };
2584
+ } else if (event.kind === "status-update") {
2585
+ return {
2586
+ payload: {
2587
+ $case: "statusUpdate",
2588
+ value: _ToProto.taskStatusUpdateEvent(event)
2589
+ }
2590
+ };
2591
+ } else if (event.kind === "artifact-update") {
2592
+ return {
2593
+ payload: {
2594
+ $case: "artifactUpdate",
2595
+ value: _ToProto.taskArtifactUpdateEvent(event)
2596
+ }
2597
+ };
2598
+ } else {
2599
+ throw A2AError.internalError("Invalid event type");
2600
+ }
2601
+ }
2602
+ static taskStatusUpdateEvent(event) {
2603
+ return {
2604
+ taskId: event.taskId,
2605
+ status: _ToProto.taskStatus(event.status),
2606
+ contextId: event.contextId,
2607
+ metadata: event.metadata,
2608
+ final: event.final
2609
+ };
2610
+ }
2611
+ static taskArtifactUpdateEvent(event) {
2612
+ return {
2613
+ taskId: event.taskId,
2614
+ artifact: _ToProto.artifact(event.artifact),
2615
+ contextId: event.contextId,
2616
+ metadata: event.metadata,
2617
+ append: event.append,
2618
+ lastChunk: event.lastChunk
2619
+ };
2620
+ }
2621
+ static messageSendResult(params) {
2622
+ if (params.kind === "message") {
2623
+ return {
2624
+ payload: {
2625
+ $case: "msg",
2626
+ value: _ToProto.message(params)
2627
+ }
2628
+ };
2629
+ } else if (params.kind === "task") {
2630
+ return {
2631
+ payload: {
2632
+ $case: "task",
2633
+ value: _ToProto.task(params)
2634
+ }
2635
+ };
2636
+ }
2637
+ }
2638
+ static message(message) {
2639
+ if (!message) {
2640
+ return void 0;
2641
+ }
2642
+ return {
2643
+ messageId: message.messageId,
2644
+ content: message.parts.map((p) => _ToProto.parts(p)),
2645
+ contextId: message.contextId,
2646
+ taskId: message.taskId,
2647
+ role: _ToProto.role(message.role),
2648
+ metadata: message.metadata,
2649
+ extensions: message.extensions ?? []
2650
+ };
2651
+ }
2652
+ static role(role) {
2653
+ switch (role) {
2654
+ case "agent":
2655
+ return 2 /* ROLE_AGENT */;
2656
+ case "user":
2657
+ return 1 /* ROLE_USER */;
2658
+ default:
2659
+ throw A2AError.internalError(`Invalid role`);
2660
+ }
2661
+ }
2662
+ static task(task) {
2663
+ return {
2664
+ id: task.id,
2665
+ contextId: task.contextId,
2666
+ status: _ToProto.taskStatus(task.status),
2667
+ artifacts: task.artifacts?.map((a) => _ToProto.artifact(a)) ?? [],
2668
+ history: task.history?.map((m) => _ToProto.message(m)) ?? [],
2669
+ metadata: task.metadata
2670
+ };
2671
+ }
2672
+ static taskStatus(status) {
2673
+ return {
2674
+ state: _ToProto.taskState(status.state),
2675
+ update: _ToProto.message(status.message),
2676
+ timestamp: status.timestamp ? new Date(status.timestamp) : void 0
2677
+ };
2678
+ }
2679
+ static artifact(artifact) {
2680
+ return {
2681
+ artifactId: artifact.artifactId,
2682
+ name: artifact.name,
2683
+ description: artifact.description,
2684
+ parts: artifact.parts.map((p) => _ToProto.parts(p)),
2685
+ metadata: artifact.metadata,
2686
+ extensions: artifact.extensions ? artifact.extensions : []
2687
+ };
2688
+ }
2689
+ static taskState(state) {
2690
+ switch (state) {
2691
+ case "submitted":
2692
+ return 1 /* TASK_STATE_SUBMITTED */;
2693
+ case "working":
2694
+ return 2 /* TASK_STATE_WORKING */;
2695
+ case "input-required":
2696
+ return 6 /* TASK_STATE_INPUT_REQUIRED */;
2697
+ case "rejected":
2698
+ return 7 /* TASK_STATE_REJECTED */;
2699
+ case "auth-required":
2700
+ return 8 /* TASK_STATE_AUTH_REQUIRED */;
2701
+ case "completed":
2702
+ return 3 /* TASK_STATE_COMPLETED */;
2703
+ case "failed":
2704
+ return 4 /* TASK_STATE_FAILED */;
2705
+ case "canceled":
2706
+ return 5 /* TASK_STATE_CANCELLED */;
2707
+ case "unknown":
2708
+ return 0 /* TASK_STATE_UNSPECIFIED */;
2709
+ default:
2710
+ return -1 /* UNRECOGNIZED */;
2711
+ }
2712
+ }
2713
+ static parts(part) {
2714
+ if (part.kind === "text") {
2715
+ return {
2716
+ part: { $case: "text", value: part.text }
2717
+ };
2718
+ }
2719
+ if (part.kind === "file") {
2720
+ let filePart;
2721
+ if ("uri" in part.file) {
2722
+ filePart = {
2723
+ file: { $case: "fileWithUri", value: part.file.uri },
2724
+ mimeType: part.file.mimeType
2725
+ };
2726
+ } else if ("bytes" in part.file) {
2727
+ filePart = {
2728
+ file: { $case: "fileWithBytes", value: Buffer.from(part.file.bytes, "base64") },
2729
+ mimeType: part.file.mimeType
2730
+ };
2731
+ } else {
2732
+ throw A2AError.internalError("Invalid file part");
2733
+ }
2734
+ return {
2735
+ part: { $case: "file", value: filePart }
2736
+ };
2737
+ }
2738
+ if (part.kind === "data") {
2739
+ return {
2740
+ part: { $case: "data", value: { data: part.data } }
2741
+ };
2742
+ }
2743
+ throw A2AError.internalError("Invalid part type");
2744
+ }
2745
+ static messageSendParams(params) {
2746
+ return {
2747
+ request: _ToProto.message(params.message),
2748
+ configuration: _ToProto.configuration(params.configuration),
2749
+ metadata: params.metadata
2750
+ };
2751
+ }
2752
+ static configuration(configuration) {
2753
+ if (!configuration) {
2754
+ return void 0;
2755
+ }
2756
+ return {
2757
+ blocking: configuration.blocking,
2758
+ acceptedOutputModes: configuration.acceptedOutputModes ?? [],
2759
+ pushNotification: _ToProto.pushNotificationConfig(configuration.pushNotificationConfig),
2760
+ historyLength: configuration.historyLength ?? 0
2761
+ };
2762
+ }
2763
+ static taskQueryParams(params) {
2764
+ return {
2765
+ name: generateTaskName(params.id),
2766
+ historyLength: params.historyLength ?? 0
2767
+ };
2768
+ }
2769
+ static cancelTaskRequest(params) {
2770
+ return {
2771
+ name: generateTaskName(params.id)
2772
+ };
2773
+ }
2774
+ static taskIdParams(params) {
2775
+ return {
2776
+ name: generateTaskName(params.id)
2777
+ };
2778
+ }
2779
+ };
2780
+
2781
+ // src/types/converters/from_proto.ts
2782
+ var FromProto = class _FromProto {
2783
+ static taskQueryParams(request) {
2784
+ return {
2785
+ id: extractTaskId(request.name),
2786
+ historyLength: request.historyLength
2787
+ };
2788
+ }
2789
+ static taskIdParams(request) {
2790
+ return {
2791
+ id: extractTaskId(request.name)
2792
+ };
2793
+ }
2794
+ static getTaskPushNotificationConfigParams(request) {
2795
+ const { taskId, configId } = extractTaskAndPushNotificationConfigId(request.name);
2796
+ return {
2797
+ id: taskId,
2798
+ pushNotificationConfigId: configId
2799
+ };
2800
+ }
2801
+ static listTaskPushNotificationConfigParams(request) {
2802
+ return {
2803
+ id: extractTaskId(request.parent)
2804
+ };
2805
+ }
2806
+ static createTaskPushNotificationConfig(request) {
2807
+ if (!request.config?.pushNotificationConfig) {
2808
+ throw A2AError.invalidParams(
2809
+ "Request must include a `config` object with a `pushNotificationConfig`"
2810
+ );
2811
+ }
2812
+ return {
2813
+ taskId: extractTaskId(request.parent),
2814
+ pushNotificationConfig: _FromProto.pushNotificationConfig(
2815
+ request.config.pushNotificationConfig
2816
+ )
2817
+ };
2818
+ }
2819
+ static deleteTaskPushNotificationConfigParams(request) {
2820
+ const { taskId, configId } = extractTaskAndPushNotificationConfigId(request.name);
2821
+ return {
2822
+ id: taskId,
2823
+ pushNotificationConfigId: configId
2824
+ };
2825
+ }
2826
+ static message(message) {
2827
+ if (!message) {
2828
+ return void 0;
2829
+ }
2830
+ return {
2831
+ kind: "message",
2832
+ messageId: message.messageId,
2833
+ parts: message.content.map((p) => _FromProto.parts(p)),
2834
+ contextId: message.contextId,
2835
+ taskId: message.taskId,
2836
+ role: _FromProto.role(message.role),
2837
+ metadata: message.metadata,
2838
+ extensions: message.extensions
2839
+ };
2840
+ }
2841
+ static role(role) {
2842
+ switch (role) {
2843
+ case 2 /* ROLE_AGENT */:
2844
+ return "agent";
2845
+ case 1 /* ROLE_USER */:
2846
+ return "user";
2847
+ default:
2848
+ throw A2AError.invalidParams(`Invalid role: ${role}`);
2849
+ }
2850
+ }
2851
+ static messageSendConfiguration(configuration) {
2852
+ if (!configuration) {
2853
+ return void 0;
2854
+ }
2855
+ return {
2856
+ blocking: configuration.blocking,
2857
+ acceptedOutputModes: configuration.acceptedOutputModes,
2858
+ pushNotificationConfig: _FromProto.pushNotificationConfig(configuration.pushNotification)
2859
+ };
2860
+ }
2861
+ static pushNotificationConfig(config) {
2862
+ if (!config) {
2863
+ return void 0;
2864
+ }
2865
+ return {
2866
+ id: config.id,
2867
+ url: config.url,
2868
+ token: config.token,
2869
+ authentication: _FromProto.pushNotificationAuthenticationInfo(config.authentication)
2870
+ };
2871
+ }
2872
+ static pushNotificationAuthenticationInfo(authInfo) {
2873
+ if (!authInfo) {
2874
+ return void 0;
2875
+ }
2876
+ return {
2877
+ schemes: authInfo.schemes,
2878
+ credentials: authInfo.credentials
2879
+ };
2880
+ }
2881
+ static parts(part) {
2882
+ if (part.part?.$case === "text") {
2883
+ return {
2884
+ kind: "text",
2885
+ text: part.part.value
2886
+ };
2887
+ }
2888
+ if (part.part?.$case === "file") {
2889
+ const filePart = part.part.value;
2890
+ if (filePart.file?.$case === "fileWithUri") {
2891
+ return {
2892
+ kind: "file",
2893
+ file: {
2894
+ uri: filePart.file.value,
2895
+ mimeType: filePart.mimeType
2896
+ }
2897
+ };
2898
+ } else if (filePart.file?.$case === "fileWithBytes") {
2899
+ return {
2900
+ kind: "file",
2901
+ file: {
2902
+ bytes: filePart.file.value.toString("base64"),
2903
+ mimeType: filePart.mimeType
2904
+ }
2905
+ };
2906
+ }
2907
+ throw A2AError.invalidParams("Invalid file part type");
2908
+ }
2909
+ if (part.part?.$case === "data") {
2910
+ return {
2911
+ kind: "data",
2912
+ data: part.part.value.data
2913
+ };
2914
+ }
2915
+ throw A2AError.invalidParams("Invalid part type");
2916
+ }
2917
+ static messageSendParams(request) {
2918
+ return {
2919
+ message: _FromProto.message(request.request),
2920
+ configuration: _FromProto.messageSendConfiguration(request.configuration),
2921
+ metadata: request.metadata
2922
+ };
2923
+ }
2924
+ static sendMessageResult(response) {
2925
+ if (response.payload?.$case === "task") {
2926
+ return _FromProto.task(response.payload.value);
2927
+ } else if (response.payload?.$case === "msg") {
2928
+ return _FromProto.message(response.payload.value);
2929
+ }
2930
+ throw A2AError.invalidParams("Invalid SendMessageResponse: missing result");
2931
+ }
2932
+ static task(task) {
2933
+ return {
2934
+ kind: "task",
2935
+ id: task.id,
2936
+ status: _FromProto.taskStatus(task.status),
2937
+ contextId: task.contextId,
2938
+ artifacts: task.artifacts?.map((a) => _FromProto.artifact(a)),
2939
+ history: task.history?.map((h) => _FromProto.message(h)),
2940
+ metadata: task.metadata
2941
+ };
2942
+ }
2943
+ static taskStatus(status) {
2944
+ return {
2945
+ message: _FromProto.message(status.update),
2946
+ state: _FromProto.taskState(status.state),
2947
+ timestamp: status.timestamp?.toISOString()
2948
+ };
2949
+ }
2950
+ static taskState(state) {
2951
+ switch (state) {
2952
+ case 1 /* TASK_STATE_SUBMITTED */:
2953
+ return "submitted";
2954
+ case 2 /* TASK_STATE_WORKING */:
2955
+ return "working";
2956
+ case 6 /* TASK_STATE_INPUT_REQUIRED */:
2957
+ return "input-required";
2958
+ case 3 /* TASK_STATE_COMPLETED */:
2959
+ return "completed";
2960
+ case 5 /* TASK_STATE_CANCELLED */:
2961
+ return "canceled";
2962
+ case 4 /* TASK_STATE_FAILED */:
2963
+ return "failed";
2964
+ case 7 /* TASK_STATE_REJECTED */:
2965
+ return "rejected";
2966
+ case 8 /* TASK_STATE_AUTH_REQUIRED */:
2967
+ return "auth-required";
2968
+ case 0 /* TASK_STATE_UNSPECIFIED */:
2969
+ return "unknown";
2970
+ default:
2971
+ throw A2AError.invalidParams(`Invalid task state: ${state}`);
2972
+ }
2973
+ }
2974
+ static artifact(artifact) {
2975
+ return {
2976
+ artifactId: artifact.artifactId,
2977
+ name: artifact.name,
2978
+ description: artifact.description,
2979
+ parts: artifact.parts.map((p) => _FromProto.parts(p)),
2980
+ metadata: artifact.metadata
2981
+ };
2982
+ }
2983
+ static taskPushNotificationConfig(request) {
2984
+ return {
2985
+ taskId: extractTaskId(request.name),
2986
+ pushNotificationConfig: _FromProto.pushNotificationConfig(request.pushNotificationConfig)
2987
+ };
2988
+ }
2989
+ static listTaskPushNotificationConfig(request) {
2990
+ return request.configs.map((c) => _FromProto.taskPushNotificationConfig(c));
2991
+ }
2992
+ static agentCard(agentCard) {
2993
+ return {
2994
+ additionalInterfaces: agentCard.additionalInterfaces?.map((i) => _FromProto.agentInterface(i)),
2995
+ capabilities: agentCard.capabilities ? _FromProto.agentCapabilities(agentCard.capabilities) : {},
2996
+ defaultInputModes: agentCard.defaultInputModes,
2997
+ defaultOutputModes: agentCard.defaultOutputModes,
2998
+ description: agentCard.description,
2999
+ documentationUrl: agentCard.documentationUrl,
3000
+ name: agentCard.name,
3001
+ preferredTransport: agentCard.preferredTransport,
3002
+ provider: agentCard.provider ? _FromProto.agentProvider(agentCard.provider) : void 0,
3003
+ protocolVersion: agentCard.protocolVersion,
3004
+ security: agentCard.security?.map((s) => _FromProto.security(s)),
3005
+ securitySchemes: agentCard.securitySchemes ? Object.fromEntries(
3006
+ Object.entries(agentCard.securitySchemes).map(([key, value]) => [
3007
+ key,
3008
+ _FromProto.securityScheme(value)
3009
+ ])
3010
+ ) : {},
3011
+ skills: agentCard.skills.map((s) => _FromProto.skills(s)),
3012
+ signatures: agentCard.signatures?.map((s) => _FromProto.agentCardSignature(s)),
3013
+ supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard,
3014
+ url: agentCard.url,
3015
+ version: agentCard.version
3016
+ };
3017
+ }
3018
+ static agentCapabilities(capabilities) {
3019
+ return {
3020
+ extensions: capabilities.extensions?.map((e) => _FromProto.agentExtension(e)),
3021
+ pushNotifications: capabilities.pushNotifications,
3022
+ streaming: capabilities.streaming
3023
+ };
3024
+ }
3025
+ static agentExtension(extension) {
3026
+ return {
3027
+ uri: extension.uri ?? "",
3028
+ description: extension.description,
3029
+ required: extension.required,
3030
+ params: extension.params
3031
+ };
3032
+ }
3033
+ static agentInterface(intf) {
3034
+ return {
3035
+ transport: intf.transport ?? "",
3036
+ url: intf.url ?? ""
3037
+ };
3038
+ }
3039
+ static agentProvider(provider) {
3040
+ return {
3041
+ organization: provider.organization ?? "",
3042
+ url: provider.url ?? ""
3043
+ };
3044
+ }
3045
+ static security(security) {
3046
+ return Object.fromEntries(
3047
+ Object.entries(security.schemes)?.map(([key, value]) => [key, value.list])
3048
+ );
3049
+ }
3050
+ static securityScheme(securitySchemes) {
3051
+ switch (securitySchemes.scheme?.$case) {
3052
+ case "apiKeySecurityScheme":
3053
+ return {
3054
+ type: "apiKey",
3055
+ name: securitySchemes.scheme.value.name,
3056
+ in: securitySchemes.scheme.value.location,
3057
+ description: securitySchemes.scheme.value.description
3058
+ };
3059
+ case "httpAuthSecurityScheme":
3060
+ return {
3061
+ type: "http",
3062
+ scheme: securitySchemes.scheme.value.scheme,
3063
+ bearerFormat: securitySchemes.scheme.value.bearerFormat,
3064
+ description: securitySchemes.scheme.value.description
3065
+ };
3066
+ case "mtlsSecurityScheme":
3067
+ return {
3068
+ type: "mutualTLS",
3069
+ description: securitySchemes.scheme.value.description
3070
+ };
3071
+ case "oauth2SecurityScheme":
3072
+ return {
3073
+ type: "oauth2",
3074
+ description: securitySchemes.scheme.value.description,
3075
+ flows: _FromProto.oauthFlows(securitySchemes.scheme.value.flows),
3076
+ oauth2MetadataUrl: securitySchemes.scheme.value.oauth2MetadataUrl
3077
+ };
3078
+ case "openIdConnectSecurityScheme":
3079
+ return {
3080
+ type: "openIdConnect",
3081
+ description: securitySchemes.scheme.value.description,
3082
+ openIdConnectUrl: securitySchemes.scheme.value.openIdConnectUrl
3083
+ };
3084
+ default:
3085
+ throw A2AError.internalError(`Unsupported security scheme type`);
3086
+ }
3087
+ }
3088
+ static oauthFlows(flows) {
3089
+ switch (flows.flow?.$case) {
3090
+ case "implicit":
3091
+ return {
3092
+ implicit: {
3093
+ authorizationUrl: flows.flow.value.authorizationUrl,
3094
+ scopes: flows.flow.value.scopes,
3095
+ refreshUrl: flows.flow.value.refreshUrl
3096
+ }
3097
+ };
3098
+ case "password":
3099
+ return {
3100
+ password: {
3101
+ refreshUrl: flows.flow.value.refreshUrl,
3102
+ scopes: flows.flow.value.scopes,
3103
+ tokenUrl: flows.flow.value.tokenUrl
3104
+ }
3105
+ };
3106
+ case "authorizationCode":
3107
+ return {
3108
+ authorizationCode: {
3109
+ refreshUrl: flows.flow.value.refreshUrl,
3110
+ authorizationUrl: flows.flow.value.authorizationUrl,
3111
+ scopes: flows.flow.value.scopes,
3112
+ tokenUrl: flows.flow.value.tokenUrl
3113
+ }
3114
+ };
3115
+ case "clientCredentials":
3116
+ return {
3117
+ clientCredentials: {
3118
+ refreshUrl: flows.flow.value.refreshUrl,
3119
+ scopes: flows.flow.value.scopes,
3120
+ tokenUrl: flows.flow.value.tokenUrl
3121
+ }
3122
+ };
3123
+ default:
3124
+ throw A2AError.internalError(`Unsupported OAuth flows`);
3125
+ }
3126
+ }
3127
+ static skills(skill) {
3128
+ return {
3129
+ id: skill.id,
3130
+ name: skill.name,
3131
+ description: skill.description,
3132
+ tags: skill.tags,
3133
+ examples: skill.examples,
3134
+ inputModes: skill.inputModes,
3135
+ outputModes: skill.outputModes,
3136
+ security: skill.security?.map((s) => _FromProto.security(s))
3137
+ };
3138
+ }
3139
+ static agentCardSignature(signatures) {
3140
+ return {
3141
+ protected: signatures.protected,
3142
+ signature: signatures.signature,
3143
+ header: signatures.header
3144
+ };
3145
+ }
3146
+ static taskStatusUpdateEvent(event) {
3147
+ return {
3148
+ kind: "status-update",
3149
+ taskId: event.taskId,
3150
+ status: _FromProto.taskStatus(event.status),
3151
+ contextId: event.contextId,
3152
+ metadata: event.metadata,
3153
+ final: event.final
3154
+ };
3155
+ }
3156
+ static taskArtifactUpdateEvent(event) {
3157
+ return {
3158
+ kind: "artifact-update",
3159
+ taskId: event.taskId,
3160
+ artifact: _FromProto.artifact(event.artifact),
3161
+ contextId: event.contextId,
3162
+ metadata: event.metadata,
3163
+ lastChunk: event.lastChunk
3164
+ };
3165
+ }
3166
+ static messageStreamResult(event) {
3167
+ switch (event.payload?.$case) {
3168
+ case "msg": {
3169
+ const message = _FromProto.message(event.payload.value);
3170
+ if (!message) {
3171
+ throw A2AError.internalError("Invalid message in StreamResponse");
3172
+ }
3173
+ return message;
3174
+ }
3175
+ case "task":
3176
+ return _FromProto.task(event.payload.value);
3177
+ case "statusUpdate":
3178
+ return _FromProto.taskStatusUpdateEvent(event.payload.value);
3179
+ case "artifactUpdate":
3180
+ return _FromProto.taskArtifactUpdateEvent(event.payload.value);
3181
+ default:
3182
+ throw A2AError.internalError("Invalid event type in StreamResponse");
3183
+ }
3184
+ }
3185
+ };
3186
+
3187
+ // src/client/transports/rest_transport.ts
3188
+ var RestTransport = class _RestTransport {
3189
+ customFetchImpl;
3190
+ endpoint;
3191
+ constructor(options) {
3192
+ this.endpoint = options.endpoint.replace(/\/+$/, "");
3193
+ this.customFetchImpl = options.fetchImpl;
3194
+ }
3195
+ async getExtendedAgentCard(options) {
3196
+ const response = await this._sendRequest(
3197
+ "GET",
3198
+ "/v1/card",
3199
+ void 0,
3200
+ options,
3201
+ void 0,
3202
+ AgentCard
3203
+ );
3204
+ return FromProto.agentCard(response);
3205
+ }
3206
+ async sendMessage(params, options) {
3207
+ const requestBody = ToProto.messageSendParams(params);
3208
+ const response = await this._sendRequest(
3209
+ "POST",
3210
+ "/v1/message:send",
3211
+ requestBody,
3212
+ options,
3213
+ SendMessageRequest,
3214
+ SendMessageResponse
3215
+ );
3216
+ return FromProto.sendMessageResult(response);
3217
+ }
3218
+ async *sendMessageStream(params, options) {
3219
+ const protoParams = ToProto.messageSendParams(params);
3220
+ const requestBody = SendMessageRequest.toJSON(protoParams);
3221
+ yield* this._sendStreamingRequest("/v1/message:stream", requestBody, options);
3222
+ }
3223
+ async setTaskPushNotificationConfig(params, options) {
3224
+ const requestBody = ToProto.taskPushNotificationConfig(params);
3225
+ const response = await this._sendRequest(
3226
+ "POST",
3227
+ `/v1/tasks/${encodeURIComponent(params.taskId)}/pushNotificationConfigs`,
3228
+ requestBody,
3229
+ options,
3230
+ TaskPushNotificationConfig,
3231
+ TaskPushNotificationConfig
3232
+ );
3233
+ return FromProto.taskPushNotificationConfig(response);
3234
+ }
3235
+ async getTaskPushNotificationConfig(params, options) {
3236
+ const { pushNotificationConfigId } = params;
3237
+ if (!pushNotificationConfigId) {
3238
+ throw new Error(
3239
+ "pushNotificationConfigId is required for getTaskPushNotificationConfig with REST transport."
3240
+ );
3241
+ }
3242
+ const response = await this._sendRequest(
3243
+ "GET",
3244
+ `/v1/tasks/${encodeURIComponent(params.id)}/pushNotificationConfigs/${encodeURIComponent(pushNotificationConfigId)}`,
3245
+ void 0,
3246
+ options,
3247
+ void 0,
3248
+ TaskPushNotificationConfig
3249
+ );
3250
+ return FromProto.taskPushNotificationConfig(response);
3251
+ }
3252
+ async listTaskPushNotificationConfig(params, options) {
3253
+ const response = await this._sendRequest(
3254
+ "GET",
3255
+ `/v1/tasks/${encodeURIComponent(params.id)}/pushNotificationConfigs`,
3256
+ void 0,
3257
+ options,
3258
+ void 0,
3259
+ ListTaskPushNotificationConfigResponse
3260
+ );
3261
+ return FromProto.listTaskPushNotificationConfig(response);
3262
+ }
3263
+ async deleteTaskPushNotificationConfig(params, options) {
3264
+ await this._sendRequest(
3265
+ "DELETE",
3266
+ `/v1/tasks/${encodeURIComponent(params.id)}/pushNotificationConfigs/${encodeURIComponent(params.pushNotificationConfigId)}`,
3267
+ void 0,
3268
+ options,
3269
+ void 0,
3270
+ void 0
3271
+ );
3272
+ }
3273
+ async getTask(params, options) {
3274
+ const queryParams = new URLSearchParams();
3275
+ if (params.historyLength !== void 0) {
3276
+ queryParams.set("historyLength", String(params.historyLength));
3277
+ }
3278
+ const queryString = queryParams.toString();
3279
+ const path = `/v1/tasks/${encodeURIComponent(params.id)}${queryString ? `?${queryString}` : ""}`;
3280
+ const response = await this._sendRequest(
3281
+ "GET",
3282
+ path,
3283
+ void 0,
3284
+ options,
3285
+ void 0,
3286
+ Task
3287
+ );
3288
+ return FromProto.task(response);
3289
+ }
3290
+ async cancelTask(params, options) {
3291
+ const response = await this._sendRequest(
3292
+ "POST",
3293
+ `/v1/tasks/${encodeURIComponent(params.id)}:cancel`,
3294
+ void 0,
3295
+ options,
3296
+ void 0,
3297
+ Task
3298
+ );
3299
+ return FromProto.task(response);
3300
+ }
3301
+ async *resubscribeTask(params, options) {
3302
+ yield* this._sendStreamingRequest(
3303
+ `/v1/tasks/${encodeURIComponent(params.id)}:subscribe`,
3304
+ void 0,
3305
+ options
3306
+ );
3307
+ }
3308
+ _fetch(...args) {
3309
+ if (this.customFetchImpl) {
3310
+ return this.customFetchImpl(...args);
3311
+ }
3312
+ if (typeof fetch === "function") {
3313
+ return fetch(...args);
3314
+ }
3315
+ throw new Error(
3316
+ "A `fetch` implementation was not provided and is not available in the global scope. Please provide a `fetchImpl` in the RestTransportOptions."
3317
+ );
3318
+ }
3319
+ _buildHeaders(options, acceptHeader = "application/json") {
3320
+ return {
3321
+ ...options?.serviceParameters,
3322
+ "Content-Type": "application/json",
3323
+ Accept: acceptHeader
3324
+ };
3325
+ }
3326
+ async _sendRequest(method, path, body, options, requestType, responseType) {
3327
+ const url = `${this.endpoint}${path}`;
3328
+ const requestInit = {
3329
+ method,
3330
+ headers: this._buildHeaders(options),
3331
+ signal: options?.signal
3332
+ };
3333
+ if (body !== void 0 && method !== "GET") {
3334
+ if (!requestType) {
3335
+ throw new Error(
3336
+ `Bug: Request body provided for ${method} ${path} but no toJson serializer provided.`
3337
+ );
3338
+ }
3339
+ requestInit.body = JSON.stringify(requestType.toJSON(body));
3340
+ }
3341
+ const response = await this._fetch(url, requestInit);
3342
+ if (!response.ok) {
3343
+ await this._handleErrorResponse(response, path);
3344
+ }
3345
+ if (response.status === 204 || !responseType) {
3346
+ return void 0;
3347
+ }
3348
+ const result = await response.json();
3349
+ return responseType.fromJSON(result);
3350
+ }
3351
+ async _handleErrorResponse(response, path) {
3352
+ let errorBodyText = "(empty or non-JSON response)";
3353
+ let errorBody;
3354
+ try {
3355
+ errorBodyText = await response.text();
3356
+ if (errorBodyText) {
3357
+ errorBody = JSON.parse(errorBodyText);
3358
+ }
3359
+ } catch (e) {
3360
+ throw new Error(
3361
+ `HTTP error for ${path}! Status: ${response.status} ${response.statusText}. Response: ${errorBodyText}`,
3362
+ { cause: e }
3363
+ );
3364
+ }
3365
+ if (errorBody && typeof errorBody.code === "number") {
3366
+ throw _RestTransport.mapToError(errorBody);
3367
+ }
3368
+ throw new Error(
3369
+ `HTTP error for ${path}! Status: ${response.status} ${response.statusText}. Response: ${errorBodyText}`
3370
+ );
3371
+ }
3372
+ async *_sendStreamingRequest(path, body, options) {
3373
+ const url = `${this.endpoint}${path}`;
3374
+ const requestInit = {
3375
+ method: "POST",
3376
+ headers: this._buildHeaders(options, "text/event-stream"),
3377
+ signal: options?.signal
3378
+ };
3379
+ if (body !== void 0) {
3380
+ requestInit.body = JSON.stringify(body);
3381
+ }
3382
+ const response = await this._fetch(url, requestInit);
3383
+ if (!response.ok) {
3384
+ await this._handleErrorResponse(response, path);
3385
+ }
3386
+ const contentType = response.headers.get("Content-Type");
3387
+ if (!contentType?.startsWith("text/event-stream")) {
3388
+ throw new Error(
3389
+ `Invalid response Content-Type for SSE stream. Expected 'text/event-stream', got '${contentType}'.`
3390
+ );
3391
+ }
3392
+ for await (const event of parseSseStream(response)) {
3393
+ if (event.type === "error") {
3394
+ const errorData = JSON.parse(event.data);
3395
+ throw _RestTransport.mapToError(errorData);
3396
+ }
3397
+ yield this._processSseEventData(event.data);
3398
+ }
3399
+ }
3400
+ _processSseEventData(jsonData) {
3401
+ if (!jsonData.trim()) {
3402
+ throw new Error("Attempted to process empty SSE event data.");
3403
+ }
3404
+ try {
3405
+ const response = JSON.parse(jsonData);
3406
+ const protoResponse = StreamResponse.fromJSON(response);
3407
+ return FromProto.messageStreamResult(protoResponse);
3408
+ } catch (e) {
3409
+ console.error("Failed to parse SSE event data:", jsonData, e);
3410
+ throw new Error(
3411
+ `Failed to parse SSE event data: "${jsonData.substring(0, 100)}...". Original error: ${e instanceof Error && e.message || "Unknown error"}`
3412
+ );
3413
+ }
3414
+ }
3415
+ static mapToError(error) {
3416
+ switch (error.code) {
3417
+ case A2A_ERROR_CODE.TASK_NOT_FOUND:
3418
+ return new TaskNotFoundError(error.message);
3419
+ case A2A_ERROR_CODE.TASK_NOT_CANCELABLE:
3420
+ return new TaskNotCancelableError(error.message);
3421
+ case A2A_ERROR_CODE.PUSH_NOTIFICATION_NOT_SUPPORTED:
3422
+ return new PushNotificationNotSupportedError(error.message);
3423
+ case A2A_ERROR_CODE.UNSUPPORTED_OPERATION:
3424
+ return new UnsupportedOperationError(error.message);
3425
+ case A2A_ERROR_CODE.CONTENT_TYPE_NOT_SUPPORTED:
3426
+ return new ContentTypeNotSupportedError(error.message);
3427
+ case A2A_ERROR_CODE.INVALID_AGENT_RESPONSE:
3428
+ return new InvalidAgentResponseError(error.message);
3429
+ case A2A_ERROR_CODE.AUTHENTICATED_EXTENDED_CARD_NOT_CONFIGURED:
3430
+ return new AuthenticatedExtendedCardNotConfiguredError(error.message);
3431
+ default:
3432
+ return new Error(
3433
+ `REST error: ${error.message} (Code: ${error.code})${error.data ? ` Data: ${JSON.stringify(error.data)}` : ""}`
3434
+ );
3435
+ }
3436
+ }
3437
+ };
3438
+ var RestTransportFactory = class _RestTransportFactory {
3439
+ constructor(options) {
3440
+ this.options = options;
3441
+ }
3442
+ static name = "HTTP+JSON";
3443
+ get protocolName() {
3444
+ return _RestTransportFactory.name;
3445
+ }
3446
+ async create(url, _agentCard) {
3447
+ return new RestTransport({
3448
+ endpoint: url,
3449
+ fetchImpl: this.options?.fetchImpl
3450
+ });
3451
+ }
3452
+ };
3453
+
3454
+ // src/client/factory.ts
3455
+ var ClientFactoryOptions = {
3456
+ /**
3457
+ * SDK default options for {@link ClientFactory}.
3458
+ */
3459
+ default: {
3460
+ transports: [new JsonRpcTransportFactory(), new RestTransportFactory()]
3461
+ },
3462
+ /**
3463
+ * Creates new options by merging an original and an override object.
3464
+ * Transports are merged based on `TransportFactory.protocolName`,
3465
+ * interceptors are concatenated, other fields are overriden.
3466
+ *
3467
+ * @example
3468
+ * ```ts
3469
+ * const options = ClientFactoryOptions.createFrom(ClientFactoryOptions.default, {
3470
+ * transports: [new MyCustomTransportFactory()], // adds a custom transport
3471
+ * clientConfig: { interceptors: [new MyInterceptor()] }, // adds a custom interceptor
3472
+ * });
3473
+ * ```
3474
+ */
3475
+ createFrom(original, overrides) {
3476
+ return {
3477
+ ...original,
3478
+ ...overrides,
3479
+ transports: mergeTransports(original.transports, overrides.transports),
3480
+ clientConfig: {
3481
+ ...original.clientConfig ?? {},
3482
+ ...overrides.clientConfig ?? {},
3483
+ interceptors: mergeArrays(
3484
+ original.clientConfig?.interceptors,
3485
+ overrides.clientConfig?.interceptors
3486
+ ),
3487
+ acceptedOutputModes: overrides.clientConfig?.acceptedOutputModes ?? original.clientConfig?.acceptedOutputModes
3488
+ },
3489
+ preferredTransports: overrides.preferredTransports ?? original.preferredTransports
3490
+ };
3491
+ }
3492
+ };
3493
+ var ClientFactory = class {
3494
+ constructor(options = ClientFactoryOptions.default) {
3495
+ this.options = options;
3496
+ if (!options.transports || options.transports.length === 0) {
3497
+ throw new Error("No transports provided");
3498
+ }
3499
+ this.transportsByName = transportsByName(options.transports);
3500
+ for (const transport of options.preferredTransports ?? []) {
3501
+ if (!this.transportsByName.has(transport)) {
3502
+ throw new Error(
3503
+ `Unknown preferred transport: ${transport}, available transports: ${[...this.transportsByName.keys()].join()}`
3504
+ );
3505
+ }
3506
+ }
3507
+ this.agentCardResolver = options.cardResolver ?? AgentCardResolver.default;
3508
+ }
3509
+ transportsByName;
3510
+ agentCardResolver;
3511
+ /**
3512
+ * Creates a new client from the provided agent card.
3513
+ */
3514
+ async createFromAgentCard(agentCard) {
3515
+ const agentCardPreferred = agentCard.preferredTransport ?? JsonRpcTransportFactory.name;
3516
+ const additionalInterfaces = agentCard.additionalInterfaces ?? [];
3517
+ const urlsPerAgentTransports = new CaseInsensitiveMap([
3518
+ [agentCardPreferred, agentCard.url],
3519
+ ...additionalInterfaces.map((i) => [i.transport, i.url])
3520
+ ]);
3521
+ const transportsByPreference = [
3522
+ ...this.options.preferredTransports ?? [],
3523
+ agentCardPreferred,
3524
+ ...additionalInterfaces.map((i) => i.transport)
3525
+ ];
3526
+ for (const transport of transportsByPreference) {
3527
+ if (!urlsPerAgentTransports.has(transport)) {
3528
+ continue;
3529
+ }
3530
+ const factory = this.transportsByName.get(transport);
3531
+ if (!factory) {
3532
+ continue;
3533
+ }
3534
+ return new Client(
3535
+ await factory.create(urlsPerAgentTransports.get(transport), agentCard),
3536
+ agentCard,
3537
+ this.options.clientConfig
3538
+ );
3539
+ }
3540
+ throw new Error(
3541
+ "No compatible transport found, available transports: " + [...this.transportsByName.keys()].join()
3542
+ );
3543
+ }
3544
+ /**
3545
+ * Downloads agent card using AgentCardResolver from options
3546
+ * and creates a new client from the downloaded card.
3547
+ *
3548
+ * @example
3549
+ * ```ts
3550
+ * const factory = new ClientFactory(); // use default options and default {@link AgentCardResolver}.
3551
+ * const client1 = await factory.createFromUrl('https://example.com'); // /.well-known/agent-card.json is used by default
3552
+ * const client2 = await factory.createFromUrl('https://example.com', '/my-agent-card.json'); // specify custom path
3553
+ * const client3 = await factory.createFromUrl('https://example.com/my-agent-card.json', ''); // specify full URL and set path to empty
3554
+ * ```
3555
+ */
3556
+ async createFromUrl(baseUrl, path) {
3557
+ const agentCard = await this.agentCardResolver.resolve(baseUrl, path);
3558
+ return this.createFromAgentCard(agentCard);
3559
+ }
3560
+ };
3561
+ function mergeTransports(original, overrides) {
3562
+ if (!overrides) {
3563
+ return original;
3564
+ }
3565
+ const result = transportsByName(original);
3566
+ const overridesByName = transportsByName(overrides);
3567
+ for (const [name, factory] of overridesByName) {
3568
+ result.set(name, factory);
3569
+ }
3570
+ return Array.from(result.values());
3571
+ }
3572
+ function transportsByName(transports) {
3573
+ const result = new CaseInsensitiveMap();
3574
+ if (!transports) {
3575
+ return result;
3576
+ }
3577
+ for (const t of transports) {
3578
+ if (result.has(t.protocolName)) {
3579
+ throw new Error(`Duplicate protocol name: ${t.protocolName}`);
3580
+ }
3581
+ result.set(t.protocolName, t);
3582
+ }
3583
+ return result;
3584
+ }
3585
+ function mergeArrays(a1, a2) {
3586
+ if (!a1 && !a2) {
3587
+ return void 0;
3588
+ }
3589
+ return [...a1 ?? [], ...a2 ?? []];
3590
+ }
3591
+ var CaseInsensitiveMap = class extends Map {
3592
+ normalizeKey(key) {
3593
+ return key.toUpperCase();
3594
+ }
3595
+ set(key, value) {
3596
+ return super.set(this.normalizeKey(key), value);
3597
+ }
3598
+ get(key) {
3599
+ return super.get(this.normalizeKey(key));
3600
+ }
3601
+ has(key) {
3602
+ return super.has(this.normalizeKey(key));
3603
+ }
3604
+ delete(key) {
3605
+ return super.delete(this.normalizeKey(key));
3606
+ }
3607
+ };
1248
3608
 
1249
3609
  // src/extensions.ts
1250
3610
  var Extensions = {
@@ -1337,15 +3697,24 @@ var ClientCallContextKey = class {
1337
3697
  0 && (module.exports = {
1338
3698
  A2AClient,
1339
3699
  AgentCardResolver,
3700
+ AuthenticatedExtendedCardNotConfiguredError,
1340
3701
  Client,
1341
3702
  ClientCallContext,
1342
3703
  ClientCallContextKey,
1343
3704
  ClientFactory,
1344
3705
  ClientFactoryOptions,
3706
+ ContentTypeNotSupportedError,
1345
3707
  DefaultAgentCardResolver,
3708
+ InvalidAgentResponseError,
1346
3709
  JsonRpcTransport,
1347
3710
  JsonRpcTransportFactory,
3711
+ PushNotificationNotSupportedError,
3712
+ RestTransport,
3713
+ RestTransportFactory,
1348
3714
  ServiceParameters,
3715
+ TaskNotCancelableError,
3716
+ TaskNotFoundError,
3717
+ UnsupportedOperationError,
1349
3718
  createAuthenticatingFetchWithRetry,
1350
3719
  withA2AExtensions
1351
3720
  });