@assistant-ui/react-a2a 0.2.35 → 0.2.37

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.
@@ -1,52 +1,49 @@
1
- import { A2AAgentCard, A2AErrorInfo, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskPushNotificationConfig } from "./types.js";
2
- //#region src/A2AClient.d.ts
3
- type A2AClientOptions = {
4
- baseUrl: string;
5
- /** Optional path prefix for all API endpoints (e.g. "/v1"). Does not affect agent card discovery. */
6
- basePath?: string | undefined;
7
- /** Optional tenant ID for multi-tenant servers. */
8
- tenant?: string | undefined;
9
- headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>) | undefined;
10
- /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */
11
- extensions?: string[] | undefined;
12
- /** Extra fetch options applied to every request. */
13
- fetchOptions?: Omit<RequestInit, "headers" | "body" | "method" | "signal"> | undefined;
1
+ import type { A2AAgentCard, A2AErrorInfo, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskPushNotificationConfig } from "./types.js";
2
+ export type A2AClientOptions = {
3
+ baseUrl: string;
4
+ /** Optional path prefix for all API endpoints (e.g. "/v1"). Does not affect agent card discovery. */
5
+ basePath?: string | undefined;
6
+ /** Optional tenant ID for multi-tenant servers. */
7
+ tenant?: string | undefined;
8
+ headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>) | undefined;
9
+ /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */
10
+ extensions?: string[] | undefined;
11
+ /** Extra fetch options applied to every request. */
12
+ fetchOptions?: Omit<RequestInit, "headers" | "body" | "method" | "signal"> | undefined;
14
13
  };
