@assistant-ui/react-a2a 0.2.31 → 0.2.33

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.
package/README.md CHANGED
@@ -13,7 +13,7 @@ npm install @assistant-ui/react @assistant-ui/react-a2a
13
13
  ```tsx
14
14
  import { AssistantRuntimeProvider } from "@assistant-ui/react";
15
15
  import { useA2ARuntime } from "@assistant-ui/react-a2a";
16
- import { Thread } from "@/components/assistant-ui/thread";
16
+ import { Thread } from "@/components/assistant-ui/elements/thread.aui";
17
17
 
18
18
  export function App() {
19
19
  const runtime = useA2ARuntime({ baseUrl: "http://localhost:9999" });
@@ -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;;cAgYP;UACH;UACA;UACA;UACA;UACA;UAIA;EAII,YAAA,SAAS;UAkBb;UAIM;UAqBA;UAyBA;EAuBR,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":";;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"}
package/dist/A2AClient.js CHANGED
@@ -24,6 +24,31 @@ const OPAQUE_FIELDS = /* @__PURE__ */ new Set([
24
24
  "forwardedProps",
25
25
  "scopes"
26
26
  ]);
27
+ const JSONRPC_STATE_MAP = {
28
+ "input-required": "input_required",
29
+ "auth-required": "auth_required",
30
+ unknown: "unspecified"
31
+ };
32
+ function normalizeParts(value) {
33
+ return value.map((raw) => {
34
+ const part = normalizeKeys(raw, false);
35
+ if (part === null || typeof part !== "object" || Array.isArray(part)) return part;
36
+ const record = part;
37
+ if (record.kind === void 0) return part;
38
+ const { kind, ...rest } = record;
39
+ const file = rest.file;
40
+ if (kind !== "file" || file === null || typeof file !== "object") return rest;
41
+ const { file: _file, ...others } = rest;
42
+ const nested = file;
43
+ return {
44
+ ...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 } : {}
49
+ };
50
+ });
51
+ }
27
52
  function normalizeKeys(obj, opaque = false) {
28
53
  if (Array.isArray(obj)) return obj.map((v) => normalizeKeys(v, opaque));
29
54
  if (obj !== null && typeof obj === "object") {
@@ -35,10 +60,14 @@ function normalizeKeys(obj, opaque = false) {
35
60
  }
36
61
  const camelKey = toCamelCase(key);
37
62
  const isOpaqueChild = OPAQUE_FIELDS.has(camelKey);
38
- if (camelKey === "state" && typeof value === "string" && value.startsWith("TASK_STATE_")) result[camelKey] = value.slice(11).toLowerCase();
39
- else if (camelKey === "role" && typeof value === "string" && value.startsWith("ROLE_")) result[camelKey] = value.slice(5).toLowerCase();
40
- else if (camelKey === "content" && Array.isArray(value)) result.parts = normalizeKeys(value, false);
41
- else if (camelKey !== "parts" || !("parts" in result)) result[camelKey] = isOpaqueChild ? value : normalizeKeys(value, false);
63
+ if (camelKey === "state" && typeof value === "string") {
64
+ if (value.startsWith("TASK_STATE_")) result[camelKey] = value.slice(11).toLowerCase();
65
+ else result[camelKey] = JSONRPC_STATE_MAP[value] ?? value;
66
+ } else if (camelKey === "role" && typeof value === "string" && value.startsWith("ROLE_")) result[camelKey] = value.slice(5).toLowerCase();
67
+ else if (camelKey === "content" && Array.isArray(value)) result.parts = normalizeParts(value);
68
+ else if (camelKey === "parts" && Array.isArray(value)) {
69
+ if (!("parts" in result)) result.parts = normalizeParts(value);
70
+ } else if (camelKey !== "parts" || !("parts" in result)) result[camelKey] = isOpaqueChild ? value : normalizeKeys(value, false);
42
71
  }
43
72
  return result;
44
73
  }
@@ -59,22 +88,63 @@ function toWireMessage(msg) {
59
88
  };
60
89
  }
61
90
  function discriminateStreamResponse(data) {
62
- if ("task" in data && data.task) return {
63
- type: "task",
64
- task: data.task
65
- };
66
- if ("message" in data && data.message) return {
67
- type: "message",
68
- message: data.message
69
- };
70
- if ("statusUpdate" in data && data.statusUpdate) return {
71
- type: "statusUpdate",
72
- event: data.statusUpdate
73
- };
74
- if ("artifactUpdate" in data && data.artifactUpdate) return {
75
- type: "artifactUpdate",
76
- event: data.artifactUpdate
77
- };
91
+ if ("task" in data) {
92
+ const task = toWrappedTask(data.task);
93
+ if (task) return {
94
+ type: "task",
95
+ task
96
+ };
97
+ }
98
+ if ("message" in data) {
99
+ const message = toWrappedMessage(data.message);
100
+ if (message) return {
101
+ type: "message",
102
+ message
103
+ };
104
+ }
105
+ if ("statusUpdate" in data) {
106
+ const statusUpdate = toWrappedStatusUpdate(data.statusUpdate);
107
+ if (statusUpdate) return {
108
+ type: "statusUpdate",
109
+ event: statusUpdate
110
+ };
111
+ }
112
+ if ("artifactUpdate" in data) {
113
+ const artifactUpdate = toWrappedArtifactUpdate(data.artifactUpdate);
114
+ if (artifactUpdate) return {
115
+ type: "artifactUpdate",
116
+ event: artifactUpdate
117
+ };
118
+ }
119
+ const { kind, ...flat } = data;
120
+ switch (kind) {
121
+ case "task":
122
+ if (!isTask(flat)) break;
123
+ return {
124
+ type: "task",
125
+ task: flat
126
+ };
127
+ case "message":
128
+ if (!isMessage(flat)) break;
129
+ return {
130
+ type: "message",
131
+ message: flat
132
+ };
133
+ case "status-update": {
134
+ if (!isStatusUpdate(flat)) break;
135
+ const { final: _final, ...event } = flat;
136
+ return {
137
+ type: "statusUpdate",
138
+ event
139
+ };
140
+ }
141
+ case "artifact-update":
142
+ if (!isArtifactUpdate(flat)) break;
143
+ return {
144
+ type: "artifactUpdate",
145
+ event: flat
146
+ };
147
+ }
78
148
  return null;
79
149
  }
80
150
  const TASK_STATES = new Set(Object.keys({
@@ -95,9 +165,83 @@ const ROLES = new Set(Object.keys({
95
165
  agent: true
96
166
  }));
97
167
  const isRole = (value) => typeof value === "string" && ROLES.has(value);
98
- const isTask = (value) => isRecord(value) && typeof value.id === "string" && value.id.length > 0 && isRecord(value.status) && isTaskState(value.status.state);
99
- const isMessage = (value) => isRecord(value) && typeof value.messageId === "string" && value.messageId.length > 0 && isRole(value.role) && Array.isArray(value.parts) && value.parts.every(isRecord);
168
+ 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);
171
+ const hasStringIds = (value, keys) => keys.every((key) => typeof value[key] === "string");
172
+ const toWrappedTaskStatus = (value) => {
173
+ if (!isRecord(value)) return null;
174
+ return {
175
+ ...value,
176
+ state: value.state == null ? "unspecified" : value.state
177
+ };
178
+ };
179
+ const toWrappedTask = (value) => {
180
+ if (!isRecord(value)) return null;
181
+ const status = toWrappedTaskStatus(value.status);
182
+ if (!status) return null;
183
+ const task = {
184
+ ...value,
185
+ contextId: value.contextId == null ? "" : value.contextId,
186
+ status
187
+ };
188
+ return isTask(task) && hasStringIds(task, ["contextId"]) ? task : null;
189
+ };
190
+ const toWrappedMessage = (value) => {
191
+ if (!isRecord(value)) return null;
192
+ const message = {
193
+ ...value,
194
+ contextId: value.contextId == null ? "" : value.contextId,
195
+ taskId: value.taskId == null ? "" : value.taskId,
196
+ role: value.role == null ? "unspecified" : value.role,
197
+ parts: value.parts == null ? [] : value.parts
198
+ };
199
+ return isMessage(message) && hasStringIds(message, ["contextId", "taskId"]) ? message : null;
200
+ };
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);
202
+ const toWrappedStatusUpdate = (value) => {
203
+ if (!isRecord(value) || !isRecord(value.status)) return null;
204
+ const statusUpdate = {
205
+ ...value,
206
+ taskId: value.taskId == null ? "" : value.taskId,
207
+ contextId: value.contextId == null ? "" : value.contextId,
208
+ status: toWrappedTaskStatus(value.status)
209
+ };
210
+ return isStatusUpdate(statusUpdate, true) && hasStringIds(statusUpdate, ["taskId", "contextId"]) ? statusUpdate : null;
211
+ };
212
+ const isArtifact = (value) => isRecord(value) && typeof value.artifactId === "string" && Array.isArray(value.parts) && value.parts.every(isRecord);
213
+ const isArtifactUpdate = (value) => isRecord(value) && hasOptionalStringIds(value, ["contextId", "taskId"]) && isArtifact(value.artifact);
214
+ const toWrappedArtifact = (value) => {
215
+ if (!isRecord(value)) return null;
216
+ const artifact = {
217
+ ...value,
218
+ artifactId: value.artifactId == null ? "" : value.artifactId,
219
+ parts: value.parts == null ? [] : value.parts
220
+ };
221
+ return isArtifact(artifact) ? artifact : null;
222
+ };
223
+ const toWrappedArtifactUpdate = (value) => {
224
+ if (!isRecord(value)) return null;
225
+ const artifact = toWrappedArtifact(value.artifact);
226
+ if (!artifact) return null;
227
+ const artifactUpdate = {
228
+ ...value,
229
+ taskId: value.taskId == null ? "" : value.taskId,
230
+ contextId: value.contextId == null ? "" : value.contextId,
231
+ artifact
232
+ };
233
+ return isArtifactUpdate(artifactUpdate) && hasStringIds(artifactUpdate, ["taskId", "contextId"]) ? artifactUpdate : null;
234
+ };
100
235
  const isStringArray = (value) => Array.isArray(value) && value.every((item) => typeof item === "string");
236
+ const toJsonRpcError = (error) => {
237
+ const rpcError = error;
238
+ return new A2AError({
239
+ code: rpcError.code ?? -1,
240
+ status: "JSONRPC_ERROR",
241
+ message: rpcError.message ?? "A2A JSON-RPC error",
242
+ details: rpcError.data === void 0 ? void 0 : Array.isArray(rpcError.data) ? rpcError.data : [rpcError.data]
243
+ });
244
+ };
101
245
  const invalidAgentCard = () => {
102
246
  throw new Error("Invalid A2A agent card response: expected a valid agent card payload.");
103
247
  };
@@ -268,7 +412,19 @@ var A2AClient = class {
268
412
  }
269
413
  });
270
414
  if (!response.ok) await this.throwResponseError(response);
271
- return normalizeKeys(await response.json());
415
+ const json = await response.json();
416
+ if (json && typeof json === "object" && "jsonrpc" in json) {
417
+ if ("error" in json && json.error) throw toJsonRpcError(json.error);
418
+ if ("result" in json) {
419
+ const result = normalizeKeys(json.result);
420
+ if (isRecord(result) && typeof result.kind === "string") {
421
+ const { kind: _kind, ...rest } = result;
422
+ return rest;
423
+ }
424
+ return result;
425
+ }
426
+ }
427
+ return normalizeKeys(json);
272
428
  }
273
429
  async getAgentCard(signal) {
274
430
  const headers = await this.getHeaders(false);
@@ -403,11 +559,15 @@ var A2AClient = class {
403
559
  const readEvent = (event) => {
404
560
  try {
405
561
  let parsed = JSON.parse(event.data);
406
- if (parsed && typeof parsed === "object" && "jsonrpc" in parsed && "result" in parsed) parsed = parsed.result;
562
+ if (parsed && typeof parsed === "object" && "jsonrpc" in parsed) {
563
+ if ("error" in parsed && parsed.error) throw toJsonRpcError(parsed.error);
564
+ if ("result" in parsed) parsed = parsed.result;
565
+ }
407
566
  const streamEvent = discriminateStreamResponse(normalizeKeys(parsed));
408
567
  if (!streamEvent) noteSkip(event.data, "unrecognized event shape");
409
568
  return streamEvent;
410
569
  } catch (error) {
570
+ if (error instanceof A2AError) throw error;
411
571
  noteSkip(event.data, error instanceof Error ? error.message : String(error));
412
572
  return null;
413
573
  }
@@ -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\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 (\n camelKey === \"state\" &&\n typeof value === \"string\" &&\n value.startsWith(\"TASK_STATE_\")\n ) {\n result[camelKey] = value.slice(11).toLowerCase();\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 = normalizeKeys(value, false);\n } else if (camelKey !== \"parts\" || !(\"parts\" in result)) {\n // dedup: \"content\" was already mapped to parts above; don't overwrite\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 && data.task) {\n return { type: \"task\", task: data.task as A2ATask };\n }\n if (\"message\" in data && data.message) {\n return { type: \"message\", message: data.message as A2AMessage };\n }\n if (\"statusUpdate\" in data && data.statusUpdate) {\n return {\n type: \"statusUpdate\",\n event: data.statusUpdate as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n if (\"artifactUpdate\" in data && data.artifactUpdate) {\n return {\n type: \"artifactUpdate\",\n event: data.artifactUpdate 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\nconst isTask = (value: unknown): value is A2ATask =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\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 isRole(value.role) &&\n Array.isArray(value.parts) &&\n value.parts.every(isRecord);\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === \"string\");\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 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 (\n parsed &&\n typeof parsed === \"object\" &&\n \"jsonrpc\" in parsed &&\n \"result\" in parsed\n ) {\n parsed = parsed.result;\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 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 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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"}
@@ -22,8 +22,7 @@ declare class A2AThreadRuntimeCore {
22
22
  private history;
23
23
  private readonly notifyUpdate;
24
24
  private runtime;
25
- private readonly repository;
26
- private exportedRepository;
25
+ private readonly session;
27
26
  private isRunningFlag;
28
27
  private abortController;
29
28
  private pendingError;
@@ -34,21 +33,19 @@ declare class A2AThreadRuntimeCore {
34
33
  private readonly recordedHistoryIds;
35
34
  private _isLoading;
36
35
  private _loadPromise;
36
+ private _loadRequested;
37
+ private _agentCardPromise;
38
+ private lastOptionsContextId;
37
39
  constructor(options: A2AThreadRuntimeCoreOptions);
38
40
  updateOptions(options: Omit<A2AThreadRuntimeCoreOptions, "notifyUpdate">): void;
41
+ /** Thread-boundary reset: applyExternalMessages alone also serves branch
42
+ * switches, deletes, and cancel resyncs, which must keep the live context. */
43
+ resetContext(): void;
39
44
  attachRuntime(runtime: AssistantRuntime): void;
40
45
  detachRuntime(): void;
41
46
  getRuntime(): AssistantRuntime | undefined;
42
47
  getMessages(): readonly ThreadMessage[];
43
48
  getMessageRepository(): ExportedMessageRepository;
44
- private tryGetMessage;
45
- private tryGetMessages;
46
- private hasMessage;
47
- private addOrUpdateMessage;
48
- private switchToBranch;
49
- private resetRepositoryHead;
50
- private clearRepository;
51
- private updateMessage;
52
49
  getTask(): A2ATask | undefined;
53
50
  getArtifacts(): readonly A2AArtifact[];
54
51
  getAgentCard(): A2AAgentCard | undefined;
@@ -64,7 +61,6 @@ declare class A2AThreadRuntimeCore {
64
61
  private appendLinearChain;
65
62
  private finalizeExternalApply;
66
63
  applyExternalMessages(messages: readonly ThreadMessage[]): void;
67
- private applyExternalMessageRepository;
68
64
  private startRun;
69
65
  private runStreaming;
70
66
  private runSync;
@@ -73,7 +69,6 @@ declare class A2AThreadRuntimeCore {
73
69
  private handleArtifactUpdate;
74
70
  private handleMessage;
75
71
  private handleTaskSnapshot;
76
- private threadMessageToA2AMessage;
77
72
  private insertAssistantPlaceholder;
78
73
  private updateAssistantContent;
79
74
  private updateAssistantStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"A2AThreadRuntimeCore.d.ts","names":[],"sources":["../src/A2AThreadRuntimeCore.ts"],"mappings":";;;;KAgCY;EACV,QAAQ;EACR;EACA,gBAAgB;EAChB,YAAY,OAAO;EACnB;EACA,uBAAuB,UAAU;EACjC,UAAU;EACV;;cA6CW;UACH;UACA;UACA;UACA;UACA;UACA;UACA;mBACS;UAET;mBACS;UACT;UACA;UACA;UACA;UAGA;UACA;UACA;mBAGS;mBACA;UACT;UACA;EAEI,YAAA,SAAS;EAWrB,cAAc,SAAS,KAAK;EAU5B,cAAc,SAAS;EAIvB;EASA,cAAc;EAId,wBAAwB;EAIxB,wBAAwB;UAKhB;UAQA;UAUA;UAIA;UAQA;UAKA;UAKA;UAKA;EAYR,WAAW;EAIX,yBAAyB;EAIzB,gBAAgB;EAIhB;MAII;EAIJ,mBAAmB;EAiCb,OAAO,SAAS,gBAAgB;EAuBhC,KAAK,SAAS,gBAAgB;EAI9B,OACJ,yBACA;IAAW,YAAY;MACtB;EAaG,UAAU;UAiBR;UAgBA;EAWR,sBAAsB,mBAAmB;UAiCjC;UA6DM;UAwEA;UA4CA;UA4BN;UAiBA;UA6BA;UA0CA;UAQA;UAuCA;UAmCA;UAsBA;UAUA;UAaA;UAQA;UAKA;UAQA;UAIA;UAQA;UAeA"}
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"}