@assistant-ui/react-a2a 0.2.41 → 0.2.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/A2AClient.d.ts +6 -0
- package/dist/A2AClient.d.ts.map +1 -1
- package/dist/A2AClient.js +9 -38
- package/dist/A2AClient.js.map +1 -1
- package/dist/A2AThreadRuntimeCore.d.ts +14 -4
- package/dist/A2AThreadRuntimeCore.d.ts.map +1 -1
- package/dist/A2AThreadRuntimeCore.js +50 -35
- package/dist/A2AThreadRuntimeCore.js.map +1 -1
- package/dist/conversions.d.ts.map +1 -1
- package/dist/conversions.js +2 -2
- package/dist/conversions.js.map +1 -1
- package/dist/useA2ARuntime.d.ts.map +1 -1
- package/dist/useA2ARuntime.js +40 -28
- package/dist/useA2ARuntime.js.map +1 -1
- package/package.json +6 -6
- package/src/A2AClient.test.ts +69 -0
- package/src/A2AClient.ts +13 -45
- package/src/A2AThreadRuntimeCore.test.ts +71 -18
- package/src/A2AThreadRuntimeCore.ts +74 -46
- package/src/conversions.test.ts +21 -0
- package/src/conversions.ts +2 -1
- package/src/useA2ARuntime.test.tsx +104 -0
- package/src/useA2ARuntime.ts +62 -35
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { a2aMessageToContent, a2uiPartsToOperations, isTerminalTaskState, taskStateToMessageStatus, threadMessageToA2AMessage } from "./conversions.js";
|
|
3
|
-
import { appendToolInteraction, createMessageRepositorySession, invokeUserCallback } from "@assistant-ui/core/internal";
|
|
3
|
+
import { RunLeases, appendToolInteraction, createMessageRepositorySession, invokeUserCallback } from "@assistant-ui/core/internal";
|
|
4
4
|
import { fromThreadMessageLike, generateId } from "@assistant-ui/core";
|
|
5
|
-
import { applyA2uiOperations,
|
|
5
|
+
import { applyA2uiOperations, surfaceToPresentToolCall } from "@assistant-ui/generative-ui/a2ui";
|
|
6
6
|
//#region src/A2AThreadRuntimeCore.ts
|
|
7
7
|
const INITIAL_AGENT_CARD_RETRY_DELAY_MS = 5e3;
|
|
8
8
|
const MAX_AGENT_CARD_RETRY_DELAY_MS = 3e5;
|
|
@@ -32,12 +32,13 @@ var A2AThreadRuntimeCore = class {
|
|
|
32
32
|
onCancel;
|
|
33
33
|
onArtifactComplete;
|
|
34
34
|
history;
|
|
35
|
-
|
|
35
|
+
listeners = /* @__PURE__ */ new Set();
|
|
36
|
+
snapshot;
|
|
36
37
|
runtime;
|
|
37
38
|
session = createMessageRepositorySession();
|
|
38
39
|
isRunningFlag = false;
|
|
39
40
|
abortController = null;
|
|
40
|
-
|
|
41
|
+
runLeases = new RunLeases();
|
|
41
42
|
pendingError = null;
|
|
42
43
|
currentTask;
|
|
43
44
|
currentArtifacts = [];
|
|
@@ -65,7 +66,22 @@ var A2AThreadRuntimeCore = class {
|
|
|
65
66
|
this.onCancel = options.onCancel;
|
|
66
67
|
this.onArtifactComplete = options.onArtifactComplete;
|
|
67
68
|
this.history = options.history;
|
|
68
|
-
|
|
69
|
+
}
|
|
70
|
+
subscribe = (listener) => {
|
|
71
|
+
this.listeners.add(listener);
|
|
72
|
+
return () => this.listeners.delete(listener);
|
|
73
|
+
};
|
|
74
|
+
getSnapshot = () => this.snapshot ??= {
|
|
75
|
+
isLoading: this._isLoading,
|
|
76
|
+
isRunning: this.isRunningFlag,
|
|
77
|
+
messageRepository: this.session.export(),
|
|
78
|
+
task: this.currentTask,
|
|
79
|
+
artifacts: this.currentArtifacts,
|
|
80
|
+
agentCard: this.agentCardValue
|
|
81
|
+
};
|
|
82
|
+
publishUpdate() {
|
|
83
|
+
this.snapshot = void 0;
|
|
84
|
+
for (const listener of this.listeners) listener();
|
|
69
85
|
}
|
|
70
86
|
updateOptions(options) {
|
|
71
87
|
this.client = options.client;
|
|
@@ -85,6 +101,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
85
101
|
* switches, deletes, and cancel resyncs, which must keep the live context. */
|
|
86
102
|
resetContext() {
|
|
87
103
|
this._historyLoadGeneration++;
|
|
104
|
+
const wasLoading = this._isLoading;
|
|
88
105
|
this._isLoading = false;
|
|
89
106
|
const controller = this.abortController;
|
|
90
107
|
this.contextId = this.lastOptionsContextId;
|
|
@@ -92,6 +109,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
92
109
|
controller.abort();
|
|
93
110
|
if (this.abortController === controller) this.abortController = null;
|
|
94
111
|
}
|
|
112
|
+
if (wasLoading) this.publishUpdate();
|
|
95
113
|
}
|
|
96
114
|
attachRuntime(runtime) {
|
|
97
115
|
this.runtime = runtime;
|
|
@@ -129,7 +147,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
129
147
|
} : part)
|
|
130
148
|
};
|
|
131
149
|
})) {
|
|
132
|
-
this.
|
|
150
|
+
this.publishUpdate();
|
|
133
151
|
this.persistAssistantHistory(messageId);
|
|
134
152
|
}
|
|
135
153
|
}
|
|
@@ -155,7 +173,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
155
173
|
this._agentCardRetryAfter = 0;
|
|
156
174
|
this._agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;
|
|
157
175
|
this._agentCardDiscoveryFailed = false;
|
|
158
|
-
this.
|
|
176
|
+
this.publishUpdate();
|
|
159
177
|
}, () => {
|
|
160
178
|
this._agentCardDiscoveryFailed = true;
|
|
161
179
|
this._agentCardRetryAfter = Date.now() + this._agentCardRetryDelay;
|
|
@@ -201,9 +219,9 @@ var A2AThreadRuntimeCore = class {
|
|
|
201
219
|
}).finally(() => {
|
|
202
220
|
if (generation !== this._historyLoadGeneration) return;
|
|
203
221
|
this._isLoading = false;
|
|
204
|
-
this.
|
|
222
|
+
this.publishUpdate();
|
|
205
223
|
});
|
|
206
|
-
this.
|
|
224
|
+
this.publishUpdate();
|
|
207
225
|
return this._loadPromise;
|
|
208
226
|
}
|
|
209
227
|
async append(message) {
|
|
@@ -212,7 +230,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
212
230
|
const parentId = message.parentId === null ? null : message.parentId && this.session.hasMessage(message.parentId) ? message.parentId : this.session.headId;
|
|
213
231
|
this.session.addOrUpdateMessage(parentId, threadMessage);
|
|
214
232
|
this.session.switchToBranch(threadMessage.id);
|
|
215
|
-
this.
|
|
233
|
+
this.publishUpdate();
|
|
216
234
|
this.recordHistoryEntry(parentId, threadMessage);
|
|
217
235
|
if (!startRun) return;
|
|
218
236
|
await this.startRun(threadMessage);
|
|
@@ -221,7 +239,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
221
239
|
const parentId = this.session.headId;
|
|
222
240
|
this.session.addOrUpdateMessage(parentId, message);
|
|
223
241
|
this.session.switchToBranch(message.id);
|
|
224
|
-
this.
|
|
242
|
+
this.publishUpdate();
|
|
225
243
|
this.recordHistoryEntry(parentId, message);
|
|
226
244
|
}
|
|
227
245
|
async edit(message) {
|
|
@@ -237,13 +255,13 @@ var A2AThreadRuntimeCore = class {
|
|
|
237
255
|
async cancel() {
|
|
238
256
|
if (!this.abortController) return;
|
|
239
257
|
const task = this.currentTask;
|
|
240
|
-
const
|
|
258
|
+
const lease = this.runLeases.current();
|
|
241
259
|
this.abortController.abort();
|
|
242
260
|
if (task?.id) try {
|
|
243
261
|
const updated = await this.client.cancelTask(task.id);
|
|
244
|
-
if (this.currentTask === task &&
|
|
262
|
+
if (this.currentTask === task && lease.isCurrent()) {
|
|
245
263
|
this.currentTask = updated;
|
|
246
|
-
this.
|
|
264
|
+
this.publishUpdate();
|
|
247
265
|
}
|
|
248
266
|
} catch {}
|
|
249
267
|
}
|
|
@@ -268,7 +286,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
268
286
|
this.currentArtifacts = [];
|
|
269
287
|
this.a2uiState = /* @__PURE__ */ new Map();
|
|
270
288
|
this.a2uiMessageIds.clear();
|
|
271
|
-
this.
|
|
289
|
+
this.publishUpdate();
|
|
272
290
|
}
|
|
273
291
|
applyExternalMessages(messages) {
|
|
274
292
|
if (messages.length === 0) this.session.clear();
|
|
@@ -298,9 +316,11 @@ var A2AThreadRuntimeCore = class {
|
|
|
298
316
|
this.finalizeExternalApply();
|
|
299
317
|
}
|
|
300
318
|
async startRun(userThreadMessage) {
|
|
301
|
-
this.
|
|
302
|
-
|
|
303
|
-
|
|
319
|
+
this.runLeases.begin();
|
|
320
|
+
const previous = this.abortController;
|
|
321
|
+
if (previous) {
|
|
322
|
+
previous.abort();
|
|
323
|
+
if (this.abortController !== previous && this.abortController !== null) return;
|
|
304
324
|
this.abortController = null;
|
|
305
325
|
}
|
|
306
326
|
const a2aMessage = threadMessageToA2AMessage(userThreadMessage, {
|
|
@@ -413,7 +433,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
413
433
|
}
|
|
414
434
|
const status = taskStateToMessageStatus(event.status.state);
|
|
415
435
|
this.updateAssistantStatus(assistantId, status);
|
|
416
|
-
this.
|
|
436
|
+
this.publishUpdate();
|
|
417
437
|
}
|
|
418
438
|
handleArtifactUpdate(assistantId, event) {
|
|
419
439
|
const { append, lastChunk } = event;
|
|
@@ -446,14 +466,14 @@ var A2AThreadRuntimeCore = class {
|
|
|
446
466
|
this.updateAssistantArtifacts(assistantId);
|
|
447
467
|
this.rebuildAssistantA2uiSurfaces(assistantId);
|
|
448
468
|
if (lastChunk) invokeRuntimeCallback("onArtifactComplete", this.onArtifactComplete, updated);
|
|
449
|
-
this.
|
|
469
|
+
this.publishUpdate();
|
|
450
470
|
}
|
|
451
471
|
handleMessage(assistantId, message) {
|
|
452
472
|
if (message.role !== "agent") return;
|
|
453
473
|
this.applyA2uiMessage(message);
|
|
454
474
|
const content = a2aMessageToContent(message);
|
|
455
475
|
this.updateAssistantContent(assistantId, content);
|
|
456
|
-
this.
|
|
476
|
+
this.publishUpdate();
|
|
457
477
|
}
|
|
458
478
|
handleTaskSnapshot(assistantId, task) {
|
|
459
479
|
const artifacts = task.artifacts === void 0 ? void 0 : Array.isArray(task.artifacts) ? task.artifacts.map(normalizeArtifact) : [];
|
|
@@ -481,7 +501,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
481
501
|
} else this.rebuildAssistantA2uiSurfaces(assistantId);
|
|
482
502
|
const status = taskStateToMessageStatus(task.status.state);
|
|
483
503
|
this.updateAssistantStatus(assistantId, status);
|
|
484
|
-
this.
|
|
504
|
+
this.publishUpdate();
|
|
485
505
|
}
|
|
486
506
|
insertAssistantPlaceholder(parentId) {
|
|
487
507
|
const id = generateId();
|
|
@@ -501,7 +521,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
501
521
|
};
|
|
502
522
|
this.session.addOrUpdateMessage(parentId, assistant);
|
|
503
523
|
this.session.switchToBranch(id);
|
|
504
|
-
this.
|
|
524
|
+
this.publishUpdate();
|
|
505
525
|
return id;
|
|
506
526
|
}
|
|
507
527
|
updateAssistantContent(messageId, content) {
|
|
@@ -528,16 +548,11 @@ var A2AThreadRuntimeCore = class {
|
|
|
528
548
|
a2uiSurfaceParts() {
|
|
529
549
|
const parts = [];
|
|
530
550
|
for (const [surfaceId, surface] of this.a2uiState) {
|
|
531
|
-
const {
|
|
532
|
-
if (!
|
|
551
|
+
const { toolCall } = surfaceToPresentToolCall(surfaceId, surface);
|
|
552
|
+
if (!toolCall) continue;
|
|
533
553
|
parts.push({
|
|
534
554
|
type: "tool-call",
|
|
535
|
-
|
|
536
|
-
toolName: "present",
|
|
537
|
-
args: spec,
|
|
538
|
-
argsText: JSON.stringify(spec),
|
|
539
|
-
result: {},
|
|
540
|
-
artifact: { a2ui: surfaceToOperations(surface) }
|
|
555
|
+
...toolCall
|
|
541
556
|
});
|
|
542
557
|
}
|
|
543
558
|
return parts;
|
|
@@ -567,7 +582,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
567
582
|
...message,
|
|
568
583
|
content: this.withA2uiSurfaces(message.content)
|
|
569
584
|
};
|
|
570
|
-
})) this.
|
|
585
|
+
})) this.publishUpdate();
|
|
571
586
|
}
|
|
572
587
|
updateAssistantArtifacts(messageId) {
|
|
573
588
|
if (this.session.updateMessage(messageId, (message) => {
|
|
@@ -587,7 +602,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
587
602
|
}
|
|
588
603
|
}
|
|
589
604
|
};
|
|
590
|
-
})) this.
|
|
605
|
+
})) this.publishUpdate();
|
|
591
606
|
}
|
|
592
607
|
updateAssistantStatus(messageId, status) {
|
|
593
608
|
if (this.session.updateMessage(messageId, (message) => {
|
|
@@ -597,7 +612,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
597
612
|
status
|
|
598
613
|
};
|
|
599
614
|
})) {
|
|
600
|
-
this.
|
|
615
|
+
this.publishUpdate();
|
|
601
616
|
if (this.isPersistableAssistantStatus(status)) this.persistAssistantHistory(messageId);
|
|
602
617
|
}
|
|
603
618
|
}
|
|
@@ -611,7 +626,7 @@ var A2AThreadRuntimeCore = class {
|
|
|
611
626
|
}
|
|
612
627
|
setRunning(running) {
|
|
613
628
|
this.isRunningFlag = running;
|
|
614
|
-
this.
|
|
629
|
+
this.publishUpdate();
|
|
615
630
|
}
|
|
616
631
|
finishRun(controller) {
|
|
617
632
|
if (this.abortController !== controller) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2AThreadRuntimeCore.js","names":["isRecord"],"sources":["../src/A2AThreadRuntimeCore.ts"],"sourcesContent":["\"use client\";\n\nimport { generateId, fromThreadMessageLike } from \"@assistant-ui/core\";\nimport type {\n AppendMessage,\n AssistantRuntime,\n ExportedMessageRepository,\n MessageStatus,\n ThreadAssistantMessage,\n ThreadAssistantMessagePart,\n ThreadHistoryAdapter,\n ThreadMessage,\n ToolCallMessagePart,\n Unstable_RecordToolInteractionOptions,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n createMessageRepositorySession,\n invokeUserCallback,\n} from \"@assistant-ui/core/internal\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport {\n applyA2uiOperations,\n convertSurfaceToUISpec,\n surfaceToOperations,\n type A2uiState,\n} from \"@assistant-ui/react-generative-ui/a2ui\";\nimport type { A2AClient } from \"./A2AClient\";\nimport type {\n A2AArtifact,\n A2AAgentCard,\n A2AMessage,\n A2ASendMessageConfiguration,\n A2AStreamEvent,\n A2ATask,\n A2ATaskArtifactUpdateEvent,\n A2ATaskStatusUpdateEvent,\n} from \"./types\";\n\nimport {\n a2aMessageToContent,\n a2uiPartsToOperations,\n isTerminalTaskState,\n threadMessageToA2AMessage,\n taskStateToMessageStatus,\n} from \"./conversions\";\n\nconst INITIAL_AGENT_CARD_RETRY_DELAY_MS = 5_000;\nconst MAX_AGENT_CARD_RETRY_DELAY_MS = 5 * 60_000;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst storedArtifact = (artifact: A2AArtifact): A2AArtifact => ({\n ...artifact,\n parts: artifact.parts.map(({ raw: _raw, ...part }) => part),\n});\n\nexport type A2AThreadRuntimeCoreOptions = {\n client: A2AClient;\n contextId?: string | undefined;\n configuration?: A2ASendMessageConfiguration | undefined;\n onError?: ((error: Error) => void) | undefined;\n onCancel?: (() => void) | undefined;\n onArtifactComplete?: ((artifact: A2AArtifact) => void) | undefined;\n history?: ThreadHistoryAdapter | undefined;\n notifyUpdate: () => void;\n};\n\nconst FALLBACK_USER_STATUS = {\n type: \"complete\",\n reason: \"unknown\",\n} as const;\n\ntype A2ARuntimeCallbackName = \"onError\" | \"onCancel\" | \"onArtifactComplete\";\n\nconst invokeRuntimeCallback = <TArgs extends readonly unknown[]>(\n name: A2ARuntimeCallbackName,\n callback: ((...args: TArgs) => unknown) | undefined,\n ...args: TArgs\n): void => {\n void invokeUserCallback(\"react-a2a\", name, callback, ...args);\n};\n\nfunction normalizeArtifact(artifact: A2AArtifact): A2AArtifact {\n return {\n ...artifact,\n parts: Array.isArray(artifact.parts) ? artifact.parts : [],\n };\n}\n\nexport class A2AThreadRuntimeCore {\n private client: A2AClient;\n private contextId: string | undefined;\n private configuration: A2ASendMessageConfiguration | undefined;\n private onError: ((error: Error) => void) | undefined;\n private onCancel: (() => void) | undefined;\n private onArtifactComplete: ((artifact: A2AArtifact) => void) | undefined;\n private history: ThreadHistoryAdapter | undefined;\n private readonly notifyUpdate: () => void;\n\n private runtime: AssistantRuntime | undefined;\n private readonly session = createMessageRepositorySession();\n private isRunningFlag = false;\n private abortController: AbortController | null = null;\n private runGeneration = 0;\n private pendingError: Error | null = null;\n\n // A2A-specific state\n private currentTask: A2ATask | undefined;\n private currentArtifacts: A2AArtifact[] = [];\n private a2uiState: A2uiState = new Map();\n private readonly a2uiMessageIds = new Set<string>();\n private agentCardValue: A2AAgentCard | undefined;\n\n // History tracking\n private readonly assistantHistoryParents = new Map<string, string | null>();\n private readonly recordedHistoryIds = new Set<string>();\n private readonly historyWrites = new Map<string, Promise<void>>();\n private _isLoading = false;\n private _loadPromise: Promise<void> | undefined;\n private _historyLoadGeneration = 0;\n private _loadRequested = false;\n private _agentCardPromise: Promise<void> | undefined;\n private _agentCardRetryAfter = 0;\n private _agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;\n private _agentCardDiscoveryFailed = false;\n\n private lastOptionsContextId: string | undefined;\n\n constructor(options: A2AThreadRuntimeCoreOptions) {\n this.client = options.client;\n this.contextId = options.contextId;\n this.lastOptionsContextId = options.contextId;\n this.configuration = options.configuration;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n this.onArtifactComplete = options.onArtifactComplete;\n this.history = options.history;\n this.notifyUpdate = options.notifyUpdate;\n }\n\n updateOptions(options: Omit<A2AThreadRuntimeCoreOptions, \"notifyUpdate\">) {\n this.client = options.client;\n // The hook re-applies options on every render, including renders caused\n // by this core's own notifyUpdate. The option only seeds the context: a\n // re-render with the same value must not clobber a server-assigned\n // contextId learned from the stream.\n if (options.contextId !== this.lastOptionsContextId) {\n this.contextId = options.contextId;\n this.lastOptionsContextId = options.contextId;\n }\n this.configuration = options.configuration;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n this.onArtifactComplete = options.onArtifactComplete;\n const previousHistory = this.history;\n this.history = options.history;\n\n if (\n this._loadRequested &&\n !this._loadPromise &&\n !previousHistory &&\n options.history &&\n this.session.getMessages().length === 0\n ) {\n void this.__internal_load();\n }\n }\n\n /** Thread-boundary reset: applyExternalMessages alone also serves branch\n * switches, deletes, and cancel resyncs, which must keep the live context. */\n resetContext(): void {\n this._historyLoadGeneration++;\n this._isLoading = false;\n // Restore the seed before aborting: an onCancel callback that starts a\n // new run must not pick up the old thread's context, and its controller\n // must not be discarded.\n const controller = this.abortController;\n this.contextId = this.lastOptionsContextId;\n if (controller) {\n controller.abort();\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n }\n\n attachRuntime(runtime: AssistantRuntime) {\n this.runtime = runtime;\n }\n\n detachRuntime() {\n this.runtime = undefined;\n // Abort in-flight requests on unmount\n const controller = this.abortController;\n if (controller) {\n controller.abort();\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n }\n\n getRuntime(): AssistantRuntime | undefined {\n return this.runtime;\n }\n\n getMessages(): readonly ThreadMessage[] {\n return this.session.getMessages();\n }\n\n getMessageRepository(): ExportedMessageRepository {\n return this.session.export();\n }\n\n public async recordToolInteraction({\n messageId,\n toolCallId,\n interaction,\n }: Unstable_RecordToolInteractionOptions): Promise<void> {\n const message = this.session.tryGetMessage(messageId)?.message;\n if (!message) {\n throw new Error(\n \"Tried to record a tool interaction on a non-existing message\",\n );\n }\n if (message.role !== \"assistant\") {\n throw new Error(\n \"Tried to record a tool interaction on a non-assistant message\",\n );\n }\n const target = message.content.find(\n (part) => part.type === \"tool-call\" && part.toolCallId === toolCallId,\n );\n if (!target || target.type !== \"tool-call\") {\n throw new Error(\n \"Tried to record a tool interaction on a non-existing tool call\",\n );\n }\n\n const touched = this.session.updateMessage(messageId, (current) => {\n if (current.role !== \"assistant\") return current;\n return {\n ...current,\n content: current.content.map((part) =>\n part.type === \"tool-call\" && part.toolCallId === toolCallId\n ? {\n ...part,\n unstable_interactions: appendToolInteraction(\n part.unstable_interactions,\n interaction,\n ),\n }\n : part,\n ),\n };\n });\n if (touched) {\n this.notifyUpdate();\n this.persistAssistantHistory(messageId);\n }\n }\n\n getTask(): A2ATask | undefined {\n return this.currentTask;\n }\n\n getArtifacts(): readonly A2AArtifact[] {\n return this.currentArtifacts;\n }\n\n getAgentCard(): A2AAgentCard | undefined {\n return this.agentCardValue;\n }\n\n isRunning(): boolean {\n return this.isRunningFlag;\n }\n\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n private loadAgentCard(): Promise<void> {\n if (Date.now() < this._agentCardRetryAfter) return Promise.resolve();\n\n this._agentCardPromise ??= this.client.getAgentCard().then(\n (agentCard) => {\n this.agentCardValue = agentCard;\n this._agentCardRetryAfter = 0;\n this._agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;\n this._agentCardDiscoveryFailed = false;\n this.notifyUpdate();\n },\n () => {\n this._agentCardDiscoveryFailed = true;\n this._agentCardRetryAfter = Date.now() + this._agentCardRetryDelay;\n this._agentCardRetryDelay = Math.min(\n this._agentCardRetryDelay * 2,\n MAX_AGENT_CARD_RETRY_DELAY_MS,\n );\n this._agentCardPromise = undefined;\n },\n );\n return this._agentCardPromise;\n }\n\n private async waitForAgentCard(signal: AbortSignal): Promise<boolean> {\n const shouldWait = !this._agentCardDiscoveryFailed;\n const load = this.loadAgentCard();\n if (signal.aborted) return false;\n if (!shouldWait) return true;\n\n let onAbort!: () => void;\n const abort = new Promise<void>((resolve) => {\n onAbort = resolve;\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n try {\n await Promise.race([load, abort]);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n return !signal.aborted;\n }\n\n __internal_load(): Promise<void> {\n this._loadRequested = true;\n const agentCardPromise = this.loadAgentCard();\n\n if (this._loadPromise) return this._loadPromise;\n if (!this.history) return agentCardPromise;\n\n this._isLoading = true;\n\n const generation = this._historyLoadGeneration;\n const historyPromise = this.history.load();\n\n this._loadPromise = historyPromise\n .then((repo) => {\n if (generation !== this._historyLoadGeneration) return;\n if (repo) {\n this.session.applyExternalMessageRepository(repo);\n this.finalizeExternalApply();\n }\n })\n .catch((error) => {\n if (generation !== this._historyLoadGeneration) return;\n invokeRuntimeCallback(\n \"onError\",\n this.onError,\n error instanceof Error ? error : new Error(String(error)),\n );\n })\n .finally(() => {\n if (generation !== this._historyLoadGeneration) return;\n this._isLoading = false;\n this.notifyUpdate();\n });\n\n this.notifyUpdate();\n return this._loadPromise;\n }\n\n async append(message: AppendMessage): Promise<void> {\n const startRun = message.startRun ?? message.role === \"user\";\n\n const threadMessage = fromThreadMessageLike(\n message as any,\n generateId(),\n FALLBACK_USER_STATUS,\n );\n const parentId =\n message.parentId === null\n ? null\n : message.parentId && this.session.hasMessage(message.parentId)\n ? message.parentId\n : this.session.headId;\n this.session.addOrUpdateMessage(parentId, threadMessage);\n this.session.switchToBranch(threadMessage.id);\n this.notifyUpdate();\n this.recordHistoryEntry(parentId, threadMessage);\n\n if (!startRun) return;\n await this.startRun(threadMessage);\n }\n\n appendVoiceTranscript(message: ThreadMessage): void {\n const parentId = this.session.headId;\n this.session.addOrUpdateMessage(parentId, message);\n this.session.switchToBranch(message.id);\n this.notifyUpdate();\n this.recordHistoryEntry(parentId, message);\n }\n\n async edit(message: AppendMessage): Promise<void> {\n await this.append(message);\n }\n\n async reload(\n parentId: string | null,\n _config: { runConfig?: Record<string, unknown> } = {},\n ): Promise<void> {\n const messages =\n parentId === null\n ? []\n : (this.session.tryGetMessages(parentId) ?? this.getMessages());\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"user\") {\n await this.startRun(messages[i]!);\n return;\n }\n }\n }\n\n async cancel(): Promise<void> {\n if (!this.abortController) return;\n\n // Read the server target before aborting: the abort listener runs the\n // onCancel callback synchronously, which may clear the thread and with it\n // the task this cancellation is for, or start a new run.\n const task = this.currentTask;\n const generation = this.runGeneration;\n\n // Abort locally first so the stream stops immediately\n this.abortController.abort();\n\n // Then try to cancel the task on the server\n if (task?.id) {\n try {\n const updated = await this.client.cancelTask(task.id);\n // Only apply the response while nothing newer exists. A newer snapshot\n // or a cleared thread replaces the task object; a follow-up run that\n // has not emitted yet keeps it, so the run generation is what rules\n // that case out.\n if (this.currentTask === task && this.runGeneration === generation) {\n this.currentTask = updated;\n this.notifyUpdate();\n }\n } catch {\n // Server cancel failed; local abort already handled\n }\n }\n }\n\n private appendLinearChain(messages: readonly ThreadMessage[]): string | null {\n let parentId: string | null = null;\n let lastId: string | null = null;\n const seen = new Set<string>();\n\n for (const message of messages) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n this.session.addOrUpdateMessage(parentId, message);\n parentId = message.id;\n lastId = message.id;\n }\n\n return lastId;\n }\n\n private finalizeExternalApply(): void {\n this.assistantHistoryParents.clear();\n this.recordedHistoryIds.clear();\n for (const { message } of this.getMessageRepository().messages) {\n this.recordedHistoryIds.add(message.id);\n }\n this.currentTask = undefined;\n this.currentArtifacts = [];\n this.a2uiState = new Map();\n this.a2uiMessageIds.clear();\n this.notifyUpdate();\n }\n\n applyExternalMessages(messages: readonly ThreadMessage[]): void {\n if (messages.length === 0) {\n this.session.clear();\n } else {\n let expectedParentId: string | null = null;\n let lastAppliedId: string | null = null;\n let hardReplace = false;\n const seen = new Set<string>();\n\n for (const message of messages) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n const existing = this.session.tryGetMessage(message.id);\n if (existing && existing.parentId !== expectedParentId) {\n hardReplace = true;\n break;\n }\n this.session.addOrUpdateMessage(expectedParentId, message);\n expectedParentId = message.id;\n lastAppliedId = message.id;\n }\n\n if (hardReplace) {\n this.session.clear();\n lastAppliedId = this.appendLinearChain(messages);\n }\n\n this.session.resetHead(lastAppliedId);\n }\n\n this.finalizeExternalApply();\n }\n\n // --- Run logic ---\n\n private async startRun(userThreadMessage: ThreadMessage): Promise<void> {\n this.runGeneration++;\n\n // Cancel any in-progress run before starting a new one\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n\n const a2aMessage = threadMessageToA2AMessage(userThreadMessage, {\n contextId: this.contextId,\n taskId:\n this.currentTask?.id &&\n !isTerminalTaskState(this.currentTask.status.state)\n ? this.currentTask.id\n : undefined,\n });\n\n // Clear task if previous task reached terminal state\n if (\n this.currentTask &&\n isTerminalTaskState(this.currentTask.status.state)\n ) {\n this.currentTask = undefined;\n }\n\n this.currentArtifacts = [];\n this.a2uiState = new Map();\n this.a2uiMessageIds.clear();\n\n const assistantParentId = userThreadMessage.id;\n const assistantId = this.insertAssistantPlaceholder(assistantParentId);\n this.markPendingAssistantHistory(assistantId, assistantParentId);\n\n const abortController = new AbortController();\n this.abortController = abortController;\n\n abortController.signal.addEventListener(\n \"abort\",\n () => {\n this.updateAssistantStatus(assistantId, {\n type: \"incomplete\",\n reason: \"cancelled\",\n });\n this.finishRun(abortController);\n invokeRuntimeCallback(\"onCancel\", this.onCancel);\n },\n { once: true },\n );\n\n this.setRunning(true);\n\n try {\n if (!(await this.waitForAgentCard(abortController.signal))) return;\n\n const supportsStreaming =\n this.agentCardValue?.capabilities?.streaming !== false;\n if (supportsStreaming) {\n await this.runStreaming(a2aMessage, assistantId, abortController);\n } else {\n await this.runSync(a2aMessage, assistantId, abortController);\n }\n } catch (error) {\n if (!abortController.signal.aborted) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.updateAssistantStatus(assistantId, {\n type: \"incomplete\",\n reason: \"error\",\n });\n invokeRuntimeCallback(\"onError\", this.onError, err);\n this.pendingError = this.pendingError ?? err;\n }\n } finally {\n this.finishRun(abortController);\n }\n\n if (this.pendingError) {\n const err = this.pendingError;\n this.pendingError = null;\n throw err;\n }\n }\n\n private async runStreaming(\n a2aMessage: A2AMessage,\n assistantId: string,\n abortController: AbortController,\n ): Promise<void> {\n const stream = this.client.streamMessage(\n a2aMessage,\n this.configuration,\n undefined, // metadata\n abortController.signal,\n );\n\n let receivedEvent = false;\n let skipReason: string | undefined;\n const diagnosedStream = (async function* () {\n const reason = yield* stream;\n if (typeof reason === \"string\") skipReason = reason;\n })();\n\n for await (const event of diagnosedStream) {\n if (abortController.signal.aborted) break;\n receivedEvent = true;\n this.handleStreamEvent(assistantId, event);\n }\n\n if (!abortController.signal.aborted) {\n if (!receivedEvent) {\n throw new Error(\n skipReason\n ? `A2A message stream ended without any events. First skipped frame: ${skipReason}`\n : \"A2A message stream ended without any events.\",\n );\n }\n\n const lastStatus = this.getAssistantStatus(assistantId);\n if (lastStatus?.type === \"running\") {\n this.updateAssistantStatus(assistantId, {\n type: \"complete\",\n reason: \"stop\",\n });\n }\n }\n }\n\n private async runSync(\n a2aMessage: A2AMessage,\n assistantId: string,\n abortController: AbortController,\n ): Promise<void> {\n const result = await this.client.sendMessage(\n a2aMessage,\n this.configuration,\n undefined, // metadata\n abortController.signal,\n );\n\n if (abortController.signal.aborted) return;\n\n // Result is either A2ATask or A2AMessage\n if (\"id\" in result && \"status\" in result) {\n // It's a Task\n this.handleTaskSnapshot(assistantId, result as A2ATask);\n } else if (\"messageId\" in result && \"parts\" in result) {\n // It's a Message\n this.handleMessage(assistantId, result as A2AMessage);\n this.updateAssistantStatus(assistantId, {\n type: \"complete\",\n reason: \"stop\",\n });\n }\n }\n\n private handleStreamEvent(assistantId: string, event: A2AStreamEvent) {\n switch (event.type) {\n case \"statusUpdate\":\n this.handleStatusUpdate(assistantId, event.event);\n break;\n case \"artifactUpdate\":\n this.handleArtifactUpdate(assistantId, event.event);\n break;\n case \"message\":\n this.handleMessage(assistantId, event.message);\n break;\n case \"task\":\n this.handleTaskSnapshot(assistantId, event.task);\n break;\n }\n }\n\n private handleStatusUpdate(\n assistantId: string,\n event: A2ATaskStatusUpdateEvent,\n ) {\n if (!this.currentTask) {\n this.currentTask = {\n id: event.taskId,\n contextId: event.contextId,\n status: event.status,\n };\n } else {\n this.currentTask = { ...this.currentTask, status: event.status };\n }\n\n if (event.contextId) {\n this.contextId = event.contextId;\n }\n\n if (event.status.message) {\n this.applyA2uiMessage(event.status.message);\n const content = a2aMessageToContent(event.status.message);\n this.updateAssistantContent(assistantId, content);\n }\n\n const status = taskStateToMessageStatus(event.status.state);\n this.updateAssistantStatus(assistantId, status);\n\n this.notifyUpdate();\n }\n\n private handleArtifactUpdate(\n assistantId: string,\n event: A2ATaskArtifactUpdateEvent,\n ) {\n const { append, lastChunk } = event;\n const artifact = normalizeArtifact(event.artifact);\n const existingIdx = this.currentArtifacts.findIndex(\n (a) => a.artifactId === artifact.artifactId,\n );\n\n let updated: A2AArtifact;\n if (existingIdx >= 0 && append) {\n const existing = this.currentArtifacts[existingIdx]!;\n updated = {\n ...existing,\n parts: [...existing.parts, ...artifact.parts],\n };\n this.currentArtifacts = [\n ...this.currentArtifacts.slice(0, existingIdx),\n updated,\n ...this.currentArtifacts.slice(existingIdx + 1),\n ];\n } else if (existingIdx >= 0) {\n updated = artifact;\n this.currentArtifacts = [\n ...this.currentArtifacts.slice(0, existingIdx),\n updated,\n ...this.currentArtifacts.slice(existingIdx + 1),\n ];\n } else {\n updated = artifact;\n this.currentArtifacts = [...this.currentArtifacts, updated];\n }\n\n this.applyA2uiParts(artifact.parts);\n this.updateAssistantArtifacts(assistantId);\n this.rebuildAssistantA2uiSurfaces(assistantId);\n\n if (lastChunk) {\n invokeRuntimeCallback(\n \"onArtifactComplete\",\n this.onArtifactComplete,\n updated,\n );\n }\n\n this.notifyUpdate();\n }\n\n private handleMessage(assistantId: string, message: A2AMessage) {\n if (message.role !== \"agent\") return;\n\n this.applyA2uiMessage(message);\n const content = a2aMessageToContent(message);\n this.updateAssistantContent(assistantId, content);\n this.notifyUpdate();\n }\n\n private handleTaskSnapshot(assistantId: string, task: A2ATask) {\n const artifacts =\n task.artifacts === undefined\n ? undefined\n : Array.isArray(task.artifacts)\n ? task.artifacts.map(normalizeArtifact)\n : [];\n const history =\n task.history === undefined\n ? undefined\n : Array.isArray(task.history)\n ? task.history\n : [];\n this.currentTask = {\n ...task,\n ...(artifacts === undefined ? {} : { artifacts }),\n ...(history === undefined ? {} : { history }),\n };\n\n if (task.contextId) {\n this.contextId = task.contextId;\n }\n const isCompleteSnapshot = history !== undefined && artifacts !== undefined;\n const artifactsToApply = isCompleteSnapshot\n ? artifacts\n : artifacts?.filter(\n (artifact) =>\n !this.currentArtifacts.some(\n ({ artifactId }) => artifactId === artifact.artifactId,\n ),\n );\n\n if (isCompleteSnapshot) {\n this.currentArtifacts = artifacts;\n this.a2uiState = new Map();\n this.a2uiMessageIds.clear();\n } else if (artifactsToApply) {\n this.currentArtifacts = [...this.currentArtifacts, ...artifactsToApply];\n }\n\n for (const message of history ?? []) {\n if (message.role === \"agent\") this.applyA2uiMessage(message, true);\n }\n for (const artifact of artifactsToApply ?? []) {\n this.applyA2uiParts(artifact.parts);\n }\n if (task.status.message) {\n this.applyA2uiMessage(task.status.message, true);\n }\n\n if (isCompleteSnapshot || artifactsToApply?.length) {\n this.updateAssistantArtifacts(assistantId);\n }\n\n if (task.status.message) {\n const content = a2aMessageToContent(task.status.message);\n this.updateAssistantContent(assistantId, content);\n } else {\n this.rebuildAssistantA2uiSurfaces(assistantId);\n }\n\n const status = taskStateToMessageStatus(task.status.state);\n this.updateAssistantStatus(assistantId, status);\n\n this.notifyUpdate();\n }\n\n // --- Message helpers ---\n\n private insertAssistantPlaceholder(parentId: string): string {\n const id = generateId();\n const assistant: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n createdAt: new Date(),\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_state: null,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n };\n this.session.addOrUpdateMessage(parentId, assistant);\n this.session.switchToBranch(id);\n this.notifyUpdate();\n return id;\n }\n\n private updateAssistantContent(\n messageId: string,\n content: ThreadAssistantMessage[\"content\"],\n ) {\n this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n return {\n ...message,\n content: this.withA2uiSurfaces(content, message.content),\n };\n });\n }\n\n private applyA2uiMessage(message: A2AMessage, replay = false) {\n if (message.messageId) {\n if (replay && this.a2uiMessageIds.has(message.messageId)) return;\n this.a2uiMessageIds.add(message.messageId);\n }\n this.applyA2uiParts(message.parts);\n }\n\n private applyA2uiParts(parts: readonly A2AMessage[\"parts\"][number][]) {\n const operations = a2uiPartsToOperations(parts);\n if (operations.length === 0) return;\n this.a2uiState = applyA2uiOperations(this.a2uiState, operations).state;\n }\n\n private a2uiSurfaceParts(): ThreadAssistantMessagePart[] {\n const parts: ThreadAssistantMessagePart[] = [];\n for (const [surfaceId, surface] of this.a2uiState) {\n const { spec } = convertSurfaceToUISpec(surface);\n if (!spec) continue;\n parts.push({\n type: \"tool-call\",\n toolCallId: `a2ui:${surfaceId}`,\n toolName: \"present\",\n args: spec as unknown as ReadonlyJSONObject,\n argsText: JSON.stringify(spec),\n result: {},\n artifact: { a2ui: surfaceToOperations(surface) },\n });\n }\n return parts;\n }\n\n private withA2uiSurfaces(\n content: ThreadAssistantMessage[\"content\"],\n previousContent: ThreadAssistantMessage[\"content\"] = content,\n ): ThreadAssistantMessage[\"content\"] {\n const preserved = content.filter(\n (part) =>\n !(part.type === \"tool-call\" && part.toolCallId.startsWith(\"a2ui:\")),\n );\n const interactionSource = [...previousContent, ...content];\n return this.withPreservedToolInteractions(interactionSource, [\n ...preserved,\n ...this.a2uiSurfaceParts(),\n ]);\n }\n\n private withPreservedToolInteractions(\n previousContent: ThreadAssistantMessage[\"content\"],\n content: ThreadAssistantMessage[\"content\"],\n ): ThreadAssistantMessage[\"content\"] {\n const interactions = new Map<\n string,\n ToolCallMessagePart[\"unstable_interactions\"]\n >();\n for (const part of previousContent) {\n if (\n part.type === \"tool-call\" &&\n part.unstable_interactions !== undefined\n ) {\n interactions.set(part.toolCallId, part.unstable_interactions);\n }\n }\n if (interactions.size === 0) return content;\n return content.map((part) => {\n if (\n part.type !== \"tool-call\" ||\n part.unstable_interactions !== undefined\n ) {\n return part;\n }\n const unstable_interactions = interactions.get(part.toolCallId);\n return unstable_interactions === undefined\n ? part\n : { ...part, unstable_interactions };\n });\n }\n\n private rebuildAssistantA2uiSurfaces(messageId: string) {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n return {\n ...message,\n content: this.withA2uiSurfaces(message.content),\n };\n });\n if (touched) this.notifyUpdate();\n }\n\n private updateAssistantArtifacts(messageId: string) {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const custom = message.metadata.custom;\n const a2a = isRecord(custom.a2a) ? custom.a2a : {};\n return {\n ...message,\n metadata: {\n ...message.metadata,\n custom: {\n ...custom,\n a2a: {\n ...a2a,\n artifacts: this.currentArtifacts.map(storedArtifact),\n },\n },\n },\n };\n });\n if (touched) this.notifyUpdate();\n }\n\n private updateAssistantStatus(messageId: string, status: MessageStatus) {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n return { ...message, status };\n });\n if (touched) {\n this.notifyUpdate();\n if (this.isPersistableAssistantStatus(status)) {\n this.persistAssistantHistory(messageId);\n }\n }\n }\n\n private getAssistantStatus(messageId: string): MessageStatus | undefined {\n const msg = this.session.tryGetMessage(messageId)?.message;\n if (msg?.role !== \"assistant\") return undefined;\n return msg.status;\n }\n\n private isPersistableAssistantStatus(status: MessageStatus): boolean {\n return (\n status.type === \"complete\" ||\n status.type === \"incomplete\" ||\n (status.type === \"requires-action\" && status.reason === \"interrupt\")\n );\n }\n\n // --- Lifecycle helpers ---\n\n private setRunning(running: boolean) {\n this.isRunningFlag = running;\n this.notifyUpdate();\n }\n\n private finishRun(controller: AbortController | null) {\n if (this.abortController !== controller) return;\n this.abortController = null;\n this.setRunning(false);\n }\n\n // --- History persistence ---\n\n private recordHistoryEntry(parentId: string | null, message: ThreadMessage) {\n void this.appendHistoryItem(parentId, message)?.catch((error) => {\n console.error(\"[react-a2a] failed to append history entry\", error);\n });\n }\n\n private markPendingAssistantHistory(\n messageId: string,\n parentId: string | null,\n ) {\n if (!this.history) return;\n this.assistantHistoryParents.set(messageId, parentId);\n }\n\n private persistAssistantHistory(messageId: string) {\n if (!this.history) return;\n const messageData = this.session.tryGetMessage(messageId);\n const parentId = this.assistantHistoryParents.get(messageId);\n if (parentId === undefined && !this.recordedHistoryIds.has(messageId)) {\n return;\n }\n const resolvedParentId =\n parentId === undefined ? messageData?.parentId : parentId;\n if (resolvedParentId === undefined) return;\n const message = messageData?.message;\n if (!message || message.role !== \"assistant\") return;\n if (!this.isPersistableAssistantStatus(message.status)) return;\n const isPausing = message.status.type === \"requires-action\";\n\n if (isPausing && !this.history.update) return;\n\n if (this.recordedHistoryIds.has(messageId)) {\n if (this.history.update) {\n const update = this.history.update.bind(this.history);\n const write = this.chainHistoryWrite(messageId, () =>\n update({ parentId: resolvedParentId, message }),\n );\n if (!isPausing) {\n this.assistantHistoryParents.delete(messageId);\n }\n void write.then(\n () => {\n this.recordedHistoryIds.add(messageId);\n },\n (error) => {\n const pending = this.historyWrites.get(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, resolvedParentId);\n }\n console.error(\"[react-a2a] failed to update history entry\", error);\n },\n );\n return;\n }\n if (!isPausing) {\n this.assistantHistoryParents.delete(messageId);\n }\n return;\n }\n const write = this.appendHistoryItem(resolvedParentId, message);\n if (!write) return;\n if (!isPausing) {\n this.assistantHistoryParents.delete(messageId);\n }\n void write.catch((error) => {\n const pending = this.historyWrites.get(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, resolvedParentId);\n }\n console.error(\"[react-a2a] failed to append history entry\", error);\n });\n }\n\n private appendHistoryItem(\n parentId: string | null,\n message: ThreadMessage,\n ): Promise<void> | undefined {\n if (!this.history || this.recordedHistoryIds.has(message.id)) return;\n this.recordedHistoryIds.add(message.id);\n const append = this.history.append.bind(this.history);\n const write = this.chainHistoryWrite(message.id, () =>\n append({ parentId, message }),\n );\n void write.catch(() => {\n this.recordedHistoryIds.delete(message.id);\n });\n return write;\n }\n\n private chainHistoryWrite(\n id: string,\n write: () => Promise<void>,\n ): Promise<void> {\n const pending = this.historyWrites.get(id);\n let next: Promise<void>;\n if (pending) {\n next = pending.then(write, write);\n } else {\n try {\n next = Promise.resolve(write());\n } catch (error) {\n next = Promise.reject(error);\n }\n }\n this.historyWrites.set(id, next);\n void next.then(\n () => {\n if (this.historyWrites.get(id) === next) {\n this.historyWrites.delete(id);\n }\n },\n () => {\n if (this.historyWrites.get(id) === next) {\n this.historyWrites.delete(id);\n }\n },\n );\n return next;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"A2AThreadRuntimeCore.js","names":["isRecord"],"sources":["../src/A2AThreadRuntimeCore.ts"],"sourcesContent":["\"use client\";\n\nimport { generateId, fromThreadMessageLike } from \"@assistant-ui/core\";\nimport type {\n AppendMessage,\n AssistantRuntime,\n ExportedMessageRepository,\n MessageStatus,\n ThreadAssistantMessage,\n ThreadAssistantMessagePart,\n ThreadHistoryAdapter,\n ThreadMessage,\n ToolCallMessagePart,\n Unstable_RecordToolInteractionOptions,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n createMessageRepositorySession,\n invokeUserCallback,\n RunLeases,\n} from \"@assistant-ui/core/internal\";\nimport {\n applyA2uiOperations,\n surfaceToPresentToolCall,\n type A2uiState,\n} from \"@assistant-ui/generative-ui/a2ui\";\nimport type { A2AClient } from \"./A2AClient\";\nimport type {\n A2AArtifact,\n A2AAgentCard,\n A2AMessage,\n A2ASendMessageConfiguration,\n A2AStreamEvent,\n A2ATask,\n A2ATaskArtifactUpdateEvent,\n A2ATaskStatusUpdateEvent,\n} from \"./types\";\n\nimport {\n a2aMessageToContent,\n a2uiPartsToOperations,\n isTerminalTaskState,\n threadMessageToA2AMessage,\n taskStateToMessageStatus,\n} from \"./conversions\";\n\nconst INITIAL_AGENT_CARD_RETRY_DELAY_MS = 5_000;\nconst MAX_AGENT_CARD_RETRY_DELAY_MS = 5 * 60_000;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst storedArtifact = (artifact: A2AArtifact): A2AArtifact => ({\n ...artifact,\n parts: artifact.parts.map(({ raw: _raw, ...part }) => part),\n});\n\nexport type A2AThreadRuntimeCoreOptions = {\n client: A2AClient;\n contextId?: string | undefined;\n configuration?: A2ASendMessageConfiguration | undefined;\n onError?: ((error: Error) => void) | undefined;\n onCancel?: (() => void) | undefined;\n onArtifactComplete?: ((artifact: A2AArtifact) => void) | undefined;\n history?: ThreadHistoryAdapter | undefined;\n};\n\nconst FALLBACK_USER_STATUS = {\n type: \"complete\",\n reason: \"unknown\",\n} as const;\n\ntype A2ARuntimeCallbackName = \"onError\" | \"onCancel\" | \"onArtifactComplete\";\n\nconst invokeRuntimeCallback = <TArgs extends readonly unknown[]>(\n name: A2ARuntimeCallbackName,\n callback: ((...args: TArgs) => unknown) | undefined,\n ...args: TArgs\n): void => {\n void invokeUserCallback(\"react-a2a\", name, callback, ...args);\n};\n\nfunction normalizeArtifact(artifact: A2AArtifact): A2AArtifact {\n return {\n ...artifact,\n parts: Array.isArray(artifact.parts) ? artifact.parts : [],\n };\n}\n\nexport class A2AThreadRuntimeCore {\n private client: A2AClient;\n private contextId: string | undefined;\n private configuration: A2ASendMessageConfiguration | undefined;\n private onError: ((error: Error) => void) | undefined;\n private onCancel: (() => void) | undefined;\n private onArtifactComplete: ((artifact: A2AArtifact) => void) | undefined;\n private history: ThreadHistoryAdapter | undefined;\n private readonly listeners = new Set<() => void>();\n private snapshot:\n | {\n isLoading: boolean;\n isRunning: boolean;\n messageRepository: ExportedMessageRepository;\n task: A2ATask | undefined;\n artifacts: readonly A2AArtifact[];\n agentCard: A2AAgentCard | undefined;\n }\n | undefined;\n\n private runtime: AssistantRuntime | undefined;\n private readonly session = createMessageRepositorySession();\n private isRunningFlag = false;\n private abortController: AbortController | null = null;\n private readonly runLeases = new RunLeases();\n private pendingError: Error | null = null;\n\n // A2A-specific state\n private currentTask: A2ATask | undefined;\n private currentArtifacts: A2AArtifact[] = [];\n private a2uiState: A2uiState = new Map();\n private readonly a2uiMessageIds = new Set<string>();\n private agentCardValue: A2AAgentCard | undefined;\n\n // History tracking\n private readonly assistantHistoryParents = new Map<string, string | null>();\n private readonly recordedHistoryIds = new Set<string>();\n private readonly historyWrites = new Map<string, Promise<void>>();\n private _isLoading = false;\n private _loadPromise: Promise<void> | undefined;\n private _historyLoadGeneration = 0;\n private _loadRequested = false;\n private _agentCardPromise: Promise<void> | undefined;\n private _agentCardRetryAfter = 0;\n private _agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;\n private _agentCardDiscoveryFailed = false;\n\n private lastOptionsContextId: string | undefined;\n\n constructor(options: A2AThreadRuntimeCoreOptions) {\n this.client = options.client;\n this.contextId = options.contextId;\n this.lastOptionsContextId = options.contextId;\n this.configuration = options.configuration;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n this.onArtifactComplete = options.onArtifactComplete;\n this.history = options.history;\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getSnapshot = () =>\n (this.snapshot ??= {\n isLoading: this._isLoading,\n isRunning: this.isRunningFlag,\n messageRepository: this.session.export(),\n task: this.currentTask,\n artifacts: this.currentArtifacts,\n agentCard: this.agentCardValue,\n });\n\n private publishUpdate(): void {\n this.snapshot = undefined;\n for (const listener of this.listeners) listener();\n }\n\n updateOptions(options: A2AThreadRuntimeCoreOptions) {\n this.client = options.client;\n // The option only seeds the context; a re-render with the same value must\n // not clobber a server-assigned contextId learned from the stream.\n if (options.contextId !== this.lastOptionsContextId) {\n this.contextId = options.contextId;\n this.lastOptionsContextId = options.contextId;\n }\n this.configuration = options.configuration;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n this.onArtifactComplete = options.onArtifactComplete;\n const previousHistory = this.history;\n this.history = options.history;\n\n if (\n this._loadRequested &&\n !this._loadPromise &&\n !previousHistory &&\n options.history &&\n this.session.getMessages().length === 0\n ) {\n void this.__internal_load();\n }\n }\n\n /** Thread-boundary reset: applyExternalMessages alone also serves branch\n * switches, deletes, and cancel resyncs, which must keep the live context. */\n resetContext(): void {\n this._historyLoadGeneration++;\n const wasLoading = this._isLoading;\n this._isLoading = false;\n // Restore the seed before aborting: an onCancel callback that starts a\n // new run must not pick up the old thread's context, and its controller\n // must not be discarded.\n const controller = this.abortController;\n this.contextId = this.lastOptionsContextId;\n if (controller) {\n controller.abort();\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n if (wasLoading) this.publishUpdate();\n }\n\n attachRuntime(runtime: AssistantRuntime) {\n this.runtime = runtime;\n }\n\n detachRuntime() {\n this.runtime = undefined;\n // Abort in-flight requests on unmount\n const controller = this.abortController;\n if (controller) {\n controller.abort();\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n }\n\n getRuntime(): AssistantRuntime | undefined {\n return this.runtime;\n }\n\n getMessages(): readonly ThreadMessage[] {\n return this.session.getMessages();\n }\n\n getMessageRepository(): ExportedMessageRepository {\n return this.session.export();\n }\n\n public async recordToolInteraction({\n messageId,\n toolCallId,\n interaction,\n }: Unstable_RecordToolInteractionOptions): Promise<void> {\n const message = this.session.tryGetMessage(messageId)?.message;\n if (!message) {\n throw new Error(\n \"Tried to record a tool interaction on a non-existing message\",\n );\n }\n if (message.role !== \"assistant\") {\n throw new Error(\n \"Tried to record a tool interaction on a non-assistant message\",\n );\n }\n const target = message.content.find(\n (part) => part.type === \"tool-call\" && part.toolCallId === toolCallId,\n );\n if (!target || target.type !== \"tool-call\") {\n throw new Error(\n \"Tried to record a tool interaction on a non-existing tool call\",\n );\n }\n\n const touched = this.session.updateMessage(messageId, (current) => {\n if (current.role !== \"assistant\") return current;\n return {\n ...current,\n content: current.content.map((part) =>\n part.type === \"tool-call\" && part.toolCallId === toolCallId\n ? {\n ...part,\n unstable_interactions: appendToolInteraction(\n part.unstable_interactions,\n interaction,\n ),\n }\n : part,\n ),\n };\n });\n if (touched) {\n this.publishUpdate();\n this.persistAssistantHistory(messageId);\n }\n }\n\n getTask(): A2ATask | undefined {\n return this.currentTask;\n }\n\n getArtifacts(): readonly A2AArtifact[] {\n return this.currentArtifacts;\n }\n\n getAgentCard(): A2AAgentCard | undefined {\n return this.agentCardValue;\n }\n\n isRunning(): boolean {\n return this.isRunningFlag;\n }\n\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n private loadAgentCard(): Promise<void> {\n if (Date.now() < this._agentCardRetryAfter) return Promise.resolve();\n\n this._agentCardPromise ??= this.client.getAgentCard().then(\n (agentCard) => {\n this.agentCardValue = agentCard;\n this._agentCardRetryAfter = 0;\n this._agentCardRetryDelay = INITIAL_AGENT_CARD_RETRY_DELAY_MS;\n this._agentCardDiscoveryFailed = false;\n this.publishUpdate();\n },\n () => {\n this._agentCardDiscoveryFailed = true;\n this._agentCardRetryAfter = Date.now() + this._agentCardRetryDelay;\n this._agentCardRetryDelay = Math.min(\n this._agentCardRetryDelay * 2,\n MAX_AGENT_CARD_RETRY_DELAY_MS,\n );\n this._agentCardPromise = undefined;\n },\n );\n return this._agentCardPromise;\n }\n\n private async waitForAgentCard(signal: AbortSignal): Promise<boolean> {\n const shouldWait = !this._agentCardDiscoveryFailed;\n const load = this.loadAgentCard();\n if (signal.aborted) return false;\n if (!shouldWait) return true;\n\n let onAbort!: () => void;\n const abort = new Promise<void>((resolve) => {\n onAbort = resolve;\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n try {\n await Promise.race([load, abort]);\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n return !signal.aborted;\n }\n\n __internal_load(): Promise<void> {\n this._loadRequested = true;\n const agentCardPromise = this.loadAgentCard();\n\n if (this._loadPromise) return this._loadPromise;\n if (!this.history) return agentCardPromise;\n\n this._isLoading = true;\n\n const generation = this._historyLoadGeneration;\n const historyPromise = this.history.load();\n\n this._loadPromise = historyPromise\n .then((repo) => {\n if (generation !== this._historyLoadGeneration) return;\n if (repo) {\n this.session.applyExternalMessageRepository(repo);\n this.finalizeExternalApply();\n }\n })\n .catch((error) => {\n if (generation !== this._historyLoadGeneration) return;\n invokeRuntimeCallback(\n \"onError\",\n this.onError,\n error instanceof Error ? error : new Error(String(error)),\n );\n })\n .finally(() => {\n if (generation !== this._historyLoadGeneration) return;\n this._isLoading = false;\n this.publishUpdate();\n });\n\n this.publishUpdate();\n return this._loadPromise;\n }\n\n async append(message: AppendMessage): Promise<void> {\n const startRun = message.startRun ?? message.role === \"user\";\n\n const threadMessage = fromThreadMessageLike(\n message as any,\n generateId(),\n FALLBACK_USER_STATUS,\n );\n const parentId =\n message.parentId === null\n ? null\n : message.parentId && this.session.hasMessage(message.parentId)\n ? message.parentId\n : this.session.headId;\n this.session.addOrUpdateMessage(parentId, threadMessage);\n this.session.switchToBranch(threadMessage.id);\n this.publishUpdate();\n this.recordHistoryEntry(parentId, threadMessage);\n\n if (!startRun) return;\n await this.startRun(threadMessage);\n }\n\n appendVoiceTranscript(message: ThreadMessage): void {\n const parentId = this.session.headId;\n this.session.addOrUpdateMessage(parentId, message);\n this.session.switchToBranch(message.id);\n this.publishUpdate();\n this.recordHistoryEntry(parentId, message);\n }\n\n async edit(message: AppendMessage): Promise<void> {\n await this.append(message);\n }\n\n async reload(\n parentId: string | null,\n _config: { runConfig?: Record<string, unknown> } = {},\n ): Promise<void> {\n const messages =\n parentId === null\n ? []\n : (this.session.tryGetMessages(parentId) ?? this.getMessages());\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"user\") {\n await this.startRun(messages[i]!);\n return;\n }\n }\n }\n\n async cancel(): Promise<void> {\n if (!this.abortController) return;\n\n // Read the server target before aborting: the abort listener runs the\n // onCancel callback synchronously, which may clear the thread and with it\n // the task this cancellation is for, or start a new run.\n const task = this.currentTask;\n const lease = this.runLeases.current();\n\n // Abort locally first so the stream stops immediately\n this.abortController.abort();\n\n // Then try to cancel the task on the server\n if (task?.id) {\n try {\n const updated = await this.client.cancelTask(task.id);\n // Only apply the response while nothing newer exists. A newer snapshot\n // or a cleared thread replaces the task object; a follow-up run that\n // has not emitted yet keeps it, so the run lease is what rules\n // that case out.\n if (this.currentTask === task && lease.isCurrent()) {\n this.currentTask = updated;\n this.publishUpdate();\n }\n } catch {\n // Server cancel failed; local abort already handled\n }\n }\n }\n\n private appendLinearChain(messages: readonly ThreadMessage[]): string | null {\n let parentId: string | null = null;\n let lastId: string | null = null;\n const seen = new Set<string>();\n\n for (const message of messages) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n this.session.addOrUpdateMessage(parentId, message);\n parentId = message.id;\n lastId = message.id;\n }\n\n return lastId;\n }\n\n private finalizeExternalApply(): void {\n this.assistantHistoryParents.clear();\n this.recordedHistoryIds.clear();\n for (const { message } of this.getMessageRepository().messages) {\n this.recordedHistoryIds.add(message.id);\n }\n this.currentTask = undefined;\n this.currentArtifacts = [];\n this.a2uiState = new Map();\n this.a2uiMessageIds.clear();\n this.publishUpdate();\n }\n\n applyExternalMessages(messages: readonly ThreadMessage[]): void {\n if (messages.length === 0) {\n this.session.clear();\n } else {\n let expectedParentId: string | null = null;\n let lastAppliedId: string | null = null;\n let hardReplace = false;\n const seen = new Set<string>();\n\n for (const message of messages) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n const existing = this.session.tryGetMessage(message.id);\n if (existing && existing.parentId !== expectedParentId) {\n hardReplace = true;\n break;\n }\n this.session.addOrUpdateMessage(expectedParentId, message);\n expectedParentId = message.id;\n lastAppliedId = message.id;\n }\n\n if (hardReplace) {\n this.session.clear();\n lastAppliedId = this.appendLinearChain(messages);\n }\n\n this.session.resetHead(lastAppliedId);\n }\n\n this.finalizeExternalApply();\n }\n\n // --- Run logic ---\n\n private async startRun(userThreadMessage: ThreadMessage): Promise<void> {\n this.runLeases.begin();\n\n // Cancel any in-progress run before starting a new one. Its abort runs\n // onCancel synchronously, and a run that callback starts keeps the thread.\n // A listener that throws before finishRun leaves `previous` installed, so\n // only a different, non-null controller counts as a replacement run.\n const previous = this.abortController;\n if (previous) {\n previous.abort();\n if (this.abortController !== previous && this.abortController !== null)\n return;\n this.abortController = null;\n }\n\n const a2aMessage = threadMessageToA2AMessage(userThreadMessage, {\n contextId: this.contextId,\n taskId:\n this.currentTask?.id &&\n !isTerminalTaskState(this.currentTask.status.state)\n ? this.currentTask.id\n : undefined,\n });\n\n // Clear task if previous task reached terminal state\n if (\n this.currentTask &&\n isTerminalTaskState(this.currentTask.status.state)\n ) {\n this.currentTask = undefined;\n }\n\n this.currentArtifacts = [];\n this.a2uiState = new Map();\n this.a2uiMessageIds.clear();\n\n const assistantParentId = userThreadMessage.id;\n const assistantId = this.insertAssistantPlaceholder(assistantParentId);\n this.markPendingAssistantHistory(assistantId, assistantParentId);\n\n const abortController = new AbortController();\n this.abortController = abortController;\n\n abortController.signal.addEventListener(\n \"abort\",\n () => {\n this.updateAssistantStatus(assistantId, {\n type: \"incomplete\",\n reason: \"cancelled\",\n });\n this.finishRun(abortController);\n invokeRuntimeCallback(\"onCancel\", this.onCancel);\n },\n { once: true },\n );\n\n this.setRunning(true);\n\n try {\n if (!(await this.waitForAgentCard(abortController.signal))) return;\n\n const supportsStreaming =\n this.agentCardValue?.capabilities?.streaming !== false;\n if (supportsStreaming) {\n await this.runStreaming(a2aMessage, assistantId, abortController);\n } else {\n await this.runSync(a2aMessage, assistantId, abortController);\n }\n } catch (error) {\n if (!abortController.signal.aborted) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.updateAssistantStatus(assistantId, {\n type: \"incomplete\",\n reason: \"error\",\n });\n invokeRuntimeCallback(\"onError\", this.onError, err);\n this.pendingError = this.pendingError ?? err;\n }\n } finally {\n this.finishRun(abortController);\n }\n\n if (this.pendingError) {\n const err = this.pendingError;\n this.pendingError = null;\n throw err;\n }\n }\n\n private async runStreaming(\n a2aMessage: A2AMessage,\n assistantId: string,\n abortController: AbortController,\n ): Promise<void> {\n const stream = this.client.streamMessage(\n a2aMessage,\n this.configuration,\n undefined, // metadata\n abortController.signal,\n );\n\n let receivedEvent = false;\n let skipReason: string | undefined;\n const diagnosedStream = (async function* () {\n const reason = yield* stream;\n if (typeof reason === \"string\") skipReason = reason;\n })();\n\n for await (const event of diagnosedStream) {\n if (abortController.signal.aborted) break;\n receivedEvent = true;\n this.handleStreamEvent(assistantId, event);\n }\n\n if (!abortController.signal.aborted) {\n if (!receivedEvent) {\n throw new Error(\n skipReason\n ? `A2A message stream ended without any events. First skipped frame: ${skipReason}`\n : \"A2A message stream ended without any events.\",\n );\n }\n\n const lastStatus = this.getAssistantStatus(assistantId);\n if (lastStatus?.type === \"running\") {\n this.updateAssistantStatus(assistantId, {\n type: \"complete\",\n reason: \"stop\",\n });\n }\n }\n }\n\n private async runSync(\n a2aMessage: A2AMessage,\n assistantId: string,\n abortController: AbortController,\n ): Promise<void> {\n const result = await this.client.sendMessage(\n a2aMessage,\n this.configuration,\n undefined, // metadata\n abortController.signal,\n );\n\n if (abortController.signal.aborted) return;\n\n // Result is either A2ATask or A2AMessage\n if (\"id\" in result && \"status\" in result) {\n // It's a Task\n this.handleTaskSnapshot(assistantId, result as A2ATask);\n } else if (\"messageId\" in result && \"parts\" in result) {\n // It's a Message\n this.handleMessage(assistantId, result as A2AMessage);\n this.updateAssistantStatus(assistantId, {\n type: \"complete\",\n reason: \"stop\",\n });\n }\n }\n\n private handleStreamEvent(assistantId: string, event: A2AStreamEvent) {\n switch (event.type) {\n case \"statusUpdate\":\n this.handleStatusUpdate(assistantId, event.event);\n break;\n case \"artifactUpdate\":\n this.handleArtifactUpdate(assistantId, event.event);\n break;\n case \"message\":\n this.handleMessage(assistantId, event.message);\n break;\n case \"task\":\n this.handleTaskSnapshot(assistantId, event.task);\n break;\n }\n }\n\n private handleStatusUpdate(\n assistantId: string,\n event: A2ATaskStatusUpdateEvent,\n ) {\n if (!this.currentTask) {\n this.currentTask = {\n id: event.taskId,\n contextId: event.contextId,\n status: event.status,\n };\n } else {\n this.currentTask = { ...this.currentTask, status: event.status };\n }\n\n if (event.contextId) {\n this.contextId = event.contextId;\n }\n\n if (event.status.message) {\n this.applyA2uiMessage(event.status.message);\n const content = a2aMessageToContent(event.status.message);\n this.updateAssistantContent(assistantId, content);\n }\n\n const status = taskStateToMessageStatus(event.status.state);\n this.updateAssistantStatus(assistantId, status);\n\n this.publishUpdate();\n }\n\n private handleArtifactUpdate(\n assistantId: string,\n event: A2ATaskArtifactUpdateEvent,\n ) {\n const { append, lastChunk } = event;\n const artifact = normalizeArtifact(event.artifact);\n const existingIdx = this.currentArtifacts.findIndex(\n (a) => a.artifactId === artifact.artifactId,\n );\n\n let updated: A2AArtifact;\n if (existingIdx >= 0 && append) {\n const existing = this.currentArtifacts[existingIdx]!;\n updated = {\n ...existing,\n parts: [...existing.parts, ...artifact.parts],\n };\n this.currentArtifacts = [\n ...this.currentArtifacts.slice(0, existingIdx),\n updated,\n ...this.currentArtifacts.slice(existingIdx + 1),\n ];\n } else if (existingIdx >= 0) {\n updated = artifact;\n this.currentArtifacts = [\n ...this.currentArtifacts.slice(0, existingIdx),\n updated,\n ...this.currentArtifacts.slice(existingIdx + 1),\n ];\n } else {\n updated = artifact;\n this.currentArtifacts = [...this.currentArtifacts, updated];\n }\n\n this.applyA2uiParts(artifact.parts);\n this.updateAssistantArtifacts(assistantId);\n this.rebuildAssistantA2uiSurfaces(assistantId);\n\n if (lastChunk) {\n invokeRuntimeCallback(\n \"onArtifactComplete\",\n this.onArtifactComplete,\n updated,\n );\n }\n\n this.publishUpdate();\n }\n\n private handleMessage(assistantId: string, message: A2AMessage) {\n if (message.role !== \"agent\") return;\n\n this.applyA2uiMessage(message);\n const content = a2aMessageToContent(message);\n this.updateAssistantContent(assistantId, content);\n this.publishUpdate();\n }\n\n private handleTaskSnapshot(assistantId: string, task: A2ATask) {\n const artifacts =\n task.artifacts === undefined\n ? undefined\n : Array.isArray(task.artifacts)\n ? task.artifacts.map(normalizeArtifact)\n : [];\n const history =\n task.history === undefined\n ? undefined\n : Array.isArray(task.history)\n ? task.history\n : [];\n this.currentTask = {\n ...task,\n ...(artifacts === undefined ? {} : { artifacts }),\n ...(history === undefined ? {} : { history }),\n };\n\n if (task.contextId) {\n this.contextId = task.contextId;\n }\n const isCompleteSnapshot = history !== undefined && artifacts !== undefined;\n const artifactsToApply = isCompleteSnapshot\n ? artifacts\n : artifacts?.filter(\n (artifact) =>\n !this.currentArtifacts.some(\n ({ artifactId }) => artifactId === artifact.artifactId,\n ),\n );\n\n if (isCompleteSnapshot) {\n this.currentArtifacts = artifacts;\n this.a2uiState = new Map();\n this.a2uiMessageIds.clear();\n } else if (artifactsToApply) {\n this.currentArtifacts = [...this.currentArtifacts, ...artifactsToApply];\n }\n\n for (const message of history ?? []) {\n if (message.role === \"agent\") this.applyA2uiMessage(message, true);\n }\n for (const artifact of artifactsToApply ?? []) {\n this.applyA2uiParts(artifact.parts);\n }\n if (task.status.message) {\n this.applyA2uiMessage(task.status.message, true);\n }\n\n if (isCompleteSnapshot || artifactsToApply?.length) {\n this.updateAssistantArtifacts(assistantId);\n }\n\n if (task.status.message) {\n const content = a2aMessageToContent(task.status.message);\n this.updateAssistantContent(assistantId, content);\n } else {\n this.rebuildAssistantA2uiSurfaces(assistantId);\n }\n\n const status = taskStateToMessageStatus(task.status.state);\n this.updateAssistantStatus(assistantId, status);\n\n this.publishUpdate();\n }\n\n // --- Message helpers ---\n\n private insertAssistantPlaceholder(parentId: string): string {\n const id = generateId();\n const assistant: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n createdAt: new Date(),\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_state: null,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n };\n this.session.addOrUpdateMessage(parentId, assistant);\n this.session.switchToBranch(id);\n this.publishUpdate();\n return id;\n }\n\n private updateAssistantContent(\n messageId: string,\n content: ThreadAssistantMessage[\"content\"],\n ) {\n this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n return {\n ...message,\n content: this.withA2uiSurfaces(content, message.content),\n };\n });\n }\n\n private applyA2uiMessage(message: A2AMessage, replay = false) {\n if (message.messageId) {\n if (replay && this.a2uiMessageIds.has(message.messageId)) return;\n this.a2uiMessageIds.add(message.messageId);\n }\n this.applyA2uiParts(message.parts);\n }\n\n private applyA2uiParts(parts: readonly A2AMessage[\"parts\"][number][]) {\n const operations = a2uiPartsToOperations(parts);\n if (operations.length === 0) return;\n this.a2uiState = applyA2uiOperations(this.a2uiState, operations).state;\n }\n\n private a2uiSurfaceParts(): ThreadAssistantMessagePart[] {\n const parts: ThreadAssistantMessagePart[] = [];\n for (const [surfaceId, surface] of this.a2uiState) {\n const { toolCall } = surfaceToPresentToolCall(surfaceId, surface);\n if (!toolCall) continue;\n parts.push({\n type: \"tool-call\",\n ...toolCall,\n });\n }\n return parts;\n }\n\n private withA2uiSurfaces(\n content: ThreadAssistantMessage[\"content\"],\n previousContent: ThreadAssistantMessage[\"content\"] = content,\n ): ThreadAssistantMessage[\"content\"] {\n const preserved = content.filter(\n (part) =>\n !(part.type === \"tool-call\" && part.toolCallId.startsWith(\"a2ui:\")),\n );\n const interactionSource = [...previousContent, ...content];\n return this.withPreservedToolInteractions(interactionSource, [\n ...preserved,\n ...this.a2uiSurfaceParts(),\n ]);\n }\n\n private withPreservedToolInteractions(\n previousContent: ThreadAssistantMessage[\"content\"],\n content: ThreadAssistantMessage[\"content\"],\n ): ThreadAssistantMessage[\"content\"] {\n const interactions = new Map<\n string,\n ToolCallMessagePart[\"unstable_interactions\"]\n >();\n for (const part of previousContent) {\n if (\n part.type === \"tool-call\" &&\n part.unstable_interactions !== undefined\n ) {\n interactions.set(part.toolCallId, part.unstable_interactions);\n }\n }\n if (interactions.size === 0) return content;\n return content.map((part) => {\n if (\n part.type !== \"tool-call\" ||\n part.unstable_interactions !== undefined\n ) {\n return part;\n }\n const unstable_interactions = interactions.get(part.toolCallId);\n return unstable_interactions === undefined\n ? part\n : { ...part, unstable_interactions };\n });\n }\n\n private rebuildAssistantA2uiSurfaces(messageId: string) {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n return {\n ...message,\n content: this.withA2uiSurfaces(message.content),\n };\n });\n if (touched) this.publishUpdate();\n }\n\n private updateAssistantArtifacts(messageId: string) {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const custom = message.metadata.custom;\n const a2a = isRecord(custom.a2a) ? custom.a2a : {};\n return {\n ...message,\n metadata: {\n ...message.metadata,\n custom: {\n ...custom,\n a2a: {\n ...a2a,\n artifacts: this.currentArtifacts.map(storedArtifact),\n },\n },\n },\n };\n });\n if (touched) this.publishUpdate();\n }\n\n private updateAssistantStatus(messageId: string, status: MessageStatus) {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n return { ...message, status };\n });\n if (touched) {\n this.publishUpdate();\n if (this.isPersistableAssistantStatus(status)) {\n this.persistAssistantHistory(messageId);\n }\n }\n }\n\n private getAssistantStatus(messageId: string): MessageStatus | undefined {\n const msg = this.session.tryGetMessage(messageId)?.message;\n if (msg?.role !== \"assistant\") return undefined;\n return msg.status;\n }\n\n private isPersistableAssistantStatus(status: MessageStatus): boolean {\n return (\n status.type === \"complete\" ||\n status.type === \"incomplete\" ||\n (status.type === \"requires-action\" && status.reason === \"interrupt\")\n );\n }\n\n // --- Lifecycle helpers ---\n\n private setRunning(running: boolean) {\n this.isRunningFlag = running;\n this.publishUpdate();\n }\n\n private finishRun(controller: AbortController | null) {\n if (this.abortController !== controller) return;\n this.abortController = null;\n this.setRunning(false);\n }\n\n // --- History persistence ---\n\n private recordHistoryEntry(parentId: string | null, message: ThreadMessage) {\n void this.appendHistoryItem(parentId, message)?.catch((error) => {\n console.error(\"[react-a2a] failed to append history entry\", error);\n });\n }\n\n private markPendingAssistantHistory(\n messageId: string,\n parentId: string | null,\n ) {\n if (!this.history) return;\n this.assistantHistoryParents.set(messageId, parentId);\n }\n\n private persistAssistantHistory(messageId: string) {\n if (!this.history) return;\n const messageData = this.session.tryGetMessage(messageId);\n const parentId = this.assistantHistoryParents.get(messageId);\n if (parentId === undefined && !this.recordedHistoryIds.has(messageId)) {\n return;\n }\n const resolvedParentId =\n parentId === undefined ? messageData?.parentId : parentId;\n if (resolvedParentId === undefined) return;\n const message = messageData?.message;\n if (!message || message.role !== \"assistant\") return;\n if (!this.isPersistableAssistantStatus(message.status)) return;\n const isPausing = message.status.type === \"requires-action\";\n\n if (isPausing && !this.history.update) return;\n\n if (this.recordedHistoryIds.has(messageId)) {\n if (this.history.update) {\n const update = this.history.update.bind(this.history);\n const write = this.chainHistoryWrite(messageId, () =>\n update({ parentId: resolvedParentId, message }),\n );\n if (!isPausing) {\n this.assistantHistoryParents.delete(messageId);\n }\n void write.then(\n () => {\n this.recordedHistoryIds.add(messageId);\n },\n (error) => {\n const pending = this.historyWrites.get(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, resolvedParentId);\n }\n console.error(\"[react-a2a] failed to update history entry\", error);\n },\n );\n return;\n }\n if (!isPausing) {\n this.assistantHistoryParents.delete(messageId);\n }\n return;\n }\n const write = this.appendHistoryItem(resolvedParentId, message);\n if (!write) return;\n if (!isPausing) {\n this.assistantHistoryParents.delete(messageId);\n }\n void write.catch((error) => {\n const pending = this.historyWrites.get(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, resolvedParentId);\n }\n console.error(\"[react-a2a] failed to append history entry\", error);\n });\n }\n\n private appendHistoryItem(\n parentId: string | null,\n message: ThreadMessage,\n ): Promise<void> | undefined {\n if (!this.history || this.recordedHistoryIds.has(message.id)) return;\n this.recordedHistoryIds.add(message.id);\n const append = this.history.append.bind(this.history);\n const write = this.chainHistoryWrite(message.id, () =>\n append({ parentId, message }),\n );\n void write.catch(() => {\n this.recordedHistoryIds.delete(message.id);\n });\n return write;\n }\n\n private chainHistoryWrite(\n id: string,\n write: () => Promise<void>,\n ): Promise<void> {\n const pending = this.historyWrites.get(id);\n let next: Promise<void>;\n if (pending) {\n next = pending.then(write, write);\n } else {\n try {\n next = Promise.resolve(write());\n } catch (error) {\n next = Promise.reject(error);\n }\n }\n this.historyWrites.set(id, next);\n void next.then(\n () => {\n if (this.historyWrites.get(id) === next) {\n this.historyWrites.delete(id);\n }\n },\n () => {\n if (this.historyWrites.get(id) === next) {\n this.historyWrites.delete(id);\n }\n },\n );\n return next;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../src/conversions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACtB,aAAa,EACd,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../src/conversions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACtB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,mBAAgB;AAwBjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAarD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,CAGtE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,OAAO,EAAE,GACxB,SAAS,OAAO,EAAE,CAGpB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,GACZ,sBAAsB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAwC3C;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EAAE,GACf,sBAAsB,CAAC,SAAS,CAAC,CAInC;AAcD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAEnE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAkB3E;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CACtD,CAAC,EACF,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,EAAE,CA0EX;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,UAAU,GAClB,sBAAsB,CAAC,SAAS,CAAC,CAEnC;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB,GACL,UAAU,CA6BZ"}
|
package/dist/conversions.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { parseDataUrl, resolveFilePartSource } from "@assistant-ui/core/internal";
|
|
2
|
+
import { parseDataUrl, resolveFilePartSource, resolveImageMediaType } from "@assistant-ui/core/internal";
|
|
3
3
|
//#region src/conversions.ts
|
|
4
4
|
function isImageMediaType(mediaType) {
|
|
5
5
|
return !!mediaType && mediaType.startsWith("image/");
|
|
@@ -121,7 +121,7 @@ function contentPartsToA2AParts(content, fallbackMimeType) {
|
|
|
121
121
|
const parsed = parseDataUrl(part.image);
|
|
122
122
|
if (parsed) return {
|
|
123
123
|
raw: parsed.data,
|
|
124
|
-
mediaType:
|
|
124
|
+
mediaType: resolveImageMediaType(part.image, fallbackMimeType),
|
|
125
125
|
...part.filename && { filename: part.filename }
|
|
126
126
|
};
|
|
127
127
|
return {
|
package/dist/conversions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversions.js","names":["isRecord"],"sources":["../src/conversions.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n MessageStatus,\n ThreadAssistantMessage,\n ThreadMessage,\n} from \"@assistant-ui/core\";\nimport {\n parseDataUrl,\n resolveFilePartSource,\n} from \"@assistant-ui/core/internal\";\nimport type { A2AMessage, A2APart, A2ATaskState } from \"./types\";\n\nfunction isImageMediaType(mediaType?: string): boolean {\n return !!mediaType && mediaType.startsWith(\"image/\");\n}\n\nconst A2UI_OPERATION_KEYS = [\n \"createSurface\",\n \"updateComponents\",\n \"updateDataModel\",\n \"deleteSurface\",\n] as const;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isA2uiOperation = (value: unknown): boolean =>\n isRecord(value) &&\n typeof value.version === \"string\" &&\n A2UI_OPERATION_KEYS.some((key) => Object.hasOwn(value, key));\n\nconst hasA2uiMediaType = (value: unknown): boolean =>\n typeof value === \"string\" && value.toLowerCase().includes(\"a2ui\");\n\nexport function isA2uiDataPart(part: A2APart): boolean {\n if (part.data === undefined) return false;\n\n const metadata = isRecord(part.metadata) ? part.metadata : {};\n return (\n hasA2uiMediaType(part.mediaType) ||\n hasA2uiMediaType(metadata.mimeType) ||\n hasA2uiMediaType(metadata.mediaType) ||\n isA2uiOperation(part.data) ||\n (Array.isArray(part.data) &&\n part.data.length > 0 &&\n part.data.every(isA2uiOperation))\n );\n}\n\nexport function a2uiPartToOperations(part: A2APart): readonly unknown[] {\n if (!isA2uiDataPart(part)) return [];\n return Array.isArray(part.data) ? part.data : [part.data];\n}\n\nexport function a2uiPartsToOperations(\n parts: readonly A2APart[],\n): readonly unknown[] {\n if (!Array.isArray(parts)) return [];\n return parts.flatMap(a2uiPartToOperations);\n}\n\nexport function a2aPartToContent(\n part: A2APart,\n): ThreadAssistantMessage[\"content\"][number] {\n if (!isRecord(part)) return { type: \"text\", text: \"\" };\n if (part.text != null) {\n return { type: \"text\", text: part.text };\n }\n if (part.url != null) {\n if (isImageMediaType(part.mediaType)) {\n return {\n type: \"image\",\n image: part.url,\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType ?? \"application/octet-stream\",\n sourceType: \"url\",\n ...(part.filename && { filename: part.filename }),\n };\n }\n if (part.raw != null) {\n if (isImageMediaType(part.mediaType)) {\n return {\n type: \"image\",\n image: `data:${part.mediaType};base64,${part.raw}`,\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n type: \"file\",\n data: part.raw,\n mimeType: part.mediaType ?? \"application/octet-stream\",\n ...(part.filename && { filename: part.filename }),\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 (Array.isArray(parts) ? parts : [])\n .filter((part) => isRecord(part) && !isA2uiDataPart(part))\n .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 | undefined;\n image?: string | undefined;\n data?: unknown;\n mimeType?: string | undefined;\n filename?: string | undefined;\n sourceType?: \"url\" | \"id\" | undefined;\n audio?: { data: string; format: string } | undefined;\n }>,\n fallbackMimeType?: string,\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 const parsed = parseDataUrl(part.image);\n if (parsed) {\n return {\n raw: parsed.data,\n mediaType: parsed.mimeType,\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n url: part.image,\n ...(fallbackMimeType && { mediaType: fallbackMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n case \"file\": {\n if (typeof part.data !== \"string\") return null;\n const declaredMimeType = part.mimeType || fallbackMimeType;\n const source = resolveFilePartSource({\n data: part.data,\n mimeType: declaredMimeType ?? \"application/octet-stream\",\n sourceType: part.sourceType,\n });\n if (source.kind === \"url\") {\n return {\n url: source.url,\n ...(declaredMimeType && { mediaType: declaredMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n const parsed = parseDataUrl(part.data);\n if (parsed) {\n return {\n raw: source.data,\n mediaType: source.mimeType,\n ...(part.filename && { filename: part.filename }),\n };\n }\n if (/^data:/i.test(part.data)) {\n return {\n url: part.data,\n ...(declaredMimeType && { mediaType: declaredMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n raw: source.data,\n ...(declaredMimeType && { mediaType: declaredMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n case \"audio\": {\n if (!part.audio) return null;\n return {\n raw: parseDataUrl(part.audio.data)?.data ?? part.audio.data,\n mediaType: `audio/${part.audio.format}`,\n };\n }\n case \"data\": {\n if (part.data === undefined) return null;\n return { data: part.data };\n }\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\nexport function threadMessageToA2AMessage(\n message: ThreadMessage,\n options: {\n contextId?: string | undefined;\n taskId?: string | undefined;\n } = {},\n): A2AMessage {\n const parts: A2APart[] = [];\n\n if (message.role === \"user\") {\n parts.push(...contentPartsToA2AParts(message.content));\n for (const attachment of message.attachments ?? []) {\n parts.push(\n ...contentPartsToA2AParts(\n attachment.content ?? [],\n attachment.contentType,\n ),\n );\n }\n }\n\n const a2aMsg: A2AMessage = {\n messageId: message.id,\n role: \"user\",\n parts,\n };\n\n if (options.contextId) {\n a2aMsg.contextId = options.contextId;\n }\n if (options.taskId) {\n a2aMsg.taskId = options.taskId;\n }\n\n return a2aMsg;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversions.js","names":["isRecord"],"sources":["../src/conversions.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n MessageStatus,\n ThreadAssistantMessage,\n ThreadMessage,\n} from \"@assistant-ui/core\";\nimport {\n parseDataUrl,\n resolveFilePartSource,\n resolveImageMediaType,\n} from \"@assistant-ui/core/internal\";\nimport type { A2AMessage, A2APart, A2ATaskState } from \"./types\";\n\nfunction isImageMediaType(mediaType?: string): boolean {\n return !!mediaType && mediaType.startsWith(\"image/\");\n}\n\nconst A2UI_OPERATION_KEYS = [\n \"createSurface\",\n \"updateComponents\",\n \"updateDataModel\",\n \"deleteSurface\",\n] as const;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isA2uiOperation = (value: unknown): boolean =>\n isRecord(value) &&\n typeof value.version === \"string\" &&\n A2UI_OPERATION_KEYS.some((key) => Object.hasOwn(value, key));\n\nconst hasA2uiMediaType = (value: unknown): boolean =>\n typeof value === \"string\" && value.toLowerCase().includes(\"a2ui\");\n\nexport function isA2uiDataPart(part: A2APart): boolean {\n if (part.data === undefined) return false;\n\n const metadata = isRecord(part.metadata) ? part.metadata : {};\n return (\n hasA2uiMediaType(part.mediaType) ||\n hasA2uiMediaType(metadata.mimeType) ||\n hasA2uiMediaType(metadata.mediaType) ||\n isA2uiOperation(part.data) ||\n (Array.isArray(part.data) &&\n part.data.length > 0 &&\n part.data.every(isA2uiOperation))\n );\n}\n\nexport function a2uiPartToOperations(part: A2APart): readonly unknown[] {\n if (!isA2uiDataPart(part)) return [];\n return Array.isArray(part.data) ? part.data : [part.data];\n}\n\nexport function a2uiPartsToOperations(\n parts: readonly A2APart[],\n): readonly unknown[] {\n if (!Array.isArray(parts)) return [];\n return parts.flatMap(a2uiPartToOperations);\n}\n\nexport function a2aPartToContent(\n part: A2APart,\n): ThreadAssistantMessage[\"content\"][number] {\n if (!isRecord(part)) return { type: \"text\", text: \"\" };\n if (part.text != null) {\n return { type: \"text\", text: part.text };\n }\n if (part.url != null) {\n if (isImageMediaType(part.mediaType)) {\n return {\n type: \"image\",\n image: part.url,\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType ?? \"application/octet-stream\",\n sourceType: \"url\",\n ...(part.filename && { filename: part.filename }),\n };\n }\n if (part.raw != null) {\n if (isImageMediaType(part.mediaType)) {\n return {\n type: \"image\",\n image: `data:${part.mediaType};base64,${part.raw}`,\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n type: \"file\",\n data: part.raw,\n mimeType: part.mediaType ?? \"application/octet-stream\",\n ...(part.filename && { filename: part.filename }),\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 (Array.isArray(parts) ? parts : [])\n .filter((part) => isRecord(part) && !isA2uiDataPart(part))\n .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 | undefined;\n image?: string | undefined;\n data?: unknown;\n mimeType?: string | undefined;\n filename?: string | undefined;\n sourceType?: \"url\" | \"id\" | undefined;\n audio?: { data: string; format: string } | undefined;\n }>,\n fallbackMimeType?: string,\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 const parsed = parseDataUrl(part.image);\n if (parsed) {\n return {\n raw: parsed.data,\n mediaType: resolveImageMediaType(part.image, fallbackMimeType),\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n url: part.image,\n ...(fallbackMimeType && { mediaType: fallbackMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n case \"file\": {\n if (typeof part.data !== \"string\") return null;\n const declaredMimeType = part.mimeType || fallbackMimeType;\n const source = resolveFilePartSource({\n data: part.data,\n mimeType: declaredMimeType ?? \"application/octet-stream\",\n sourceType: part.sourceType,\n });\n if (source.kind === \"url\") {\n return {\n url: source.url,\n ...(declaredMimeType && { mediaType: declaredMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n const parsed = parseDataUrl(part.data);\n if (parsed) {\n return {\n raw: source.data,\n mediaType: source.mimeType,\n ...(part.filename && { filename: part.filename }),\n };\n }\n if (/^data:/i.test(part.data)) {\n return {\n url: part.data,\n ...(declaredMimeType && { mediaType: declaredMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n return {\n raw: source.data,\n ...(declaredMimeType && { mediaType: declaredMimeType }),\n ...(part.filename && { filename: part.filename }),\n };\n }\n case \"audio\": {\n if (!part.audio) return null;\n return {\n raw: parseDataUrl(part.audio.data)?.data ?? part.audio.data,\n mediaType: `audio/${part.audio.format}`,\n };\n }\n case \"data\": {\n if (part.data === undefined) return null;\n return { data: part.data };\n }\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\nexport function threadMessageToA2AMessage(\n message: ThreadMessage,\n options: {\n contextId?: string | undefined;\n taskId?: string | undefined;\n } = {},\n): A2AMessage {\n const parts: A2APart[] = [];\n\n if (message.role === \"user\") {\n parts.push(...contentPartsToA2AParts(message.content));\n for (const attachment of message.attachments ?? []) {\n parts.push(\n ...contentPartsToA2AParts(\n attachment.content ?? [],\n attachment.contentType,\n ),\n );\n }\n }\n\n const a2aMsg: A2AMessage = {\n messageId: message.id,\n role: \"user\",\n parts,\n };\n\n if (options.contextId) {\n a2aMsg.contextId = options.contextId;\n }\n if (options.taskId) {\n a2aMsg.taskId = options.taskId;\n }\n\n return a2aMsg;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useA2ARuntime.d.ts","sourceRoot":"","sources":["../src/useA2ARuntime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useA2ARuntime.d.ts","sourceRoot":"","sources":["../src/useA2ARuntime.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAgB;AAmBpD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,gBAAgB,CA6N7E"}
|