@assistant-ui/react-a2a 0.2.20 → 0.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,15 @@
1
1
  import { A2AAgentCard, A2AErrorInfo, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskPushNotificationConfig } from "./types.js";
2
-
3
2
  //#region src/A2AClient.d.ts
4
3
  type A2AClientOptions = {
5
- baseUrl: string; /** Optional path prefix for all API endpoints (e.g. "/v1"). Does not affect agent card discovery. */
6
- basePath?: string | undefined; /** Optional tenant ID for multi-tenant servers. */
4
+ baseUrl: string;
5
+ /** Optional path prefix for all API endpoints (e.g. "/v1"). Does not affect agent card discovery. */
6
+ basePath?: string | undefined;
7
+ /** Optional tenant ID for multi-tenant servers. */
7
8
  tenant?: string | undefined;
8
- headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>) | undefined; /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */
9
- extensions?: string[] | undefined; /** Extra fetch options applied to every request. */
9
+ headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>) | undefined;
10
+ /** A2A extension URIs to negotiate. Sent as A2A-Extensions header. */
11
+ extensions?: string[] | undefined;
12
+ /** Extra fetch options applied to every request. */
10
13
  fetchOptions?: Omit<RequestInit, "headers" | "body" | "method" | "signal"> | undefined;
11
14
  };
12
15
  declare class A2AError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"A2AClient.d.ts","names":[],"sources":["../src/A2AClient.ts"],"mappings":";;;KAgBY,gBAAA;EACV,OAAA,UADU;EAGV,QAAA;EAEA,MAAA;EACA,OAAA,GACI,MAAA,0BACO,MAAA,mBAAyB,OAAA,CAAQ,MAAA,gCAAA;EAG5C,UAAA,yBAGS;EADT,YAAA,GACI,IAAA,CAAK,WAAA;AAAA;AAAA,cAIE,QAAA,SAAiB,KAAK;EACjC,IAAA;EACA,MAAA;EACA,OAAA;cAEY,IAAA,EAAM,YAAA;AAAA;AAAA,cAuHP,SAAA;EAAA,QACH,OAAA;EAAA,QACA,QAAA;EAAA,QACA,MAAA;EAAA,QACA,aAAA;EAAA,QACA,YAAA;EAAA,QAIA,SAAA;cAII,OAAA,EAAS,gBAAA;EAAA,QAkBb,WAAA;EAAA,QAIM,UAAA;EAAA,QAqBA,kBAAA;EAAA,QAyBA,SAAA;EAuBR,YAAA,CAAa,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,YAAA;EAe5C,oBAAA,CAAqB,MAAA,GAAS,WAAA,GAAc,OAAA,CAAQ,YAAA;EASpD,WAAA,CACJ,OAAA,EAAS,UAAA,EACT,aAAA,GAAgB,2BAAA,EAChB,QAAA,GAAW,MAAA,mBACX,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,OAAA,GAAU,UAAA;EAuBd,aAAA,CACL,OAAA,EAAS,UAAA,EACT,aAAA,GAAgB,2BAAA,EAChB,QAAA,GAAW,MAAA,mBACX,MAAA,GAAS,WAAA,GACR,cAAA,CAAe,cAAA;EA6BZ,OAAA,CACJ,MAAA,UACA,aAAA,WACA,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,OAAA;EAaL,SAAA,CACJ,OAAA,GAAU,mBAAA,EACV,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,oBAAA;EAoBL,UAAA,CACJ,MAAA,UACA,QAAA,GAAW,MAAA,mBACX,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,OAAA;EAYJ,eAAA,CACL,MAAA,UACA,MAAA,GAAS,WAAA,GACR,cAAA,CAAe,cAAA;EAqBZ,gCAAA,CACJ,MAAA,EAAQ,6BAAA,EACR,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,6BAAA;EAaL,6BAAA,CACJ,MAAA,UACA,QAAA,UACA,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,6BAAA;EAOL,+BAAA,CACJ,MAAA,UACA,OAAA;IAAY,QAAA;IAAmB,SAAA;EAAA,GAC/B,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,0CAAA;EAYL,gCAAA,CACJ,MAAA,UACA,QAAA,UACA,MAAA,GAAS,WAAA,GACR,OAAA;EAAA,QAmBY,QAAA;AAAA"}
1
+ {"version":3,"file":"A2AClient.d.ts","names":[],"sources":["../src/A2AClient.ts"],"mappings":";;KAiBY;EACV;;EAEA;;EAEA;EACA,UACI,gCACO,yBAAyB,QAAQ;;EAG5C;;EAEA,eACI,KAAK;;cAIE,iBAAiB;EAC5B;EACA;EACA;cAEY,MAAM;;cAuHP;UACH;UACA;UACA;UACA;UACA;UAIA;cAII,SAAS;UAkBb;UAIM;UAqBA;UAyBA;EAuBR,aAAa,SAAS,cAAc,QAAQ;EAe5C,qBAAqB,SAAS,cAAc,QAAQ;EASpD,YACJ,SAAS,YACT,gBAAgB,6BAChB,WAAW,yBACX,SAAS,cACR,QAAQ,UAAU;EAuBd,cACL,SAAS,YACT,gBAAgB,6BAChB,WAAW,yBACX,SAAS,cACR,eAAe;EA6BZ,QACJ,gBACA,wBACA,SAAS,cACR,QAAQ;EAaL,UACJ,UAAU,qBACV,SAAS,cACR,QAAQ;EAoBL,WACJ,gBACA,WAAW,yBACX,SAAS,cACR,QAAQ;EAYJ,gBACL,gBACA,SAAS,cACR,eAAe;EAqBZ,iCACJ,QAAQ,+BACR,SAAS,cACR,QAAQ;EAaL,8BACJ,gBACA,kBACA,SAAS,cACR,QAAQ;EAOL,gCACJ,gBACA;IAAY;IAAmB;KAC/B,SAAS,cACR,QAAQ;EAYL,iCACJ,gBACA,kBACA,SAAS,cACR;UAmBY"}
package/dist/A2AClient.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import "./types.js";
2
+ import { SSEEventDecoder } from "assistant-stream/utils";
2
3
  //#region src/A2AClient.ts
