@assistant-ui/react-a2a 0.2.33 → 0.2.35

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 +1 @@
1
- {"version":3,"file":"A2AClient.d.ts","names":[],"sources":["../src/A2AClient.ts"],"mappings":";;KAkBY;EACV;;EAEA;;EAEA;EACA,UACI,gCACO,yBAAyB,QAAQ;;EAG5C;;EAEA,eACI,KAAK;;cAIE,iBAAiB;EAC5B;EACA;EACA;EAEY,YAAA,MAAM;;cAgmBP;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","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"}
package/dist/A2AClient.js CHANGED
@@ -29,12 +29,25 @@ const JSONRPC_STATE_MAP = {
29
29
  "auth-required": "auth_required",
30
30
  unknown: "unspecified"
31
31
  };
32
+ const PART_STRING_FIELDS = [
33
+ "text",
34
+ "raw",
35
+ "url",
36
+ "filename",
37
+ "mediaType"
38
+ ];
39
+ const NULLABLE_PART_FIELDS = [...PART_STRING_FIELDS, "metadata"];
40
+ function normalizePartNulls(part) {
41
+ const normalized = { ...part };
42
+ for (const field of NULLABLE_PART_FIELDS) if (normalized[field] === null) delete normalized[field];
43
+ return normalized;
44
+ }
32
45
  function normalizeParts(value) {
33
46
  return value.map((raw) => {
34
47
  const part = normalizeKeys(raw, false);
35
48
  if (part === null || typeof part !== "object" || Array.isArray(part)) return part;
36
- const record = part;
37
- if (record.kind === void 0) return part;
49
+ const record = normalizePartNulls(part);
50
+ if (record.kind === void 0) return record;
38
51
  const { kind, ...rest } = record;
39
52
  const file = rest.file;
40
53
  if (kind !== "file" || file === null || typeof file !== "object") return rest;
@@ -42,10 +55,10 @@ function normalizeParts(value) {
42
55
  const nested = file;
43
56
  return {
44
57
  ...others,
45
- ...nested.uri !== void 0 ? { url: nested.uri } : {},
46
- ...nested.bytes !== void 0 ? { raw: nested.bytes } : {},
47
- ...nested.mimeType !== void 0 ? { mediaType: nested.mimeType } : {},
48
- ...nested.name !== void 0 ? { filename: nested.name } : {}
58
+ ...nested.uri != null ? { url: nested.uri } : {},
59
+ ...nested.bytes != null ? { raw: nested.bytes } : {},
60
+ ...nested.mimeType != null ? { mediaType: nested.mimeType } : {},
61
+ ...nested.name != null ? { filename: nested.name } : {}
49
62
  };
50
63
  });
51
64
  }
@@ -166,8 +179,12 @@ const ROLES = new Set(Object.keys({
166
179
  }));
167
180
  const isRole = (value) => typeof value === "string" && ROLES.has(value);
168
181
  const hasOptionalStringIds = (value, keys) => keys.every((key) => value[key] == null || typeof value[key] === "string");
169
- const isTask = (value) => isRecord(value) && typeof value.id === "string" && value.id.length > 0 && hasOptionalStringIds(value, ["contextId"]) && isRecord(value.status) && isTaskState(value.status.state);
170
- const isMessage = (value) => isRecord(value) && typeof value.messageId === "string" && value.messageId.length > 0 && hasOptionalStringIds(value, ["contextId", "taskId"]) && isRole(value.role) && Array.isArray(value.parts) && value.parts.every(isRecord);
182
+ const hasOptionalStringFields = (value, keys) => keys.every((key) => value[key] === void 0 || typeof value[key] === "string");
183
+ const isPart = (value) => isRecord(value) && hasOptionalStringFields(value, PART_STRING_FIELDS) && (value.metadata === void 0 || isRecord(value.metadata));
184
+ const hasValidNestedParts = (value) => !isRecord(value) || !Array.isArray(value.parts) || value.parts.every(isPart);
185
+ const hasValidNestedPartsInCollection = (value) => !Array.isArray(value) || value.every(hasValidNestedParts);
186
+ const isTask = (value) => isRecord(value) && typeof value.id === "string" && value.id.length > 0 && hasOptionalStringIds(value, ["contextId"]) && isRecord(value.status) && isTaskState(value.status.state) && hasValidNestedParts(value.status.message) && hasValidNestedPartsInCollection(value.artifacts) && hasValidNestedPartsInCollection(value.history);
187
+ const isMessage = (value) => isRecord(value) && typeof value.messageId === "string" && value.messageId.length > 0 && hasOptionalStringIds(value, ["contextId", "taskId"]) && isRole(value.role) && Array.isArray(value.parts) && value.parts.every(isPart);
171
188
  const hasStringIds = (value, keys) => keys.every((key) => typeof value[key] === "string");
172
189
  const toWrappedTaskStatus = (value) => {
173
190
  if (!isRecord(value)) return null;
@@ -198,7 +215,7 @@ const toWrappedMessage = (value) => {
198
215
  };
199
216
  return isMessage(message) && hasStringIds(message, ["contextId", "taskId"]) ? message : null;
200
217
  };
201
- const isStatusUpdate = (value, allowEmptyTaskId = false) => isRecord(value) && typeof value.taskId === "string" && (allowEmptyTaskId || value.taskId.length > 0) && hasOptionalStringIds(value, ["contextId"]) && isRecord(value.status) && isTaskState(value.status.state);
218
+ const isStatusUpdate = (value, allowEmptyTaskId = false) => isRecord(value) && typeof value.taskId === "string" && (allowEmptyTaskId || value.taskId.length > 0) && hasOptionalStringIds(value, ["contextId"]) && isRecord(value.status) && isTaskState(value.status.state) && hasValidNestedParts(value.status.message);
202
219
  const toWrappedStatusUpdate = (value) => {
203
220
  if (!isRecord(value) || !isRecord(value.status)) return null;
204
221
  const statusUpdate = {
@@ -209,7 +226,7 @@ const toWrappedStatusUpdate = (value) => {
209
226
  };
210
227
  return isStatusUpdate(statusUpdate, true) && hasStringIds(statusUpdate, ["taskId", "contextId"]) ? statusUpdate : null;
211
228
  };
212
- const isArtifact = (value) => isRecord(value) && typeof value.artifactId === "string" && Array.isArray(value.parts) && value.parts.every(isRecord);
229
+ const isArtifact = (value) => isRecord(value) && typeof value.artifactId === "string" && Array.isArray(value.parts) && value.parts.every(isPart);
213
230
  const isArtifactUpdate = (value) => isRecord(value) && hasOptionalStringIds(value, ["contextId", "taskId"]) && isArtifact(value.artifact);
214
231
  const toWrappedArtifact = (value) => {
215
232
  if (!isRecord(value)) return null;
@@ -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 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\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 = part as Record<string, unknown>;\n if (record.kind === undefined) return part;\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 !== undefined ? { url: nested.uri } : {}),\n ...(nested.bytes !== undefined ? { raw: nested.bytes } : {}),\n ...(nested.mimeType !== undefined ? { mediaType: nested.mimeType } : {}),\n ...(nested.name !== undefined ? { 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 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\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(isRecord);\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\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(isRecord);\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":"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"}
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":"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"}
@@ -35,6 +35,9 @@ declare class A2AThreadRuntimeCore {
35
35
  private _loadPromise;
36
36
  private _loadRequested;
37
37
  private _agentCardPromise;
38
+ private _agentCardRetryAfter;
39
+ private _agentCardRetryDelay;
40
+ private _agentCardDiscoveryFailed;
38
41
  private lastOptionsContextId;
39
42
  constructor(options: A2AThreadRuntimeCoreOptions);
40
43
  updateOptions(options: Omit<A2AThreadRuntimeCoreOptions, "notifyUpdate">): void;
@@ -51,6 +54,8 @@ declare class A2AThreadRuntimeCore {
51
54
  getAgentCard(): A2AAgentCard | undefined;
52
55
  isRunning(): boolean;
53
56
  get isLoading(): boolean;
57
+ private loadAgentCard;
58
+ private waitForAgentCard;
54
59
  __internal_load(): Promise<void>;
55
60
  append(message: AppendMessage): Promise<void>;
56
61
  edit(message: AppendMessage): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"A2AThreadRuntimeCore.d.ts","names":[],"sources":["../src/A2AThreadRuntimeCore.ts"],"mappings":";;;;KAkCY;EACV,QAAQ;EACR;EACA,gBAAgB;EAChB,YAAY,OAAO;EACnB;EACA,uBAAuB,UAAU;EACjC,UAAU;EACV;;cAyBW;UACH;UACA;UACA;UACA;UACA;UACA;UACA;mBACS;UAET;mBACS;UACT;UACA;UACA;UAGA;UACA;UACA;mBAGS;mBACA;UACT;UACA;UACA;UACA;UAEA;EAEI,YAAA,SAAS;EAYrB,cAAc,SAAS,KAAK;;;EA8B5B;EAcA,cAAc,SAAS;EAIvB;EASA,cAAc;EAId,wBAAwB;EAIxB,wBAAwB;EAIxB,WAAW;EAIX,yBAAyB;EAIzB,gBAAgB;EAIhB;MAII;EAIJ,mBAAmB;EAwCb,OAAO,SAAS,gBAAgB;EAuBhC,KAAK,SAAS,gBAAgB;EAI9B,OACJ,yBACA;IAAW,YAAY;MACtB;EAaG,UAAU;UAiBR;UAgBA;EAWR,sBAAsB,mBAAmB;UAmC3B;UA+EA;UA4CA;UA4BN;UAiBA;UA6BA;UA0CA;UAQA;UAuCA;UAsBA;UAUA;UAaA;UAQA;UAKA;UAQA;UAIA;UAQA;UAeA"}
1
+ {"version":3,"file":"A2AThreadRuntimeCore.d.ts","names":[],"sources":["../src/A2AThreadRuntimeCore.ts"],"mappings":";;;;KAsCY;EACV,QAAQ;EACR;EACA,gBAAgB;EAChB,YAAY,OAAO;EACnB;EACA,uBAAuB,UAAU;EACjC,UAAU;EACV;;cAyBW;UACH;UACA;UACA;UACA;UACA;UACA;UACA;mBACS;UAET;mBACS;UACT;UACA;UACA;UAGA;UACA;UACA;mBAGS;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;UACA;UAEA;EAEI,YAAA,SAAS;EAYrB,cAAc,SAAS,KAAK;;;EA8B5B;EAcA,cAAc,SAAS;EAIvB;EASA,cAAc;EAId,wBAAwB;EAIxB,wBAAwB;EAIxB,WAAW;EAIX,yBAAyB;EAIzB,gBAAgB;EAIhB;MAII;UAII;UAwBM;EAoBd,mBAAmB;EAkCb,OAAO,SAAS,gBAAgB;EAuBhC,KAAK,SAAS,gBAAgB;EAI9B,OACJ,yBACA;IAAW,YAAY;MACtB;EAaG,UAAU;UAiBR;UAgBA;EAWR,sBAAsB,mBAAmB;UAmC3B;UA+EA;UA4CA;UA4BN;UAiBA;UA6BA;UA0CA;UAQA;UAuCA;UAsBA;UAUA;UAaA;UAQA;UAKA;UAQA;UAIA;UAQA;UAeA"}
@@ -3,6 +3,8 @@ import { a2aMessageToContent, isTerminalTaskState, taskStateToMessageStatus, thr
3
3
  import { createMessageRepositorySession, invokeUserCallback } from "@assistant-ui/core/internal";
4
4
  import { fromThreadMessageLike, generateId } from "@assistant-ui/core";
5
5
  //#region src/A2AThreadRuntimeCore.ts
6
+ const INITIAL_AGENT_CARD_RETRY_DELAY_MS = 5e3;
7
+ const MAX_AGENT_CARD_RETRY_DELAY_MS = 3e5;
6
8
  const FALLBACK_USER_STATUS = {
7
9
  type: "complete",
8
10
  reason: "unknown"
@@ -39,6 +41,9 @@ var A2AThreadRuntimeCore = class {
39
41
  _loadPromise;
40
42
  _loadRequested = false;
41
43
  _agentCardPromise;
44
+ _agentCardRetryAfter = 0;
45
+ _agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;
46
+ _agentCardDiscoveryFailed = false;
42
47
  lastOptionsContextId;
43
48
  constructor(options) {
44
49
  this.client = options.client;
@@ -109,17 +114,47 @@ var A2AThreadRuntimeCore = class {
109
114
  get isLoading() {
110
115
  return this._isLoading;
111
116
  }
112
- __internal_load() {
113
- this._loadRequested = true;
117
+ loadAgentCard() {
118
+ if (Date.now() < this._agentCardRetryAfter) return Promise.resolve();
114
119
  this._agentCardPromise ??= this.client.getAgentCard().then((agentCard) => {
115
120
  this.agentCardValue = agentCard;
121
+ this._agentCardRetryAfter = 0;
122
+ this._agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;
123
+ this._agentCardDiscoveryFailed = false;
116
124
  this.notifyUpdate();
117
- }).catch(() => void 0);
125
+ }, () => {
126
+ this._agentCardDiscoveryFailed = true;
127
+ this._agentCardRetryAfter = Date.now() + this._agentCardRetryDelay;
128
+ this._agentCardRetryDelay = Math.min(this._agentCardRetryDelay * 2, MAX_AGENT_CARD_RETRY_DELAY_MS);
129
+ this._agentCardPromise = void 0;
130
+ });
131
+ return this._agentCardPromise;
132
+ }
133
+ async waitForAgentCard(signal) {
134
+ const shouldWait = !this._agentCardDiscoveryFailed;
135
+ const load = this.loadAgentCard();
136
+ if (signal.aborted) return false;
137
+ if (!shouldWait) return true;
138
+ let onAbort;
139
+ const abort = new Promise((resolve) => {
140
+ onAbort = resolve;
141
+ signal.addEventListener("abort", onAbort, { once: true });
142
+ });
143
+ try {
144
+ await Promise.race([load, abort]);
145
+ } finally {
146
+ signal.removeEventListener("abort", onAbort);
147
+ }
148
+ return !signal.aborted;
149
+ }
150
+ __internal_load() {
151
+ this._loadRequested = true;
152
+ const agentCardPromise = this.loadAgentCard();
118
153
  if (this._loadPromise) return this._loadPromise;
119
- if (!this.history) return this._agentCardPromise;
154
+ if (!this.history) return agentCardPromise;
120
155
  this._isLoading = true;
121
156
  const historyPromise = this.history.load();
122
- this._loadPromise = Promise.all([historyPromise, this._agentCardPromise]).then(([repo]) => {
157
+ this._loadPromise = Promise.all([historyPromise, agentCardPromise]).then(([repo]) => {
123
158
  if (repo) {
124
159
  this.session.applyExternalMessageRepository(repo);
125
160
  this.finalizeExternalApply();
@@ -235,9 +270,9 @@ var A2AThreadRuntimeCore = class {
235
270
  invokeRuntimeCallback("onCancel", this.onCancel);
236
271
  }, { once: true });
237
272
  this.setRunning(true);
238
- const supportsStreaming = this.agentCardValue?.capabilities?.streaming !== false;
239
273
  try {
240
- if (supportsStreaming) await this.runStreaming(a2aMessage, assistantId, abortController);
274
+ if (!await this.waitForAgentCard(abortController.signal)) return;
275
+ if (this.agentCardValue?.capabilities?.streaming !== false) await this.runStreaming(a2aMessage, assistantId, abortController);
241
276
  else await this.runSync(a2aMessage, assistantId, abortController);
242
277
  } catch (error) {
243
278
  if (!abortController.signal.aborted) {