@assistant-ui/react-a2a 0.2.41 → 0.2.42
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/dist/A2AClient.d.ts +6 -0
- package/dist/A2AClient.d.ts.map +1 -1
- package/dist/A2AClient.js +9 -38
- package/dist/A2AClient.js.map +1 -1
- package/dist/A2AThreadRuntimeCore.d.ts +14 -4
- package/dist/A2AThreadRuntimeCore.d.ts.map +1 -1
- package/dist/A2AThreadRuntimeCore.js +50 -35
- package/dist/A2AThreadRuntimeCore.js.map +1 -1
- package/dist/conversions.d.ts.map +1 -1
- package/dist/conversions.js +2 -2
- package/dist/conversions.js.map +1 -1
- package/dist/useA2ARuntime.d.ts.map +1 -1
- package/dist/useA2ARuntime.js +40 -28
- package/dist/useA2ARuntime.js.map +1 -1
- package/package.json +6 -6
- package/src/A2AClient.test.ts +69 -0
- package/src/A2AClient.ts +13 -45
- package/src/A2AThreadRuntimeCore.test.ts +71 -18
- package/src/A2AThreadRuntimeCore.ts +74 -46
- package/src/conversions.test.ts +21 -0
- package/src/conversions.ts +2 -1
- package/src/useA2ARuntime.test.tsx +104 -0
- package/src/useA2ARuntime.ts +62 -35
package/dist/A2AClient.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ export type A2AClientOptions = {
|
|
|
10
10
|
extensions?: string[] | undefined;
|
|
11
11
|
/** Extra fetch options applied to every request. */
|
|
12
12
|
fetchOptions?: Omit<RequestInit, "headers" | "body" | "method" | "signal"> | undefined;
|
|
13
|
+
/** Maximum UTF-16 code units accepted in one SSE line. Defaults to 16 MiB. */
|
|
14
|
+
maxStreamLineLength?: number | undefined;
|
|
15
|
+
/** Maximum UTF-16 code units retained across one SSE event. Defaults to 16 MiB. */
|
|
16
|
+
maxStreamEventLength?: number | undefined;
|
|
13
17
|
};
|
|
14
18
|
export declare class A2AError extends Error {
|
|
15
19
|
code: number;
|
|
@@ -22,6 +26,8 @@ export declare class A2AClient {
|
|
|
22
26
|
private basePath;
|
|
23
27
|
private tenant;
|
|
24
28
|
private extensionUris;
|
|
29
|
+
private maxStreamLineLength;
|
|
30
|
+
private maxStreamEventLength;
|
|
25
31
|
private fetchOptions;
|
|
26
32
|
private headersFn;
|
|
27
33
|
constructor(options: A2AClientOptions);
|
package/dist/A2AClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2AClient.d.ts","sourceRoot":"","sources":["../src/A2AClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,0CAA0C,EAC1C,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EAGV,2BAA2B,EAC3B,cAAc,EACd,OAAO,EACP,6BAA6B,EAE9B,mBAAgB;AAGjB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAChE,SAAS,CAAC;IACd,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC,oDAAoD;IACpD,YAAY,CAAC,EACT,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAC3D,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"A2AClient.d.ts","sourceRoot":"","sources":["../src/A2AClient.ts"],"names":[],"mappings":"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"}
|
package/dist/A2AClient.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./types.js";
|
|
2
2
|
import { SSEEventDecoder } from "assistant-stream/utils";
|
|
3
|
-
import { isRecord } from "@assistant-ui/core/internal";
|
|
3
|
+
import { isRecord, raceWithAbortSignal } from "@assistant-ui/core/internal";
|
|
4
4
|
//#region src/A2AClient.ts
|
|
5
5
|
var A2AError = class extends Error {
|
|
6
6
|
code;
|
|
@@ -363,42 +363,6 @@ const parseListTaskPushNotificationConfigsResponse = (value) => {
|
|
|
363
363
|
function signalInit(signal) {
|
|
364
364
|
return signal ? { signal } : {};
|
|
365
365
|
}
|
|
366
|
-
const getAbortReason = (signal) => {
|
|
367
|
-
if (signal.reason !== void 0) return signal.reason;
|
|
368
|
-
const error = /* @__PURE__ */ new Error("The operation was aborted");
|
|
369
|
-
error.name = "AbortError";
|
|
370
|
-
return error;
|
|
371
|
-
};
|
|
372
|
-
const raceWithAbortSignal = (signal, operation) => {
|
|
373
|
-
if (!signal) return Promise.resolve().then(operation);
|
|
374
|
-
if (signal.aborted) return Promise.reject(getAbortReason(signal));
|
|
375
|
-
return new Promise((resolve, reject) => {
|
|
376
|
-
let settled = false;
|
|
377
|
-
const cleanup = () => signal.removeEventListener("abort", handleAbort);
|
|
378
|
-
const resolveOnce = (value) => {
|
|
379
|
-
if (settled) return;
|
|
380
|
-
settled = true;
|
|
381
|
-
cleanup();
|
|
382
|
-
resolve(value);
|
|
383
|
-
};
|
|
384
|
-
const rejectOnce = (error) => {
|
|
385
|
-
if (settled) return;
|
|
386
|
-
settled = true;
|
|
387
|
-
cleanup();
|
|
388
|
-
reject(error);
|
|
389
|
-
};
|
|
390
|
-
const handleAbort = () => rejectOnce(getAbortReason(signal));
|
|
391
|
-
signal.addEventListener("abort", handleAbort, { once: true });
|
|
392
|
-
let result;
|
|
393
|
-
try {
|
|
394
|
-
result = operation();
|
|
395
|
-
} catch (error) {
|
|
396
|
-
rejectOnce(error);
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
Promise.resolve(result).then(resolveOnce, rejectOnce);
|
|
400
|
-
});
|
|
401
|
-
};
|
|
402
366
|
const SKIPPED_FRAME_SNIPPET_LENGTH = 120;
|
|
403
367
|
function describeSkippedFrame(data, reason) {
|
|
404
368
|
const collapsed = data.replace(/\s+/g, " ");
|
|
@@ -409,6 +373,8 @@ var A2AClient = class {
|
|
|
409
373
|
basePath;
|
|
410
374
|
tenant;
|
|
411
375
|
extensionUris;
|
|
376
|
+
maxStreamLineLength;
|
|
377
|
+
maxStreamEventLength;
|
|
412
378
|
fetchOptions;
|
|
413
379
|
headersFn;
|
|
414
380
|
constructor(options) {
|
|
@@ -416,6 +382,8 @@ var A2AClient = class {
|
|
|
416
382
|
this.basePath = options.basePath ? `/${options.basePath.replace(/^\/|\/$/g, "")}` : "";
|
|
417
383
|
this.tenant = options.tenant;
|
|
418
384
|
this.extensionUris = options.extensions;
|
|
385
|
+
this.maxStreamLineLength = options.maxStreamLineLength;
|
|
386
|
+
this.maxStreamEventLength = options.maxStreamEventLength;
|
|
419
387
|
const { headers: _h, body: _b, method: _m, signal: _s, ...safeFetchOptions } = options.fetchOptions ?? {};
|
|
420
388
|
this.fetchOptions = safeFetchOptions;
|
|
421
389
|
this.headersFn = options.headers ?? {};
|
|
@@ -604,7 +572,6 @@ var A2AClient = class {
|
|
|
604
572
|
const reader = response.body?.getReader();
|
|
605
573
|
if (!reader) throw new Error("No response body");
|
|
606
574
|
const decoder = new TextDecoder();
|
|
607
|
-
const sseDecoder = new SSEEventDecoder();
|
|
608
575
|
let firstSkipReason;
|
|
609
576
|
const noteSkip = (data, reason) => {
|
|
610
577
|
firstSkipReason ??= describeSkippedFrame(data, reason);
|
|
@@ -627,6 +594,10 @@ var A2AClient = class {
|
|
|
627
594
|
};
|
|
628
595
|
let shouldCancel = true;
|
|
629
596
|
try {
|
|
597
|
+
const sseDecoder = new SSEEventDecoder({
|
|
598
|
+
maxLineLength: this.maxStreamLineLength,
|
|
599
|
+
maxEventLength: this.maxStreamEventLength
|
|
600
|
+
});
|
|
630
601
|
while (true) {
|
|
631
602
|
let result;
|
|
632
603
|
try {
|
package/dist/A2AClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2AClient.js","names":[],"sources":["../src/A2AClient.ts"],"sourcesContent":["import { SSEEventDecoder, type SSEEvent } from \"assistant-stream/utils\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\nimport type {\n A2AAgentCard,\n A2AErrorInfo,\n A2AListTaskPushNotificationConfigsResponse,\n A2AListTasksRequest,\n A2AListTasksResponse,\n A2AMessage,\n A2APart,\n A2ARole,\n A2ASendMessageConfiguration,\n A2AStreamEvent,\n A2ATask,\n A2ATaskPushNotificationConfig,\n A2ATaskState,\n} from \"./types\";\nimport { A2A_PROTOCOL_VERSION } from \"./types\";\n\nexport type A2AClientOptions = {\n baseUrl: string;\n /** Optional path prefix for all API endpoints (e.g. \"/v1\"). Does not affect agent card discovery. */\n basePath?: string | undefined;\n /** Optional tenant ID for multi-tenant servers. */\n tenant?: string | undefined;\n headers?:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined;\n /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */\n extensions?: string[] | undefined;\n /** Extra fetch options applied to every request. */\n fetchOptions?:\n | Omit<RequestInit, \"headers\" | \"body\" | \"method\" | \"signal\">\n | undefined;\n};\n\nexport class A2AError extends Error {\n code: number;\n status: string;\n details: unknown[] | undefined;\n\n constructor(info: A2AErrorInfo) {\n super(info.message);\n this.name = \"A2AError\";\n this.code = info.code;\n this.status = info.status;\n this.details = info.details;\n }\n}\n\n// Incoming key normalization: snake_case → camelCase, plus ProtoJSON enum normalization.\nfunction toCamelCase(key: string): string {\n return key.replace(/_([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n// Fields whose values are opaque user data (google.protobuf.Struct / Value).\n// Keys inside these objects must NOT be camelCased or have enum normalization applied.\nconst OPAQUE_FIELDS = new Set([\n \"metadata\",\n \"data\",\n \"params\",\n \"forwardedProps\",\n \"scopes\",\n]);\n\nconst JSONRPC_STATE_MAP: Record<string, string> = {\n \"input-required\": \"input_required\",\n \"auth-required\": \"auth_required\",\n unknown: \"unspecified\",\n};\n\nconst PART_STRING_FIELDS = [\n \"text\",\n \"raw\",\n \"url\",\n \"filename\",\n \"mediaType\",\n] as const;\n\nconst NULLABLE_PART_FIELDS = [...PART_STRING_FIELDS, \"metadata\"] as const;\n\nfunction normalizePartNulls(\n part: Record<string, unknown>,\n): Record<string, unknown> {\n const normalized = { ...part };\n for (const field of NULLABLE_PART_FIELDS) {\n if (normalized[field] === null) delete normalized[field];\n }\n return normalized;\n}\n\n// JSON-RPC file parts nest the payload under `file`; the internal A2APart is\n// flat, so the nested fields map onto url/raw/mediaType/filename.\nfunction normalizeParts(value: unknown[]): unknown[] {\n return value.map((raw) => {\n const part = normalizeKeys(raw, false);\n if (part === null || typeof part !== \"object\" || Array.isArray(part))\n return part;\n const record = normalizePartNulls(part as Record<string, unknown>);\n if (record.kind === undefined) return record;\n const { kind, ...rest } = record;\n const file = rest.file;\n if (kind !== \"file\" || file === null || typeof file !== \"object\")\n return rest;\n const { file: _file, ...others } = rest;\n const nested = file as Record<string, unknown>;\n return {\n ...others,\n ...(nested.uri != null ? { url: nested.uri } : {}),\n ...(nested.bytes != null ? { raw: nested.bytes } : {}),\n ...(nested.mimeType != null ? { mediaType: nested.mimeType } : {}),\n ...(nested.name != null ? { filename: nested.name } : {}),\n };\n });\n}\n\nfunction normalizeKeys(obj: unknown, opaque = false): unknown {\n if (Array.isArray(obj)) return obj.map((v) => normalizeKeys(v, opaque));\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n // Inside opaque fields: preserve keys and values as-is (only recurse arrays/objects structurally)\n if (opaque) {\n result[key] =\n typeof value === \"object\" && value !== null\n ? normalizeKeys(value, true)\n : value;\n continue;\n }\n\n const camelKey = toCamelCase(key);\n const isOpaqueChild = OPAQUE_FIELDS.has(camelKey);\n\n if (camelKey === \"state\" && typeof value === \"string\") {\n // Proto-style (TASK_STATE_WORKING) and the JSON-RPC state names map\n // onto the internal snake_case states; anything unrecognized is\n // preserved verbatim.\n if (value.startsWith(\"TASK_STATE_\")) {\n result[camelKey] = value.slice(11).toLowerCase();\n } else {\n result[camelKey] = JSONRPC_STATE_MAP[value] ?? value;\n }\n } else if (\n camelKey === \"role\" &&\n typeof value === \"string\" &&\n value.startsWith(\"ROLE_\")\n ) {\n result[camelKey] = value.slice(5).toLowerCase();\n } else if (camelKey === \"content\" && Array.isArray(value)) {\n // v0.3 servers used \"content\" for message/artifact parts; normalize to \"parts\" for backward compat\n result.parts = normalizeParts(value);\n } else if (camelKey === \"parts\" && Array.isArray(value)) {\n // dedup: \"content\" was already mapped to parts above; don't overwrite\n if (!(\"parts\" in result)) result.parts = normalizeParts(value);\n } else if (camelKey !== \"parts\" || !(\"parts\" in result)) {\n result[camelKey] = isOpaqueChild ? value : normalizeKeys(value, false);\n }\n }\n return result;\n }\n return obj;\n}\n\n// Outgoing enum conversion (v1.0 ProtoJSON format)\nfunction toWireRole(role: A2ARole): string {\n if (role === \"user\") return \"ROLE_USER\";\n if (role === \"agent\") return \"ROLE_AGENT\";\n return \"ROLE_UNSPECIFIED\";\n}\n\nfunction toWireTaskState(state: A2ATaskState): string {\n return `TASK_STATE_${state.toUpperCase()}`;\n}\n\nfunction toWireMessage(msg: A2AMessage): unknown {\n return { ...msg, role: toWireRole(msg.role) };\n}\n\nfunction discriminateStreamResponse(\n data: Record<string, unknown>,\n): A2AStreamEvent | null {\n if (\"task\" in data) {\n const task = toWrappedTask(data.task);\n if (task) return { type: \"task\", task };\n }\n if (\"message\" in data) {\n const message = toWrappedMessage(data.message);\n if (message) return { type: \"message\", message };\n }\n if (\"statusUpdate\" in data) {\n const statusUpdate = toWrappedStatusUpdate(data.statusUpdate);\n if (statusUpdate) {\n return {\n type: \"statusUpdate\",\n event: statusUpdate as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n }\n if (\"artifactUpdate\" in data) {\n const artifactUpdate = toWrappedArtifactUpdate(data.artifactUpdate);\n if (artifactUpdate) {\n return {\n type: \"artifactUpdate\",\n event: artifactUpdate as A2AStreamEvent extends {\n type: \"artifactUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n }\n // JSON-RPC streaming results are the event itself, flat, discriminated by\n // `kind` (per the A2A JSON-RPC schema), rather than wrapped in a\n // REST-style single-key envelope. The field sets cannot collide with the\n // wrapper keys above, so this is a pure fallthrough.\n const { kind, ...flat } = data;\n switch (kind) {\n case \"task\":\n if (!isTask(flat)) break;\n return { type: \"task\", task: flat };\n case \"message\":\n if (!isMessage(flat)) break;\n return { type: \"message\", message: flat };\n case \"status-update\": {\n if (!isStatusUpdate(flat)) break;\n const { final: _final, ...event } = flat;\n return {\n type: \"statusUpdate\",\n event: event as unknown as A2AStreamEvent extends {\n type: \"statusUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n case \"artifact-update\":\n if (!isArtifactUpdate(flat)) break;\n return {\n type: \"artifactUpdate\",\n event: flat as unknown as A2AStreamEvent extends {\n type: \"artifactUpdate\";\n event: infer E;\n }\n ? E\n : never,\n };\n }\n return null;\n}\n\nconst TASK_STATES: ReadonlySet<string> = new Set(\n Object.keys({\n unspecified: true,\n submitted: true,\n working: true,\n completed: true,\n failed: true,\n canceled: true,\n input_required: true,\n rejected: true,\n auth_required: true,\n } satisfies Record<A2ATaskState, true>),\n);\n\nconst isTaskState = (value: unknown): value is A2ATaskState =>\n typeof value === \"string\" && TASK_STATES.has(value);\n\nconst ROLES: ReadonlySet<string> = new Set(\n Object.keys({\n unspecified: true,\n user: true,\n agent: true,\n } satisfies Record<A2ARole, true>),\n);\n\nconst isRole = (value: unknown): value is A2ARole =>\n typeof value === \"string\" && ROLES.has(value);\n\n// Ids reach task state and the next request body unchecked by anything\n// downstream, so an id that is present and not null must be a string.\n// An omitted or null id keeps the acceptance each path already had.\nconst hasOptionalStringIds = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean =>\n keys.every((key) => value[key] == null || typeof value[key] === \"string\");\n\nconst hasOptionalStringFields = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean =>\n keys.every(\n (key) => value[key] === undefined || typeof value[key] === \"string\",\n );\n\nconst isPart = (value: unknown): value is A2APart =>\n isRecord(value) &&\n hasOptionalStringFields(value, PART_STRING_FIELDS) &&\n (value.metadata === undefined || isRecord(value.metadata));\n\nconst hasValidNestedParts = (value: unknown): boolean =>\n !isRecord(value) || !Array.isArray(value.parts) || value.parts.every(isPart);\n\nconst hasValidNestedPartsInCollection = (value: unknown): boolean =>\n !Array.isArray(value) || value.every(hasValidNestedParts);\n\nconst isTask = (value: unknown): value is A2ATask =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n hasOptionalStringIds(value, [\"contextId\"]) &&\n isRecord(value.status) &&\n isTaskState(value.status.state) &&\n hasValidNestedParts(value.status.message) &&\n hasValidNestedPartsInCollection(value.artifacts) &&\n hasValidNestedPartsInCollection(value.history);\n\nconst isMessage = (value: unknown): value is A2AMessage =>\n isRecord(value) &&\n typeof value.messageId === \"string\" &&\n value.messageId.length > 0 &&\n hasOptionalStringIds(value, [\"contextId\", \"taskId\"]) &&\n isRole(value.role) &&\n Array.isArray(value.parts) &&\n value.parts.every(isPart);\n\n// Legacy wrappers use ProtoJSON, where omitted and null fields decode to proto\n// defaults. Normalize those defaults before enforcing semantic requirements.\n// Filling a null id with the ProtoJSON default does not make it a string, and\n// the shape guards below check the fields they name rather than the ids. The\n// runtime reads these straight into task state and the next request body.\nconst hasStringIds = (\n value: Record<string, unknown>,\n keys: readonly string[],\n): boolean => keys.every((key) => typeof value[key] === \"string\");\n\nconst toWrappedTaskStatus = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n return {\n ...value,\n state: value.state == null ? \"unspecified\" : value.state,\n };\n};\n\nconst toWrappedTask = (value: unknown): A2ATask | null => {\n if (!isRecord(value)) return null;\n const status = toWrappedTaskStatus(value.status);\n if (!status) return null;\n\n const task = {\n ...value,\n contextId: value.contextId == null ? \"\" : value.contextId,\n status,\n };\n return isTask(task) && hasStringIds(task, [\"contextId\"]) ? task : null;\n};\n\nconst toWrappedMessage = (value: unknown): A2AMessage | null => {\n if (!isRecord(value)) return null;\n\n const message = {\n ...value,\n contextId: value.contextId == null ? \"\" : value.contextId,\n taskId: value.taskId == null ? \"\" : value.taskId,\n role: value.role == null ? \"unspecified\" : value.role,\n parts: value.parts == null ? [] : value.parts,\n };\n return isMessage(message) && hasStringIds(message, [\"contextId\", \"taskId\"])\n ? message\n : null;\n};\n\nconst isStatusUpdate = (\n value: unknown,\n allowEmptyTaskId = false,\n): value is Record<string, unknown> =>\n isRecord(value) &&\n typeof value.taskId === \"string\" &&\n (allowEmptyTaskId || value.taskId.length > 0) &&\n hasOptionalStringIds(value, [\"contextId\"]) &&\n isRecord(value.status) &&\n isTaskState(value.status.state) &&\n hasValidNestedParts(value.status.message);\n\nconst toWrappedStatusUpdate = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value) || !isRecord(value.status)) return null;\n\n const statusUpdate = {\n ...value,\n taskId: value.taskId == null ? \"\" : value.taskId,\n contextId: value.contextId == null ? \"\" : value.contextId,\n status: toWrappedTaskStatus(value.status),\n };\n return isStatusUpdate(statusUpdate, true) &&\n hasStringIds(statusUpdate, [\"taskId\", \"contextId\"])\n ? statusUpdate\n : null;\n};\n\nconst isArtifact = (value: unknown): value is Record<string, unknown> =>\n isRecord(value) &&\n typeof value.artifactId === \"string\" &&\n Array.isArray(value.parts) &&\n value.parts.every(isPart);\n\nconst isArtifactUpdate = (value: unknown): value is Record<string, unknown> =>\n isRecord(value) &&\n hasOptionalStringIds(value, [\"contextId\", \"taskId\"]) &&\n isArtifact(value.artifact);\n\nconst toWrappedArtifact = (value: unknown): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n\n const artifact = {\n ...value,\n artifactId: value.artifactId == null ? \"\" : value.artifactId,\n parts: value.parts == null ? [] : value.parts,\n };\n return isArtifact(artifact) ? artifact : null;\n};\n\nconst toWrappedArtifactUpdate = (\n value: unknown,\n): Record<string, unknown> | null => {\n if (!isRecord(value)) return null;\n const artifact = toWrappedArtifact(value.artifact);\n if (!artifact) return null;\n\n const artifactUpdate = {\n ...value,\n taskId: value.taskId == null ? \"\" : value.taskId,\n contextId: value.contextId == null ? \"\" : value.contextId,\n artifact,\n };\n return isArtifactUpdate(artifactUpdate) &&\n hasStringIds(artifactUpdate, [\"taskId\", \"contextId\"])\n ? artifactUpdate\n : null;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every((item) => typeof item === \"string\");\n\nconst toJsonRpcError = (error: unknown): A2AError => {\n const rpcError = error as { code?: number; message?: string; data?: unknown };\n return new A2AError({\n code: rpcError.code ?? -1,\n status: \"JSONRPC_ERROR\",\n message: rpcError.message ?? \"A2A JSON-RPC error\",\n details:\n rpcError.data === undefined\n ? undefined\n : Array.isArray(rpcError.data)\n ? rpcError.data\n : [rpcError.data],\n });\n};\n\nconst invalidAgentCard = (): never => {\n throw new Error(\n \"Invalid A2A agent card response: expected a valid agent card payload.\",\n );\n};\n\nconst parseCardString = (value: unknown): string =>\n value == null ? \"\" : typeof value === \"string\" ? value : invalidAgentCard();\n\nconst parseCardStringArray = (value: unknown): string[] =>\n value == null ? [] : isStringArray(value) ? value : invalidAgentCard();\n\nconst parseCardRecordArray = (value: unknown): Record<string, unknown>[] =>\n value == null\n ? []\n : Array.isArray(value) && value.every(isRecord)\n ? (value as Record<string, unknown>[])\n : invalidAgentCard();\n\nconst parseCardRecord = (value: unknown): Record<string, unknown> =>\n value == null ? {} : isRecord(value) ? value : invalidAgentCard();\n\n// Proto3 JSON parsing treats omitted and null fields as defaults, so a valid\n// card may arrive without its empty lists, strings, or capabilities. Fill\n// those per the proto3 JSON mapping rules; a payload without a name or with a\n// present field of the wrong type rejects.\nconst parseAgentCardResponse = (value: unknown): A2AAgentCard => {\n if (\n !isRecord(value) ||\n typeof value.name !== \"string\" ||\n value.name.length === 0\n ) {\n return invalidAgentCard();\n }\n\n return {\n ...value,\n name: value.name,\n description: parseCardString(value.description),\n version: parseCardString(value.version),\n supportedInterfaces: parseCardRecordArray(value.supportedInterfaces).map(\n (entry) => ({\n ...entry,\n url: parseCardString(entry.url),\n protocolBinding: parseCardString(entry.protocolBinding),\n protocolVersion: parseCardString(entry.protocolVersion),\n }),\n ),\n capabilities: parseCardRecord(value.capabilities),\n defaultInputModes: parseCardStringArray(value.defaultInputModes),\n defaultOutputModes: parseCardStringArray(value.defaultOutputModes),\n skills: parseCardRecordArray(value.skills).map((entry) => ({\n ...entry,\n id: parseCardString(entry.id),\n name: parseCardString(entry.name),\n description: parseCardString(entry.description),\n tags: parseCardStringArray(entry.tags),\n })),\n } as A2AAgentCard;\n};\n\nconst parseSendMessageResponse = (value: unknown): A2ATask | A2AMessage => {\n if (isRecord(value)) {\n const candidate = value.task ?? value.message ?? value;\n if (isTask(candidate) || isMessage(candidate)) return candidate;\n }\n\n throw new Error(\n \"Invalid A2A message:send response: expected a valid task or message payload.\",\n );\n};\n\nconst parseTaskResponse = (\n value: unknown,\n operation: \"tasks:get\" | \"tasks:cancel\",\n): A2ATask => {\n if (isTask(value)) return value;\n\n throw new Error(\n `Invalid A2A ${operation} response: expected a valid task payload.`,\n );\n};\n\nconst isNonNegativeInteger = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isInteger(value) && value >= 0;\n\nconst invalidListTasksResponse = (): never => {\n throw new Error(\n \"Invalid A2A tasks:list response: expected a valid task list payload.\",\n );\n};\n\nconst parseListTasksResponse = (value: unknown): A2AListTasksResponse => {\n if (!isRecord(value)) return invalidListTasksResponse();\n\n const tasks = value.tasks ?? [];\n if (!Array.isArray(tasks) || !tasks.every(isTask)) {\n return invalidListTasksResponse();\n }\n\n const { nextPageToken, pageSize, totalSize } = value;\n if (\n (nextPageToken != null && typeof nextPageToken !== \"string\") ||\n (pageSize != null && !isNonNegativeInteger(pageSize)) ||\n (totalSize != null && !isNonNegativeInteger(totalSize))\n ) {\n return invalidListTasksResponse();\n }\n\n return {\n ...value,\n tasks,\n nextPageToken: nextPageToken ?? \"\",\n pageSize: pageSize ?? 0,\n totalSize: totalSize ?? 0,\n };\n};\n\nconst invalidPushNotificationConfigResponse =\n (\n operation: \"pushNotificationConfigs:create\" | \"pushNotificationConfigs:get\",\n ) =>\n (): never => {\n throw new Error(\n `Invalid A2A ${operation} response: expected a valid push notification config payload.`,\n );\n };\n\nconst invalidListPushNotificationConfigsResponse = (): never => {\n throw new Error(\n \"Invalid A2A pushNotificationConfigs:list response: expected a valid push notification config list payload.\",\n );\n};\n\nconst parseOptionalString = (\n value: unknown,\n invalid: () => never,\n): string | undefined =>\n value == null ? undefined : typeof value === \"string\" ? value : invalid();\n\nconst parseTaskPushNotificationConfigResponse = (\n value: unknown,\n invalid: () => never,\n): A2ATaskPushNotificationConfig => {\n if (\n !isRecord(value) ||\n typeof value.url !== \"string\" ||\n value.url.length === 0\n ) {\n return invalid();\n }\n\n const { tenant, id, taskId, url, token, authentication, ...extra } = value;\n let normalizedAuthentication: A2ATaskPushNotificationConfig[\"authentication\"];\n if (authentication != null) {\n if (!isRecord(authentication)) return invalid();\n const { scheme, credentials, ...authenticationExtra } = authentication;\n normalizedAuthentication = {\n ...authenticationExtra,\n scheme: parseOptionalString(scheme, invalid) ?? \"\",\n ...(credentials == null\n ? {}\n : { credentials: parseOptionalString(credentials, invalid) }),\n };\n }\n\n return {\n ...extra,\n ...(tenant == null ? {} : { tenant: parseOptionalString(tenant, invalid) }),\n ...(id == null ? {} : { id: parseOptionalString(id, invalid) }),\n ...(taskId == null ? {} : { taskId: parseOptionalString(taskId, invalid) }),\n url,\n ...(token == null ? {} : { token: parseOptionalString(token, invalid) }),\n ...(normalizedAuthentication === undefined\n ? {}\n : { authentication: normalizedAuthentication }),\n };\n};\n\nconst parseListTaskPushNotificationConfigsResponse = (\n value: unknown,\n): A2AListTaskPushNotificationConfigsResponse => {\n if (!isRecord(value)) return invalidListPushNotificationConfigsResponse();\n\n const { configs: rawConfigs, nextPageToken, ...extra } = value;\n if (rawConfigs != null && !Array.isArray(rawConfigs)) {\n return invalidListPushNotificationConfigsResponse();\n }\n\n return {\n ...extra,\n configs: (rawConfigs ?? []).map((config) =>\n parseTaskPushNotificationConfigResponse(\n config,\n invalidListPushNotificationConfigsResponse,\n ),\n ),\n ...(nextPageToken == null\n ? {}\n : {\n nextPageToken: parseOptionalString(\n nextPageToken,\n invalidListPushNotificationConfigsResponse,\n ),\n }),\n };\n};\n\nfunction signalInit(signal?: AbortSignal): RequestInit {\n return signal ? { signal } : {};\n}\n\nconst getAbortReason = (signal: AbortSignal): unknown => {\n if (signal.reason !== undefined) return signal.reason;\n const error = new Error(\"The operation was aborted\");\n error.name = \"AbortError\";\n return error;\n};\n\nconst raceWithAbortSignal = <T>(\n signal: AbortSignal | undefined,\n operation: () => T | PromiseLike<T>,\n): Promise<T> => {\n if (!signal) return Promise.resolve().then(operation);\n if (signal.aborted) return Promise.reject(getAbortReason(signal));\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = () => signal.removeEventListener(\"abort\", handleAbort);\n const resolveOnce = (value: T) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(value);\n };\n const rejectOnce = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n };\n const handleAbort = () => rejectOnce(getAbortReason(signal));\n\n signal.addEventListener(\"abort\", handleAbort, { once: true });\n let result: T | PromiseLike<T>;\n try {\n result = operation();\n } catch (error) {\n rejectOnce(error);\n return;\n }\n Promise.resolve(result).then(resolveOnce, rejectOnce);\n });\n};\n\nconst SKIPPED_FRAME_SNIPPET_LENGTH = 120;\n\nfunction describeSkippedFrame(data: string, reason: string): string {\n const collapsed = data.replace(/\\s+/g, \" \");\n const snippet =\n collapsed.length > SKIPPED_FRAME_SNIPPET_LENGTH\n ? `${collapsed.slice(0, SKIPPED_FRAME_SNIPPET_LENGTH)}…`\n : collapsed;\n return `${reason} (frame: ${snippet})`;\n}\n\nexport class A2AClient {\n private baseUrl: string;\n private basePath: string;\n private tenant: string | undefined;\n private extensionUris: string[] | undefined;\n private fetchOptions: Omit<\n RequestInit,\n \"headers\" | \"body\" | \"method\" | \"signal\"\n >;\n private headersFn:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\n constructor(options: A2AClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n this.basePath = options.basePath\n ? `/${options.basePath.replace(/^\\/|\\/$/g, \"\")}`\n : \"\";\n this.tenant = options.tenant;\n this.extensionUris = options.extensions;\n const {\n headers: _h,\n body: _b,\n method: _m,\n signal: _s,\n ...safeFetchOptions\n } = (options.fetchOptions ?? {}) as RequestInit;\n this.fetchOptions = safeFetchOptions;\n this.headersFn = options.headers ?? {};\n }\n\n private getBasePath(): string {\n return `${this.basePath}${this.tenant ? `/${encodeURIComponent(this.tenant)}` : \"\"}`;\n }\n\n private async getHeaders(\n includeContentType = true,\n signal?: AbortSignal,\n ): Promise<Record<string, string>> {\n const custom =\n typeof this.headersFn === \"function\"\n ? await raceWithAbortSignal(signal, this.headersFn)\n : this.headersFn;\n const headers: Record<string, string> = {\n Accept: \"application/a2a+json, application/json\",\n \"A2A-Version\": A2A_PROTOCOL_VERSION,\n ...custom,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/a2a+json\";\n }\n if (this.extensionUris?.length) {\n headers[\"A2A-Extensions\"] = this.extensionUris.join(\", \");\n }\n return headers;\n }\n\n private async throwResponseError(response: Response): Promise<never> {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n // no parseable body\n }\n\n if (errorBody && typeof errorBody === \"object\" && \"error\" in errorBody) {\n const err = (errorBody as Record<string, any>).error;\n throw new A2AError({\n code: err.code ?? response.status,\n status: err.status ?? response.statusText,\n message: err.message ?? `A2A request failed: ${response.status}`,\n details: err.details,\n });\n }\n\n throw new A2AError({\n code: response.status,\n status: response.statusText,\n message: `A2A request failed: ${response.status} ${response.statusText}`,\n });\n }\n\n private async fetchJSON<T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> {\n const isGet = !options.method || options.method.toUpperCase() === \"GET\";\n const headers = await this.getHeaders(!isGet, options.signal ?? undefined);\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...this.fetchOptions,\n ...options,\n headers: {\n ...headers,\n ...(options.headers as Record<string, string>),\n },\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n if (json && typeof json === \"object\" && \"jsonrpc\" in json) {\n if (\"error\" in json && json.error) {\n throw toJsonRpcError(json.error);\n }\n if (\"result\" in json) {\n const result = normalizeKeys(json.result);\n if (isRecord(result) && typeof result.kind === \"string\") {\n const { kind: _kind, ...rest } = result;\n return rest as T;\n }\n return result as T;\n }\n }\n return normalizeKeys(json) as T;\n }\n\n // --- Agent Card ---\n\n async getAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const headers = await this.getHeaders(false, signal); // GET: no Content-Type\n const url = `${this.baseUrl}/.well-known/agent-card.json`;\n const response = await fetch(url, {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n return parseAgentCardResponse(normalizeKeys(json));\n }\n\n async getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/extendedAgentCard`,\n signalInit(signal),\n );\n return parseAgentCardResponse(result);\n }\n\n // --- Message ---\n\n async sendMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask | A2AMessage> {\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/message:send`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n\n return parseSendMessageResponse(result);\n }\n\n async *streamMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(true, signal);\n headers.Accept = \"text/event-stream\";\n\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/message:stream`,\n {\n ...this.fetchOptions,\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n return yield* this.parseSSE(response);\n }\n\n // --- Tasks ---\n\n async getTask(\n taskId: string,\n historyLength?: number,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const params = new URLSearchParams();\n if (historyLength !== undefined) {\n // Proto field name for HTTP transcoding query params\n params.set(\"history_length\", String(historyLength));\n }\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseTaskResponse(result, \"tasks:get\");\n }\n\n async listTasks(\n request?: A2AListTasksRequest,\n signal?: AbortSignal,\n ): Promise<A2AListTasksResponse> {\n const params = new URLSearchParams();\n if (request?.contextId) params.set(\"context_id\", request.contextId);\n if (request?.status) params.set(\"status\", toWireTaskState(request.status));\n if (request?.pageSize !== undefined)\n params.set(\"page_size\", String(request.pageSize));\n if (request?.pageToken) params.set(\"page_token\", request.pageToken);\n if (request?.historyLength !== undefined)\n params.set(\"history_length\", String(request.historyLength));\n if (request?.statusTimestampAfter)\n params.set(\"status_timestamp_after\", request.statusTimestampAfter);\n if (request?.includeArtifacts !== undefined)\n params.set(\"include_artifacts\", String(request.includeArtifacts));\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTasksResponse(result);\n }\n\n async cancelTask(\n taskId: string,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const body = metadata ? { metadata } : {};\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:cancel`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n return parseTaskResponse(result, \"tasks:cancel\");\n }\n\n async *subscribeToTask(\n taskId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(false, signal); // GET: no Content-Type\n headers.Accept = \"text/event-stream\";\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:subscribe`,\n {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n yield* this.parseSSE(response);\n }\n\n // --- Push Notification Configs ---\n\n async createTaskPushNotificationConfig(\n config: A2ATaskPushNotificationConfig,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const taskId = config.taskId;\n if (!taskId) throw new Error(\"taskId is required\");\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs`,\n {\n method: \"POST\",\n body: JSON.stringify(config),\n ...signalInit(signal),\n },\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:create\"),\n );\n }\n\n async getTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n signalInit(signal),\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:get\"),\n );\n }\n\n async listTaskPushNotificationConfigs(\n taskId: string,\n options?: { pageSize?: number; pageToken?: string },\n signal?: AbortSignal,\n ): Promise<A2AListTaskPushNotificationConfigsResponse> {\n const params = new URLSearchParams();\n if (options?.pageSize !== undefined)\n params.set(\"page_size\", String(options.pageSize));\n if (options?.pageToken) params.set(\"page_token\", options.pageToken);\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTaskPushNotificationConfigsResponse(result);\n }\n\n async deleteTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const isGet = false;\n const headers = await this.getHeaders(!isGet, signal);\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n {\n ...this.fetchOptions,\n method: \"DELETE\",\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n }\n\n // --- SSE Parsing ---\n\n private async *parseSSE(\n response: Response,\n ): AsyncGenerator<A2AStreamEvent, string | undefined> {\n const contentType = response.headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\", 1)[0]?.trim().toLowerCase();\n if (mediaType !== \"text/event-stream\") {\n const received = contentType\n ? `\"${contentType}\"`\n : \"no Content-Type header\";\n void response.body?.cancel().catch(() => undefined);\n throw new Error(\n `Expected A2A stream response Content-Type \"text/event-stream\", received ${received}`,\n );\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n const sseDecoder = new SSEEventDecoder();\n\n let firstSkipReason: string | undefined;\n const noteSkip = (data: string, reason: string) => {\n firstSkipReason ??= describeSkippedFrame(data, reason);\n };\n\n const readEvent = (event: SSEEvent): A2AStreamEvent | null => {\n try {\n let parsed = JSON.parse(event.data);\n\n if (parsed && typeof parsed === \"object\" && \"jsonrpc\" in parsed) {\n if (\"error\" in parsed && parsed.error) {\n throw toJsonRpcError(parsed.error);\n }\n if (\"result\" in parsed) {\n parsed = parsed.result;\n }\n }\n\n const normalized = normalizeKeys(parsed) as Record<string, unknown>;\n const streamEvent = discriminateStreamResponse(normalized);\n if (!streamEvent) noteSkip(event.data, \"unrecognized event shape\");\n return streamEvent;\n } catch (error) {\n if (error instanceof A2AError) throw error;\n noteSkip(\n event.data,\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n };\n\n let shouldCancel = true;\n try {\n while (true) {\n let result: ReadableStreamReadResult<Uint8Array>;\n try {\n result = await reader.read();\n } catch (error) {\n shouldCancel = false;\n throw error;\n }\n\n const { done, value } = result;\n if (done) {\n shouldCancel = false;\n for (const event of sseDecoder.push(decoder.decode())) {\n const parsed = readEvent(event);\n if (parsed) yield parsed;\n }\n break;\n }\n\n for (const event of sseDecoder.push(\n decoder.decode(value, { stream: true }),\n )) {\n const parsed = readEvent(event);\n if (parsed) yield parsed;\n }\n }\n } finally {\n try {\n if (shouldCancel) await reader.cancel().catch(() => undefined);\n } finally {\n reader.releaseLock();\n }\n }\n\n return firstSkipReason;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"A2AClient.js","names":[],"sources":["../src/A2AClient.ts"],"sourcesContent":["import { SSEEventDecoder, type SSEEvent } from \"assistant-stream/utils\";\nimport { isRecord, raceWithAbortSignal } 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 /** Maximum UTF-16 code units accepted in one SSE line. Defaults to 16 MiB. */\n maxStreamLineLength?: number | undefined;\n /** Maximum UTF-16 code units retained across one SSE event. Defaults to 16 MiB. */\n maxStreamEventLength?: number | 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 maxStreamLineLength: number | undefined;\n private maxStreamEventLength: number | 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 this.maxStreamLineLength = options.maxStreamLineLength;\n this.maxStreamEventLength = options.maxStreamEventLength;\n const {\n headers: _h,\n body: _b,\n method: _m,\n signal: _s,\n ...safeFetchOptions\n } = (options.fetchOptions ?? {}) as RequestInit;\n this.fetchOptions = safeFetchOptions;\n this.headersFn = options.headers ?? {};\n }\n\n private getBasePath(): string {\n return `${this.basePath}${this.tenant ? `/${encodeURIComponent(this.tenant)}` : \"\"}`;\n }\n\n private async getHeaders(\n includeContentType = true,\n signal?: AbortSignal,\n ): Promise<Record<string, string>> {\n const custom =\n typeof this.headersFn === \"function\"\n ? await raceWithAbortSignal(signal, this.headersFn)\n : this.headersFn;\n const headers: Record<string, string> = {\n Accept: \"application/a2a+json, application/json\",\n \"A2A-Version\": A2A_PROTOCOL_VERSION,\n ...custom,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/a2a+json\";\n }\n if (this.extensionUris?.length) {\n headers[\"A2A-Extensions\"] = this.extensionUris.join(\", \");\n }\n return headers;\n }\n\n private async throwResponseError(response: Response): Promise<never> {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n // no parseable body\n }\n\n if (errorBody && typeof errorBody === \"object\" && \"error\" in errorBody) {\n const err = (errorBody as Record<string, any>).error;\n throw new A2AError({\n code: err.code ?? response.status,\n status: err.status ?? response.statusText,\n message: err.message ?? `A2A request failed: ${response.status}`,\n details: err.details,\n });\n }\n\n throw new A2AError({\n code: response.status,\n status: response.statusText,\n message: `A2A request failed: ${response.status} ${response.statusText}`,\n });\n }\n\n private async fetchJSON<T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> {\n const isGet = !options.method || options.method.toUpperCase() === \"GET\";\n const headers = await this.getHeaders(!isGet, options.signal ?? undefined);\n const response = await fetch(`${this.baseUrl}${path}`, {\n ...this.fetchOptions,\n ...options,\n headers: {\n ...headers,\n ...(options.headers as Record<string, string>),\n },\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n if (json && typeof json === \"object\" && \"jsonrpc\" in json) {\n if (\"error\" in json && json.error) {\n throw toJsonRpcError(json.error);\n }\n if (\"result\" in json) {\n const result = normalizeKeys(json.result);\n if (isRecord(result) && typeof result.kind === \"string\") {\n const { kind: _kind, ...rest } = result;\n return rest as T;\n }\n return result as T;\n }\n }\n return normalizeKeys(json) as T;\n }\n\n // --- Agent Card ---\n\n async getAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const headers = await this.getHeaders(false, signal); // GET: no Content-Type\n const url = `${this.baseUrl}/.well-known/agent-card.json`;\n const response = await fetch(url, {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n });\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n const json = await response.json();\n return parseAgentCardResponse(normalizeKeys(json));\n }\n\n async getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/extendedAgentCard`,\n signalInit(signal),\n );\n return parseAgentCardResponse(result);\n }\n\n // --- Message ---\n\n async sendMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask | A2AMessage> {\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/message:send`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n\n return parseSendMessageResponse(result);\n }\n\n async *streamMessage(\n message: A2AMessage,\n configuration?: A2ASendMessageConfiguration,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(true, signal);\n headers.Accept = \"text/event-stream\";\n\n const body: Record<string, unknown> = {\n message: toWireMessage(message),\n };\n if (configuration) body.configuration = configuration;\n if (metadata) body.metadata = metadata;\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/message:stream`,\n {\n ...this.fetchOptions,\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n return yield* this.parseSSE(response);\n }\n\n // --- Tasks ---\n\n async getTask(\n taskId: string,\n historyLength?: number,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const params = new URLSearchParams();\n if (historyLength !== undefined) {\n // Proto field name for HTTP transcoding query params\n params.set(\"history_length\", String(historyLength));\n }\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseTaskResponse(result, \"tasks:get\");\n }\n\n async listTasks(\n request?: A2AListTasksRequest,\n signal?: AbortSignal,\n ): Promise<A2AListTasksResponse> {\n const params = new URLSearchParams();\n if (request?.contextId) params.set(\"context_id\", request.contextId);\n if (request?.status) params.set(\"status\", toWireTaskState(request.status));\n if (request?.pageSize !== undefined)\n params.set(\"page_size\", String(request.pageSize));\n if (request?.pageToken) params.set(\"page_token\", request.pageToken);\n if (request?.historyLength !== undefined)\n params.set(\"history_length\", String(request.historyLength));\n if (request?.statusTimestampAfter)\n params.set(\"status_timestamp_after\", request.statusTimestampAfter);\n if (request?.includeArtifacts !== undefined)\n params.set(\"include_artifacts\", String(request.includeArtifacts));\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTasksResponse(result);\n }\n\n async cancelTask(\n taskId: string,\n metadata?: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<A2ATask> {\n const body = metadata ? { metadata } : {};\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:cancel`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n return parseTaskResponse(result, \"tasks:cancel\");\n }\n\n async *subscribeToTask(\n taskId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<A2AStreamEvent> {\n const headers = await this.getHeaders(false, signal); // GET: no Content-Type\n headers.Accept = \"text/event-stream\";\n\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:subscribe`,\n {\n ...this.fetchOptions,\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n\n yield* this.parseSSE(response);\n }\n\n // --- Push Notification Configs ---\n\n async createTaskPushNotificationConfig(\n config: A2ATaskPushNotificationConfig,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const taskId = config.taskId;\n if (!taskId) throw new Error(\"taskId is required\");\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs`,\n {\n method: \"POST\",\n body: JSON.stringify(config),\n ...signalInit(signal),\n },\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:create\"),\n );\n }\n\n async getTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n signalInit(signal),\n );\n return parseTaskPushNotificationConfigResponse(\n result,\n invalidPushNotificationConfigResponse(\"pushNotificationConfigs:get\"),\n );\n }\n\n async listTaskPushNotificationConfigs(\n taskId: string,\n options?: { pageSize?: number; pageToken?: string },\n signal?: AbortSignal,\n ): Promise<A2AListTaskPushNotificationConfigsResponse> {\n const params = new URLSearchParams();\n if (options?.pageSize !== undefined)\n params.set(\"page_size\", String(options.pageSize));\n if (options?.pageToken) params.set(\"page_token\", options.pageToken);\n const qs = params.toString();\n const result = await this.fetchJSON<unknown>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\n return parseListTaskPushNotificationConfigsResponse(result);\n }\n\n async deleteTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<void> {\n const isGet = false;\n const headers = await this.getHeaders(!isGet, signal);\n const response = await fetch(\n `${this.baseUrl}${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n {\n ...this.fetchOptions,\n method: \"DELETE\",\n headers,\n ...signalInit(signal),\n },\n );\n if (!response.ok) {\n await this.throwResponseError(response);\n }\n }\n\n // --- SSE Parsing ---\n\n private async *parseSSE(\n response: Response,\n ): AsyncGenerator<A2AStreamEvent, string | undefined> {\n const contentType = response.headers.get(\"Content-Type\");\n const mediaType = contentType?.split(\";\", 1)[0]?.trim().toLowerCase();\n if (mediaType !== \"text/event-stream\") {\n const received = contentType\n ? `\"${contentType}\"`\n : \"no Content-Type header\";\n void response.body?.cancel().catch(() => undefined);\n throw new Error(\n `Expected A2A stream response Content-Type \"text/event-stream\", received ${received}`,\n );\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n\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 const sseDecoder = new SSEEventDecoder({\n maxLineLength: this.maxStreamLineLength,\n maxEventLength: this.maxStreamEventLength,\n });\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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"}
|
|
@@ -9,7 +9,6 @@ export type A2AThreadRuntimeCoreOptions = {
|
|
|
9
9
|
onCancel?: (() => void) | undefined;
|
|
10
10
|
onArtifactComplete?: ((artifact: A2AArtifact) => void) | undefined;
|
|
11
11
|
history?: ThreadHistoryAdapter | undefined;
|
|
12
|
-
notifyUpdate: () => void;
|
|
13
12
|
};
|
|
14
13
|
export declare class A2AThreadRuntimeCore {
|
|
15
14
|
private client;
|
|
@@ -19,12 +18,13 @@ export declare class A2AThreadRuntimeCore {
|
|
|
19
18
|
private onCancel;
|
|
20
19
|
private onArtifactComplete;
|
|
21
20
|
private history;
|
|
22
|
-
private readonly
|
|
21
|
+
private readonly listeners;
|
|
22
|
+
private snapshot;
|
|
23
23
|
private runtime;
|
|
24
24
|
private readonly session;
|
|
25
25
|
private isRunningFlag;
|
|
26
26
|
private abortController;
|
|
27
|
-
private
|
|
27
|
+
private readonly runLeases;
|
|
28
28
|
private pendingError;
|
|
29
29
|
private currentTask;
|
|
30
30
|
private currentArtifacts;
|
|
@@ -44,7 +44,17 @@ export declare class A2AThreadRuntimeCore {
|
|
|
44
44
|
private _agentCardDiscoveryFailed;
|
|
45
45
|
private lastOptionsContextId;
|
|
46
46
|
constructor(options: A2AThreadRuntimeCoreOptions);
|
|
47
|
-
|
|
47
|
+
subscribe: (listener: () => void) => (() => void);
|
|
48
|
+
getSnapshot: () => {
|
|
49
|
+
isLoading: boolean;
|
|
50
|
+
isRunning: boolean;
|
|
51
|
+
messageRepository: ExportedMessageRepository;
|
|
52
|
+
task: A2ATask | undefined;
|
|
53
|
+
artifacts: readonly A2AArtifact[];
|
|
54
|
+
agentCard: A2AAgentCard | undefined;
|
|
55
|
+
};
|
|
56
|
+
private publishUpdate;
|
|
57
|
+
updateOptions(options: A2AThreadRuntimeCoreOptions): void;
|
|
48
58
|
/** Thread-boundary reset: applyExternalMessages alone also serves branch
|
|
49
59
|
* switches, deletes, and cancel resyncs, which must keep the live context. */
|
|
50
60
|
resetContext(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2AThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../src/A2AThreadRuntimeCore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,yBAAyB,EAIzB,oBAAoB,EACpB,aAAa,EAEb,qCAAqC,EACtC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"A2AThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../src/A2AThreadRuntimeCore.ts"],"names":[],"mappings":"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"}
|