3
4
  var A2AError = class extends Error {
4
5
  code;
@@ -15,7 +16,7 @@ var A2AError = class extends Error {
15
16
  function toCamelCase(key) {
16
17
  return key.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
17
18
  }
18
- const OPAQUE_FIELDS = new Set([
19
+ const OPAQUE_FIELDS = /* @__PURE__ */ new Set([
19
20
  "metadata",
20
21
  "data",
21
22
  "params",
@@ -251,32 +252,37 @@ var A2AClient = class {
251
252
  if (!response.ok) await this.throwResponseError(response);
252
253
  }
253
254
  async *parseSSE(response) {
255
+ const contentType = response.headers.get("Content-Type");
256
+ if (contentType?.split(";", 1)[0]?.trim().toLowerCase() !== "text/event-stream") {
257
+ const received = contentType ? `"${contentType}"` : "no Content-Type header";
258
+ throw new Error(`Expected A2A stream response Content-Type "text/event-stream", received ${received}`);
259
+ }
254
260
  const reader = response.body?.getReader();
255
261
  if (!reader) throw new Error("No response body");
256
262
  const decoder = new TextDecoder();
257
- let buffer = "";
263
+ const sseDecoder = new SSEEventDecoder();
264
+ const readEvent = (event) => {
265
+ try {
266
+ let parsed = JSON.parse(event.data);
267
+ if (parsed && typeof parsed === "object" && "jsonrpc" in parsed && "result" in parsed) parsed = parsed.result;
268
+ return discriminateStreamResponse(normalizeKeys(parsed));
269
+ } catch {
270
+ return null;
271
+ }
272
+ };
258
273
  try {
259
274
  while (true) {
260
275
  const { done, value } = await reader.read();
261
- if (done) break;
262
- buffer += decoder.decode(value, { stream: true });
263
- let eventEnd = buffer.indexOf("\n\n");
264
- while (eventEnd !== -1) {
265
- const eventText = buffer.slice(0, eventEnd);
266
- buffer = buffer.slice(eventEnd + 2);
267
- const dataLines = [];
268
- for (const line of eventText.split("\n")) {
269
- const trimmed = line.replace(/\r$/, "");
270
- if (trimmed.startsWith("data:")) dataLines.push(trimmed.slice(5).trim());
276
+ if (done) {
277
+ for (const event of sseDecoder.push(decoder.decode())) {
278
+ const parsed = readEvent(event);
279
+ if (parsed) yield parsed;
271
280
  }
272
- if (dataLines.length === 0) continue;
273
- try {
274
- let parsed = JSON.parse(dataLines.join("\n"));
275
- if (parsed && typeof parsed === "object" && "jsonrpc" in parsed && "result" in parsed) parsed = parsed.result;
276
- const event = discriminateStreamResponse(normalizeKeys(parsed));
277
- if (event) yield event;
278
- } catch {}
279
- eventEnd = buffer.indexOf("\n\n");
281
+ break;
282
+ }
283
+ for (const event of sseDecoder.push(decoder.decode(value, { stream: true }))) {
284
+ const parsed = readEvent(event);
285
+ if (parsed) yield parsed;
280
286
  }
281
287
  }
282
288
  } finally {
@@ -1 +1 @@
1
- {"version":3,"file":"A2AClient.js","names":[],"sources":["../src/A2AClient.ts"],"sourcesContent":["import 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\nfunction signalInit(signal?: AbortSignal): RequestInit {\n return signal ? { signal } : {};\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 normalizeKeys(json) as A2AAgentCard;\n }\n\n async getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n return this.fetchJSON<A2AAgentCard>(\n `${this.getBasePath()}/extendedAgentCard`,\n signalInit(signal),\n );\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<Record<string, unknown>>(\n `${this.getBasePath()}/message:send`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n\n // Unwrap SendMessageResponse: {task: Task} | {message: Message}\n if (\"task\" in result && result.task) return result.task as A2ATask;\n if (\"message\" in result && result.message)\n return result.message as A2AMessage;\n return result as unknown as A2ATask | A2AMessage;\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 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 return this.fetchJSON<A2ATask>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\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 return this.fetchJSON<A2AListTasksResponse>(\n `${this.getBasePath()}/tasks${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\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 return this.fetchJSON<A2ATask>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:cancel`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\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 return this.fetchJSON<A2ATaskPushNotificationConfig>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs`,\n {\n method: \"POST\",\n body: JSON.stringify(config),\n ...signalInit(signal),\n },\n );\n }\n\n async getTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n return this.fetchJSON<A2ATaskPushNotificationConfig>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n signalInit(signal),\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 return this.fetchJSON<A2AListTaskPushNotificationConfigsResponse>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\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(response: Response): AsyncGenerator<A2AStreamEvent> {\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n let eventEnd: number = buffer.indexOf(\"\\n\\n\");\n while (eventEnd !== -1) {\n const eventText = buffer.slice(0, eventEnd);\n buffer = buffer.slice(eventEnd + 2);\n\n const dataLines: string[] = [];\n\n for (const line of eventText.split(\"\\n\")) {\n const trimmed = line.replace(/\\r$/, \"\");\n if (trimmed.startsWith(\"data:\")) {\n dataLines.push(trimmed.slice(5).trim());\n }\n // event:, id:, retry: lines are parsed but not used —\n // we discriminate event type from the JSON payload.\n }\n\n if (dataLines.length === 0) continue;\n\n try {\n let parsed = JSON.parse(dataLines.join(\"\\n\"));\n\n // Unwrap JSON-RPC envelope if present\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 event = discriminateStreamResponse(normalized);\n if (event) yield event;\n } catch {\n // Skip malformed events\n }\n eventEnd = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\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 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\nfunction signalInit(signal?: AbortSignal): RequestInit {\n return signal ? { signal } : {};\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 normalizeKeys(json) as A2AAgentCard;\n }\n\n async getExtendedAgentCard(signal?: AbortSignal): Promise<A2AAgentCard> {\n return this.fetchJSON<A2AAgentCard>(\n `${this.getBasePath()}/extendedAgentCard`,\n signalInit(signal),\n );\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<Record<string, unknown>>(\n `${this.getBasePath()}/message:send`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\n\n // Unwrap SendMessageResponse: {task: Task} | {message: Message}\n if (\"task\" in result && result.task) return result.task as A2ATask;\n if (\"message\" in result && result.message)\n return result.message as A2AMessage;\n return result as unknown as A2ATask | A2AMessage;\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 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 return this.fetchJSON<A2ATask>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\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 return this.fetchJSON<A2AListTasksResponse>(\n `${this.getBasePath()}/tasks${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\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 return this.fetchJSON<A2ATask>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}:cancel`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n ...signalInit(signal),\n },\n );\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 return this.fetchJSON<A2ATaskPushNotificationConfig>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs`,\n {\n method: \"POST\",\n body: JSON.stringify(config),\n ...signalInit(signal),\n },\n );\n }\n\n async getTaskPushNotificationConfig(\n taskId: string,\n configId: string,\n signal?: AbortSignal,\n ): Promise<A2ATaskPushNotificationConfig> {\n return this.fetchJSON<A2ATaskPushNotificationConfig>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs/${encodeURIComponent(configId)}`,\n signalInit(signal),\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 return this.fetchJSON<A2AListTaskPushNotificationConfigsResponse>(\n `${this.getBasePath()}/tasks/${encodeURIComponent(taskId)}/pushNotificationConfigs${qs ? `?${qs}` : \"\"}`,\n signalInit(signal),\n );\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(response: Response): AsyncGenerator<A2AStreamEvent> {\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 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 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 return discriminateStreamResponse(normalized);\n } catch {\n return null;\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\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 reader.releaseLock();\n }\n }\n}\n"],"mappings":";;;AAmCA,IAAa,WAAb,cAA8B,MAAM;CAClC;CACA;CACA;CAEA,YAAY,MAAoB;EAC9B,MAAM,KAAK,OAAO;EAClB,KAAK,OAAO;EACZ,KAAK,OAAO,KAAK;EACjB,KAAK,SAAS,KAAK;EACnB,KAAK,UAAU,KAAK;CACtB;AACF;AAGA,SAAS,YAAY,KAAqB;CACxC,OAAO,IAAI,QAAQ,cAAc,GAAG,MAAc,EAAE,YAAY,CAAC;AACnE;AAIA,MAAM,gCAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,cAAc,KAAc,SAAS,OAAgB;CAC5D,IAAI,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,KAAK,MAAM,cAAc,GAAG,MAAM,CAAC;CACtE,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;EAC3C,MAAM,SAAkC,CAAC;EACzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAA8B,GAAG;GAEzE,IAAI,QAAQ;IACV,OAAO,OACL,OAAO,UAAU,YAAY,UAAU,OACnC,cAAc,OAAO,IAAI,IACzB;IACN;GACF;GAEA,MAAM,WAAW,YAAY,GAAG;GAChC,MAAM,gBAAgB,cAAc,IAAI,QAAQ;GAEhD,IACE,aAAa,WACb,OAAO,UAAU,YACjB,MAAM,WAAW,aAAa,GAE9B,OAAO,YAAY,MAAM,MAAM,EAAE,CAAC,CAAC,YAAY;QAC1C,IACL,aAAa,UACb,OAAO,UAAU,YACjB,MAAM,WAAW,OAAO,GAExB,OAAO,YAAY,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY;QACzC,IAAI,aAAa,aAAa,MAAM,QAAQ,KAAK,GAEtD,OAAO,QAAQ,cAAc,OAAO,KAAK;QACpC,IAAI,aAAa,WAAW,EAAE,WAAW,SAE9C,OAAO,YAAY,gBAAgB,QAAQ,cAAc,OAAO,KAAK;EAEzE;EACA,OAAO;CACT;CACA,OAAO;AACT;AAGA,SAAS,WAAW,MAAuB;CACzC,IAAI,SAAS,QAAQ,OAAO;CAC5B,IAAI,SAAS,SAAS,OAAO;CAC7B,OAAO;AACT;AAEA,SAAS,gBAAgB,OAA6B;CACpD,OAAO,cAAc,MAAM,YAAY;AACzC;AAEA,SAAS,cAAc,KAA0B;CAC/C,OAAO;EAAE,GAAG;EAAK,MAAM,WAAW,IAAI,IAAI;CAAE;AAC9C;AAEA,SAAS,2BACP,MACuB;CACvB,IAAI,UAAU,QAAQ,KAAK,MACzB,OAAO;EAAE,MAAM;EAAQ,MAAM,KAAK;CAAgB;CAEpD,IAAI,aAAa,QAAQ,KAAK,SAC5B,OAAO;EAAE,MAAM;EAAW,SAAS,KAAK;CAAsB;CAEhE,IAAI,kBAAkB,QAAQ,KAAK,cACjC,OAAO;EACL,MAAM;EACN,OAAO,KAAK;CAMd;CAEF,IAAI,oBAAoB,QAAQ,KAAK,gBACnC,OAAO;EACL,MAAM;EACN,OAAO,KAAK;CAMd;CAEF,OAAO;AACT;AAEA,SAAS,WAAW,QAAmC;CACrD,OAAO,SAAS,EAAE,OAAO,IAAI,CAAC;AAChC;AAEA,IAAa,YAAb,MAAuB;CACrB;CACA;CACA;CACA;CACA;CAIA;CAIA,YAAY,SAA2B;EACrC,KAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;EAChD,KAAK,WAAW,QAAQ,WACpB,IAAI,QAAQ,SAAS,QAAQ,YAAY,EAAE,MAC3C;EACJ,KAAK,SAAS,QAAQ;EACtB,KAAK,gBAAgB,QAAQ;EAC7B,MAAM,EACJ,SAAS,IACT,MAAM,IACN,QAAQ,IACR,QAAQ,IACR,GAAG,qBACA,QAAQ,gBAAgB,CAAC;EAC9B,KAAK,eAAe;EACpB,KAAK,YAAY,QAAQ,WAAW,CAAC;CACvC;CAEA,cAA8B;EAC5B,OAAO,GAAG,KAAK,WAAW,KAAK,SAAS,IAAI,mBAAmB,KAAK,MAAM,MAAM;CAClF;CAEA,MAAc,WACZ,qBAAqB,MACY;EAKjC,MAAM,UAAkC;GACtC,QAAQ;GACR,eAAA;GACA,GANA,OAAO,KAAK,cAAc,aACtB,MAAM,KAAK,UAAU,IACrB,KAAK;EAKX;EACA,IAAI,oBACF,QAAQ,kBAAkB;EAE5B,IAAI,KAAK,eAAe,QACtB,QAAQ,oBAAoB,KAAK,cAAc,KAAK,IAAI;EAE1D,OAAO;CACT;CAEA,MAAc,mBAAmB,UAAoC;EACnE,IAAI;EACJ,IAAI;GACF,YAAY,MAAM,SAAS,KAAK;EAClC,QAAQ,CAER;EAEA,IAAI,aAAa,OAAO,cAAc,YAAY,WAAW,WAAW;GACtE,MAAM,MAAO,UAAkC;GAC/C,MAAM,IAAI,SAAS;IACjB,MAAM,IAAI,QAAQ,SAAS;IAC3B,QAAQ,IAAI,UAAU,SAAS;IAC/B,SAAS,IAAI,WAAW,uBAAuB,SAAS;IACxD,SAAS,IAAI;GACf,CAAC;EACH;EAEA,MAAM,IAAI,SAAS;GACjB,MAAM,SAAS;GACf,QAAQ,SAAS;GACjB,SAAS,uBAAuB,SAAS,OAAO,GAAG,SAAS;EAC9D,CAAC;CACH;CAEA,MAAc,UACZ,MACA,UAAuB,CAAC,GACZ;EACZ,MAAM,QAAQ,CAAC,QAAQ,UAAU,QAAQ,OAAO,YAAY,MAAM;EAClE,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC,KAAK;EAC5C,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,UAAU,QAAQ;GACrD,GAAG,KAAK;GACR,GAAG;GACH,SAAS;IACP,GAAG;IACH,GAAI,QAAQ;GACd;EACF,CAAC;EACD,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAGxC,OAAO,cAAc,MADF,SAAS,KAAK,CACR;CAC3B;CAIA,MAAM,aAAa,QAA6C;EAC9D,MAAM,UAAU,MAAM,KAAK,WAAW,KAAK;EAC3C,MAAM,MAAM,GAAG,KAAK,QAAQ;EAC5B,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,GAAG,KAAK;GACR;GACA,GAAG,WAAW,MAAM;EACtB,CAAC;EACD,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAGxC,OAAO,cAAc,MADF,SAAS,KAAK,CACR;CAC3B;CAEA,MAAM,qBAAqB,QAA6C;EACtE,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,qBACtB,WAAW,MAAM,CACnB;CACF;CAIA,MAAM,YACJ,SACA,eACA,UACA,QAC+B;EAC/B,MAAM,OAAgC,EACpC,SAAS,cAAc,OAAO,EAChC;EACA,IAAI,eAAe,KAAK,gBAAgB;EACxC,IAAI,UAAU,KAAK,WAAW;EAE9B,MAAM,SAAS,MAAM,KAAK,UACxB,GAAG,KAAK,YAAY,EAAE,gBACtB;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,IAAI;GACzB,GAAG,WAAW,MAAM;EACtB,CACF;EAGA,IAAI,UAAU,UAAU,OAAO,MAAM,OAAO,OAAO;EACnD,IAAI,aAAa,UAAU,OAAO,SAChC,OAAO,OAAO;EAChB,OAAO;CACT;CAEA,OAAO,cACL,SACA,eACA,UACA,QACgC;EAChC,MAAM,UAAU,MAAM,KAAK,WAAW,IAAI;EAC1C,QAAQ,SAAS;EAEjB,MAAM,OAAgC,EACpC,SAAS,cAAc,OAAO,EAChC;EACA,IAAI,eAAe,KAAK,gBAAgB;EACxC,IAAI,UAAU,KAAK,WAAW;EAE9B,MAAM,WAAW,MAAM,MACrB,GAAG,KAAK,UAAU,KAAK,YAAY,EAAE,kBACrC;GACE,GAAG,KAAK;GACR,QAAQ;GACR;GACA,MAAM,KAAK,UAAU,IAAI;GACzB,GAAG,WAAW,MAAM;EACtB,CACF;EACA,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAGxC,OAAO,KAAK,SAAS,QAAQ;CAC/B;CAIA,MAAM,QACJ,QACA,eACA,QACkB;EAClB,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,kBAAkB,KAAA,GAEpB,OAAO,IAAI,kBAAkB,OAAO,aAAa,CAAC;EAEpD,MAAM,KAAK,OAAO,SAAS;EAC3B,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,IAAI,KAAK,IAAI,OAAO,MAC5E,WAAW,MAAM,CACnB;CACF;CAEA,MAAM,UACJ,SACA,QAC+B;EAC/B,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,SAAS,WAAW,OAAO,IAAI,cAAc,QAAQ,SAAS;EAClE,IAAI,SAAS,QAAQ,OAAO,IAAI,UAAU,gBAAgB,QAAQ,MAAM,CAAC;EACzE,IAAI,SAAS,aAAa,KAAA,GACxB,OAAO,IAAI,aAAa,OAAO,QAAQ,QAAQ,CAAC;EAClD,IAAI,SAAS,WAAW,OAAO,IAAI,cAAc,QAAQ,SAAS;EAClE,IAAI,SAAS,kBAAkB,KAAA,GAC7B,OAAO,IAAI,kBAAkB,OAAO,QAAQ,aAAa,CAAC;EAC5D,IAAI,SAAS,sBACX,OAAO,IAAI,0BAA0B,QAAQ,oBAAoB;EACnE,IAAI,SAAS,qBAAqB,KAAA,GAChC,OAAO,IAAI,qBAAqB,OAAO,QAAQ,gBAAgB,CAAC;EAClE,MAAM,KAAK,OAAO,SAAS;EAC3B,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,QAAQ,KAAK,IAAI,OAAO,MAC9C,WAAW,MAAM,CACnB;CACF;CAEA,MAAM,WACJ,QACA,UACA,QACkB;EAClB,MAAM,OAAO,WAAW,EAAE,SAAS,IAAI,CAAC;EACxC,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,UAC1D;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,IAAI;GACzB,GAAG,WAAW,MAAM;EACtB,CACF;CACF;CAEA,OAAO,gBACL,QACA,QACgC;EAChC,MAAM,UAAU,MAAM,KAAK,WAAW,KAAK;EAC3C,QAAQ,SAAS;EAEjB,MAAM,WAAW,MAAM,MACrB,GAAG,KAAK,UAAU,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,aACzE;GACE,GAAG,KAAK;GACR;GACA,GAAG,WAAW,MAAM;EACtB,CACF;EACA,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;EAGxC,OAAO,KAAK,SAAS,QAAQ;CAC/B;CAIA,MAAM,iCACJ,QACA,QACwC;EACxC,MAAM,SAAS,OAAO;EACtB,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,oBAAoB;EACjD,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,2BAC1D;GACE,QAAQ;GACR,MAAM,KAAK,UAAU,MAAM;GAC3B,GAAG,WAAW,MAAM;EACtB,CACF;CACF;CAEA,MAAM,8BACJ,QACA,UACA,QACwC;EACxC,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,2BAA2B,mBAAmB,QAAQ,KAChH,WAAW,MAAM,CACnB;CACF;CAEA,MAAM,gCACJ,QACA,SACA,QACqD;EACrD,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,SAAS,aAAa,KAAA,GACxB,OAAO,IAAI,aAAa,OAAO,QAAQ,QAAQ,CAAC;EAClD,IAAI,SAAS,WAAW,OAAO,IAAI,cAAc,QAAQ,SAAS;EAClE,MAAM,KAAK,OAAO,SAAS;EAC3B,OAAO,KAAK,UACV,GAAG,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,0BAA0B,KAAK,IAAI,OAAO,MACpG,WAAW,MAAM,CACnB;CACF;CAEA,MAAM,iCACJ,QACA,UACA,QACe;EAEf,MAAM,UAAU,MAAM,KAAK,WAAW,IAAM;EAC5C,MAAM,WAAW,MAAM,MACrB,GAAG,KAAK,UAAU,KAAK,YAAY,EAAE,SAAS,mBAAmB,MAAM,EAAE,2BAA2B,mBAAmB,QAAQ,KAC/H;GACE,GAAG,KAAK;GACR,QAAQ;GACR;GACA,GAAG,WAAW,MAAM;EACtB,CACF;EACA,IAAI,CAAC,SAAS,IACZ,MAAM,KAAK,mBAAmB,QAAQ;CAE1C;CAIA,OAAe,SAAS,UAAoD;EAC1E,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;EAEvD,IADkB,aAAa,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,YAAY,MAClD,qBAAqB;GACrC,MAAM,WAAW,cACb,IAAI,YAAY,KAChB;GACJ,MAAM,IAAI,MACR,2EAA2E,UAC7E;EACF;EAEA,MAAM,SAAS,SAAS,MAAM,UAAU;EACxC,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,kBAAkB;EAE/C,MAAM,UAAU,IAAI,YAAY;EAChC,MAAM,aAAa,IAAI,gBAAgB;EAEvC,MAAM,aAAa,UAA2C;GAC5D,IAAI;IACF,IAAI,SAAS,KAAK,MAAM,MAAM,IAAI;IAElC,IACE,UACA,OAAO,WAAW,YAClB,aAAa,UACb,YAAY,QAEZ,SAAS,OAAO;IAIlB,OAAO,2BADY,cAAc,MACU,CAAC;GAC9C,QAAQ;IACN,OAAO;GACT;EACF;EAEA,IAAI;GACF,OAAO,MAAM;IACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;IAC1C,IAAI,MAAM;KACR,KAAK,MAAM,SAAS,WAAW,KAAK,QAAQ,OAAO,CAAC,GAAG;MACrD,MAAM,SAAS,UAAU,KAAK;MAC9B,IAAI,QAAQ,MAAM;KACpB;KACA;IACF;IAEA,KAAK,MAAM,SAAS,WAAW,KAC7B,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CACxC,GAAG;KACD,MAAM,SAAS,UAAU,KAAK;KAC9B,IAAI,QAAQ,MAAM;IACpB;GACF;EACF,UAAU;GACR,OAAO,YAAY;EACrB;CACF;AACF"}
@@ -1,7 +1,6 @@
1
1
  import { A2AAgentCard, A2AArtifact, A2ASendMessageConfiguration, A2ATask } from "./types.js";
2
2
  import { A2AClient } from "./A2AClient.js";
3
3
  import { AppendMessage, AssistantRuntime, ThreadHistoryAdapter, ThreadMessage } from "@assistant-ui/core";
4
-
5
4
  //#region src/A2AThreadRuntimeCore.d.ts
6
5
  type A2AThreadRuntimeCoreOptions = {
7
6
  client: A2AClient;
@@ -1 +1 @@
1
- {"version":3,"file":"A2AThreadRuntimeCore.d.ts","names":[],"sources":["../src/A2AThreadRuntimeCore.ts"],"mappings":";;;;;KA6BY,2BAAA;EACV,MAAA,EAAQ,SAAA;EACR,SAAA;EACA,aAAA,GAAgB,2BAAA;EAChB,OAAA,KAAY,KAAA,EAAO,KAAA;EACnB,QAAA;EACA,kBAAA,KAAuB,QAAA,EAAU,WAAA;EACjC,OAAA,GAAU,oBAAA;EACV,YAAA;AAAA;AAAA,cAQW,oBAAA;EAAA,QACH,MAAA;EAAA,QACA,SAAA;EAAA,QACA,aAAA;EAAA,QACA,OAAA;EAAA,QACA,QAAA;EAAA,QACA,kBAAA;EAAA,QACA,OAAA;EAAA,iBACS,YAAA;EAAA,QAET,OAAA;EAAA,QACA,QAAA;EAAA,QACA,aAAA;EAAA,QACA,eAAA;EAAA,QACA,YAAA;EAAA,QAGA,WAAA;EAAA,QACA,gBAAA;EAAA,QACA,cAAA;EAAA,iBAGS,uBAAA;EAAA,iBACA,kBAAA;EAAA,QACT,UAAA;EAAA,QACA,YAAA;cAEI,OAAA,EAAS,2BAAA;EAWrB,aAAA,CAAc,OAAA,EAAS,IAAA,CAAK,2BAAA;EAU5B,aAAA,CAAc,OAAA,EAAS,gBAAA;EAIvB,aAAA;EASA,UAAA,IAAc,gBAAA;EAId,WAAA,aAAwB,aAAA;EAIxB,OAAA,IAAW,OAAA;EAIX,YAAA,aAAyB,WAAA;EAIzB,YAAA,IAAgB,YAAA;EAIhB,SAAA;EAAA,IAII,SAAA;EAIJ,eAAA,IAAmB,OAAA;EAgCb,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA;EAsBhC,IAAA,CAAK,OAAA,EAAS,aAAA,GAAgB,OAAA;EAI9B,MAAA,CACJ,QAAA,iBACA,OAAA;IAAW,SAAA,GAAY,MAAA;EAAA,IACtB,OAAA;EAaG,MAAA,IAAU,OAAA;EAiBhB,qBAAA,CAAsB,QAAA,WAAmB,aAAA;EAAA,QAe3B,QAAA;EAAA,QAwEA,YAAA;EAAA,QA4BA,OAAA;EAAA,QA4BN,iBAAA;EAAA,QAiBA,kBAAA;EAAA,QA6BA,oBAAA;EAAA,QAqCA,aAAA;EAAA,QAQA,kBAAA;EAAA,QAuBA,yBAAA;EAAA,QAiCA,0BAAA;EAAA,QAqBA,sBAAA;EAAA,QAWA,qBAAA;EAAA,QAgBA,kBAAA;EAAA,QASA,UAAA;EAAA,QAKA,SAAA;EAAA,QAOA,SAAA;EAAA,QAcA,kBAAA;EAAA,QAIA,2BAAA;EAAA,QAQA,uBAAA;EAAA,QAeA,iBAAA;AAAA"}
1
+ {"version":3,"file":"A2AThreadRuntimeCore.d.ts","names":[],"sources":["../src/A2AThreadRuntimeCore.ts"],"mappings":";;;;KA6BY;EACV,QAAQ;EACR;EACA,gBAAgB;EAChB,YAAY,OAAO;EACnB;EACA,uBAAuB,UAAU;EACjC,UAAU;EACV;;cAQW;UACH;UACA;UACA;UACA;UACA;UACA;UACA;mBACS;UAET;UACA;UACA;UACA;UACA;UAGA;UACA;UACA;mBAGS;mBACA;UACT;UACA;cAEI,SAAS;EAWrB,cAAc,SAAS,KAAK;EAU5B,cAAc,SAAS;EAIvB;EASA,cAAc;EAId,wBAAwB;EAIxB,WAAW;EAIX,yBAAyB;EAIzB,gBAAgB;EAIhB;MAII;EAIJ,mBAAmB;EAgCb,OAAO,SAAS,gBAAgB;EAsBhC,KAAK,SAAS,gBAAgB;EAI9B,OACJ,yBACA;IAAW,YAAY;MACtB;EAaG,UAAU;EAiBhB,sBAAsB,mBAAmB;UAe3B;UAwEA;UA4BA;UA4BN;UAiBA;UA6BA;UAqCA;UAQA;UAuBA;UAiCA;UAqBA;UAWA;UAgBA;UASA;UAKA;UAOA;UAcA;UAIA;UAQA;UAeA"}
@@ -0,0 +1,6 @@
1
+ import { A2AExtras } from "./types.js";
2
+ //#region src/a2aExtras.d.ts
3
+ declare const a2aExtras: import("@assistant-ui/core/internal").RuntimeExtras<A2AExtras>;
4
+ //#endregion
5
+ export { a2aExtras };
6
+ //# sourceMappingURL=a2aExtras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2aExtras.d.ts","names":[],"sources":["../src/a2aExtras.ts"],"mappings":";;cAGa,iDAAS,cAAA"}
@@ -0,0 +1,7 @@
1
+ import { createRuntimeExtras } from "@assistant-ui/core/internal";
2
+ //#region src/a2aExtras.ts
3
+ const a2aExtras = createRuntimeExtras("useA2ARuntime");
4
+ //#endregion
5
+ export { a2aExtras };
6
+
7
+ //# sourceMappingURL=a2aExtras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2aExtras.js","names":[],"sources":["../src/a2aExtras.ts"],"sourcesContent":["import { createRuntimeExtras } from \"@assistant-ui/core/internal\";\nimport type { A2AExtras } from \"./types\";\n\nexport const a2aExtras = createRuntimeExtras<A2AExtras>(\"useA2ARuntime\");\n"],"mappings":";;AAGA,MAAa,YAAY,oBAA+B,eAAe"}
@@ -1,6 +1,5 @@
1
1
  import { A2AMessage, A2APart, A2ATaskState } from "./types.js";
2
2
  import { MessageStatus, ThreadAssistantMessage } from "@assistant-ui/core";
3
-
4
3
  //#region src/conversions.d.ts
5
4
  declare function a2aPartToContent(part: A2APart): ThreadAssistantMessage["content"][number];
6
5
  declare function a2aPartsToContent(parts: A2APart[]): ThreadAssistantMessage["content"];
@@ -1 +1 @@
1
- {"version":3,"file":"conversions.d.ts","names":[],"sources":["../src/conversions.ts"],"mappings":";;;;iBASgB,gBAAA,CACd,IAAA,EAAM,OAAA,GACL,sBAAsB;AAAA,iBA+BT,iBAAA,CACd,KAAA,EAAO,OAAA,KACN,sBAAsB;AAAA,iBAgBT,mBAAA,CAAoB,KAAmB,EAAZ,YAAY;AAAA,iBAIvC,sBAAA,CAAuB,KAAmB,EAAZ,YAAY;AAAA,iBAI1C,wBAAA,CAAyB,KAAA,EAAO,YAAA,GAAe,aAAa;AAAA,iBAoB5D,sBAAA,CACd,OAAA,EAAS,aAAA;EACP,IAAA;EACA,IAAA;EACA,KAAA;AAAA,KAED,OAAO;AAAA,iBAgBM,mBAAA,CACd,OAAA,EAAS,UAAA,GACR,sBAAsB"}
1
+ {"version":3,"file":"conversions.d.ts","names":[],"sources":["../src/conversions.ts"],"mappings":";;;iBASgB,iBACd,MAAM,UACL;iBA+Ba,kBACd,OAAO,YACN;iBAgBa,oBAAoB,OAAO;iBAI3B,uBAAuB,OAAO;iBAI9B,yBAAyB,OAAO,eAAe;iBAoB/C,uBACd,SAAS;EACP;EACA;EACA;KAED;iBAgBa,oBACd,SAAS,aACR"}
@@ -40,13 +40,13 @@ function a2aPartToContent(part) {
40
40
  function a2aPartsToContent(parts) {
41
41
  return parts.map(a2aPartToContent);
42
42
  }
43
- const TERMINAL_STATES = new Set([
43
+ const TERMINAL_STATES = /* @__PURE__ */ new Set([
44
44
  "completed",
45
45
  "failed",
46
46
  "canceled",
47
47
  "rejected"
48
48
  ]);
49
- const INTERRUPTED_STATES = new Set(["input_required", "auth_required"]);
49
+ const INTERRUPTED_STATES = /* @__PURE__ */ new Set(["input_required", "auth_required"]);
50
50
  function isTerminalTaskState(state) {
51
51
  return TERMINAL_STATES.has(state);
52
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"conversions.js","names":[],"sources":["../src/conversions.ts"],"sourcesContent":["\"use client\";\n\nimport type { MessageStatus, ThreadAssistantMessage } from \"@assistant-ui/core\";\nimport type { A2AMessage, A2APart, A2ATaskState } from \"./types\";\n\nfunction isImageMediaType(mediaType?: string): boolean {\n return !!mediaType && mediaType.startsWith(\"image/\");\n}\n\nexport function a2aPartToContent(\n part: A2APart,\n): ThreadAssistantMessage[\"content\"][number] {\n if (part.text !== undefined) {\n return { type: \"text\", text: part.text };\n }\n if (part.url !== undefined) {\n if (isImageMediaType(part.mediaType)) {\n return { type: \"image\", image: part.url };\n }\n return {\n type: \"text\",\n text: part.filename ? `[${part.filename}](${part.url})` : part.url,\n };\n }\n if (part.raw !== undefined) {\n if (isImageMediaType(part.mediaType)) {\n return {\n type: \"image\",\n image: `data:${part.mediaType};base64,${part.raw}`,\n };\n }\n return {\n type: \"text\",\n text: `[File: ${part.filename ?? \"download\"}]`,\n };\n }\n if (part.data !== undefined) {\n return { type: \"text\", text: JSON.stringify(part.data, null, 2) };\n }\n return { type: \"text\", text: \"\" };\n}\n\nexport function a2aPartsToContent(\n parts: A2APart[],\n): ThreadAssistantMessage[\"content\"] {\n return parts.map(a2aPartToContent);\n}\n\nconst TERMINAL_STATES = new Set<A2ATaskState>([\n \"completed\",\n \"failed\",\n \"canceled\",\n \"rejected\",\n]);\n\nconst INTERRUPTED_STATES = new Set<A2ATaskState>([\n \"input_required\",\n \"auth_required\",\n]);\n\nexport function isTerminalTaskState(state: A2ATaskState): boolean {\n return TERMINAL_STATES.has(state);\n}\n\nexport function isInterruptedTaskState(state: A2ATaskState): boolean {\n return INTERRUPTED_STATES.has(state);\n}\n\nexport function taskStateToMessageStatus(state: A2ATaskState): MessageStatus {\n switch (state) {\n case \"submitted\":\n case \"working\":\n return { type: \"running\" };\n case \"completed\":\n return { type: \"complete\", reason: \"stop\" };\n case \"failed\":\n case \"rejected\":\n return { type: \"incomplete\", reason: \"error\" };\n case \"canceled\":\n return { type: \"incomplete\", reason: \"cancelled\" };\n case \"input_required\":\n case \"auth_required\":\n return { type: \"requires-action\", reason: \"interrupt\" };\n default:\n return { type: \"running\" };\n }\n}\n\nexport function contentPartsToA2AParts(\n content: ReadonlyArray<{\n type: string;\n text?: string;\n image?: string;\n }>,\n): A2APart[] {\n return content\n .map((part): A2APart | null => {\n switch (part.type) {\n case \"text\":\n return { text: part.text ?? \"\" };\n case \"image\":\n if (!part.image) return null;\n return { url: part.image, mediaType: \"image/*\" };\n default:\n return null;\n }\n })\n .filter((p): p is A2APart => p !== null);\n}\n\nexport function a2aMessageToContent(\n message: A2AMessage,\n): ThreadAssistantMessage[\"content\"] {\n return a2aPartsToContent(message.parts);\n}\n"],"mappings":";;AAKA,SAAS,iBAAiB,WAA6B;CACrD,OAAO,CAAC,CAAC,aAAa,UAAU,WAAW,QAAQ;AACrD;AAEA,SAAgB,iBACd,MAC2C;CAC3C,IAAI,KAAK,SAAS,KAAA,GAChB,OAAO;EAAE,MAAM;EAAQ,MAAM,KAAK;CAAK;CAEzC,IAAI,KAAK,QAAQ,KAAA,GAAW;EAC1B,IAAI,iBAAiB,KAAK,SAAS,GACjC,OAAO;GAAE,MAAM;GAAS,OAAO,KAAK;EAAI;EAE1C,OAAO;GACL,MAAM;GACN,MAAM,KAAK,WAAW,IAAI,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK;EACjE;CACF;CACA,IAAI,KAAK,QAAQ,KAAA,GAAW;EAC1B,IAAI,iBAAiB,KAAK,SAAS,GACjC,OAAO;GACL,MAAM;GACN,OAAO,QAAQ,KAAK,UAAU,UAAU,KAAK;EAC/C;EAEF,OAAO;GACL,MAAM;GACN,MAAM,UAAU,KAAK,YAAY,WAAW;EAC9C;CACF;CACA,IAAI,KAAK,SAAS,KAAA,GAChB,OAAO;EAAE,MAAM;EAAQ,MAAM,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC;CAAE;CAElE,OAAO;EAAE,MAAM;EAAQ,MAAM;CAAG;AAClC;AAEA,SAAgB,kBACd,OACmC;CACnC,OAAO,MAAM,IAAI,gBAAgB;AACnC;AAEA,MAAM,kBAAkB,IAAI,IAAkB;CAC5C;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,qBAAqB,IAAI,IAAkB,CAC/C,kBACA,eACF,CAAC;AAED,SAAgB,oBAAoB,OAA8B;CAChE,OAAO,gBAAgB,IAAI,KAAK;AAClC;AAEA,SAAgB,uBAAuB,OAA8B;CACnE,OAAO,mBAAmB,IAAI,KAAK;AACrC;AAEA,SAAgB,yBAAyB,OAAoC;CAC3E,QAAQ,OAAR;EACE,KAAK;EACL,KAAK,WACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,aACH,OAAO;GAAE,MAAM;GAAY,QAAQ;EAAO;EAC5C,KAAK;EACL,KAAK,YACH,OAAO;GAAE,MAAM;GAAc,QAAQ;EAAQ;EAC/C,KAAK,YACH,OAAO;GAAE,MAAM;GAAc,QAAQ;EAAY;EACnD,KAAK;EACL,KAAK,iBACH,OAAO;GAAE,MAAM;GAAmB,QAAQ;EAAY;EACxD,SACE,OAAO,EAAE,MAAM,UAAU;CAC7B;AACF;AAEA,SAAgB,uBACd,SAKW;CACX,OAAO,QACJ,KAAK,SAAyB;EAC7B,QAAQ,KAAK,MAAb;GACE,KAAK,QACH,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG;GACjC,KAAK;IACH,IAAI,CAAC,KAAK,OAAO,OAAO;IACxB,OAAO;KAAE,KAAK,KAAK;KAAO,WAAW;IAAU;GACjD,SACE,OAAO;EACX;CACF,CAAC,CAAC,CACD,QAAQ,MAAoB,MAAM,IAAI;AAC3C;AAEA,SAAgB,oBACd,SACmC;CACnC,OAAO,kBAAkB,QAAQ,KAAK;AACxC"}
1
+ {"version":3,"file":"conversions.js","names":[],"sources":["../src/conversions.ts"],"sourcesContent":["\"use client\";\n\nimport type { MessageStatus, ThreadAssistantMessage } from \"@assistant-ui/core\";\nimport type { A2AMessage, A2APart, A2ATaskState } from \"./types\";\n\nfunction isImageMediaType(mediaType?: string): boolean {\n return !!mediaType && mediaType.startsWith(\"image/\");\n}\n\nexport function a2aPartToContent(\n part: A2APart,\n): ThreadAssistantMessage[\"content\"][number] {\n if (part.text !== undefined) {\n return { type: \"text\", text: part.text };\n }\n if (part.url !== undefined) {\n if (isImageMediaType(part.mediaType)) {\n return { type: \"image\", image: part.url };\n }\n return {\n type: \"text\",\n text: part.filename ? `[${part.filename}](${part.url})` : part.url,\n };\n }\n if (part.raw !== undefined) {\n if (isImageMediaType(part.mediaType)) {\n return {\n type: \"image\",\n image: `data:${part.mediaType};base64,${part.raw}`,\n };\n }\n return {\n type: \"text\",\n text: `[File: ${part.filename ?? \"download\"}]`,\n };\n }\n if (part.data !== undefined) {\n return { type: \"text\", text: JSON.stringify(part.data, null, 2) };\n }\n return { type: \"text\", text: \"\" };\n}\n\nexport function a2aPartsToContent(\n parts: A2APart[],\n): ThreadAssistantMessage[\"content\"] {\n return parts.map(a2aPartToContent);\n}\n\nconst TERMINAL_STATES = new Set<A2ATaskState>([\n \"completed\",\n \"failed\",\n \"canceled\",\n \"rejected\",\n]);\n\nconst INTERRUPTED_STATES = new Set<A2ATaskState>([\n \"input_required\",\n \"auth_required\",\n]);\n\nexport function isTerminalTaskState(state: A2ATaskState): boolean {\n return TERMINAL_STATES.has(state);\n}\n\nexport function isInterruptedTaskState(state: A2ATaskState): boolean {\n return INTERRUPTED_STATES.has(state);\n}\n\nexport function taskStateToMessageStatus(state: A2ATaskState): MessageStatus {\n switch (state) {\n case \"submitted\":\n case \"working\":\n return { type: \"running\" };\n case \"completed\":\n return { type: \"complete\", reason: \"stop\" };\n case \"failed\":\n case \"rejected\":\n return { type: \"incomplete\", reason: \"error\" };\n case \"canceled\":\n return { type: \"incomplete\", reason: \"cancelled\" };\n case \"input_required\":\n case \"auth_required\":\n return { type: \"requires-action\", reason: \"interrupt\" };\n default:\n return { type: \"running\" };\n }\n}\n\nexport function contentPartsToA2AParts(\n content: ReadonlyArray<{\n type: string;\n text?: string;\n image?: string;\n }>,\n): A2APart[] {\n return content\n .map((part): A2APart | null => {\n switch (part.type) {\n case \"text\":\n return { text: part.text ?? \"\" };\n case \"image\":\n if (!part.image) return null;\n return { url: part.image, mediaType: \"image/*\" };\n default:\n return null;\n }\n })\n .filter((p): p is A2APart => p !== null);\n}\n\nexport function a2aMessageToContent(\n message: A2AMessage,\n): ThreadAssistantMessage[\"content\"] {\n return a2aPartsToContent(message.parts);\n}\n"],"mappings":";;AAKA,SAAS,iBAAiB,WAA6B;CACrD,OAAO,CAAC,CAAC,aAAa,UAAU,WAAW,QAAQ;AACrD;AAEA,SAAgB,iBACd,MAC2C;CAC3C,IAAI,KAAK,SAAS,KAAA,GAChB,OAAO;EAAE,MAAM;EAAQ,MAAM,KAAK;CAAK;CAEzC,IAAI,KAAK,QAAQ,KAAA,GAAW;EAC1B,IAAI,iBAAiB,KAAK,SAAS,GACjC,OAAO;GAAE,MAAM;GAAS,OAAO,KAAK;EAAI;EAE1C,OAAO;GACL,MAAM;GACN,MAAM,KAAK,WAAW,IAAI,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK;EACjE;CACF;CACA,IAAI,KAAK,QAAQ,KAAA,GAAW;EAC1B,IAAI,iBAAiB,KAAK,SAAS,GACjC,OAAO;GACL,MAAM;GACN,OAAO,QAAQ,KAAK,UAAU,UAAU,KAAK;EAC/C;EAEF,OAAO;GACL,MAAM;GACN,MAAM,UAAU,KAAK,YAAY,WAAW;EAC9C;CACF;CACA,IAAI,KAAK,SAAS,KAAA,GAChB,OAAO;EAAE,MAAM;EAAQ,MAAM,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC;CAAE;CAElE,OAAO;EAAE,MAAM;EAAQ,MAAM;CAAG;AAClC;AAEA,SAAgB,kBACd,OACmC;CACnC,OAAO,MAAM,IAAI,gBAAgB;AACnC;AAEA,MAAM,kCAAkB,IAAI,IAAkB;CAC5C;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,qCAAqB,IAAI,IAAkB,CAC/C,kBACA,eACF,CAAC;AAED,SAAgB,oBAAoB,OAA8B;CAChE,OAAO,gBAAgB,IAAI,KAAK;AAClC;AAEA,SAAgB,uBAAuB,OAA8B;CACnE,OAAO,mBAAmB,IAAI,KAAK;AACrC;AAEA,SAAgB,yBAAyB,OAAoC;CAC3E,QAAQ,OAAR;EACE,KAAK;EACL,KAAK,WACH,OAAO,EAAE,MAAM,UAAU;EAC3B,KAAK,aACH,OAAO;GAAE,MAAM;GAAY,QAAQ;EAAO;EAC5C,KAAK;EACL,KAAK,YACH,OAAO;GAAE,MAAM;GAAc,QAAQ;EAAQ;EAC/C,KAAK,YACH,OAAO;GAAE,MAAM;GAAc,QAAQ;EAAY;EACnD,KAAK;EACL,KAAK,iBACH,OAAO;GAAE,MAAM;GAAmB,QAAQ;EAAY;EACxD,SACE,OAAO,EAAE,MAAM,UAAU;CAC7B;AACF;AAEA,SAAgB,uBACd,SAKW;CACX,OAAO,QACJ,KAAK,SAAyB;EAC7B,QAAQ,KAAK,MAAb;GACE,KAAK,QACH,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG;GACjC,KAAK;IACH,IAAI,CAAC,KAAK,OAAO,OAAO;IACxB,OAAO;KAAE,KAAK,KAAK;KAAO,WAAW;IAAU;GACjD,SACE,OAAO;EACX;CACF,CAAC,CAAC,CACD,QAAQ,MAAoB,MAAM,IAAI;AAC3C;AAEA,SAAgB,oBACd,SACmC;CACnC,OAAO,kBAAkB,QAAQ,KAAK;AACxC"}
@@ -0,0 +1,11 @@
1
+ import { A2AAgentCard, A2AArtifact, A2ATask } from "./types.js";
2
+ //#region src/hooks.d.ts
3
+ /** The current A2A task, if a run is in progress. */
4
+ declare const useA2ATask: () => A2ATask | undefined;
5
+ /** The artifacts accumulated for the current A2A run. */
6
+ declare const useA2AArtifacts: () => readonly A2AArtifact[];
7
+ /** The discovered A2A agent card. */
8
+ declare const useA2AAgentCard: () => A2AAgentCard | undefined;
9
+ //#endregion
10
+ export { useA2AAgentCard, useA2AArtifacts, useA2ATask };
11
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","names":[],"sources":["../src/hooks.ts"],"mappings":";;;cAKa,kBAAA;;cAGA,gCAAA;;cAGA,uBAAA"}
package/dist/hooks.js ADDED
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { a2aExtras } from "./a2aExtras.js";
3
+ //#region src/hooks.ts
4
+ /** The current A2A task, if a run is in progress. */
5
+ const useA2ATask = () => a2aExtras.use((e) => e.task);
6
+ /** The artifacts accumulated for the current A2A run. */
7
+ const useA2AArtifacts = () => a2aExtras.use((e) => e.artifacts);
8
+ /** The discovered A2A agent card. */
9
+ const useA2AAgentCard = () => a2aExtras.use((e) => e.agentCard);
10
+ //#endregion
11
+ export { useA2AAgentCard, useA2AArtifacts, useA2ATask };
12
+
13
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","names":[],"sources":["../src/hooks.ts"],"sourcesContent":["\"use client\";\n\nimport { a2aExtras } from \"./a2aExtras\";\n\n/** The current A2A task, if a run is in progress. */\nexport const useA2ATask = () => a2aExtras.use((e) => e.task);\n\n/** The artifacts accumulated for the current A2A run. */\nexport const useA2AArtifacts = () => a2aExtras.use((e) => e.artifacts);\n\n/** The discovered A2A agent card. */\nexport const useA2AAgentCard = () => a2aExtras.use((e) => e.agentCard);\n"],"mappings":";;;;AAKA,MAAa,mBAAmB,UAAU,KAAK,MAAM,EAAE,IAAI;;AAG3D,MAAa,wBAAwB,UAAU,KAAK,MAAM,EAAE,SAAS;;AAGrE,MAAa,wBAAwB,UAAU,KAAK,MAAM,EAAE,SAAS"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { A2AAgentCapabilities, A2AAgentCard, A2AAgentCardSignature, A2AAgentInterface, A2AAgentSkill, A2AApiKeySecurityScheme, A2AArtifact, A2AAuthenticationInfo, A2AAuthorizationCodeOAuthFlow, A2AClientCredentialsOAuthFlow, A2ADeviceCodeOAuthFlow, A2AErrorInfo, A2AHttpAuthSecurityScheme, A2AImplicitOAuthFlow, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2AMutualTlsSecurityScheme, A2AOAuth2SecurityScheme, A2AOAuthFlows, A2AOpenIdConnectSecurityScheme, A2APart, A2APasswordOAuthFlow, A2ARole, A2ASecurityRequirement, A2ASecurityScheme, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskArtifactUpdateEvent, A2ATaskPushNotificationConfig, A2ATaskState, A2ATaskStatus, A2ATaskStatusUpdateEvent, A2A_PROTOCOL_VERSION } from "./types.js";
1
+ import { A2AAgentCapabilities, A2AAgentCard, A2AAgentCardSignature, A2AAgentInterface, A2AAgentSkill, A2AApiKeySecurityScheme, A2AArtifact, A2AAuthenticationInfo, A2AAuthorizationCodeOAuthFlow, A2AClientCredentialsOAuthFlow, A2ADeviceCodeOAuthFlow, A2AErrorInfo, A2AHttpAuthSecurityScheme, A2AImplicitOAuthFlow, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2AMutualTlsSecurityScheme, A2AOAuth2SecurityScheme, A2AOAuthFlows, A2AOpenIdConnectSecurityScheme, A2APart, A2APasswordOAuthFlow, A2ARole, A2ASecurityRequirement, A2ASecurityScheme, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskArtifactUpdateEvent, A2ATaskPushNotificationConfig, A2ATaskState, A2ATaskStatus, A2ATaskStatusUpdateEvent, A2A_PROTOCOL_VERSION, UseA2ARuntimeOptions, UseA2AThreadListAdapter } from "./types.js";
2
2
  import { A2AClient, A2AClientOptions, A2AError } from "./A2AClient.js";
3
3
  import { a2aMessageToContent, a2aPartToContent, a2aPartsToContent, contentPartsToA2AParts, isInterruptedTaskState, isTerminalTaskState, taskStateToMessageStatus } from "./conversions.js";
4
- import { UseA2ARuntimeOptions, UseA2AThreadListAdapter, useA2AAgentCard, useA2AArtifacts, useA2ARuntime, useA2ATask } from "./useA2ARuntime.js";
4
+ import { useA2AAgentCard, useA2AArtifacts, useA2ATask } from "./hooks.js";
5
+ import { useA2ARuntime } from "./useA2ARuntime.js";
5
6
  export { type A2AAgentCapabilities, type A2AAgentCard, type A2AAgentCardSignature, type A2AAgentInterface, type A2AAgentSkill, type A2AApiKeySecurityScheme, type A2AArtifact, type A2AAuthenticationInfo, type A2AAuthorizationCodeOAuthFlow, A2AClient, type A2AClientCredentialsOAuthFlow, type A2AClientOptions, type A2ADeviceCodeOAuthFlow, A2AError, type A2AErrorInfo, type A2AHttpAuthSecurityScheme, type A2AImplicitOAuthFlow, type A2AListTaskPushNotificationConfigsResponse, type A2AListTasksRequest, type A2AListTasksResponse, type A2AMessage, type A2AMutualTlsSecurityScheme, type A2AOAuth2SecurityScheme, type A2AOAuthFlows, type A2AOpenIdConnectSecurityScheme, type A2APart, type A2APasswordOAuthFlow, type A2ARole, type A2ASecurityRequirement, type A2ASecurityScheme, type A2ASendMessageConfiguration, type A2AStreamEvent, type A2ATask, type A2ATaskArtifactUpdateEvent, type A2ATaskPushNotificationConfig, type A2ATaskState, type A2ATaskStatus, type A2ATaskStatusUpdateEvent, A2A_PROTOCOL_VERSION, type UseA2ARuntimeOptions, type UseA2AThreadListAdapter, a2aMessageToContent, a2aPartToContent, a2aPartsToContent, contentPartsToA2AParts, isInterruptedTaskState, isTerminalTaskState, taskStateToMessageStatus, useA2AAgentCard, useA2AArtifacts, useA2ARuntime, useA2ATask };
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { A2A_PROTOCOL_VERSION } from "./types.js";
2
2
  import { A2AClient, A2AError } from "./A2AClient.js";
3
3
  import { a2aMessageToContent, a2aPartToContent, a2aPartsToContent, contentPartsToA2AParts, isInterruptedTaskState, isTerminalTaskState, taskStateToMessageStatus } from "./conversions.js";
4
- import { useA2AAgentCard, useA2AArtifacts, useA2ARuntime, useA2ATask } from "./useA2ARuntime.js";
4
+ import { useA2AAgentCard, useA2AArtifacts, useA2ATask } from "./hooks.js";
5
+ import { useA2ARuntime } from "./useA2ARuntime.js";
5
6
  export { A2AClient, A2AError, A2A_PROTOCOL_VERSION, a2aMessageToContent, a2aPartToContent, a2aPartsToContent, contentPartsToA2AParts, isInterruptedTaskState, isTerminalTaskState, taskStateToMessageStatus, useA2AAgentCard, useA2AArtifacts, useA2ARuntime, useA2ATask };
package/dist/types.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { A2AClient, A2AClientOptions } from "./A2AClient.js";
2
+ import { AttachmentAdapter, DictationAdapter, ExternalStoreSharedOptions, FeedbackAdapter, RealtimeVoiceAdapter, SpeechSynthesisAdapter, ThreadHistoryAdapter, ThreadMessage } from "@assistant-ui/core";
1
3
  //#region src/types.d.ts
2
4
  declare const A2A_PROTOCOL_VERSION = "1.0";
3
5
  type A2ARole = "unspecified" | "user" | "agent";
@@ -154,8 +156,10 @@ type A2APasswordOAuthFlow = {
154
156
  };
155
157
  type A2AOAuthFlows = {
156
158
  authorizationCode?: A2AAuthorizationCodeOAuthFlow | undefined;
157
- clientCredentials?: A2AClientCredentialsOAuthFlow | undefined; /** @deprecated */
158
- implicit?: A2AImplicitOAuthFlow | undefined; /** @deprecated */
159
+ clientCredentials?: A2AClientCredentialsOAuthFlow | undefined;
160
+ /** @deprecated */
161
+ implicit?: A2AImplicitOAuthFlow | undefined;
162
+ /** @deprecated */
159
163
  password?: A2APasswordOAuthFlow | undefined;
160
164
  deviceCode?: A2ADeviceCodeOAuthFlow | undefined;
161
165
  };
@@ -234,6 +238,54 @@ type A2AAgentCard = {
234
238
  signatures?: A2AAgentCardSignature[] | undefined;
235
239
  iconUrl?: string | undefined;
236
240
  };
241
+ /** Private state `useA2ARuntime` exposes through `thread.extras`. */
242
+ type A2AExtras = {
243
+ task: A2ATask | undefined;
244
+ artifacts: readonly A2AArtifact[];
245
+ agentCard: A2AAgentCard | undefined;
246
+ };
247
+ type UseA2AThreadListAdapter = {
248
+ threadId?: string;
249
+ onSwitchToNewThread?: () => Promise<void> | void;
250
+ onSwitchToThread?: (threadId: string) => Promise<{
251
+ messages: readonly ThreadMessage[];
252
+ }>;
253
+ };
254
+ type UseA2ARuntimeOptions = ExternalStoreSharedOptions & {
255
+ /** Pre-built A2A client instance. Provide this OR baseUrl. */
256
+ client?: A2AClient;
257
+ /** Base URL of the A2A server. Used to create a client if `client` is not provided. */
258
+ baseUrl?: string;
259
+ /** Optional path prefix for all API endpoints (e.g. "/v1"). Does not affect agent card discovery. Only used with baseUrl. */
260
+ basePath?: string;
261
+ /** Optional tenant ID for multi-tenant servers. Only used with baseUrl. */
262
+ tenant?: string;
263
+ /** Headers for the A2A client (only used with baseUrl). */
264
+ headers?: A2AClientOptions["headers"];
265
+ /** A2A extension URIs to negotiate. Only used with baseUrl. */
266
+ extensions?: string[];
267
+ /** Extra fetch options (e.g. `{ credentials: 'include' }`). Only used with `baseUrl`. */
268
+ fetchOptions?: A2AClientOptions["fetchOptions"];
269
+ /** Initial context ID for the conversation. */
270
+ contextId?: string;
271
+ /** Default send message configuration. */
272
+ configuration?: A2ASendMessageConfiguration;
273
+ /** Called when an error occurs. */
274
+ onError?: (error: Error) => void;
275
+ /** Called when a run is cancelled. */
276
+ onCancel?: () => void;
277
+ /** Called when an artifact is fully received (lastChunk). */
278
+ onArtifactComplete?: (artifact: A2AArtifact) => void;
279
+ adapters?: {
280
+ attachments?: AttachmentAdapter;
281
+ speech?: SpeechSynthesisAdapter;
282
+ dictation?: DictationAdapter;
283
+ voice?: RealtimeVoiceAdapter;
284
+ feedback?: FeedbackAdapter;
285
+ history?: ThreadHistoryAdapter;
286
+ threadList?: UseA2AThreadListAdapter;
287
+ };
288
+ };
237
289
  //#endregion
238
- export { A2AAgentCapabilities, A2AAgentCard, A2AAgentCardSignature, A2AAgentInterface, A2AAgentSkill, A2AApiKeySecurityScheme, A2AArtifact, A2AAuthenticationInfo, A2AAuthorizationCodeOAuthFlow, A2AClientCredentialsOAuthFlow, A2ADeviceCodeOAuthFlow, A2AErrorInfo, A2AHttpAuthSecurityScheme, A2AImplicitOAuthFlow, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2AMutualTlsSecurityScheme, A2AOAuth2SecurityScheme, A2AOAuthFlows, A2AOpenIdConnectSecurityScheme, A2APart, A2APasswordOAuthFlow, A2ARole, A2ASecurityRequirement, A2ASecurityScheme, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskArtifactUpdateEvent, A2ATaskPushNotificationConfig, A2ATaskState, A2ATaskStatus, A2ATaskStatusUpdateEvent, A2A_PROTOCOL_VERSION };
290
+ export { A2AAgentCapabilities, A2AAgentCard, A2AAgentCardSignature, A2AAgentInterface, A2AAgentSkill, A2AApiKeySecurityScheme, A2AArtifact, A2AAuthenticationInfo, A2AAuthorizationCodeOAuthFlow, A2AClientCredentialsOAuthFlow, A2ADeviceCodeOAuthFlow, A2AErrorInfo, A2AExtras, A2AHttpAuthSecurityScheme, A2AImplicitOAuthFlow, A2AListTaskPushNotificationConfigsResponse, A2AListTasksRequest, A2AListTasksResponse, A2AMessage, A2AMutualTlsSecurityScheme, A2AOAuth2SecurityScheme, A2AOAuthFlows, A2AOpenIdConnectSecurityScheme, A2APart, A2APasswordOAuthFlow, A2ARole, A2ASecurityRequirement, A2ASecurityScheme, A2ASendMessageConfiguration, A2AStreamEvent, A2ATask, A2ATaskArtifactUpdateEvent, A2ATaskPushNotificationConfig, A2ATaskState, A2ATaskStatus, A2ATaskStatusUpdateEvent, A2A_PROTOCOL_VERSION, UseA2ARuntimeOptions, UseA2AThreadListAdapter };
239
291
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;cAgBa;KAED;KAEA;EACV;EACA;EACA;EACA;EAEA,WAAW;EACX;EACA;;KAGU;EACV;EACA;EACA;EACA,MAAM;EACN,OAAO;EACP,WAAW;EACX;EACA;;KAGU;KAWA;EACV,OAAO;EACP,UAAU;EACV;;KAGU;EACV;EACA;EACA;EACA,OAAO;EACP,WAAW;EACX;;KAGU;EACV;EACA;EACA,QAAQ;EACR,YAAY;EACZ,UAAU;EACV,WAAW;;KAID;EACV;EACA;EACA,QAAQ;EACR,WAAW;;KAGD;EACV;EACA;EACA,UAAU;EACV;EACA;EACA,WAAW;;KAGD;EACN;EAAc,MAAM;;EACpB;EAAiB,SAAS;;EAC1B;EAAsB,OAAO;;EAC7B;EAAwB,OAAO;;KAEzB;EACV;EACA;;KAGU;EACV;EACA;EACA;EACA;EACA;EACA,iBAAiB;;KAGP;EACV,SAAS;EACT;;KAGU;EACV;EACA,6BAA6B;EAC7B;EACA;;KAGU;EACV;EACA,SAAS;EACT;EACA;EACA;EACA;EACA;;KAGU;EACV,OAAO;EACP;EACA;EACA;;KAIU;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA;;KAGU;EACV;EACA;EACA;EACA,QAAQ;EACR;;KAGU;EACV;EACA;EACA,QAAQ;;KAGE;EACV;EACA;EACA;EACA,QAAQ;;;KAIE;EACV;EACA;EACA,SAAS;;;KAIC;EACV;EACA;EACA,SAAS;;KAGC;EACV,oBAAoB;EACpB,oBAAoB;;EAEpB,WAAW;;EAEX,WAAW;EACX,aAAa;;KAGH;EACV;EACA,OAAO;EACP;;KAGU;EACV;EACA;;KAGU;EACV;;KAGU;EACV,uBAAuB;EACvB,yBAAyB;EACzB,uBAAuB;EACvB,8BAA8B;EAC9B,qBAAqB;;KAGX;EACV,SAAS;IAAiB;;;KAIhB;EACV;EACA;EACA,SAAS;;KAGC;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA,uBAAuB;;KAGb;EACV;EACA;EACA,aACI;IACE;IACA;IACA;IACA,SAAS;;EAGf;;KAGU;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA,qBAAqB;EACrB;IAEM;IACA;;EAGN;EACA;EACA,cAAc;EACd,kBAAkB,eAAe;EACjC,uBAAuB;EACvB;EACA;EACA,QAAQ;EACR,aAAa;EACb;;;KAIU;EACV,MAAM;EACN,oBAAoB;EACpB,WAAW;;KAGD;EACV;EACA,4BAA4B;EAC5B,oBAAoB,qBAAqB;IACvC,mBAAmB;;;KAIX,uBAAuB;;EAEjC,SAAS;;EAET;;EAEA;;EAEA;;EAEA,UAAU;;EAEV;;EAEA,eAAe;;EAGf;;EAEA,gBAAgB;;EAGhB,WAAW,OAAO;;EAElB;;EAEA,sBAAsB,UAAU;EAEhC;IACE,cAAc;IACd,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,UAAU;IACV,aAAa"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["// A2A v1.0 Protocol Types\n// Enum values use lowercase internally; normalized from ProtoJSON SCREAMING_SNAKE_CASE on read.\n// Wire format uses ROLE_USER/ROLE_AGENT and TASK_STATE_* per ADR-001.\n\nexport const A2A_PROTOCOL_VERSION = \"1.0\";\n\nexport type A2ARole = \"unspecified\" | \"user\" | \"agent\";\n\nexport type A2APart = {\n text?: string | undefined;\n raw?: string | undefined; // base64 encoded bytes\n url?: string | undefined;\n data?: unknown; // google.protobuf.Value\n\n metadata?: Record<string, unknown> | undefined;\n filename?: string | undefined;\n mediaType?: string | undefined; // MIME type\n};\n\nexport type A2AMessage = {\n messageId: string;\n contextId?: string | undefined;\n taskId?: string | undefined;\n role: A2ARole;\n parts: A2APart[];\n metadata?: Record<string, unknown> | undefined;\n extensions?: string[] | undefined;\n referenceTaskIds?: string[] | undefined;\n};\n\nexport type A2ATaskState =\n | \"unspecified\"\n | \"submitted\"\n | \"working\"\n | \"completed\"\n | \"failed\"\n | \"canceled\"\n | \"input_required\"\n | \"rejected\"\n | \"auth_required\";\n\nexport type A2ATaskStatus = {\n state: A2ATaskState;\n message?: A2AMessage | undefined;\n timestamp?: string | undefined; // ISO 8601\n};\n\nexport type A2AArtifact = {\n artifactId: string;\n name?: string | undefined;\n description?: string | undefined;\n parts: A2APart[];\n metadata?: Record<string, unknown> | undefined;\n extensions?: string[] | undefined;\n};\n\nexport type A2ATask = {\n id: string;\n contextId?: string | undefined;\n status: A2ATaskStatus;\n artifacts?: A2AArtifact[] | undefined;\n history?: A2AMessage[] | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\n// Streaming events\nexport type A2ATaskStatusUpdateEvent = {\n taskId: string;\n contextId: string; // REQUIRED per proto\n status: A2ATaskStatus;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type A2ATaskArtifactUpdateEvent = {\n taskId: string;\n contextId: string; // REQUIRED per proto\n artifact: A2AArtifact;\n append?: boolean | undefined;\n lastChunk?: boolean | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type A2AStreamEvent =\n | { type: \"task\"; task: A2ATask }\n | { type: \"message\"; message: A2AMessage }\n | { type: \"statusUpdate\"; event: A2ATaskStatusUpdateEvent }\n | { type: \"artifactUpdate\"; event: A2ATaskArtifactUpdateEvent };\n\nexport type A2AAuthenticationInfo = {\n scheme: string;\n credentials?: string | undefined;\n};\n\nexport type A2ATaskPushNotificationConfig = {\n tenant?: string | undefined;\n id?: string | undefined;\n taskId?: string | undefined;\n url: string;\n token?: string | undefined;\n authentication?: A2AAuthenticationInfo | undefined;\n};\n\nexport type A2AListTaskPushNotificationConfigsResponse = {\n configs: A2ATaskPushNotificationConfig[];\n nextPageToken?: string | undefined;\n};\n\nexport type A2ASendMessageConfiguration = {\n acceptedOutputModes?: string[] | undefined;\n taskPushNotificationConfig?: A2ATaskPushNotificationConfig | undefined;\n historyLength?: number | undefined;\n returnImmediately?: boolean | undefined;\n};\n\nexport type A2AListTasksRequest = {\n contextId?: string | undefined;\n status?: A2ATaskState | undefined;\n pageSize?: number | undefined;\n pageToken?: string | undefined;\n historyLength?: number | undefined;\n statusTimestampAfter?: string | undefined; // ISO 8601\n includeArtifacts?: boolean | undefined;\n};\n\nexport type A2AListTasksResponse = {\n tasks: A2ATask[];\n nextPageToken: string;\n pageSize: number;\n totalSize: number;\n};\n\n// Structured error (google.rpc.Status)\nexport type A2AErrorInfo = {\n code: number;\n status: string;\n message: string;\n details?: unknown[] | undefined;\n};\n\nexport type A2AApiKeySecurityScheme = {\n description?: string | undefined;\n location: string; // \"query\" | \"header\" | \"cookie\"\n name: string;\n};\n\nexport type A2AHttpAuthSecurityScheme = {\n description?: string | undefined;\n scheme: string; // e.g. \"Bearer\"\n bearerFormat?: string | undefined;\n};\n\nexport type A2AAuthorizationCodeOAuthFlow = {\n authorizationUrl: string;\n tokenUrl: string;\n refreshUrl?: string | undefined;\n scopes: Record<string, string>;\n pkceRequired?: boolean | undefined;\n};\n\nexport type A2AClientCredentialsOAuthFlow = {\n tokenUrl: string;\n refreshUrl?: string | undefined;\n scopes: Record<string, string>;\n};\n\nexport type A2ADeviceCodeOAuthFlow = {\n deviceAuthorizationUrl: string;\n tokenUrl: string;\n refreshUrl?: string | undefined;\n scopes: Record<string, string>;\n};\n\n/** @deprecated Use Authorization Code + PKCE instead. */\nexport type A2AImplicitOAuthFlow = {\n authorizationUrl?: string | undefined;\n refreshUrl?: string | undefined;\n scopes?: Record<string, string> | undefined;\n};\n\n/** @deprecated Use Authorization Code + PKCE or Device Code. */\nexport type A2APasswordOAuthFlow = {\n tokenUrl?: string | undefined;\n refreshUrl?: string | undefined;\n scopes?: Record<string, string> | undefined;\n};\n\nexport type A2AOAuthFlows = {\n authorizationCode?: A2AAuthorizationCodeOAuthFlow | undefined;\n clientCredentials?: A2AClientCredentialsOAuthFlow | undefined;\n /** @deprecated */\n implicit?: A2AImplicitOAuthFlow | undefined;\n /** @deprecated */\n password?: A2APasswordOAuthFlow | undefined;\n deviceCode?: A2ADeviceCodeOAuthFlow | undefined;\n};\n\nexport type A2AOAuth2SecurityScheme = {\n description?: string | undefined;\n flows: A2AOAuthFlows;\n oauth2MetadataUrl?: string | undefined;\n};\n\nexport type A2AOpenIdConnectSecurityScheme = {\n description?: string | undefined;\n openIdConnectUrl: string;\n};\n\nexport type A2AMutualTlsSecurityScheme = {\n description?: string | undefined;\n};\n\nexport type A2ASecurityScheme = {\n apiKeySecurityScheme?: A2AApiKeySecurityScheme | undefined;\n httpAuthSecurityScheme?: A2AHttpAuthSecurityScheme | undefined;\n oauth2SecurityScheme?: A2AOAuth2SecurityScheme | undefined;\n openIdConnectSecurityScheme?: A2AOpenIdConnectSecurityScheme | undefined;\n mtlsSecurityScheme?: A2AMutualTlsSecurityScheme | undefined;\n};\n\nexport type A2ASecurityRequirement = {\n schemes: Record<string, { list: string[] }>;\n};\n\n// Agent card signature (JWS)\nexport type A2AAgentCardSignature = {\n protected: string; // base64url-encoded JWS header\n signature: string; // base64url-encoded signature\n header?: Record<string, unknown> | undefined;\n};\n\nexport type A2AAgentSkill = {\n id: string;\n name: string;\n description: string;\n tags: string[];\n examples?: string[] | undefined;\n inputModes?: string[] | undefined;\n outputModes?: string[] | undefined;\n securityRequirements?: A2ASecurityRequirement[] | undefined;\n};\n\nexport type A2AAgentCapabilities = {\n streaming?: boolean | undefined;\n pushNotifications?: boolean | undefined;\n extensions?:\n | Array<{\n uri: string;\n description?: string | undefined;\n required?: boolean | undefined;\n params?: Record<string, unknown> | undefined;\n }>\n | undefined;\n extendedAgentCard?: boolean | undefined;\n};\n\nexport type A2AAgentInterface = {\n url: string;\n protocolBinding: string;\n protocolVersion: string;\n tenant?: string | undefined;\n};\n\nexport type A2AAgentCard = {\n name: string;\n description: string;\n supportedInterfaces: A2AAgentInterface[]; // REQUIRED per proto\n provider?:\n | {\n organization: string;\n url: string;\n }\n | undefined;\n version: string;\n documentationUrl?: string | undefined;\n capabilities: A2AAgentCapabilities;\n securitySchemes?: Record<string, A2ASecurityScheme> | undefined;\n securityRequirements?: A2ASecurityRequirement[] | undefined;\n defaultInputModes: string[];\n defaultOutputModes: string[];\n skills: A2AAgentSkill[];\n signatures?: A2AAgentCardSignature[] | undefined;\n iconUrl?: string | undefined;\n};\n"],"mappings":";AAIA,MAAa,uBAAuB"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["// A2A v1.0 Protocol Types\n// Enum values use lowercase internally; normalized from ProtoJSON SCREAMING_SNAKE_CASE on read.\n// Wire format uses ROLE_USER/ROLE_AGENT and TASK_STATE_* per ADR-001.\n\nimport type {\n AttachmentAdapter,\n DictationAdapter,\n ExternalStoreSharedOptions,\n FeedbackAdapter,\n RealtimeVoiceAdapter,\n SpeechSynthesisAdapter,\n ThreadHistoryAdapter,\n ThreadMessage,\n} from \"@assistant-ui/core\";\nimport type { A2AClient, A2AClientOptions } from \"./A2AClient\";\n\nexport const A2A_PROTOCOL_VERSION = \"1.0\";\n\nexport type A2ARole = \"unspecified\" | \"user\" | \"agent\";\n\nexport type A2APart = {\n text?: string | undefined;\n raw?: string | undefined; // base64 encoded bytes\n url?: string | undefined;\n data?: unknown; // google.protobuf.Value\n\n metadata?: Record<string, unknown> | undefined;\n filename?: string | undefined;\n mediaType?: string | undefined; // MIME type\n};\n\nexport type A2AMessage = {\n messageId: string;\n contextId?: string | undefined;\n taskId?: string | undefined;\n role: A2ARole;\n parts: A2APart[];\n metadata?: Record<string, unknown> | undefined;\n extensions?: string[] | undefined;\n referenceTaskIds?: string[] | undefined;\n};\n\nexport type A2ATaskState =\n | \"unspecified\"\n | \"submitted\"\n | \"working\"\n | \"completed\"\n | \"failed\"\n | \"canceled\"\n | \"input_required\"\n | \"rejected\"\n | \"auth_required\";\n\nexport type A2ATaskStatus = {\n state: A2ATaskState;\n message?: A2AMessage | undefined;\n timestamp?: string | undefined; // ISO 8601\n};\n\nexport type A2AArtifact = {\n artifactId: string;\n name?: string | undefined;\n description?: string | undefined;\n parts: A2APart[];\n metadata?: Record<string, unknown> | undefined;\n extensions?: string[] | undefined;\n};\n\nexport type A2ATask = {\n id: string;\n contextId?: string | undefined;\n status: A2ATaskStatus;\n artifacts?: A2AArtifact[] | undefined;\n history?: A2AMessage[] | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\n// Streaming events\nexport type A2ATaskStatusUpdateEvent = {\n taskId: string;\n contextId: string; // REQUIRED per proto\n status: A2ATaskStatus;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type A2ATaskArtifactUpdateEvent = {\n taskId: string;\n contextId: string; // REQUIRED per proto\n artifact: A2AArtifact;\n append?: boolean | undefined;\n lastChunk?: boolean | undefined;\n metadata?: Record<string, unknown> | undefined;\n};\n\nexport type A2AStreamEvent =\n | { type: \"task\"; task: A2ATask }\n | { type: \"message\"; message: A2AMessage }\n | { type: \"statusUpdate\"; event: A2ATaskStatusUpdateEvent }\n | { type: \"artifactUpdate\"; event: A2ATaskArtifactUpdateEvent };\n\nexport type A2AAuthenticationInfo = {\n scheme: string;\n credentials?: string | undefined;\n};\n\nexport type A2ATaskPushNotificationConfig = {\n tenant?: string | undefined;\n id?: string | undefined;\n taskId?: string | undefined;\n url: string;\n token?: string | undefined;\n authentication?: A2AAuthenticationInfo | undefined;\n};\n\nexport type A2AListTaskPushNotificationConfigsResponse = {\n configs: A2ATaskPushNotificationConfig[];\n nextPageToken?: string | undefined;\n};\n\nexport type A2ASendMessageConfiguration = {\n acceptedOutputModes?: string[] | undefined;\n taskPushNotificationConfig?: A2ATaskPushNotificationConfig | undefined;\n historyLength?: number | undefined;\n returnImmediately?: boolean | undefined;\n};\n\nexport type A2AListTasksRequest = {\n contextId?: string | undefined;\n status?: A2ATaskState | undefined;\n pageSize?: number | undefined;\n pageToken?: string | undefined;\n historyLength?: number | undefined;\n statusTimestampAfter?: string | undefined; // ISO 8601\n includeArtifacts?: boolean | undefined;\n};\n\nexport type A2AListTasksResponse = {\n tasks: A2ATask[];\n nextPageToken: string;\n pageSize: number;\n totalSize: number;\n};\n\n// Structured error (google.rpc.Status)\nexport type A2AErrorInfo = {\n code: number;\n status: string;\n message: string;\n details?: unknown[] | undefined;\n};\n\nexport type A2AApiKeySecurityScheme = {\n description?: string | undefined;\n location: string; // \"query\" | \"header\" | \"cookie\"\n name: string;\n};\n\nexport type A2AHttpAuthSecurityScheme = {\n description?: string | undefined;\n scheme: string; // e.g. \"Bearer\"\n bearerFormat?: string | undefined;\n};\n\nexport type A2AAuthorizationCodeOAuthFlow = {\n authorizationUrl: string;\n tokenUrl: string;\n refreshUrl?: string | undefined;\n scopes: Record<string, string>;\n pkceRequired?: boolean | undefined;\n};\n\nexport type A2AClientCredentialsOAuthFlow = {\n tokenUrl: string;\n refreshUrl?: string | undefined;\n scopes: Record<string, string>;\n};\n\nexport type A2ADeviceCodeOAuthFlow = {\n deviceAuthorizationUrl: string;\n tokenUrl: string;\n refreshUrl?: string | undefined;\n scopes: Record<string, string>;\n};\n\n/** @deprecated Use Authorization Code + PKCE instead. */\nexport type A2AImplicitOAuthFlow = {\n authorizationUrl?: string | undefined;\n refreshUrl?: string | undefined;\n scopes?: Record<string, string> | undefined;\n};\n\n/** @deprecated Use Authorization Code + PKCE or Device Code. */\nexport type A2APasswordOAuthFlow = {\n tokenUrl?: string | undefined;\n refreshUrl?: string | undefined;\n scopes?: Record<string, string> | undefined;\n};\n\nexport type A2AOAuthFlows = {\n authorizationCode?: A2AAuthorizationCodeOAuthFlow | undefined;\n clientCredentials?: A2AClientCredentialsOAuthFlow | undefined;\n /** @deprecated */\n implicit?: A2AImplicitOAuthFlow | undefined;\n /** @deprecated */\n password?: A2APasswordOAuthFlow | undefined;\n deviceCode?: A2ADeviceCodeOAuthFlow | undefined;\n};\n\nexport type A2AOAuth2SecurityScheme = {\n description?: string | undefined;\n flows: A2AOAuthFlows;\n oauth2MetadataUrl?: string | undefined;\n};\n\nexport type A2AOpenIdConnectSecurityScheme = {\n description?: string | undefined;\n openIdConnectUrl: string;\n};\n\nexport type A2AMutualTlsSecurityScheme = {\n description?: string | undefined;\n};\n\nexport type A2ASecurityScheme = {\n apiKeySecurityScheme?: A2AApiKeySecurityScheme | undefined;\n httpAuthSecurityScheme?: A2AHttpAuthSecurityScheme | undefined;\n oauth2SecurityScheme?: A2AOAuth2SecurityScheme | undefined;\n openIdConnectSecurityScheme?: A2AOpenIdConnectSecurityScheme | undefined;\n mtlsSecurityScheme?: A2AMutualTlsSecurityScheme | undefined;\n};\n\nexport type A2ASecurityRequirement = {\n schemes: Record<string, { list: string[] }>;\n};\n\n// Agent card signature (JWS)\nexport type A2AAgentCardSignature = {\n protected: string; // base64url-encoded JWS header\n signature: string; // base64url-encoded signature\n header?: Record<string, unknown> | undefined;\n};\n\nexport type A2AAgentSkill = {\n id: string;\n name: string;\n description: string;\n tags: string[];\n examples?: string[] | undefined;\n inputModes?: string[] | undefined;\n outputModes?: string[] | undefined;\n securityRequirements?: A2ASecurityRequirement[] | undefined;\n};\n\nexport type A2AAgentCapabilities = {\n streaming?: boolean | undefined;\n pushNotifications?: boolean | undefined;\n extensions?:\n | Array<{\n uri: string;\n description?: string | undefined;\n required?: boolean | undefined;\n params?: Record<string, unknown> | undefined;\n }>\n | undefined;\n extendedAgentCard?: boolean | undefined;\n};\n\nexport type A2AAgentInterface = {\n url: string;\n protocolBinding: string;\n protocolVersion: string;\n tenant?: string | undefined;\n};\n\nexport type A2AAgentCard = {\n name: string;\n description: string;\n supportedInterfaces: A2AAgentInterface[]; // REQUIRED per proto\n provider?:\n | {\n organization: string;\n url: string;\n }\n | undefined;\n version: string;\n documentationUrl?: string | undefined;\n capabilities: A2AAgentCapabilities;\n securitySchemes?: Record<string, A2ASecurityScheme> | undefined;\n securityRequirements?: A2ASecurityRequirement[] | undefined;\n defaultInputModes: string[];\n defaultOutputModes: string[];\n skills: A2AAgentSkill[];\n signatures?: A2AAgentCardSignature[] | undefined;\n iconUrl?: string | undefined;\n};\n\n/** Private state `useA2ARuntime` exposes through `thread.extras`. */\nexport type A2AExtras = {\n task: A2ATask | undefined;\n artifacts: readonly A2AArtifact[];\n agentCard: A2AAgentCard | undefined;\n};\n\nexport type UseA2AThreadListAdapter = {\n threadId?: string;\n onSwitchToNewThread?: () => Promise<void> | void;\n onSwitchToThread?: (threadId: string) => Promise<{\n messages: readonly ThreadMessage[];\n }>;\n};\n\nexport type UseA2ARuntimeOptions = ExternalStoreSharedOptions & {\n /** Pre-built A2A client instance. Provide this OR baseUrl. */\n client?: A2AClient;\n /** Base URL of the A2A server. Used to create a client if `client` is not provided. */\n baseUrl?: string;\n /** Optional path prefix for all API endpoints (e.g. \"/v1\"). Does not affect agent card discovery. Only used with baseUrl. */\n basePath?: string;\n /** Optional tenant ID for multi-tenant servers. Only used with baseUrl. */\n tenant?: string;\n /** Headers for the A2A client (only used with baseUrl). */\n headers?: A2AClientOptions[\"headers\"];\n /** A2A extension URIs to negotiate. Only used with baseUrl. */\n extensions?: string[];\n /** Extra fetch options (e.g. `{ credentials: 'include' }`). Only used with `baseUrl`. */\n fetchOptions?: A2AClientOptions[\"fetchOptions\"];\n\n /** Initial context ID for the conversation. */\n contextId?: string;\n /** Default send message configuration. */\n configuration?: A2ASendMessageConfiguration;\n\n /** Called when an error occurs. */\n onError?: (error: Error) => void;\n /** Called when a run is cancelled. */\n onCancel?: () => void;\n /** Called when an artifact is fully received (lastChunk). */\n onArtifactComplete?: (artifact: A2AArtifact) => void;\n\n adapters?: {\n attachments?: AttachmentAdapter;\n speech?: SpeechSynthesisAdapter;\n dictation?: DictationAdapter;\n voice?: RealtimeVoiceAdapter;\n feedback?: FeedbackAdapter;\n history?: ThreadHistoryAdapter;\n threadList?: UseA2AThreadListAdapter;\n };\n};\n"],"mappings":";AAgBA,MAAa,uBAAuB"}
@@ -1,42 +1,7 @@
1
- import { A2AAgentCard, A2AArtifact, A2ASendMessageConfiguration, A2ATask } from "./types.js";
2
- import { A2AClient, A2AClientOptions } from "./A2AClient.js";
3
- import { AssistantRuntime, AttachmentAdapter, DictationAdapter, ExternalStoreSharedOptions, FeedbackAdapter, RealtimeVoiceAdapter, SpeechSynthesisAdapter, ThreadHistoryAdapter, ThreadMessage } from "@assistant-ui/core";
4
-
1
+ import { UseA2ARuntimeOptions } from "./types.js";
2
+ import { AssistantRuntime } from "@assistant-ui/core";
5
3
  //#region src/useA2ARuntime.d.ts
6
- declare const useA2ATask: () => A2ATask | undefined;
7
- declare const useA2AArtifacts: () => readonly A2AArtifact[];
8
- declare const useA2AAgentCard: () => A2AAgentCard | undefined;
9
- type UseA2AThreadListAdapter = {
10
- threadId?: string;
11
- onSwitchToNewThread?: () => Promise<void> | void;
12
- onSwitchToThread?: (threadId: string) => Promise<{
13
- messages: readonly ThreadMessage[];
14
- }>;
15
- };
16
- type UseA2ARuntimeOptions = ExternalStoreSharedOptions & {
17
- /** Pre-built A2A client instance. Provide this OR baseUrl. */client?: A2AClient; /** Base URL of the A2A server. Used to create a client if `client` is not provided. */
18
- baseUrl?: string; /** Optional path prefix for all API endpoints (e.g. "/v1"). Does not affect agent card discovery. Only used with baseUrl. */
19
- basePath?: string; /** Optional tenant ID for multi-tenant servers. Only used with baseUrl. */
20
- tenant?: string; /** Headers for the A2A client (only used with baseUrl). */
21
- headers?: A2AClientOptions["headers"]; /** A2A extension URIs to negotiate. Only used with baseUrl. */
22
- extensions?: string[]; /** Extra fetch options (e.g. `{ credentials: 'include' }`). Only used with `baseUrl`. */
23
- fetchOptions?: A2AClientOptions["fetchOptions"]; /** Initial context ID for the conversation. */
24
- contextId?: string; /** Default send message configuration. */
25
- configuration?: A2ASendMessageConfiguration; /** Called when an error occurs. */
26
- onError?: (error: Error) => void; /** Called when a run is cancelled. */
27
- onCancel?: () => void; /** Called when an artifact is fully received (lastChunk). */
28
- onArtifactComplete?: (artifact: A2AArtifact) => void;
29
- adapters?: {
30
- attachments?: AttachmentAdapter;
31
- speech?: SpeechSynthesisAdapter;
32
- dictation?: DictationAdapter;
33
- voice?: RealtimeVoiceAdapter;
34
- feedback?: FeedbackAdapter;
35
- history?: ThreadHistoryAdapter;
36
- threadList?: UseA2AThreadListAdapter;
37
- };
38
- };
39
4
  declare function useA2ARuntime(options: UseA2ARuntimeOptions): AssistantRuntime;
40
5
  //#endregion
41
- export { UseA2ARuntimeOptions, UseA2AThreadListAdapter, useA2AAgentCard, useA2AArtifacts, useA2ARuntime, useA2ATask };
6
+ export { useA2ARuntime };
42
7
  //# sourceMappingURL=useA2ARuntime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useA2ARuntime.d.ts","names":[],"sources":["../src/useA2ARuntime.ts"],"mappings":";;;;;cAyDa,UAAA,QAAU,OAAA;AAAA,cAIV,eAAA,iBAAe,WAAA;AAAA,cAIf,eAAA,QAAe,YAAA;AAAA,KAMhB,uBAAA;EACV,QAAA;EACA,mBAAA,SAA4B,OAAA;EAC5B,gBAAA,IAAoB,QAAA,aAAqB,OAAA;IACvC,QAAA,WAAmB,aAAA;EAAA;AAAA;AAAA,KAMX,oBAAA,GAAuB,0BAAA;EAhBtB,8DAkBX,MAAA,GAAS,SAAA;EAET,OAAA,WApB0B;EAsB1B,QAAA,WAhBiC;EAkBjC,MAAA,WAhB4B;EAkB5B,OAAA,GAAU,gBAAA,aAjB+B;EAmBzC,UAAA,aAnBgD;EAqBhD,YAAA,GAAe,gBAAA,kBAtBf;EAyBA,SAAA,WAxBA;EA0BA,aAAA,GAAgB,2BAAA,EA1ByB;EA6BzC,OAAA,IAAW,KAAA,EAAO,KAAA,WA5BG;EA8BrB,QAAA,eA9BkC;EAgClC,kBAAA,IAAsB,QAAA,EAJC,WAAA;EAMvB,QAAA;IACE,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IACX,OAAA,GAAU,oBAAA;IACV,UAAA,GAAa,uBAAA;EAAA;AAAA;AAAA,iBAMD,aAAA,CAAc,OAAA,EAAS,oBAAA,GAAuB,gBAAgB"}
1
+ {"version":3,"file":"useA2ARuntime.d.ts","names":[],"sources":["../src/useA2ARuntime.ts"],"mappings":";;;iBAmBgB,cAAc,SAAS,uBAAuB"}