15
- declare class A2AError extends Error {
16
- code: number;
17
- status: string;
18
- details: unknown[] | undefined;
19
- constructor(info: A2AErrorInfo);
14
+ export declare class A2AError extends Error {
15
+ code: number;
16
+ status: string;
17
+ details: unknown[] | undefined;
18
+ constructor(info: A2AErrorInfo);
20
19
  }
21
- declare class A2AClient {
22
- private baseUrl;
23
- private basePath;
24
- private tenant;
25
- private extensionUris;
26
- private fetchOptions;
27
- private headersFn;
28
- constructor(options: A2AClientOptions);
29
- private getBasePath;
30
- private getHeaders;
31
- private throwResponseError;
32
- private fetchJSON;
33
- getAgentCard(signal?: AbortSignal): Promise<A2AAgentCard>;
34
- getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard>;
35
- sendMessage(message: A2AMessage, configuration?: A2ASendMessageConfiguration, metadata?: Record<string, unknown>, signal?: AbortSignal): Promise<A2ATask | A2AMessage>;
36
- streamMessage(message: A2AMessage, configuration?: A2ASendMessageConfiguration, metadata?: Record<string, unknown>, signal?: AbortSignal): AsyncGenerator<A2AStreamEvent>;
37
- getTask(taskId: string, historyLength?: number, signal?: AbortSignal): Promise<A2ATask>;
38
- listTasks(request?: A2AListTasksRequest, signal?: AbortSignal): Promise<A2AListTasksResponse>;
39
- cancelTask(taskId: string, metadata?: Record<string, unknown>, signal?: AbortSignal): Promise<A2ATask>;
40
- subscribeToTask(taskId: string, signal?: AbortSignal): AsyncGenerator<A2AStreamEvent>;
41
- createTaskPushNotificationConfig(config: A2ATaskPushNotificationConfig, signal?: AbortSignal): Promise<A2ATaskPushNotificationConfig>;
42
- getTaskPushNotificationConfig(taskId: string, configId: string, signal?: AbortSignal): Promise<A2ATaskPushNotificationConfig>;
43
- listTaskPushNotificationConfigs(taskId: string, options?: {
44
- pageSize?: number;
45
- pageToken?: string;
46
- }, signal?: AbortSignal): Promise<A2AListTaskPushNotificationConfigsResponse>;
47
- deleteTaskPushNotificationConfig(taskId: string, configId: string, signal?: AbortSignal): Promise<void>;
48
- private parseSSE;
20
+ export declare class A2AClient {
21
+ private baseUrl;
22
+ private basePath;
23
+ private tenant;
24
+ private extensionUris;
25
+ private fetchOptions;
26
+ private headersFn;
27
+ constructor(options: A2AClientOptions);
28
+ private getBasePath;
29
+ private getHeaders;
30
+ private throwResponseError;
31
+ private fetchJSON;
32
+ getAgentCard(signal?: AbortSignal): Promise<A2AAgentCard>;
33
+ getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard>;
34
+ sendMessage(message: A2AMessage, configuration?: A2ASendMessageConfiguration, metadata?: Record<string, unknown>, signal?: AbortSignal): Promise<A2ATask | A2AMessage>;
35
+ streamMessage(message: A2AMessage, configuration?: A2ASendMessageConfiguration, metadata?: Record<string, unknown>, signal?: AbortSignal): AsyncGenerator<A2AStreamEvent>;
36
+ getTask(taskId: string, historyLength?: number, signal?: AbortSignal): Promise<A2ATask>;
37
+ listTasks(request?: A2AListTasksRequest, signal?: AbortSignal): Promise<A2AListTasksResponse>;
38
+ cancelTask(taskId: string, metadata?: Record<string, unknown>, signal?: AbortSignal): Promise<A2ATask>;
39
+ subscribeToTask(taskId: string, signal?: AbortSignal): AsyncGenerator<A2AStreamEvent>;
40
+ createTaskPushNotificationConfig(config: A2ATaskPushNotificationConfig, signal?: AbortSignal): Promise<A2ATaskPushNotificationConfig>;
41
+ getTaskPushNotificationConfig(taskId: string, configId: string, signal?: AbortSignal): Promise<A2ATaskPushNotificationConfig>;
42
+ listTaskPushNotificationConfigs(taskId: string, options?: {
43
+ pageSize?: number;
44
+ pageToken?: string;
45
+ }, signal?: AbortSignal): Promise<A2AListTaskPushNotificationConfigsResponse>;
46
+ deleteTaskPushNotificationConfig(taskId: string, configId: string, signal?: AbortSignal): Promise<void>;
47
+ private parseSSE;
49
48
  }
50
- //#endregion
51
- export { A2AClient, A2AClientOptions, A2AError };
52
49
  //# sourceMappingURL=A2AClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"A2AClient.d.ts","names":[],"sources":["../src/A2AClient.ts"],"mappings":";;KAmBY;EACV;;EAEA;;EAEA;EACA,UACI,gCACO,yBAAyB,QAAQ;;EAG5C;;EAEA,eACI,KAAK;;cAIE,iBAAiB;EAC5B;EACA;EACA;EAEY,YAAA,MAAM;;cA2oBP;UACH;UACA;UACA;UACA;UACA;UAIA;EAII,YAAA,SAAS;UAkBb;UAIM;UAqBA;UAyBA;EAoCR,aAAa,SAAS,cAAc,QAAQ;EAe5C,qBAAqB,SAAS,cAAc,QAAQ;EAUpD,YACJ,SAAS,YACT,gBAAgB,6BAChB,WAAW,yBACX,SAAS,cACR,QAAQ,UAAU;EAmBd,cACL,SAAS,YACT,gBAAgB,6BAChB,WAAW,yBACX,SAAS,cACR,eAAe;EA6BZ,QACJ,gBACA,wBACA,SAAS,cACR,QAAQ;EAcL,UACJ,UAAU,qBACV,SAAS,cACR,QAAQ;EAqBL,WACJ,gBACA,WAAW,yBACX,SAAS,cACR,QAAQ;EAaJ,gBACL,gBACA,SAAS,cACR,eAAe;EAqBZ,iCACJ,QAAQ,+BACR,SAAS,cACR,QAAQ;EAiBL,8BACJ,gBACA,kBACA,SAAS,cACR,QAAQ;EAWL,gCACJ,gBACA;IAAY;IAAmB;KAC/B,SAAS,cACR,QAAQ;EAaL,iCACJ,gBACA,kBACA,SAAS,cACR;UAmBY"}
1
+ {"version":3,"file":"A2AClient.d.ts","sourceRoot":"","sources":["../src/A2AClient.ts"],"names":[],"mappings":"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"}
package/dist/A2AClient.js CHANGED
@@ -363,6 +363,42 @@ const parseListTaskPushNotificationConfigsResponse = (value) => {
363
363
  function signalInit(signal) {
364
364
  return signal ? { signal } : {};
365
365
  }
366
+ const getAbortReason = (signal) => {
367
+ if (signal.reason !== void 0) return signal.reason;
368
+ const error = /* @__PURE__ */ new Error("The operation was aborted");
369
+ error.name = "AbortError";
370
+ return error;
371
+ };
372
+ const raceWithAbortSignal = (signal, operation) => {
373
+ if (!signal) return Promise.resolve().then(operation);
374
+ if (signal.aborted) return Promise.reject(getAbortReason(signal));
375
+ return new Promise((resolve, reject) => {
376
+ let settled = false;
377
+ const cleanup = () => signal.removeEventListener("abort", handleAbort);
378
+ const resolveOnce = (value) => {
379
+ if (settled) return;
380
+ settled = true;
381
+ cleanup();
382
+ resolve(value);
383
+ };
384
+ const rejectOnce = (error) => {
385
+ if (settled) return;
386
+ settled = true;
387
+ cleanup();
388
+ reject(error);
389
+ };
390
+ const handleAbort = () => rejectOnce(getAbortReason(signal));
391
+ signal.addEventListener("abort", handleAbort, { once: true });
392
+ let result;
393
+ try {
394
+ result = operation();
395
+ } catch (error) {
396
+ rejectOnce(error);
397
+ return;
398
+ }
399
+ Promise.resolve(result).then(resolveOnce, rejectOnce);
400
+ });
401
+ };
366
402
  const SKIPPED_FRAME_SNIPPET_LENGTH = 120;
367
403
  function describeSkippedFrame(data, reason) {
368
404
  const collapsed = data.replace(/\s+/g, " ");
@@ -387,11 +423,11 @@ var A2AClient = class {
387
423
  getBasePath() {
388
424
  return `${this.basePath}${this.tenant ? `/${encodeURIComponent(this.tenant)}` : ""}`;
389
425
  }
390
- async getHeaders(includeContentType = true) {
426
+ async getHeaders(includeContentType = true, signal) {
391
427
  const headers = {
392
428
  Accept: "application/a2a+json, application/json",
393
429
  "A2A-Version": "1.0",
394
- ...typeof this.headersFn === "function" ? await this.headersFn() : this.headersFn
430
+ ...typeof this.headersFn === "function" ? await raceWithAbortSignal(signal, this.headersFn) : this.headersFn
395
431
  };
396
432
  if (includeContentType) headers["Content-Type"] = "application/a2a+json";
397
433
  if (this.extensionUris?.length) headers["A2A-Extensions"] = this.extensionUris.join(", ");
@@ -419,7 +455,7 @@ var A2AClient = class {
419
455
  }
420
456
  async fetchJSON(path, options = {}) {
421
457
  const isGet = !options.method || options.method.toUpperCase() === "GET";
422
- const headers = await this.getHeaders(!isGet);
458
+ const headers = await this.getHeaders(!isGet, options.signal ?? void 0);
423
459
  const response = await fetch(`${this.baseUrl}${path}`, {
424
460
  ...this.fetchOptions,
425
461
  ...options,
@@ -444,7 +480,7 @@ var A2AClient = class {
444
480
  return normalizeKeys(json);
445
481
  }
446
482
  async getAgentCard(signal) {
447
- const headers = await this.getHeaders(false);
483
+ const headers = await this.getHeaders(false, signal);
448
484
  const url = `${this.baseUrl}/.well-known/agent-card.json`;
449
485
  const response = await fetch(url, {
450
486
  ...this.fetchOptions,
@@ -471,7 +507,7 @@ var A2AClient = class {
471
507
  return parseSendMessageResponse(result);
472
508
  }
473
509
  async *streamMessage(message, configuration, metadata, signal) {
474
- const headers = await this.getHeaders(true);
510
+ const headers = await this.getHeaders(true, signal);
475
511
  headers.Accept = "text/event-stream";
476
512
  const body = { message: toWireMessage(message) };
477
513
  if (configuration) body.configuration = configuration;
@@ -516,7 +552,7 @@ var A2AClient = class {
516
552
  return parseTaskResponse(result, "tasks:cancel");
517
553
  }
518
554
  async *subscribeToTask(taskId, signal) {
519
- const headers = await this.getHeaders(false);
555
+ const headers = await this.getHeaders(false, signal);
520
556
  headers.Accept = "text/event-stream";
521
557
  const response = await fetch(`${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:subscribe`, {
522
558
  ...this.fetchOptions,
@@ -549,7 +585,7 @@ var A2AClient = class {
549
585
  return parseListTaskPushNotificationConfigsResponse(result);
550
586
  }
551
587
  async deleteTaskPushNotificationConfig(taskId, configId, signal) {
552
- const headers = await this.getHeaders(true);
588
+ const headers = await this.getHeaders(true, signal);
553
589
  const response = await fetch(`${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`, {
554
590
  ...this.fetchOptions,
555
591
  method: "DELETE",
@@ -1 +1 @@
1
- {"version":3,"file":"A2AClient.js","names":[],"sources":["../src/A2AClient.ts"],"sourcesContent":["import { SSEEventDecoder, type SSEEvent } from \"assistant-stream/utils\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\nimport type {\n A2AAgentCard,\n A2AErrorInfo,\n A2AListTaskPushNotificationConfigsResponse,\n A2AListTasksRequest,\n A2AListTasksResponse,\n A2AMessage,\n A2APart,\n A2ARole,\n A2ASendMessageConfiguration,\n A2AStreamEvent,\n A2ATask,\n A2ATaskPushNotificationConfig,\n A2ATaskState,\n} from \"./types\";\nimport { A2A_PROTOCOL_VERSION } from \"./types\";\n\nexport type A2AClientOptions = {\n baseUrl: string;\n /** Optional path prefix for all API endpoints (e.g. \"/v1\"). Does not affect agent card discovery. */\n basePath?: string | undefined;\n /** Optional tenant ID for multi-tenant servers. */\n tenant?: string | undefined;\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\n /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */\n extensions?: string[] | undefined;\n /** Extra fetch options applied to every request. */\n fetchOptions?:\n | Omit<RequestInit, \"headers\" | \"body\" | \"method\" | \"signal\">\n | undefined;\n};\n\nexport class A2AError extends Error {\n code: number;\n status: string;\n details: unknown[] | undefined;\n\n constructor(info: A2AErrorInfo) {\n super(info.message);\n this.name = \"A2AError\";\n this.code = info.code;\n this.status = info.status;\n this.details = info.details;\n }\n}\n\n// Incoming key normalization: snake_case → camelCase, plus ProtoJSON enum normalization.\nfunction toCamelCase(key: string): string {\n return key.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n// Fields whose values are opaque user data (google.protobuf.Struct / Value).\n// Keys inside these objects must NOT be camelCased or have enum normalization applied.\nconst OPAQUE_FIELDS = new Set([\n \"metadata\",\n \"data\",\n \"params\",\n \"forwardedProps\",\n \"scopes\",\n]);\n\nconst JSONRPC_STATE_MAP: Record<string, string> = {\n \"input-required\": \"input_required\",\n \"auth-required\": \"auth_required\",\n unknown: \"unspecified\",\n};\n\nconst PART_STRING_FIELDS = [\n \"text\",\n \"raw\",\n \"url\",\n \"filename\",\n \"mediaType\",\n] as const;\n\nconst NULLABLE_PART_FIELDS = [...PART_STRING_FIELDS, \"metadata\"] as const;\n\nfunction normalizePartNulls(\n part: Record<string, unknown>,\n): Record<string, unknown> {\n const normalized = { ...part };\n for (const field of NULLABLE_PART_FIELDS) {\n if (normalized[field] === null) delete normalized[field];\n }\n return normalized;\n}\n\n// JSON-RPC file parts nest the payload under `file`; the internal A2APart is\n// flat, so the nested fields map onto url/raw/mediaType/filename.\nfunction normalizeParts(value: unknown[]): unknown[] {\n return value.map((raw) => {\n const part = normalizeKeys(raw, false);\n if (part === null || typeof part !== \"object\" || Array.isArray(part))\n return part;\n const record = normalizePartNulls(part as Record<string, unknown>);\n if (record.kind === undefined) return record;\n const { kind, ...rest } = record;\n const file = rest.file;\n if (kind !== \"file\" || file === null || typeof file !== \"object\")\n return rest;\n const { file: _file, ...others } = rest;\n const nested = file as Record<string, unknown>;\n return {\n ...others,\n ...(nested.uri != null ? { url: nested.uri } : {}),\n ...(nested.bytes != null ? { raw: nested.bytes } : {}),\n ...(nested.mimeType != null ? { mediaType: nested.mimeType } : {}),\n ...(nested.name != null ? { filename: nested.name } : {}),\n };\n });\n}\n\nfunction normalizeKeys(obj: unknown, opaque = false): unknown {\n if (Array.isArray(obj)) return obj.map((v) => normalizeKeys(v, opaque));\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n // Inside opaque fields: preserve keys and values as-is (only recurse arrays/objects structurally)\n if (opaque) {\n result[key] =\n typeof value === \"object\" && value !== null\n ? normalizeKeys(value, true)\n : value;\n continue;\n }\n\n const camelKey = toCamelCase(key);\n const isOpaqueChild = OPAQUE_FIELDS.has(camelKey);\n\n if (camelKey === \"state\" && typeof value === \"string\") {\n // Proto-style (TASK_STATE_WORKING) and the JSON-RPC state names map\n // onto the internal snake_case states; anything unrecognized is\n // preserved verbatim.\n if (value.startsWith(\"TASK_STATE_\")) {\n result[camelKey] = value.slice(11).toLowerCase();\n } else {\n result[camelKey] = JSONRPC_STATE_MAP[value] ?? value;\n }\n } else if (\n camelKey === \"role\" &&\n typeof value === \"string\" &&\n value.startsWith(\"ROLE_\")\n ) {\n result[camelKey] = value.slice(5).toLowerCase();\n } else if (camelKey === \"content\" && Array.isArray(value)) {\n // v0.3 servers used \"content\" for message/artifact parts; normalize to \"parts\" for backward compat\n result.parts = normalizeParts(value);\n } else if (camelKey === \"parts\" && Array.isArray(value)) {\n // dedup: \"content\" was already mapped to parts above; don't overwrite\n if (!(\"parts\" in result)) result.parts = normalizeParts(value);\n } else if (camelKey !== \"parts\" || !(\"parts\" in result)) {\n result[camelKey] = isOpaqueChild ? value : normalizeKeys(value, false);\n }\n }\n return result;\n }\n return obj;\n}\n\n// Outgoing enum conversion (v1.0 ProtoJSON format)\nfunction toWireRole(role: A2ARole): string {\n if (role === \"user\") return \"ROLE_USER\";\n if (role === \"agent\") return \"ROLE_AGENT\";\n return \"ROLE_UNSPECIFIED\";\n}\n\nfunction toWireTaskState(state: A2ATaskState): string {\n return `TASK_STATE_${state.toUpperCase()}`;\n}\n\nfunction toWireMessage(msg: A2AMessage): unknown {\n return { ...msg, role: toWireRole(msg.role) };\n}\n\nfunction discriminateStreamResponse(\n data: Record<string, unknown>,\n): A2AStreamEvent | null {\n if (\"task\" in data) {\n const task = toWrappedTask(data.task);\n if (task) return { type: \"task\", task };\n }\n if (\"message\" in data) {\n const message = toWrappedMessage(data.message);\n if (message) return { type: \"message\", message };\n }\n if (\"statusUpdate\" in data) {\n const statusUpdate = toWrappedStatusUpdate(data.statusUpdate);\n if (statusUpdate) {\n return {\n type: \"statusUpdate\",\n event: statusUpdate as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n }\n if (\"artifactUpdate\" in data) {\n const artifactUpdate = toWrappedArtifactUpdate(data.artifactUpdate);\n if (artifactUpdate) {\n return {\n type: \"artifactUpdate\",\n event: artifactUpdate as A2AStreamEvent extends {\n type: \"artifactUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n }\n // JSON-RPC streaming results are the event itself, flat, discriminated by\n // `kind` (per the A2A JSON-RPC schema), rather than wrapped in a\n // REST-style single-key envelope. The field sets cannot collide with the\n // wrapper keys above, so this is a pure fallthrough.\n const { kind, ...flat } = data;\n switch (kind) {\n case \"task\":\n if (!isTask(flat)) break;\n return { type: \"task\", task: flat };\n case \"message\":\n if (!isMessage(flat)) break;\n return { type: \"message\", message: flat };\n case \"status-update\": {\n if (!isStatusUpdate(flat)) break;\n const { final: _final, ...event } = flat;\n return {\n type: \"statusUpdate\",\n event: event as unknown as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n case \"artifact-update\":\n if (!isArtifactUpdate(flat)) break;\n return {\n type: \"artifactUpdate\",\n event: flat as unknown as A2AStreamEvent extends {\n type: \"artifactUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n return null;\n}\n\nconst TASK_STATES: ReadonlySet<string> = new Set(\n Object.keys({\n unspecified: true,\n submitted: true,\n working: true,\n completed: true,\n failed: true,\n canceled: true,\n input_required: true,\n rejected: true,\n auth_required: true,\n } satisfies Record<A2ATaskState, true>),\n);\n\nconst isTaskState = (value: unknown): value is A2ATaskState =>\n typeof value === \"string\" && TASK_STATES.has(value);\n\nconst ROLES: ReadonlySet<string> = new Set(\n Object.keys({\n unspecified: true,\n user: true,\n agent: true,\n } satisfies Record<A2ARole, true>),\n);\n\nconst isRole = (value: unknown): value is A2ARole =>\n typeof value === \"string\" && ROLES.has(value);\n\n// Ids reach task state and the next request body unchecked by anything\n// downstream, so an id that is present and not null must be a string.\n// An omitted or null id keeps the acceptance each path already had.\nconst hasOptionalStringIds = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean =>\n keys.every((key) => value[key] == null || typeof value[key] === \"string\");\n\nconst hasOptionalStringFields = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean =>\n keys.every(\n (key) => value[key] === undefined || typeof value[key] === \"string\",\n );\n\nconst isPart = (value: unknown): value is A2APart =>\n isRecord(value) &&\n hasOptionalStringFields(value, PART_STRING_FIELDS) &&\n (value.metadata === undefined || isRecord(value.metadata));\n\nconst hasValidNestedParts = (value: unknown): boolean =>\n !isRecord(value) || !Array.isArray(value.parts) || value.parts.every(isPart);\n\nconst hasValidNestedPartsInCollection = (value: unknown): boolean =>\n !Array.isArray(value) || value.every(hasValidNestedParts);\n\nconst isTask = (value: unknown): value is A2ATask =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n hasOptionalStringIds(value, [\"contextId\"]) &&\n isRecord(value.status) &&\n isTaskState(value.status.state) &&\n hasValidNestedParts(value.status.message) &&\n hasValidNestedPartsInCollection(value.artifacts) &&\n hasValidNestedPartsInCollection(value.history);\n\nconst isMessage = (value: unknown): value is A2AMessage =>\n isRecord(value) &&\n typeof value.messageId === \"string\" &&\n value.messageId.length > 0 &&\n hasOptionalStringIds(value, [\"contextId\", \"taskId\"]) &&\n isRole(value.role) &&\n Array.isArray(value.parts) &&\n value.parts.every(isPart);\n\n// Legacy wrappers use ProtoJSON, where omitted and null fields decode to proto\n// defaults. Normalize those defaults before enforcing semantic requirements.\n// Filling a null id with the ProtoJSON default does not make it a string, and\n// the shape guards below check the fields they name rather than the ids. The\n// runtime reads these straight into task state and the next request body.\nconst hasStringIds = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean => keys.every((key) => typeof value[key] === \"string\");\n\nconst toWrappedTaskStatus = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n return {\n ...value,\n state: value.state == null ? \"unspecified\" : value.state,\n };\n};\n\nconst toWrappedTask = (value: unknown): A2ATask | null => {\n if (!isRecord(value)) return null;\n const status = toWrappedTaskStatus(value.status);\n if (!status) return null;\n\n const task = {\n ...value,\n contextId: value.contextId == null ? \"\" : value.contextId,\n status,\n };\n return isTask(task) && hasStringIds(task, [\"contextId\"]) ? task : null;\n};\n\nconst toWrappedMessage = (value: unknown): A2AMessage | null => {\n if (!isRecord(value)) return null;\n\n const message = {\n ...value,\n contextId: value.contextId == null ? \"\" : value.contextId,\n taskId: value.taskId == null ? \"\" : value.taskId,\n role: value.role == null ? \"unspecified\" : value.role,\n parts: value.parts == null ? [] : value.parts,\n };\n return isMessage(message) && hasStringIds(message, [\"contextId\", \"taskId\"])\n ? message\n : null;\n};\n\nconst isStatusUpdate = (\n value: unknown,\n allowEmptyTaskId = false,\n): value is Record<string, unknown> =>\n isRecord(value) &&\n typeof value.taskId === \"string\" &&\n (allowEmptyTaskId || value.taskId.length > 0) &&\n hasOptionalStringIds(value, [\"contextId\"]) &&\n isRecord(value.status) &&\n isTaskState(value.status.state) &&\n hasValidNestedParts(value.status.message);\n\nconst toWrappedStatusUpdate = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value) || !isRecord(value.status)) return null;\n\n const statusUpdate = {\n ...value,\n taskId: value.taskId == null ? \"\" : value.taskId,\n contextId: value.contextId == null ? \"\" : value.contextId,\n status: toWrappedTaskStatus(value.status),\n };\n return isStatusUpdate(statusUpdate, true) &&\n hasStringIds(statusUpdate, [\"taskId\", \"contextId\"])\n ? statusUpdate\n : null;\n};\n\nconst isArtifact = (value: unknown): value is Record<string, unknown> =>\n isRecord(value) &&\n typeof value.artifactId === \"string\" &&\n Array.isArray(value.parts) &&\n value.parts.every(isPart);\n\nconst isArtifactUpdate = (value: unknown): value is Record<string, unknown> =>\n isRecord(value) &&\n hasOptionalStringIds(value, [\"contextId\", \"taskId\"]) &&\n isArtifact(value.artifact);\n\nconst toWrappedArtifact = (value: unknown): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n\n const artifact = {\n ...value,\n artifactId: value.artifactId == null ? \"\" : value.artifactId,\n parts: value.parts == null ? [] : value.parts,\n };\n return isArtifact(artifact) ? artifact : null;\n};\n\nconst toWrappedArtifactUpdate = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n const artifact = toWrappedArtifact(value.artifact);\n if (!artifact) return null;\n\n const artifactUpdate = {\n ...value,\n taskId: value.taskId == null ? \"\" : value.taskId,\n contextId: value.contextId == null ? \"\" : value.contextId,\n artifact,\n };\n return isArtifactUpdate(artifactUpdate) &&\n hasStringIds(artifactUpdate, [\"taskId\", \"contextId\"])\n ? artifactUpdate\n : null;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === \"string\");\n\nconst toJsonRpcError = (error: unknown): A2AError => {\n const rpcError = error as { code?: number; message?: string; data?: unknown };\n return new A2AError({\n code: rpcError.code ?? -1,\n status: \"JSONRPC_ERROR\",\n message: rpcError.message ?? \"A2A JSON-RPC error\",\n details:\n rpcError.data === undefined\n ? undefined\n : Array.isArray(rpcError.data)\n ? rpcError.data\n : [rpcError.data],\n });\n};\n\nconst invalidAgentCard = (): never => {\n throw new Error(\n \"Invalid A2A agent card response: expected a valid agent card payload.\",\n );\n};\n\nconst parseCardString = (value: unknown): string =>\n value == null ? \"\" : typeof value === \"string\" ? value : invalidAgentCard();\n\nconst parseCardStringArray = (value: unknown): string[] =>\n value == null ? [] : isStringArray(value) ? value : invalidAgentCard();\n\nconst parseCardRecordArray = (value: unknown): Record<string, unknown>[] =>\n value == null\n ? []\n : Array.isArray(value) && value.every(isRecord)\n ? (value as Record<string, unknown>[])\n : invalidAgentCard();\n\nconst parseCardRecord = (value: unknown): Record<string, unknown> =>\n value == null ? {} : isRecord(value) ? value : invalidAgentCard();\n\n// Proto3 JSON parsing treats omitted and null fields as defaults, so a valid\n// card may arrive without its empty lists, strings, or capabilities. Fill\n// those per the proto3 JSON mapping rules; a payload without a name or with a\n// present field of the wrong type rejects.\nconst parseAgentCardResponse = (value: unknown): A2AAgentCard => {\n if (\n !isRecord(value) ||\n typeof value.name !== \"string\" ||\n value.name.length === 0\n ) {\n return invalidAgentCard();\n }\n\n return {\n ...value,\n name: value.name,\n description: parseCardString(value.description),\n version: parseCardString(value.version),\n supportedInterfaces: parseCardRecordArray(value.supportedInterfaces).map(\n (entry) => ({\n ...entry,\n url: parseCardString(entry.url),\n protocolBinding: parseCardString(entry.protocolBinding),\n protocolVersion: parseCardString(entry.protocolVersion),\n }),\n ),\n capabilities: parseCardRecord(value.capabilities),\n defaultInputModes: parseCardStringArray(value.defaultInputModes),\n defaultOutputModes: parseCardStringArray(value.defaultOutputModes),\n skills: parseCardRecordArray(value.skills).map((entry) => ({\n ...entry,\n id: parseCardString(entry.id),\n name: parseCardString(entry.name),\n description: parseCardString(entry.description),\n tags: parseCardStringArray(entry.tags),\n })),\n } as A2AAgentCard;\n};\n\nconst parseSendMessageResponse = (value: unknown): A2ATask | A2AMessage => {\n if (isRecord(value)) {\n const candidate = value.task ?? value.message ?? value;\n if (isTask(candidate) || isMessage(candidate)) return candidate;\n }\n\n throw new Error(\n \"Invalid A2A message:send response: expected a valid task or message payload.\",\n );\n};\n\nconst parseTaskResponse = (\n value: unknown,\n operation: \"tasks:get\" | \"tasks:cancel\",\n): A2ATask => {\n if (isTask(value)) return value;\n\n throw new Error(\n `Invalid A2A ${operation} response: expected a valid task payload.`,\n );\n};\n\nconst isNonNegativeInteger = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n\nconst invalidListTasksResponse = (): never => {\n throw new Error(\n \"Invalid A2A tasks:list response: expected a valid task list payload.\",\n );\n};\n\nconst parseListTasksResponse = (value: unknown): A2AListTasksResponse => {\n if (!isRecord(value)) return invalidListTasksResponse();\n\n const tasks = value.tasks ?? [];\n if (!Array.isArray(tasks) || !tasks.every(isTask)) {\n return invalidListTasksResponse();\n }\n\n const { nextPageToken, pageSize, totalSize } = value;\n if (\n (nextPageToken != null && typeof nextPageToken !== \"string\") ||\n (pageSize != null && !isNonNegativeInteger(pageSize)) ||\n (totalSize != null && !isNonNegativeInteger(totalSize))\n ) {\n return invalidListTasksResponse();\n }\n\n return {\n ...value,\n tasks,\n nextPageToken: nextPageToken ?? \"\",\n pageSize: pageSize ?? 0,\n totalSize: totalSize ?? 0,\n };\n};\n\nconst invalidPushNotificationConfigResponse =\n (\n operation: \"pushNotificationConfigs:create\" | \"pushNotificationConfigs:get\",\n ) =>\n (): never => {\n throw new Error(\n `Invalid A2A ${operation} response: expected a valid push notification config payload.`,\n );\n };\n\nconst invalidListPushNotificationConfigsResponse = (): never => {\n throw new Error(\n \"Invalid A2A pushNotificationConfigs:list response: expected a valid push notification config list payload.\",\n );\n};\n\nconst parseOptionalString = (\n value: unknown,\n invalid: () => never,\n): string | undefined =>\n value == null ? undefined : typeof value === \"string\" ? value : invalid();\n\nconst parseTaskPushNotificationConfigResponse = (\n value: unknown,\n invalid: () => never,\n): A2ATaskPushNotificationConfig => {\n if (\n !isRecord(value) ||\n typeof value.url !== \"string\" ||\n value.url.length === 0\n ) {\n return invalid();\n }\n\n const { tenant, id, taskId, url, token, authentication, ...extra } = value;\n let normalizedAuthentication: A2ATaskPushNotificationConfig[\"authentication\"];\n if (authentication != null) {\n if (!isRecord(authentication)) return invalid();\n const { scheme, credentials, ...authenticationExtra } = authentication;\n normalizedAuthentication = {\n ...authenticationExtra,\n scheme: parseOptionalString(scheme, invalid) ?? \"\",\n ...(credentials == null\n ? {}\n : { credentials: parseOptionalString(credentials, invalid) }),\n };\n }\n\n return {\n ...extra,\n ...(tenant == null ? {} : { tenant: parseOptionalString(tenant, invalid) }),\n ...(id == null ? {} : { id: parseOptionalString(id, invalid) }),\n ...(taskId == null ? {} : { taskId: parseOptionalString(taskId, invalid) }),\n url,\n ...(token == null ? {} : { token: parseOptionalString(token, invalid) }),\n ...(normalizedAuthentication === undefined\n ? {}\n : { authentication: normalizedAuthentication }),\n };\n};\n\nconst parseListTaskPushNotificationConfigsResponse = (\n value: unknown,\n): A2AListTaskPushNotificationConfigsResponse => {\n if (!isRecord(value)) return invalidListPushNotificationConfigsResponse();\n\n const { configs: rawConfigs, nextPageToken, ...extra } = value;\n if (rawConfigs != null && !Array.isArray(rawConfigs)) {\n return invalidListPushNotificationConfigsResponse();\n }\n\n return {\n ...extra,\n configs: (rawConfigs ?? []).map((config) =>\n parseTaskPushNotificationConfigResponse(\n config,\n invalidListPushNotificationConfigsResponse,\n ),\n ),\n ...(nextPageToken == null\n ? {}\n : {\n nextPageToken: parseOptionalString(\n nextPageToken,\n invalidListPushNotificationConfigsResponse,\n ),\n }),\n };\n};\n\nfunction signalInit(signal?: AbortSignal): RequestInit {\n return signal ? { signal } : {};\n}\n\nconst SKIPPED_FRAME_SNIPPET_LENGTH = 120;\n\nfunction describeSkippedFrame(data: string, reason: string): string {\n const collapsed = data.replace(/\\s+/g, \" \");\n const snippet =\n collapsed.length > SKIPPED_FRAME_SNIPPET_LENGTH\n ? `${collapsed.slice(0, SKIPPED_FRAME_SNIPPET_LENGTH)}…`\n : collapsed;\n return `${reason} (frame: ${snippet})`;\n}\n\nexport class A2AClient {\n private baseUrl: string;\n private basePath: string;\n private tenant: string | undefined;\n private extensionUris: string[] | undefined;\n private fetchOptions: Omit<\n RequestInit,\n \"headers\" | \"body\" | \"method\" | \"signal\"\n >;\n private headersFn:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\n constructor(options: A2AClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.basePath = options.basePath\n ? `/${options.basePath.replace(/^\\/|\\/$/g, \"\")}`\n : \"\";\n this.tenant = options.tenant;\n this.extensionUris = options.extensions;\n const {\n headers: _h,\n body: _b,\n method: _m,\n signal: _s,\n ...safeFetchOptions\n } = (options.fetchOptions ?? {}) as RequestInit;\n this.fetchOptions = safeFetchOptions;\n this.headersFn = options.headers ?? {};\n }\n\n private getBasePath(): string {\n return `${this.basePath}${this.tenant ? `/${encodeURIComponent(this.tenant)}` : \"\"}`;\n }\n\n private async getHeaders(\n includeContentType = true,\n ): Promise<Record<string, string>> {\n const custom =\n typeof this.headersFn === \"function\"\n ? await this.headersFn()\n : this.headersFn;\n const headers: Record<string, string> = {\n Accept: \"application/a2a+json, application/json\",\n \"A2A-Version\": A2A_PROTOCOL_VERSION,\n ...custom,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/a2a+json\";\n }\n if (this.extensionUris?.length) {\n headers[\"A2A-Extensions\"] = this.extensionUris.join(\", \");\n }\n return headers;\n }\n\n private async throwResponseError(response: Response): Promise<never> {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n // no parseable body\n }\n\n if (errorBody && typeof errorBody === \"object\" && \"error\" in errorBody) {\n const err = (errorBody as Record<string, any>).error;\n throw new A2AError({\n code: err.code ?? response.status,\n status: err.status ?? response.statusText,\n message: err.message ?? `A2A request failed: ${response.status}`,\n details: err.details,\n });\n }\n\n throw new A2AError({\n code: response.status,\n status: response.statusText,\n message: `A2A request failed: ${response.status} ${response.statusText}`,\n });\n }\n\n private async fetchJSON<T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> {\n const isGet = !options.method || options.method.toUpperCase() === \"GET\";\n const headers = await this.getHeaders(!isGet);\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...this.fetchOptions,\n ...options,\n headers: {\n ...headers,\n ...(options.headers as Record<string, string>),\n },\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n if (json && typeof json === \"object\" && \"jsonrpc\" in json) {\n if (\"error\" in json && json.error) {\n throw toJsonRpcError(json.error);\n }\n if (\"result\" in json) {\n const result = normalizeKeys(json.result);\n if (isRecord(result) && typeof result.kind === \"string\") {\n const { kind: _kind, ...rest } = result;\n return rest as T;\n }\n return result as T;\n }\n }\n return normalizeKeys(json) as T;\n }\n\n // --- Agent Card ---\n\n async getAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const headers = await this.getHeaders(false); // GET: no Content-Type\n const url = `${this.baseUrl}/.well-known/agent-card.json`;\n const response = await fetch(url, {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n return parseAgentCardResponse(normalizeKeys(json));\n }\n\n async getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/extendedAgentCard`,\n signalInit(signal),\n );\n return parseAgentCardResponse(result);\n }\n\n // --- Message ---\n\n async sendMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask | A2AMessage> {\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/message:send`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n\n return parseSendMessageResponse(result);\n }\n\n async *streamMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(true);\n headers.Accept = \"text/event-stream\";\n\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/message:stream`,\n {\n ...this.fetchOptions,\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n return yield* this.parseSSE(response);\n }\n\n // --- Tasks ---\n\n async getTask(\n taskId: string,\n historyLength?: number,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const params = new URLSearchParams();\n if (historyLength !== undefined) {\n // Proto field name for HTTP transcoding query params\n params.set(\"history_length\", String(historyLength));\n }\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseTaskResponse(result, \"tasks:get\");\n }\n\n async listTasks(\n request?: A2AListTasksRequest,\n signal?: AbortSignal,\n ): Promise<A2AListTasksResponse> {\n const params = new URLSearchParams();\n if (request?.contextId) params.set(\"context_id\", request.contextId);\n if (request?.status) params.set(\"status\", toWireTaskState(request.status));\n if (request?.pageSize !== undefined)\n params.set(\"page_size\", String(request.pageSize));\n if (request?.pageToken) params.set(\"page_token\", request.pageToken);\n if (request?.historyLength !== undefined)\n params.set(\"history_length\", String(request.historyLength));\n if (request?.statusTimestampAfter)\n params.set(\"status_timestamp_after\", request.statusTimestampAfter);\n if (request?.includeArtifacts !== undefined)\n params.set(\"include_artifacts\", String(request.includeArtifacts));\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTasksResponse(result);\n }\n\n async cancelTask(\n taskId: string,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const body = metadata ? { metadata } : {};\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:cancel`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n return parseTaskResponse(result, \"tasks:cancel\");\n }\n\n async *subscribeToTask(\n taskId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(false); // GET: no Content-Type\n headers.Accept = \"text/event-stream\";\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:subscribe`,\n {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n yield* this.parseSSE(response);\n }\n\n // --- Push Notification Configs ---\n\n async createTaskPushNotificationConfig(\n config: A2ATaskPushNotificationConfig,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const taskId = config.taskId;\n if (!taskId) throw new Error(\"taskId is required\");\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs`,\n {\n method: \"POST\",\n body: JSON.stringify(config),\n ...signalInit(signal),\n },\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:create\"),\n );\n }\n\n async getTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n signalInit(signal),\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:get\"),\n );\n }\n\n async listTaskPushNotificationConfigs(\n taskId: string,\n options?: { pageSize?: number; pageToken?: string },\n signal?: AbortSignal,\n ): Promise<A2AListTaskPushNotificationConfigsResponse> {\n const params = new URLSearchParams();\n if (options?.pageSize !== undefined)\n params.set(\"page_size\", String(options.pageSize));\n if (options?.pageToken) params.set(\"page_token\", options.pageToken);\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTaskPushNotificationConfigsResponse(result);\n }\n\n async deleteTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const isGet = false;\n const headers = await this.getHeaders(!isGet);\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n {\n ...this.fetchOptions,\n method: \"DELETE\",\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n }\n\n // --- SSE Parsing ---\n\n private async *parseSSE(\n response: Response,\n ): AsyncGenerator<A2AStreamEvent, string | undefined> {\n const contentType = response.headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\", 1)[0]?.trim().toLowerCase();\n if (mediaType !== \"text/event-stream\") {\n const received = contentType\n ? `\"${contentType}\"`\n : \"no Content-Type header\";\n void response.body?.cancel().catch(() => undefined);\n throw new Error(\n `Expected A2A stream response Content-Type \"text/event-stream\", received ${received}`,\n );\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n const sseDecoder = new SSEEventDecoder();\n\n let firstSkipReason: string | undefined;\n const noteSkip = (data: string, reason: string) => {\n firstSkipReason ??= describeSkippedFrame(data, reason);\n };\n\n const readEvent = (event: SSEEvent): A2AStreamEvent | null => {\n try {\n let parsed = JSON.parse(event.data);\n\n if (parsed && typeof parsed === \"object\" && \"jsonrpc\" in parsed) {\n if (\"error\" in parsed && parsed.error) {\n throw toJsonRpcError(parsed.error);\n }\n if (\"result\" in parsed) {\n parsed = parsed.result;\n }\n }\n\n const normalized = normalizeKeys(parsed) as Record<string, unknown>;\n const streamEvent = discriminateStreamResponse(normalized);\n if (!streamEvent) noteSkip(event.data, \"unrecognized event shape\");\n return streamEvent;\n } catch (error) {\n if (error instanceof A2AError) throw error;\n noteSkip(\n event.data,\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n };\n\n let shouldCancel = true;\n try {\n while (true) {\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await reader.read();\n } catch (error) {\n shouldCancel = false;\n throw error;\n }\n\n const { done, value } = result;\n if (done) {\n shouldCancel = false;\n for (const event of sseDecoder.push(decoder.decode())) {\n const parsed = readEvent(event);\n if (parsed) yield parsed;\n }\n break;\n }\n\n for (const event of sseDecoder.push(\n decoder.decode(value, { stream: true }),\n )) {\n const parsed = readEvent(event);\n if (parsed) yield parsed;\n }\n }\n } finally {\n try {\n if (shouldCancel) await reader.cancel().catch(() => undefined);\n } finally {\n reader.releaseLock();\n }\n }\n\n return firstSkipReason;\n }\n}\n"],"mappings":";;;;AAqCA,IAAa,WAAb,cAA8B,MAAM;CAClC;CACA;CACA;CAEA,YAAY,MAAoB;EAC9B,MAAM,KAAK,OAAO;EAClB,KAAK,OAAO;EACZ,KAAK,OAAO,KAAK;EACjB,KAAK,SAAS,KAAK;EACnB,KAAK,UAAU,KAAK;CACtB;AACF;AAGA,SAAS,YAAY,KAAqB;CACxC,OAAO,IAAI,QAAQ,cAAc,GAAG,MAAc,EAAE,YAAY,CAAC;AACnE;AAIA,MAAM,gCAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,oBAA4C;CAChD,kBAAkB;CAClB,iBAAiB;CACjB,SAAS;AACX;AAEA,MAAM,qBAAqB;CACzB;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,uBAAuB,CAAC,GAAG,oBAAoB,UAAU;AAE/D,SAAS,mBACP,MACyB;CACzB,MAAM,aAAa,EAAE,GAAG,KAAK;CAC7B,KAAK,MAAM,SAAS,sBAClB,IAAI,WAAW,WAAW,MAAM,OAAO,WAAW;CAEpD,OAAO;AACT;AAIA,SAAS,eAAe,OAA6B;CACnD,OAAO,MAAM,KAAK,QAAQ;EACxB,MAAM,OAAO,cAAc,KAAK,KAAK;EACrC,IAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GACjE,OAAO;EACT,MAAM,SAAS,mBAAmB,IAA+B;EACjE,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO;EACtC,MAAM,EAAE,MAAM,GAAG,SAAS;EAC1B,MAAM,OAAO,KAAK;EAClB,IAAI,SAAS,UAAU,SAAS,QAAQ,OAAO,SAAS,UACtD,OAAO;EACT,MAAM,EAAE,MAAM,OAAO,GAAG,WAAW;EACnC,MAAM,SAAS;EACf,OAAO;GACL,GAAG;GACH,GAAI,OAAO,OAAO,OAAO,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;GAChD,GAAI,OAAO,SAAS,OAAO,EAAE,KAAK,OAAO,MAAM,IAAI,CAAC;GACpD,GAAI,OAAO,YAAY,OAAO,EAAE,WAAW,OAAO,SAAS,IAAI,CAAC;GAChE,GAAI,OAAO,QAAQ,OAAO,EAAE,UAAU,OAAO,KAAK,IAAI,CAAC;EACzD;CACF,CAAC;AACH;AAEA,SAAS,cAAc,KAAc,SAAS,OAAgB;CAC5D,IAAI,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,KAAK,MAAM,cAAc,GAAG,MAAM,CAAC;CACtE,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;EAC3C,MAAM,SAAkC,CAAC;EACzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAA8B,GAAG;GAEzE,IAAI,QAAQ;IACV,OAAO,OACL,OAAO,UAAU,YAAY,UAAU,OACnC,cAAc,OAAO,IAAI,IACzB;IACN;GACF;GAEA,MAAM,WAAW,YAAY,GAAG;GAChC,MAAM,gBAAgB,cAAc,IAAI,QAAQ;GAEhD,IAAI,aAAa,WAAW,OAAO,UAAU,UAAU;IAIrD,IAAI,MAAM,WAAW,aAAa,GAChC,OAAO,YAAY,MAAM,MAAM,EAAE,CAAC,CAAC,YAAY;SAE/C,OAAO,YAAY,kBAAkB,UAAU;GAEnD,OAAO,IACL,aAAa,UACb,OAAO,UAAU,YACjB,MAAM,WAAW,OAAO,GAExB,OAAO,YAAY,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY;QACzC,IAAI,aAAa,aAAa,MAAM,QAAQ,KAAK,GAEtD,OAAO,QAAQ,eAAe,KAAK;QAC9B,IAAI,aAAa,WAAW,MAAM,QAAQ,KAAK,GAEhD;QAAA,EAAE,WAAW,SAAS,OAAO,QAAQ,eAAe,KAAK;GAAA,OACxD,IAAI,aAAa,WAAW,EAAE,WAAW,SAC9C,OAAO,YAAY,gBAAgB,QAAQ,cAAc,OAAO,KAAK;EAEzE;EACA,OAAO;CACT;CACA,OAAO;AACT;AAGA,SAAS,WAAW,MAAuB;CACzC,IAAI,SAAS,QAAQ,OAAO;CAC5B,IAAI,SAAS,SAAS,OAAO;CAC7B,OAAO;AACT;AAEA,SAAS,gBAAgB,OAA6B;CACpD,OAAO,cAAc,MAAM,YAAY;AACzC;AAEA,SAAS,cAAc,KAA0B;CAC/C,OAAO;EAAE,GAAG;EAAK,MAAM,WAAW,IAAI,IAAI;CAAE;AAC9C;AAEA,SAAS,2BACP,MACuB;CACvB,IAAI,UAAU,MAAM;EAClB,MAAM,OAAO,cAAc,KAAK,IAAI;EACpC,IAAI,MAAM,OAAO;GAAE,MAAM;GAAQ;EAAK;CACxC;CACA,IAAI,aAAa,MAAM;EACrB,MAAM,UAAU,iBAAiB,KAAK,OAAO;EAC7C,IAAI,SAAS,OAAO;GAAE,MAAM;GAAW;EAAQ;CACjD;CACA,IAAI,kBAAkB,MAAM;EAC1B,MAAM,eAAe,sBAAsB,KAAK,YAAY;EAC5D,IAAI,cACF,OAAO;GACL,MAAM;GACN,OAAO;EAMT;CAEJ;CACA,IAAI,oBAAoB,MAAM;EAC5B,MAAM,iBAAiB,wBAAwB,KAAK,cAAc;EAClE,IAAI,gBACF,OAAO;GACL,MAAM;GACN,OAAO;EAMT;CAEJ;CAKA,MAAM,EAAE,MAAM,GAAG,SAAS;CAC1B,QAAQ,MAAR;EACE,KAAK;GACH,IAAI,CAAC,OAAO,IAAI,GAAG;GACnB,OAAO;IAAE,MAAM;IAAQ,MAAM;GAAK;EACpC,KAAK;GACH,IAAI,CAAC,UAAU,IAAI,GAAG;GACtB,OAAO;IAAE,MAAM;IAAW,SAAS;GAAK;EAC1C,KAAK,iBAAiB;GACpB,IAAI,CAAC,eAAe,IAAI,GAAG;GAC3B,MAAM,EAAE,OAAO,QAAQ,GAAG,UAAU;GACpC,OAAO;IACL,MAAM;IACC;GAMT;EACF;EACA,KAAK;GACH,IAAI,CAAC,iBAAiB,IAAI,GAAG;GAC7B,OAAO;IACL,MAAM;IACN,OAAO;GAMT;CACJ;CACA,OAAO;AACT;AAEA,MAAM,cAAmC,IAAI,IAC3C,OAAO,KAAK;CACV,aAAa;CACb,WAAW;CACX,SAAS;CACT,WAAW;CACX,QAAQ;CACR,UAAU;CACV,gBAAgB;CAChB,UAAU;CACV,eAAe;AACjB,CAAsC,CACxC;AAEA,MAAM,eAAe,UACnB,OAAO,UAAU,YAAY,YAAY,IAAI,KAAK;AAEpD,MAAM,QAA6B,IAAI,IACrC,OAAO,KAAK;CACV,aAAa;CACb,MAAM;CACN,OAAO;AACT,CAAiC,CACnC;AAEA,MAAM,UAAU,UACd,OAAO,UAAU,YAAY,MAAM,IAAI,KAAK;AAK9C,MAAM,wBACJ,OACA,SAEA,KAAK,OAAO,QAAQ,MAAM,QAAQ,QAAQ,OAAO,MAAM,SAAS,QAAQ;AAE1E,MAAM,2BACJ,OACA,SAEA,KAAK,OACF,QAAQ,MAAM,SAAS,KAAA,KAAa,OAAO,MAAM,SAAS,QAC7D;AAEF,MAAM,UAAU,UACd,SAAS,KAAK,KACd,wBAAwB,OAAO,kBAAkB,MAChD,MAAM,aAAa,KAAA,KAAa,SAAS,MAAM,QAAQ;AAE1D,MAAM,uBAAuB,UAC3B,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM;AAE7E,MAAM,mCAAmC,UACvC,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,mBAAmB;AAE1D,MAAM,UAAU,UACd,SAAS,KAAK,KACd,OAAO,MAAM,OAAO,YACpB,MAAM,GAAG,SAAS,KAClB,qBAAqB,OAAO,CAAC,WAAW,CAAC,KACzC,SAAS,MAAM,MAAM,KACrB,YAAY,MAAM,OAAO,KAAK,KAC9B,oBAAoB,MAAM,OAAO,OAAO,KACxC,gCAAgC,MAAM,SAAS,KAC/C,gCAAgC,MAAM,OAAO;AAE/C,MAAM,aAAa,UACjB,SAAS,KAAK,KACd,OAAO,MAAM,cAAc,YAC3B,MAAM,UAAU,SAAS,KACzB,qBAAqB,OAAO,CAAC,aAAa,QAAQ,CAAC,KACnD,OAAO,MAAM,IAAI,KACjB,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM,MAAM,MAAM;AAO1B,MAAM,gBACJ,OACA,SACY,KAAK,OAAO,QAAQ,OAAO,MAAM,SAAS,QAAQ;AAEhE,MAAM,uBACJ,UACmC;CACnC,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAC7B,OAAO;EACL,GAAG;EACH,OAAO,MAAM,SAAS,OAAO,gBAAgB,MAAM;CACrD;AACF;AAEA,MAAM,iBAAiB,UAAmC;CACxD,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAC7B,MAAM,SAAS,oBAAoB,MAAM,MAAM;CAC/C,IAAI,CAAC,QAAQ,OAAO;CAEpB,MAAM,OAAO;EACX,GAAG;EACH,WAAW,MAAM,aAAa,OAAO,KAAK,MAAM;EAChD;CACF;CACA,OAAO,OAAO,IAAI,KAAK,aAAa,MAAM,CAAC,WAAW,CAAC,IAAI,OAAO;AACpE;AAEA,MAAM,oBAAoB,UAAsC;CAC9D,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAE7B,MAAM,UAAU;EACd,GAAG;EACH,WAAW,MAAM,aAAa,OAAO,KAAK,MAAM;EAChD,QAAQ,MAAM,UAAU,OAAO,KAAK,MAAM;EAC1C,MAAM,MAAM,QAAQ,OAAO,gBAAgB,MAAM;EACjD,OAAO,MAAM,SAAS,OAAO,CAAC,IAAI,MAAM;CAC1C;CACA,OAAO,UAAU,OAAO,KAAK,aAAa,SAAS,CAAC,aAAa,QAAQ,CAAC,IACtE,UACA;AACN;AAEA,MAAM,kBACJ,OACA,mBAAmB,UAEnB,SAAS,KAAK,KACd,OAAO,MAAM,WAAW,aACvB,oBAAoB,MAAM,OAAO,SAAS,MAC3C,qBAAqB,OAAO,CAAC,WAAW,CAAC,KACzC,SAAS,MAAM,MAAM,KACrB,YAAY,MAAM,OAAO,KAAK,KAC9B,oBAAoB,MAAM,OAAO,OAAO;AAE1C,MAAM,yBACJ,UACmC;CACnC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,MAAM,MAAM,GAAG,OAAO;CAExD,MAAM,eAAe;EACnB,GAAG;EACH,QAAQ,MAAM,UAAU,OAAO,KAAK,MAAM;EAC1C,WAAW,MAAM,aAAa,OAAO,KAAK,MAAM;EAChD,QAAQ,oBAAoB,MAAM,MAAM;CAC1C;CACA,OAAO,eAAe,cAAc,IAAI,KACtC,aAAa,cAAc,CAAC,UAAU,WAAW,CAAC,IAChD,eACA;AACN;AAEA,MAAM,cAAc,UAClB,SAAS,KAAK,KACd,OAAO,MAAM,eAAe,YAC5B,MAAM,QAAQ,MAAM,KAAK,KACzB,MAAM,MAAM,MAAM,MAAM;AAE1B,MAAM,oBAAoB,UACxB,SAAS,KAAK,KACd,qBAAqB,OAAO,CAAC,aAAa,QAAQ,CAAC,KACnD,WAAW,MAAM,QAAQ;AAE3B,MAAM,qBAAqB,UAAmD;CAC5E,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAE7B,MAAM,WAAW;EACf,GAAG;EACH,YAAY,MAAM,cAAc,OAAO,KAAK,MAAM;EAClD,OAAO,MAAM,SAAS,OAAO,CAAC,IAAI,MAAM;CAC1C;CACA,OAAO,WAAW,QAAQ,IAAI,WAAW;AAC3C;AAEA,MAAM,2BACJ,UACmC;CACnC,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAC7B,MAAM,WAAW,kBAAkB,MAAM,QAAQ;CACjD,IAAI,CAAC,UAAU,OAAO;CAEtB,MAAM,iBAAiB;EACrB,GAAG;EACH,QAAQ,MAAM,UAAU,OAAO,KAAK,MAAM;EAC1C,WAAW,MAAM,aAAa,OAAO,KAAK,MAAM;EAChD;CACF;CACA,OAAO,iBAAiB,cAAc,KACpC,aAAa,gBAAgB,CAAC,UAAU,WAAW,CAAC,IAClD,iBACA;AACN;AAEA,MAAM,iBAAiB,UACrB,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ;AAExE,MAAM,kBAAkB,UAA6B;CACnD,MAAM,WAAW;CACjB,OAAO,IAAI,SAAS;EAClB,MAAM,SAAS,QAAQ;EACvB,QAAQ;EACR,SAAS,SAAS,WAAW;EAC7B,SACE,SAAS,SAAS,KAAA,IACd,KAAA,IACA,MAAM,QAAQ,SAAS,IAAI,IACzB,SAAS,OACT,CAAC,SAAS,IAAI;CACxB,CAAC;AACH;AAEA,MAAM,yBAAgC;CACpC,MAAM,IAAI,MACR,uEACF;AACF;AAEA,MAAM,mBAAmB,UACvB,SAAS,OAAO,KAAK,OAAO,UAAU,WAAW,QAAQ,iBAAiB;AAE5E,MAAM,wBAAwB,UAC5B,SAAS,OAAO,CAAC,IAAI,cAAc,KAAK,IAAI,QAAQ,iBAAiB;AAEvE,MAAM,wBAAwB,UAC5B,SAAS,OACL,CAAC,IACD,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,QAAQ,IACzC,QACD,iBAAiB;AAEzB,MAAM,mBAAmB,UACvB,SAAS,OAAO,CAAC,IAAI,SAAS,KAAK,IAAI,QAAQ,iBAAiB;AAMlE,MAAM,0BAA0B,UAAiC;CAC/D,IACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,SAAS,YACtB,MAAM,KAAK,WAAW,GAEtB,OAAO,iBAAiB;CAG1B,OAAO;EACL,GAAG;EACH,MAAM,MAAM;EACZ,aAAa,gBAAgB,MAAM,WAAW;EAC9C,SAAS,gBAAgB,MAAM,OAAO;EACtC,qBAAqB,qBAAqB,MAAM,mBAAmB,CAAC,CAAC,KAClE,WAAW;GACV,GAAG;GACH,KAAK,gBAAgB,MAAM,GAAG;GAC9B,iBAAiB,gBAAgB,MAAM,eAAe;GACtD,iBAAiB,gBAAgB,MAAM,eAAe;EACxD,EACF;EACA,cAAc,gBAAgB,MAAM,YAAY;EAChD,mBAAmB,qBAAqB,MAAM,iBAAiB;EAC/D,oBAAoB,qBAAqB,MAAM,kBAAkB;EACjE,QAAQ,qBAAqB,MAAM,MAAM,CAAC,CAAC,KAAK,WAAW;GACzD,GAAG;GACH,IAAI,gBAAgB,MAAM,EAAE;GAC5B,MAAM,gBAAgB,MAAM,IAAI;GAChC,aAAa,gBAAgB,MAAM,WAAW;GAC9C,MAAM,qBAAqB,MAAM,IAAI;EACvC,EAAE;CACJ;AACF;AAEA,MAAM,4BAA4B,UAAyC;CACzE,IAAI,SAAS,KAAK,GAAG;EACnB,MAAM,YAAY,MAAM,QAAQ,MAAM,WAAW;EACjD,IAAI,OAAO,SAAS,KAAK,UAAU,SAAS,GAAG,OAAO;CACxD;CAEA,MAAM,IAAI,MACR,8EACF;AACF;AAEA,MAAM,qBACJ,OACA,cACY;CACZ,IAAI,OAAO,KAAK,GAAG,OAAO;CAE1B,MAAM,IAAI,MACR,eAAe,UAAU,0CAC3B;AACF;AAEA,MAAM,wBAAwB,UAC5B,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS;AAEnE,MAAM,iCAAwC;CAC5C,MAAM,IAAI,MACR,sEACF;AACF;AAEA,MAAM,0BAA0B,UAAyC;CACvE,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,yBAAyB;CAEtD,MAAM,QAAQ,MAAM,SAAS,CAAC;CAC9B,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,MAAM,GAC9C,OAAO,yBAAyB;CAGlC,MAAM,EAAE,eAAe,UAAU,cAAc;CAC/C,IACG,iBAAiB,QAAQ,OAAO,kBAAkB,YAClD,YAAY,QAAQ,CAAC,qBAAqB,QAAQ,KAClD,aAAa,QAAQ,CAAC,qBAAqB,SAAS,GAErD,OAAO,yBAAyB;CAGlC,OAAO;EACL,GAAG;EACH;EACA,eAAe,iBAAiB;EAChC,UAAU,YAAY;EACtB,WAAW,aAAa;CAC1B;AACF;AAEA,MAAM,yCAEF,oBAEW;CACX,MAAM,IAAI,MACR,eAAe,UAAU,8DAC3B;AACF;AAEF,MAAM,mDAA0D;CAC9D,MAAM,IAAI,MACR,4GACF;AACF;AAEA,MAAM,uBACJ,OACA,YAEA,SAAS,OAAO,KAAA,IAAY,OAAO,UAAU,WAAW,QAAQ,QAAQ;AAE1E,MAAM,2CACJ,OACA,YACkC;CAClC,IACE,CAAC,SAAS,KAAK,KACf,OAAO,MAAM,QAAQ,YACrB,MAAM,IAAI,WAAW,GAErB,OAAO,QAAQ;CAGjB,MAAM,EAAE,QAAQ,IAAI,QAAQ,KAAK,OAAO,gBAAgB,GAAG,UAAU;CACrE,IAAI;CACJ,IAAI,kBAAkB,MAAM;EAC1B,IAAI,CAAC,SAAS,cAAc,GAAG,OAAO,QAAQ;EAC9C,MAAM,EAAE,QAAQ,aAAa,GAAG,wBAAwB;EACxD,2BAA2B;GACzB,GAAG;GACH,QAAQ,oBAAoB,QAAQ,OAAO,KAAK;GAChD,GAAI,eAAe,OACf,CAAC,IACD,EAAE,aAAa,oBAAoB,aAAa,OAAO,EAAE;EAC/D;CACF;CAEA,OAAO;EACL,GAAG;EACH,GAAI,UAAU,OAAO,CAAC,IAAI,EAAE,QAAQ,oBAAoB,QAAQ,OAAO,EAAE;EACzE,GAAI,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,oBAAoB,IAAI,OAAO,EAAE;EAC7D,GAAI,UAAU,OAAO,CAAC,IAAI,EAAE,QAAQ,oBAAoB,QAAQ,OAAO,EAAE;EACzE;EACA,GAAI,SAAS,OAAO,CAAC,IAAI,EAAE,OAAO,oBAAoB,OAAO,OAAO,EAAE;EACtE,GAAI,6BAA6B,KAAA,IAC7B,CAAC,IACD,EAAE,gBAAgB,yBAAyB;CACjD;AACF;AAEA,MAAM,gDACJ,UAC+C;CAC/C,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO,2CAA2C;CAExE,MAAM,EAAE,SAAS,YAAY,eAAe,GAAG,UAAU;CACzD,IAAI,cAAc,QAAQ,CAAC,MAAM,QAAQ,UAAU,GACjD,OAAO,2CAA2C;CAGpD,OAAO;EACL,GAAG;EACH,UAAU,cAAc,CAAC,EAAA,CAAG,KAAK,WAC/B,wCACE,QACA,0CACF,CACF;EACA,GAAI,iBAAiB,OACjB,CAAC,IACD,EACE,eAAe,oBACb,eACA,0CACF,EACF;CACN;AACF;AAEA,SAAS,WAAW,QAAmC;CACrD,OAAO,SAAS,EAAE,OAAO,IAAI,CAAC;AAChC;AAEA,MAAM,+BAA+B;AAErC,SAAS,qBAAqB,MAAc,QAAwB;CAClE,MAAM,YAAY,KAAK,QAAQ,QAAQ,GAAG;CAK1C,OAAO,GAAG,OAAO,WAHf,UAAU,SAAS,+BACf,GAAG,UAAU,MAAM,GAAG,4BAA4B,EAAE,KACpD,UAC8B;AACtC;AAEA,IAAa,YAAb,MAAuB;CACrB;CACA;CACA;CACA;CACA;CAIA;CAIA,YAAY,SAA2B;EACrC,KAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;EAChD,KAAK,WAAW,QAAQ,WACpB,IAAI,QAAQ,SAAS,QAAQ,YAAY,EAAE,MAC3C;EACJ,KAAK,SAAS,QAAQ;EACtB,KAAK,gBAAgB,QAAQ;EAC7B,MAAM,EACJ,SAAS,IACT,MAAM,IACN,QAAQ,IACR,QAAQ,IACR,GAAG,qBACA,QAAQ,gBAAgB,CAAC;EAC9B,KAAK,eAAe;EACpB,KAAK,YAAY,QAAQ,WAAW,CAAC;CACvC;CAEA,cAA8B;EAC5B,OAAO,GAAG,KAAK,WAAW,KAAK,SAAS,IAAI,mBAAmB,KAAK,MAAM,MAAM;CAClF;CAEA,MAAc,WACZ,qBAAqB,MACY;EAKjC,MAAM,UAAkC;GACtC,QAAQ;GACR,eAAA;GACA,GANA,OAAO,KAAK,cAAc,aACtB,MAAM,KAAK,UAAU,IACrB,KAAK;EAKX;EACA,IAAI,oBACF,QAAQ,kBAAkB;EAE5B,IAAI,KAAK,eAAe,QACtB,QAAQ,oBAAoB,KAAK,cAAc,KAAK,IAAI;EAE1D,OAAO;CACT;CAEA,MAAc,mBAAmB,UAAoC;EACnE,IAAI;EACJ,IAAI;GACF,YAAY,MAAM,SAAS,KAAK;EAClC,QAAQ,CAER;EAEA,IAAI,aAAa,OAAO,cAAc,YAAY,WAAW,WAAW;GACtE,MAAM,MAAO,UAAkC;GAC/C,MAAM,IAAI,SAAS;IACjB,MAAM,IAAI,QAAQ,SAAS;IAC3B,QAAQ,IAAI,UAAU,SAAS;IAC/B,SAAS,IAAI,WAAW,uBAAuB,SAAS;IACxD,SAAS,IAAI;GACf,CAAC;EACH;EAEA,MAAM,IAAI,SAAS;GACjB,MAAM,SAAS;GACf,QAAQ,SAAS;GACjB,SAAS,uBAAuB,SAAS,OAAO,GAAG,SAAS;EAC9D,CAAC;CACH;CAEA,MAAc,UACZ,MACA,UAAuB,CAAC,GACZ;EACZ,MAAM,QAAQ,CAAC,QAAQ,UAAU,QAAQ,OAAO,YAAY,MAAM;EAClE,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC,KAAK;EAC5C,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,UAAU,QAAQ;GACrD,GAAG,KAAK;GACR,GAAG;GACH,SAAS;IACP,GAAG;IACH,GAAI,QAAQ;GACd;EACF,CAAC;EACD,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAExC,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,IAAI,QAAQ,OAAO,SAAS,YAAY,aAAa,MAAM;GACzD,IAAI,WAAW,QAAQ,KAAK,OAC1B,MAAM,eAAe,KAAK,KAAK;GAEjC,IAAI,YAAY,MAAM;IACpB,MAAM,SAAS,cAAc,KAAK,MAAM;IACxC,IAAI,SAAS,MAAM,KAAK,OAAO,OAAO,SAAS,UAAU;KACvD,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;KACjC,OAAO;IACT;IACA,OAAO;GACT;EACF;EACA,OAAO,cAAc,IAAI;CAC3B;CAIA,MAAM,aAAa,QAA6C;EAC9D,MAAM,UAAU,MAAM,KAAK,WAAW,KAAK;EAC3C,MAAM,MAAM,GAAG,KAAK,QAAQ;EAC5B,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,GAAG,KAAK;GACR;GACA,GAAG,WAAW,MAAM;EACtB,CAAC;EACD,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAExC,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,OAAO,uBAAuB,cAAc,IAAI,CAAC;CACnD;CAEA,MAAM,qBAAqB,QAA6C;EACtE,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,qBACtB,WAAW,MAAM,CACnB;EACA,OAAO,uBAAuB,MAAM;CACtC;CAIA,MAAM,YACJ,SACA,eACA,UACA,QAC+B;EAC/B,MAAM,OAAgC,EACpC,SAAS,cAAc,OAAO,EAChC;EACA,IAAI,eAAe,KAAK,gBAAgB;EACxC,IAAI,UAAU,KAAK,WAAW;EAE9B,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,gBACtB;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,IAAI;GACzB,GAAG,WAAW,MAAM;EACtB,CACF;EAEA,OAAO,yBAAyB,MAAM;CACxC;CAEA,OAAO,cACL,SACA,eACA,UACA,QACgC;EAChC,MAAM,UAAU,MAAM,KAAK,WAAW,IAAI;EAC1C,QAAQ,SAAS;EAEjB,MAAM,OAAgC,EACpC,SAAS,cAAc,OAAO,EAChC;EACA,IAAI,eAAe,KAAK,gBAAgB;EACxC,IAAI,UAAU,KAAK,WAAW;EAE9B,MAAM,WAAW,MAAM,MACrB,GAAG,KAAK,UAAU,KAAK,YAAY,EAAE,kBACrC;GACE,GAAG,KAAK;GACR,QAAQ;GACR;GACA,MAAM,KAAK,UAAU,IAAI;GACzB,GAAG,WAAW,MAAM;EACtB,CACF;EACA,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAGxC,OAAO,OAAO,KAAK,SAAS,QAAQ;CACtC;CAIA,MAAM,QACJ,QACA,eACA,QACkB;EAClB,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,kBAAkB,KAAA,GAEpB,OAAO,IAAI,kBAAkB,OAAO,aAAa,CAAC;EAEpD,MAAM,KAAK,OAAO,SAAS;EAC3B,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,IAAI,KAAK,IAAI,OAAO,MAC5E,WAAW,MAAM,CACnB;EACA,OAAO,kBAAkB,QAAQ,WAAW;CAC9C;CAEA,MAAM,UACJ,SACA,QAC+B;EAC/B,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,SAAS,WAAW,OAAO,IAAI,cAAc,QAAQ,SAAS;EAClE,IAAI,SAAS,QAAQ,OAAO,IAAI,UAAU,gBAAgB,QAAQ,MAAM,CAAC;EACzE,IAAI,SAAS,aAAa,KAAA,GACxB,OAAO,IAAI,aAAa,OAAO,QAAQ,QAAQ,CAAC;EAClD,IAAI,SAAS,WAAW,OAAO,IAAI,cAAc,QAAQ,SAAS;EAClE,IAAI,SAAS,kBAAkB,KAAA,GAC7B,OAAO,IAAI,kBAAkB,OAAO,QAAQ,aAAa,CAAC;EAC5D,IAAI,SAAS,sBACX,OAAO,IAAI,0BAA0B,QAAQ,oBAAoB;EACnE,IAAI,SAAS,qBAAqB,KAAA,GAChC,OAAO,IAAI,qBAAqB,OAAO,QAAQ,gBAAgB,CAAC;EAClE,MAAM,KAAK,OAAO,SAAS;EAC3B,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,QAAQ,KAAK,IAAI,OAAO,MAC9C,WAAW,MAAM,CACnB;EACA,OAAO,uBAAuB,MAAM;CACtC;CAEA,MAAM,WACJ,QACA,UACA,QACkB;EAClB,MAAM,OAAO,WAAW,EAAE,SAAS,IAAI,CAAC;EACxC,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,UAC1D;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,IAAI;GACzB,GAAG,WAAW,MAAM;EACtB,CACF;EACA,OAAO,kBAAkB,QAAQ,cAAc;CACjD;CAEA,OAAO,gBACL,QACA,QACgC;EAChC,MAAM,UAAU,MAAM,KAAK,WAAW,KAAK;EAC3C,QAAQ,SAAS;EAEjB,MAAM,WAAW,MAAM,MACrB,GAAG,KAAK,UAAU,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,aACzE;GACE,GAAG,KAAK;GACR;GACA,GAAG,WAAW,MAAM;EACtB,CACF;EACA,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAGxC,OAAO,KAAK,SAAS,QAAQ;CAC/B;CAIA,MAAM,iCACJ,QACA,QACwC;EACxC,MAAM,SAAS,OAAO;EACtB,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,oBAAoB;EACjD,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,2BAC1D;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,MAAM;GAC3B,GAAG,WAAW,MAAM;EACtB,CACF;EACA,OAAO,wCACL,QACA,sCAAsC,gCAAgC,CACxE;CACF;CAEA,MAAM,8BACJ,QACA,UACA,QACwC;EACxC,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,2BAA2B,mBAAmB,QAAQ,KAChH,WAAW,MAAM,CACnB;EACA,OAAO,wCACL,QACA,sCAAsC,6BAA6B,CACrE;CACF;CAEA,MAAM,gCACJ,QACA,SACA,QACqD;EACrD,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,SAAS,aAAa,KAAA,GACxB,OAAO,IAAI,aAAa,OAAO,QAAQ,QAAQ,CAAC;EAClD,IAAI,SAAS,WAAW,OAAO,IAAI,cAAc,QAAQ,SAAS;EAClE,MAAM,KAAK,OAAO,SAAS;EAC3B,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,0BAA0B,KAAK,IAAI,OAAO,MACpG,WAAW,MAAM,CACnB;EACA,OAAO,6CAA6C,MAAM;CAC5D;CAEA,MAAM,iCACJ,QACA,UACA,QACe;EAEf,MAAM,UAAU,MAAM,KAAK,WAAW,IAAM;EAC5C,MAAM,WAAW,MAAM,MACrB,GAAG,KAAK,UAAU,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,2BAA2B,mBAAmB,QAAQ,KAC/H;GACE,GAAG,KAAK;GACR,QAAQ;GACR;GACA,GAAG,WAAW,MAAM;EACtB,CACF;EACA,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;CAE1C;CAIA,OAAe,SACb,UACoD;EACpD,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;EAEvD,IADkB,aAAa,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,YAAY,MAClD,qBAAqB;GACrC,MAAM,WAAW,cACb,IAAI,YAAY,KAChB;GACJ,SAAc,MAAM,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;GAClD,MAAM,IAAI,MACR,2EAA2E,UAC7E;EACF;EAEA,MAAM,SAAS,SAAS,MAAM,UAAU;EACxC,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,kBAAkB;EAE/C,MAAM,UAAU,IAAI,YAAY;EAChC,MAAM,aAAa,IAAI,gBAAgB;EAEvC,IAAI;EACJ,MAAM,YAAY,MAAc,WAAmB;GACjD,oBAAoB,qBAAqB,MAAM,MAAM;EACvD;EAEA,MAAM,aAAa,UAA2C;GAC5D,IAAI;IACF,IAAI,SAAS,KAAK,MAAM,MAAM,IAAI;IAElC,IAAI,UAAU,OAAO,WAAW,YAAY,aAAa,QAAQ;KAC/D,IAAI,WAAW,UAAU,OAAO,OAC9B,MAAM,eAAe,OAAO,KAAK;KAEnC,IAAI,YAAY,QACd,SAAS,OAAO;IAEpB;IAGA,MAAM,cAAc,2BADD,cAAc,MACuB,CAAC;IACzD,IAAI,CAAC,aAAa,SAAS,MAAM,MAAM,0BAA0B;IACjE,OAAO;GACT,SAAS,OAAO;IACd,IAAI,iBAAiB,UAAU,MAAM;IACrC,SACE,MAAM,MACN,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;IACA,OAAO;GACT;EACF;EAEA,IAAI,eAAe;EACnB,IAAI;GACF,OAAO,MAAM;IACX,IAAI;IACJ,IAAI;KACF,SAAS,MAAM,OAAO,KAAK;IAC7B,SAAS,OAAO;KACd,eAAe;KACf,MAAM;IACR;IAEA,MAAM,EAAE,MAAM,UAAU;IACxB,IAAI,MAAM;KACR,eAAe;KACf,KAAK,MAAM,SAAS,WAAW,KAAK,QAAQ,OAAO,CAAC,GAAG;MACrD,MAAM,SAAS,UAAU,KAAK;MAC9B,IAAI,QAAQ,MAAM;KACpB;KACA;IACF;IAEA,KAAK,MAAM,SAAS,WAAW,KAC7B,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CACxC,GAAG;KACD,MAAM,SAAS,UAAU,KAAK;KAC9B,IAAI,QAAQ,MAAM;IACpB;GACF;EACF,UAAU;GACR,IAAI;IACF,IAAI,cAAc,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;GAC/D,UAAU;IACR,OAAO,YAAY;GACrB;EACF;EAEA,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"A2AClient.js","names":[],"sources":["../src/A2AClient.ts"],"sourcesContent":["import { SSEEventDecoder, type SSEEvent } from \"assistant-stream/utils\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\nimport type {\n A2AAgentCard,\n A2AErrorInfo,\n A2AListTaskPushNotificationConfigsResponse,\n A2AListTasksRequest,\n A2AListTasksResponse,\n A2AMessage,\n A2APart,\n A2ARole,\n A2ASendMessageConfiguration,\n A2AStreamEvent,\n A2ATask,\n A2ATaskPushNotificationConfig,\n A2ATaskState,\n} from \"./types\";\nimport { A2A_PROTOCOL_VERSION } from \"./types\";\n\nexport type A2AClientOptions = {\n baseUrl: string;\n /** Optional path prefix for all API endpoints (e.g. \"/v1\"). Does not affect agent card discovery. */\n basePath?: string | undefined;\n /** Optional tenant ID for multi-tenant servers. */\n tenant?: string | undefined;\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\n /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */\n extensions?: string[] | undefined;\n /** Extra fetch options applied to every request. */\n fetchOptions?:\n | Omit<RequestInit, \"headers\" | \"body\" | \"method\" | \"signal\">\n | undefined;\n};\n\nexport class A2AError extends Error {\n code: number;\n status: string;\n details: unknown[] | undefined;\n\n constructor(info: A2AErrorInfo) {\n super(info.message);\n this.name = \"A2AError\";\n this.code = info.code;\n this.status = info.status;\n this.details = info.details;\n }\n}\n\n// Incoming key normalization: snake_case → camelCase, plus ProtoJSON enum normalization.\nfunction toCamelCase(key: string): string {\n return key.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n// Fields whose values are opaque user data (google.protobuf.Struct / Value).\n// Keys inside these objects must NOT be camelCased or have enum normalization applied.\nconst OPAQUE_FIELDS = new Set([\n \"metadata\",\n \"data\",\n \"params\",\n \"forwardedProps\",\n \"scopes\",\n]);\n\nconst JSONRPC_STATE_MAP: Record<string, string> = {\n \"input-required\": \"input_required\",\n \"auth-required\": \"auth_required\",\n unknown: \"unspecified\",\n};\n\nconst PART_STRING_FIELDS = [\n \"text\",\n \"raw\",\n \"url\",\n \"filename\",\n \"mediaType\",\n] as const;\n\nconst NULLABLE_PART_FIELDS = [...PART_STRING_FIELDS, \"metadata\"] as const;\n\nfunction normalizePartNulls(\n part: Record<string, unknown>,\n): Record<string, unknown> {\n const normalized = { ...part };\n for (const field of NULLABLE_PART_FIELDS) {\n if (normalized[field] === null) delete normalized[field];\n }\n return normalized;\n}\n\n// JSON-RPC file parts nest the payload under `file`; the internal A2APart is\n// flat, so the nested fields map onto url/raw/mediaType/filename.\nfunction normalizeParts(value: unknown[]): unknown[] {\n return value.map((raw) => {\n const part = normalizeKeys(raw, false);\n if (part === null || typeof part !== \"object\" || Array.isArray(part))\n return part;\n const record = normalizePartNulls(part as Record<string, unknown>);\n if (record.kind === undefined) return record;\n const { kind, ...rest } = record;\n const file = rest.file;\n if (kind !== \"file\" || file === null || typeof file !== \"object\")\n return rest;\n const { file: _file, ...others } = rest;\n const nested = file as Record<string, unknown>;\n return {\n ...others,\n ...(nested.uri != null ? { url: nested.uri } : {}),\n ...(nested.bytes != null ? { raw: nested.bytes } : {}),\n ...(nested.mimeType != null ? { mediaType: nested.mimeType } : {}),\n ...(nested.name != null ? { filename: nested.name } : {}),\n };\n });\n}\n\nfunction normalizeKeys(obj: unknown, opaque = false): unknown {\n if (Array.isArray(obj)) return obj.map((v) => normalizeKeys(v, opaque));\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n // Inside opaque fields: preserve keys and values as-is (only recurse arrays/objects structurally)\n if (opaque) {\n result[key] =\n typeof value === \"object\" && value !== null\n ? normalizeKeys(value, true)\n : value;\n continue;\n }\n\n const camelKey = toCamelCase(key);\n const isOpaqueChild = OPAQUE_FIELDS.has(camelKey);\n\n if (camelKey === \"state\" && typeof value === \"string\") {\n // Proto-style (TASK_STATE_WORKING) and the JSON-RPC state names map\n // onto the internal snake_case states; anything unrecognized is\n // preserved verbatim.\n if (value.startsWith(\"TASK_STATE_\")) {\n result[camelKey] = value.slice(11).toLowerCase();\n } else {\n result[camelKey] = JSONRPC_STATE_MAP[value] ?? value;\n }\n } else if (\n camelKey === \"role\" &&\n typeof value === \"string\" &&\n value.startsWith(\"ROLE_\")\n ) {\n result[camelKey] = value.slice(5).toLowerCase();\n } else if (camelKey === \"content\" && Array.isArray(value)) {\n // v0.3 servers used \"content\" for message/artifact parts; normalize to \"parts\" for backward compat\n result.parts = normalizeParts(value);\n } else if (camelKey === \"parts\" && Array.isArray(value)) {\n // dedup: \"content\" was already mapped to parts above; don't overwrite\n if (!(\"parts\" in result)) result.parts = normalizeParts(value);\n } else if (camelKey !== \"parts\" || !(\"parts\" in result)) {\n result[camelKey] = isOpaqueChild ? value : normalizeKeys(value, false);\n }\n }\n return result;\n }\n return obj;\n}\n\n// Outgoing enum conversion (v1.0 ProtoJSON format)\nfunction toWireRole(role: A2ARole): string {\n if (role === \"user\") return \"ROLE_USER\";\n if (role === \"agent\") return \"ROLE_AGENT\";\n return \"ROLE_UNSPECIFIED\";\n}\n\nfunction toWireTaskState(state: A2ATaskState): string {\n return `TASK_STATE_${state.toUpperCase()}`;\n}\n\nfunction toWireMessage(msg: A2AMessage): unknown {\n return { ...msg, role: toWireRole(msg.role) };\n}\n\nfunction discriminateStreamResponse(\n data: Record<string, unknown>,\n): A2AStreamEvent | null {\n if (\"task\" in data) {\n const task = toWrappedTask(data.task);\n if (task) return { type: \"task\", task };\n }\n if (\"message\" in data) {\n const message = toWrappedMessage(data.message);\n if (message) return { type: \"message\", message };\n }\n if (\"statusUpdate\" in data) {\n const statusUpdate = toWrappedStatusUpdate(data.statusUpdate);\n if (statusUpdate) {\n return {\n type: \"statusUpdate\",\n event: statusUpdate as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n }\n if (\"artifactUpdate\" in data) {\n const artifactUpdate = toWrappedArtifactUpdate(data.artifactUpdate);\n if (artifactUpdate) {\n return {\n type: \"artifactUpdate\",\n event: artifactUpdate as A2AStreamEvent extends {\n type: \"artifactUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n }\n // JSON-RPC streaming results are the event itself, flat, discriminated by\n // `kind` (per the A2A JSON-RPC schema), rather than wrapped in a\n // REST-style single-key envelope. The field sets cannot collide with the\n // wrapper keys above, so this is a pure fallthrough.\n const { kind, ...flat } = data;\n switch (kind) {\n case \"task\":\n if (!isTask(flat)) break;\n return { type: \"task\", task: flat };\n case \"message\":\n if (!isMessage(flat)) break;\n return { type: \"message\", message: flat };\n case \"status-update\": {\n if (!isStatusUpdate(flat)) break;\n const { final: _final, ...event } = flat;\n return {\n type: \"statusUpdate\",\n event: event as unknown as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n case \"artifact-update\":\n if (!isArtifactUpdate(flat)) break;\n return {\n type: \"artifactUpdate\",\n event: flat as unknown as A2AStreamEvent extends {\n type: \"artifactUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n return null;\n}\n\nconst TASK_STATES: ReadonlySet<string> = new Set(\n Object.keys({\n unspecified: true,\n submitted: true,\n working: true,\n completed: true,\n failed: true,\n canceled: true,\n input_required: true,\n rejected: true,\n auth_required: true,\n } satisfies Record<A2ATaskState, true>),\n);\n\nconst isTaskState = (value: unknown): value is A2ATaskState =>\n typeof value === \"string\" && TASK_STATES.has(value);\n\nconst ROLES: ReadonlySet<string> = new Set(\n Object.keys({\n unspecified: true,\n user: true,\n agent: true,\n } satisfies Record<A2ARole, true>),\n);\n\nconst isRole = (value: unknown): value is A2ARole =>\n typeof value === \"string\" && ROLES.has(value);\n\n// Ids reach task state and the next request body unchecked by anything\n// downstream, so an id that is present and not null must be a string.\n// An omitted or null id keeps the acceptance each path already had.\nconst hasOptionalStringIds = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean =>\n keys.every((key) => value[key] == null || typeof value[key] === \"string\");\n\nconst hasOptionalStringFields = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean =>\n keys.every(\n (key) => value[key] === undefined || typeof value[key] === \"string\",\n );\n\nconst isPart = (value: unknown): value is A2APart =>\n isRecord(value) &&\n hasOptionalStringFields(value, PART_STRING_FIELDS) &&\n (value.metadata === undefined || isRecord(value.metadata));\n\nconst hasValidNestedParts = (value: unknown): boolean =>\n !isRecord(value) || !Array.isArray(value.parts) || value.parts.every(isPart);\n\nconst hasValidNestedPartsInCollection = (value: unknown): boolean =>\n !Array.isArray(value) || value.every(hasValidNestedParts);\n\nconst isTask = (value: unknown): value is A2ATask =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n hasOptionalStringIds(value, [\"contextId\"]) &&\n isRecord(value.status) &&\n isTaskState(value.status.state) &&\n hasValidNestedParts(value.status.message) &&\n hasValidNestedPartsInCollection(value.artifacts) &&\n hasValidNestedPartsInCollection(value.history);\n\nconst isMessage = (value: unknown): value is A2AMessage =>\n isRecord(value) &&\n typeof value.messageId === \"string\" &&\n value.messageId.length > 0 &&\n hasOptionalStringIds(value, [\"contextId\", \"taskId\"]) &&\n isRole(value.role) &&\n Array.isArray(value.parts) &&\n value.parts.every(isPart);\n\n// Legacy wrappers use ProtoJSON, where omitted and null fields decode to proto\n// defaults. Normalize those defaults before enforcing semantic requirements.\n// Filling a null id with the ProtoJSON default does not make it a string, and\n// the shape guards below check the fields they name rather than the ids. The\n// runtime reads these straight into task state and the next request body.\nconst hasStringIds = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean => keys.every((key) => typeof value[key] === \"string\");\n\nconst toWrappedTaskStatus = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n return {\n ...value,\n state: value.state == null ? \"unspecified\" : value.state,\n };\n};\n\nconst toWrappedTask = (value: unknown): A2ATask | null => {\n if (!isRecord(value)) return null;\n const status = toWrappedTaskStatus(value.status);\n if (!status) return null;\n\n const task = {\n ...value,\n contextId: value.contextId == null ? \"\" : value.contextId,\n status,\n };\n return isTask(task) && hasStringIds(task, [\"contextId\"]) ? task : null;\n};\n\nconst toWrappedMessage = (value: unknown): A2AMessage | null => {\n if (!isRecord(value)) return null;\n\n const message = {\n ...value,\n contextId: value.contextId == null ? \"\" : value.contextId,\n taskId: value.taskId == null ? \"\" : value.taskId,\n role: value.role == null ? \"unspecified\" : value.role,\n parts: value.parts == null ? [] : value.parts,\n };\n return isMessage(message) && hasStringIds(message, [\"contextId\", \"taskId\"])\n ? message\n : null;\n};\n\nconst isStatusUpdate = (\n value: unknown,\n allowEmptyTaskId = false,\n): value is Record<string, unknown> =>\n isRecord(value) &&\n typeof value.taskId === \"string\" &&\n (allowEmptyTaskId || value.taskId.length > 0) &&\n hasOptionalStringIds(value, [\"contextId\"]) &&\n isRecord(value.status) &&\n isTaskState(value.status.state) &&\n hasValidNestedParts(value.status.message);\n\nconst toWrappedStatusUpdate = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value) || !isRecord(value.status)) return null;\n\n const statusUpdate = {\n ...value,\n taskId: value.taskId == null ? \"\" : value.taskId,\n contextId: value.contextId == null ? \"\" : value.contextId,\n status: toWrappedTaskStatus(value.status),\n };\n return isStatusUpdate(statusUpdate, true) &&\n hasStringIds(statusUpdate, [\"taskId\", \"contextId\"])\n ? statusUpdate\n : null;\n};\n\nconst isArtifact = (value: unknown): value is Record<string, unknown> =>\n isRecord(value) &&\n typeof value.artifactId === \"string\" &&\n Array.isArray(value.parts) &&\n value.parts.every(isPart);\n\nconst isArtifactUpdate = (value: unknown): value is Record<string, unknown> =>\n isRecord(value) &&\n hasOptionalStringIds(value, [\"contextId\", \"taskId\"]) &&\n isArtifact(value.artifact);\n\nconst toWrappedArtifact = (value: unknown): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n\n const artifact = {\n ...value,\n artifactId: value.artifactId == null ? \"\" : value.artifactId,\n parts: value.parts == null ? [] : value.parts,\n };\n return isArtifact(artifact) ? artifact : null;\n};\n\nconst toWrappedArtifactUpdate = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n const artifact = toWrappedArtifact(value.artifact);\n if (!artifact) return null;\n\n const artifactUpdate = {\n ...value,\n taskId: value.taskId == null ? \"\" : value.taskId,\n contextId: value.contextId == null ? \"\" : value.contextId,\n artifact,\n };\n return isArtifactUpdate(artifactUpdate) &&\n hasStringIds(artifactUpdate, [\"taskId\", \"contextId\"])\n ? artifactUpdate\n : null;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === \"string\");\n\nconst toJsonRpcError = (error: unknown): A2AError => {\n const rpcError = error as { code?: number; message?: string; data?: unknown };\n return new A2AError({\n code: rpcError.code ?? -1,\n status: \"JSONRPC_ERROR\",\n message: rpcError.message ?? \"A2A JSON-RPC error\",\n details:\n rpcError.data === undefined\n ? undefined\n : Array.isArray(rpcError.data)\n ? rpcError.data\n : [rpcError.data],\n });\n};\n\nconst invalidAgentCard = (): never => {\n throw new Error(\n \"Invalid A2A agent card response: expected a valid agent card payload.\",\n );\n};\n\nconst parseCardString = (value: unknown): string =>\n value == null ? \"\" : typeof value === \"string\" ? value : invalidAgentCard();\n\nconst parseCardStringArray = (value: unknown): string[] =>\n value == null ? [] : isStringArray(value) ? value : invalidAgentCard();\n\nconst parseCardRecordArray = (value: unknown): Record<string, unknown>[] =>\n value == null\n ? []\n : Array.isArray(value) && value.every(isRecord)\n ? (value as Record<string, unknown>[])\n : invalidAgentCard();\n\nconst parseCardRecord = (value: unknown): Record<string, unknown> =>\n value == null ? {} : isRecord(value) ? value : invalidAgentCard();\n\n// Proto3 JSON parsing treats omitted and null fields as defaults, so a valid\n// card may arrive without its empty lists, strings, or capabilities. Fill\n// those per the proto3 JSON mapping rules; a payload without a name or with a\n// present field of the wrong type rejects.\nconst parseAgentCardResponse = (value: unknown): A2AAgentCard => {\n if (\n !isRecord(value) ||\n typeof value.name !== \"string\" ||\n value.name.length === 0\n ) {\n return invalidAgentCard();\n }\n\n return {\n ...value,\n name: value.name,\n description: parseCardString(value.description),\n version: parseCardString(value.version),\n supportedInterfaces: parseCardRecordArray(value.supportedInterfaces).map(\n (entry) => ({\n ...entry,\n url: parseCardString(entry.url),\n protocolBinding: parseCardString(entry.protocolBinding),\n protocolVersion: parseCardString(entry.protocolVersion),\n }),\n ),\n capabilities: parseCardRecord(value.capabilities),\n defaultInputModes: parseCardStringArray(value.defaultInputModes),\n defaultOutputModes: parseCardStringArray(value.defaultOutputModes),\n skills: parseCardRecordArray(value.skills).map((entry) => ({\n ...entry,\n id: parseCardString(entry.id),\n name: parseCardString(entry.name),\n description: parseCardString(entry.description),\n tags: parseCardStringArray(entry.tags),\n })),\n } as A2AAgentCard;\n};\n\nconst parseSendMessageResponse = (value: unknown): A2ATask | A2AMessage => {\n if (isRecord(value)) {\n const candidate = value.task ?? value.message ?? value;\n if (isTask(candidate) || isMessage(candidate)) return candidate;\n }\n\n throw new Error(\n \"Invalid A2A message:send response: expected a valid task or message payload.\",\n );\n};\n\nconst parseTaskResponse = (\n value: unknown,\n operation: \"tasks:get\" | \"tasks:cancel\",\n): A2ATask => {\n if (isTask(value)) return value;\n\n throw new Error(\n `Invalid A2A ${operation} response: expected a valid task payload.`,\n );\n};\n\nconst isNonNegativeInteger = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n\nconst invalidListTasksResponse = (): never => {\n throw new Error(\n \"Invalid A2A tasks:list response: expected a valid task list payload.\",\n );\n};\n\nconst parseListTasksResponse = (value: unknown): A2AListTasksResponse => {\n if (!isRecord(value)) return invalidListTasksResponse();\n\n const tasks = value.tasks ?? [];\n if (!Array.isArray(tasks) || !tasks.every(isTask)) {\n return invalidListTasksResponse();\n }\n\n const { nextPageToken, pageSize, totalSize } = value;\n if (\n (nextPageToken != null && typeof nextPageToken !== \"string\") ||\n (pageSize != null && !isNonNegativeInteger(pageSize)) ||\n (totalSize != null && !isNonNegativeInteger(totalSize))\n ) {\n return invalidListTasksResponse();\n }\n\n return {\n ...value,\n tasks,\n nextPageToken: nextPageToken ?? \"\",\n pageSize: pageSize ?? 0,\n totalSize: totalSize ?? 0,\n };\n};\n\nconst invalidPushNotificationConfigResponse =\n (\n operation: \"pushNotificationConfigs:create\" | \"pushNotificationConfigs:get\",\n ) =>\n (): never => {\n throw new Error(\n `Invalid A2A ${operation} response: expected a valid push notification config payload.`,\n );\n };\n\nconst invalidListPushNotificationConfigsResponse = (): never => {\n throw new Error(\n \"Invalid A2A pushNotificationConfigs:list response: expected a valid push notification config list payload.\",\n );\n};\n\nconst parseOptionalString = (\n value: unknown,\n invalid: () => never,\n): string | undefined =>\n value == null ? undefined : typeof value === \"string\" ? value : invalid();\n\nconst parseTaskPushNotificationConfigResponse = (\n value: unknown,\n invalid: () => never,\n): A2ATaskPushNotificationConfig => {\n if (\n !isRecord(value) ||\n typeof value.url !== \"string\" ||\n value.url.length === 0\n ) {\n return invalid();\n }\n\n const { tenant, id, taskId, url, token, authentication, ...extra } = value;\n let normalizedAuthentication: A2ATaskPushNotificationConfig[\"authentication\"];\n if (authentication != null) {\n if (!isRecord(authentication)) return invalid();\n const { scheme, credentials, ...authenticationExtra } = authentication;\n normalizedAuthentication = {\n ...authenticationExtra,\n scheme: parseOptionalString(scheme, invalid) ?? \"\",\n ...(credentials == null\n ? {}\n : { credentials: parseOptionalString(credentials, invalid) }),\n };\n }\n\n return {\n ...extra,\n ...(tenant == null ? {} : { tenant: parseOptionalString(tenant, invalid) }),\n ...(id == null ? {} : { id: parseOptionalString(id, invalid) }),\n ...(taskId == null ? {} : { taskId: parseOptionalString(taskId, invalid) }),\n url,\n ...(token == null ? {} : { token: parseOptionalString(token, invalid) }),\n ...(normalizedAuthentication === undefined\n ? {}\n : { authentication: normalizedAuthentication }),\n };\n};\n\nconst parseListTaskPushNotificationConfigsResponse = (\n value: unknown,\n): A2AListTaskPushNotificationConfigsResponse => {\n if (!isRecord(value)) return invalidListPushNotificationConfigsResponse();\n\n const { configs: rawConfigs, nextPageToken, ...extra } = value;\n if (rawConfigs != null && !Array.isArray(rawConfigs)) {\n return invalidListPushNotificationConfigsResponse();\n }\n\n return {\n ...extra,\n configs: (rawConfigs ?? []).map((config) =>\n parseTaskPushNotificationConfigResponse(\n config,\n invalidListPushNotificationConfigsResponse,\n ),\n ),\n ...(nextPageToken == null\n ? {}\n : {\n nextPageToken: parseOptionalString(\n nextPageToken,\n invalidListPushNotificationConfigsResponse,\n ),\n }),\n };\n};\n\nfunction signalInit(signal?: AbortSignal): RequestInit {\n return signal ? { signal } : {};\n}\n\nconst getAbortReason = (signal: AbortSignal): unknown => {\n if (signal.reason !== undefined) return signal.reason;\n const error = new Error(\"The operation was aborted\");\n error.name = \"AbortError\";\n return error;\n};\n\nconst raceWithAbortSignal = <T>(\n signal: AbortSignal | undefined,\n operation: () => T | PromiseLike<T>,\n): Promise<T> => {\n if (!signal) return Promise.resolve().then(operation);\n if (signal.aborted) return Promise.reject(getAbortReason(signal));\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = () => signal.removeEventListener(\"abort\", handleAbort);\n const resolveOnce = (value: T) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const rejectOnce = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n };\n const handleAbort = () => rejectOnce(getAbortReason(signal));\n\n signal.addEventListener(\"abort\", handleAbort, { once: true });\n let result: T | PromiseLike<T>;\n try {\n result = operation();\n } catch (error) {\n rejectOnce(error);\n return;\n }\n Promise.resolve(result).then(resolveOnce, rejectOnce);\n });\n};\n\nconst SKIPPED_FRAME_SNIPPET_LENGTH = 120;\n\nfunction describeSkippedFrame(data: string, reason: string): string {\n const collapsed = data.replace(/\\s+/g, \" \");\n const snippet =\n collapsed.length > SKIPPED_FRAME_SNIPPET_LENGTH\n ? `${collapsed.slice(0, SKIPPED_FRAME_SNIPPET_LENGTH)}…`\n : collapsed;\n return `${reason} (frame: ${snippet})`;\n}\n\nexport class A2AClient {\n private baseUrl: string;\n private basePath: string;\n private tenant: string | undefined;\n private extensionUris: string[] | undefined;\n private fetchOptions: Omit<\n RequestInit,\n \"headers\" | \"body\" | \"method\" | \"signal\"\n >;\n private headersFn:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\n constructor(options: A2AClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.basePath = options.basePath\n ? `/${options.basePath.replace(/^\\/|\\/$/g, \"\")}`\n : \"\";\n this.tenant = options.tenant;\n this.extensionUris = options.extensions;\n const {\n headers: _h,\n body: _b,\n method: _m,\n signal: _s,\n ...safeFetchOptions\n } = (options.fetchOptions ?? {}) as RequestInit;\n this.fetchOptions = safeFetchOptions;\n this.headersFn = options.headers ?? {};\n }\n\n private getBasePath(): string {\n return `${this.basePath}${this.tenant ? `/${encodeURIComponent(this.tenant)}` : \"\"}`;\n }\n\n private async getHeaders(\n includeContentType = true,\n signal?: AbortSignal,\n ): Promise<Record<string, string>> {\n const custom =\n typeof this.headersFn === \"function\"\n ? await raceWithAbortSignal(signal, this.headersFn)\n : this.headersFn;\n const headers: Record<string, string> = {\n Accept: \"application/a2a+json, application/json\",\n \"A2A-Version\": A2A_PROTOCOL_VERSION,\n ...custom,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/a2a+json\";\n }\n if (this.extensionUris?.length) {\n headers[\"A2A-Extensions\"] = this.extensionUris.join(\", \");\n }\n return headers;\n }\n\n private async throwResponseError(response: Response): Promise<never> {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n // no parseable body\n }\n\n if (errorBody && typeof errorBody === \"object\" && \"error\" in errorBody) {\n const err = (errorBody as Record<string, any>).error;\n throw new A2AError({\n code: err.code ?? response.status,\n status: err.status ?? response.statusText,\n message: err.message ?? `A2A request failed: ${response.status}`,\n details: err.details,\n });\n }\n\n throw new A2AError({\n code: response.status,\n status: response.statusText,\n message: `A2A request failed: ${response.status} ${response.statusText}`,\n });\n }\n\n private async fetchJSON<T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> {\n const isGet = !options.method || options.method.toUpperCase() === \"GET\";\n const headers = await this.getHeaders(!isGet, options.signal ?? undefined);\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...this.fetchOptions,\n ...options,\n headers: {\n ...headers,\n ...(options.headers as Record<string, string>),\n },\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n if (json && typeof json === \"object\" && \"jsonrpc\" in json) {\n if (\"error\" in json && json.error) {\n throw toJsonRpcError(json.error);\n }\n if (\"result\" in json) {\n const result = normalizeKeys(json.result);\n if (isRecord(result) && typeof result.kind === \"string\") {\n const { kind: _kind, ...rest } = result;\n return rest as T;\n }\n return result as T;\n }\n }\n return normalizeKeys(json) as T;\n }\n\n // --- Agent Card ---\n\n async getAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const headers = await this.getHeaders(false, signal); // GET: no Content-Type\n const url = `${this.baseUrl}/.well-known/agent-card.json`;\n const response = await fetch(url, {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n return parseAgentCardResponse(normalizeKeys(json));\n }\n\n async getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/extendedAgentCard`,\n signalInit(signal),\n );\n return parseAgentCardResponse(result);\n }\n\n // --- Message ---\n\n async sendMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask | A2AMessage> {\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/message:send`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n\n return parseSendMessageResponse(result);\n }\n\n async *streamMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(true, signal);\n headers.Accept = \"text/event-stream\";\n\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/message:stream`,\n {\n ...this.fetchOptions,\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n return yield* this.parseSSE(response);\n }\n\n // --- Tasks ---\n\n async getTask(\n taskId: string,\n historyLength?: number,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const params = new URLSearchParams();\n if (historyLength !== undefined) {\n // Proto field name for HTTP transcoding query params\n params.set(\"history_length\", String(historyLength));\n }\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseTaskResponse(result, \"tasks:get\");\n }\n\n async listTasks(\n request?: A2AListTasksRequest,\n signal?: AbortSignal,\n ): Promise<A2AListTasksResponse> {\n const params = new URLSearchParams();\n if (request?.contextId) params.set(\"context_id\", request.contextId);\n if (request?.status) params.set(\"status\", toWireTaskState(request.status));\n if (request?.pageSize !== undefined)\n params.set(\"page_size\", String(request.pageSize));\n if (request?.pageToken) params.set(\"page_token\", request.pageToken);\n if (request?.historyLength !== undefined)\n params.set(\"history_length\", String(request.historyLength));\n if (request?.statusTimestampAfter)\n params.set(\"status_timestamp_after\", request.statusTimestampAfter);\n if (request?.includeArtifacts !== undefined)\n params.set(\"include_artifacts\", String(request.includeArtifacts));\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTasksResponse(result);\n }\n\n async cancelTask(\n taskId: string,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const body = metadata ? { metadata } : {};\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:cancel`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n return parseTaskResponse(result, \"tasks:cancel\");\n }\n\n async *subscribeToTask(\n taskId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(false, signal); // GET: no Content-Type\n headers.Accept = \"text/event-stream\";\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:subscribe`,\n {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n yield* this.parseSSE(response);\n }\n\n // --- Push Notification Configs ---\n\n async createTaskPushNotificationConfig(\n config: A2ATaskPushNotificationConfig,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const taskId = config.taskId;\n if (!taskId) throw new Error(\"taskId is required\");\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs`,\n {\n method: \"POST\",\n body: JSON.stringify(config),\n ...signalInit(signal),\n },\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:create\"),\n );\n }\n\n async getTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n signalInit(signal),\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:get\"),\n );\n }\n\n async listTaskPushNotificationConfigs(\n taskId: string,\n options?: { pageSize?: number; pageToken?: string },\n signal?: AbortSignal,\n ): Promise<A2AListTaskPushNotificationConfigsResponse> {\n const params = new URLSearchParams();\n if (options?.pageSize !== undefined)\n params.set(\"page_size\", String(options.pageSize));\n if (options?.pageToken) params.set(\"page_token\", options.pageToken);\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTaskPushNotificationConfigsResponse(result);\n }\n\n async deleteTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const isGet = false;\n const headers = await this.getHeaders(!isGet, signal);\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n {\n ...this.fetchOptions,\n method: \"DELETE\",\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n }\n\n // --- SSE Parsing ---\n\n private async *parseSSE(\n response: Response,\n ): AsyncGenerator<A2AStreamEvent, string | undefined> {\n const contentType = response.headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\", 1)[0]?.trim().toLowerCase();\n if (mediaType !== \"text/event-stream\") {\n const received = contentType\n ? `\"${contentType}\"`\n : \"no Content-Type header\";\n void response.body?.cancel().catch(() => undefined);\n throw new Error(\n `Expected A2A stream response Content-Type \"text/event-stream\", received ${received}`,\n );\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n const sseDecoder = new SSEEventDecoder();\n\n let firstSkipReason: string | undefined;\n const noteSkip = (data: string, reason: string) => {\n firstSkipReason ??= describeSkippedFrame(data, reason);\n };\n\n const readEvent = (event: SSEEvent): A2AStreamEvent | null => {\n try {\n let parsed = JSON.parse(event.data);\n\n if (parsed && typeof parsed === \"object\" && \"jsonrpc\" in parsed) {\n if (\"error\" in parsed && parsed.error) {\n throw toJsonRpcError(parsed.error);\n }\n if (\"result\" in parsed) {\n parsed = parsed.result;\n }\n }\n\n const normalized = normalizeKeys(parsed) as Record<string, unknown>;\n const streamEvent = discriminateStreamResponse(normalized);\n if (!streamEvent) noteSkip(event.data, \"unrecognized event shape\");\n return streamEvent;\n } catch (error) {\n if (error instanceof A2AError) throw error;\n noteSkip(\n event.data,\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n };\n\n let shouldCancel = true;\n try {\n while (true) {\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await reader.read();\n } catch (error) {\n shouldCancel = false;\n throw error;\n }\n\n const { done, value } = result;\n if (done) {\n shouldCancel = false;\n for (const event of sseDecoder.push(decoder.decode())) {\n const parsed = readEvent(event);\n if (parsed) yield parsed;\n }\n break;\n }\n\n for (const event of sseDecoder.push(\n decoder.decode(value, { stream: true }),\n )) {\n const parsed = readEvent(event);\n if (parsed) yield parsed;\n }\n }\n } finally {\n try {\n if (shouldCancel) await reader.cancel().catch(() => undefined);\n } finally {\n reader.releaseLock();\n }\n }\n\n return firstSkipReason;\n }\n}\n"],"mappings":"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"}