@assistant-ui/react-ag-ui 0.1.2 → 0.1.3
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/runtime/AgUiThreadController.d.ts.map +1 -1
- package/dist/runtime/AgUiThreadController.js +31 -4
- package/dist/runtime/AgUiThreadController.js.map +1 -1
- package/dist/runtime/adapter/run-aggregator.d.ts +1 -0
- package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
- package/dist/runtime/adapter/run-aggregator.js +8 -0
- package/dist/runtime/adapter/run-aggregator.js.map +1 -1
- package/package.json +5 -4
- package/src/runtime/AgUiThreadController.snapshot-head-move.test.ts +180 -1
- package/src/runtime/AgUiThreadController.test.ts +133 -1
- package/src/runtime/AgUiThreadController.ts +70 -7
- package/src/runtime/adapter/run-aggregator.ts +11 -0
- package/src/useAgUiRuntime.cloud-run-leases.test.tsx +384 -0
- package/src/useAgUiRuntime.state.test.tsx +87 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgUiThreadController.js","names":[],"sources":["../../src/runtime/AgUiThreadController.ts"],"sourcesContent":["\"use client\";\n\nimport {\n generateId,\n fromThreadMessageLike,\n isMcpAppUri,\n} from \"@assistant-ui/core\";\nimport type {\n AddToolResultOptions,\n AppendMessage,\n CreateAppendMessage,\n AssistantRuntime,\n ChatModelRunOptions,\n ChatModelRunResult,\n ExportedMessageRepository,\n MessageStatus,\n RespondToToolApprovalOptions,\n RunConfig,\n ThreadAssistantMessage,\n ThreadHistoryAdapter,\n ThreadMessage,\n ToolCallMessagePart,\n Unstable_ToolInteraction,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n createHistoryWriteChain,\n createMessageRepositorySession,\n invokeUserCallback,\n iterateToolCallParts,\n mapToolCallPartsDeep,\n} from \"@assistant-ui/core/internal\";\nimport type {\n AbstractAgent,\n AgentSubscriber,\n Context,\n RunAgentParameters,\n RunAgentResult,\n} from \"@ag-ui/client\";\nimport jsonpatch, { type Operation } from \"fast-json-patch\";\nimport {\n createAgUiThreadState,\n reduceAgUiThreadState,\n type AgUiThreadAction,\n type AgUiThreadState,\n} from \"./agUiThreadState\";\nimport type { Logger } from \"./logger\";\nimport { readMcpAppResourceUri, toolContentText } from \"./mcp-tool-result\";\nimport type {\n AgUiCustomMetadata,\n AgUiEvent,\n AgUiInterrupt,\n AgUiResumeEntry,\n AgUiResumeTranscript,\n UseAgUiRuntimeOptions,\n} from \"./types\";\nimport { AG_UI_METADATA_NAMESPACE, MCP_APPS_ACTIVITY_TYPE } from \"./types\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport {\n isPlainObject,\n RunAggregator,\n tryParseJSON,\n} from \"./adapter/run-aggregator\";\nimport {\n fromAgUiSnapshotMessages,\n toAgUiMessages,\n toAgUiTools,\n withAgUiPartMessageMetadata,\n} from \"./adapter/conversions\";\nimport { createAgUiSubscriber } from \"./adapter/subscriber\";\nimport {\n createReplayContentMerger,\n groupReplayToolContent,\n indexReplayToolOwners,\n preserveToolResult,\n} from \"./adapter/replay-content\";\nimport {\n buildToolApprovalResume,\n projectAgUiToolApprovals,\n preserveToolApprovalDecision,\n withSettledToolApprovals,\n withToolApprovalDecision,\n} from \"./adapter/tool-approval\";\n\n// AbstractAgent.runAgent declares two parameters. HttpAgent ignores a third and\n// is cancelled through agent.abortRun(); the run options stay for subclasses\n// that inherit the base no-op abortRun and have no other cancellation hook.\ntype RunAgentWithRunOptions = (\n parameters: RunAgentParameters,\n subscriber: AgentSubscriber,\n options: { signal: AbortSignal },\n) => Promise<RunAgentResult>;\n\nconst optimisticPrefix = \"__optimistic__\";\nconst generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;\nconst isOptimisticId = (id: string) => id.startsWith(optimisticPrefix);\n\nconst isResolvedToolCall = (\n part: ThreadAssistantMessage[\"content\"][number],\n): boolean =>\n part.type === \"tool-call\" && \"result\" in part && part.result !== undefined;\n\nconst hasResolvedToolCalls = (message: ThreadMessage): boolean => {\n if (message.role !== \"assistant\") return false;\n for (const part of iterateToolCallParts(message.content)) {\n if (isResolvedToolCall(part)) return true;\n }\n return false;\n};\n\nconst listedPendingToolCallIds = (\n assistant: Pick<ThreadAssistantMessage, \"metadata\">,\n): ReadonlySet<string> | undefined => {\n const ids = (\n assistant.metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.pendingToolCallIds;\n return ids === undefined ? undefined : new Set(ids);\n};\n\ntype ReplayContext = {\n // Immutable history reference: partial argument frames cannot redefine consent.\n readonly originalContent: ThreadAssistantMessage[\"content\"];\n accountedResultIds: ReadonlySet<string>;\n admittedToolCallIds: ReadonlySet<string>;\n merge: ReturnType<typeof createReplayContentMerger>;\n};\n\ntype SnapshotMessageReconciler = (\n snapshot: ThreadAssistantMessage,\n previous: ThreadAssistantMessage | undefined,\n) => ThreadAssistantMessage;\n\nconst withoutPendingToolCallIds = (\n metadata: ThreadAssistantMessage[\"metadata\"],\n): ThreadAssistantMessage[\"metadata\"] => {\n const namespace = metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined;\n if (!namespace || !(\"pendingToolCallIds\" in namespace)) return metadata;\n const { pendingToolCallIds: _pendingToolCallIds, ...remainingNamespace } =\n namespace;\n const { [AG_UI_METADATA_NAMESPACE]: _namespace, ...remainingCustom } =\n metadata.custom;\n return {\n ...metadata,\n custom: {\n ...remainingCustom,\n ...(Object.keys(remainingNamespace).length > 0\n ? { [AG_UI_METADATA_NAMESPACE]: remainingNamespace }\n : {}),\n },\n };\n};\n\nconst withPendingToolCallIds = (\n metadata: ThreadAssistantMessage[\"metadata\"],\n ids: Iterable<string>,\n): ThreadAssistantMessage[\"metadata\"] => ({\n ...metadata,\n custom: {\n ...metadata.custom,\n [AG_UI_METADATA_NAMESPACE]: {\n ...(metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined),\n pendingToolCallIds: [...ids],\n },\n },\n});\n\nconst actionableToolCallIds = (\n message: ThreadMessage | undefined,\n): ReadonlySet<string> => {\n if (\n message?.role !== \"assistant\" ||\n message.status?.type !== \"requires-action\" ||\n message.status.reason !== \"tool-calls\"\n )\n return new Set();\n const permitted = listedPendingToolCallIds(message);\n return new Set(\n Array.from(iterateToolCallParts(message.content))\n .filter(\n (part) =>\n !isResolvedToolCall(part) &&\n (!permitted || permitted.has(part.toolCallId)),\n )\n .map((part) => part.toolCallId),\n );\n};\n\nconst isActivityPart = (part: ThreadAssistantMessage[\"content\"][number]) =>\n part.type === \"data\" && part.name.startsWith(\"agui-activity/\");\n\ntype ResumeStream = (\n options: ChatModelRunOptions,\n) => AsyncGenerator<ChatModelRunResult, void, unknown>;\ntype ResumeRunConfig = {\n parentId: string | null;\n sourceId: string | null;\n runConfig: RunConfig;\n stream?: ResumeStream;\n};\n\n/**\n * A resume submission, pairing the entries that answer the open interrupts with\n * the assistant message they were opened on. That message anchors the resume\n * transcript: under `resumeTranscript: \"appended\"` only what follows it is sent.\n */\ntype ResumeDispatch = {\n entries: AgUiResumeEntry[];\n interruptedMessageId: string;\n};\n\ntype CoreOptions = {\n agent: AbstractAgent;\n logger: Logger;\n showThinking: boolean;\n joinStrategy?: UseAgUiRuntimeOptions[\"joinStrategy\"];\n getRunContext?: UseAgUiRuntimeOptions[\"getRunContext\"];\n resumeTranscript?: AgUiResumeTranscript | undefined;\n autoCancelPendingToolCalls?: boolean | undefined;\n onError?: (error: Error) => void;\n onCancel?: () => void;\n history?: ThreadHistoryAdapter;\n isThreadSwitching?: () => boolean;\n};\n\nconst FALLBACK_USER_STATUS = { type: \"complete\", reason: \"unknown\" } as const;\n\nconst textOf = (content: ThreadAssistantMessage[\"content\"]) =>\n content.flatMap((part) => (part.type === \"text\" ? [part.text] : [])).join(\"\");\n\n/**\n * Swaps `content`'s text parts, in order, for `source`'s. A text part `source`\n * has beyond `content`'s text slots goes after the nearest earlier part of\n * `source` that `content` also has: a tool call by id, another part by its\n * type and position among parts of that type. With none, it goes first.\n */\nconst replaceTextParts = (\n content: ThreadAssistantMessage[\"content\"],\n source: ThreadAssistantMessage[\"content\"],\n): ThreadAssistantMessage[\"content\"] => {\n const texts = source.filter((part) => part.type === \"text\");\n const result: ThreadAssistantMessage[\"content\"][number][] = [];\n let used = 0;\n for (const part of content) {\n if (part.type !== \"text\") result.push(part);\n else if (used < texts.length) result.push(texts[used++]!);\n }\n const positionIn = (\n parts: readonly ThreadAssistantMessage[\"content\"][number][],\n part: ThreadAssistantMessage[\"content\"][number],\n ) => parts.filter((other) => other.type === part.type).indexOf(part);\n for (const text of texts.slice(used)) {\n let anchor = -1;\n for (\n let index = source.indexOf(text) - 1;\n index >= 0 && anchor < 0;\n index--\n ) {\n const before = source[index]!;\n if (before.type === \"tool-call\") {\n anchor = result.findIndex(\n (part) =>\n part.type === \"tool-call\" && part.toolCallId === before.toolCallId,\n );\n } else if (before.type === \"text\") {\n anchor = result.indexOf(before);\n } else {\n const sameType = result.filter((part) => part.type === before.type);\n const match = sameType[positionIn(source, before)];\n anchor = match ? result.indexOf(match) : -1;\n }\n }\n result.splice(anchor + 1, 0, text);\n }\n return result;\n};\n\nconst settleNestedContent = (\n content: ThreadAssistantMessage[\"content\"],\n status: MessageStatus,\n) =>\n mapToolCallPartsDeep(content, (part) =>\n part.messages\n ? {\n ...part,\n messages: part.messages.map((message) =>\n message.role === \"assistant\" && message.status?.type === \"running\"\n ? { ...message, status }\n : message,\n ),\n }\n : part,\n ).content;\n\ntype AgUiRuntimeCallbackName = \"onError\" | \"onCancel\";\n\nconst invokeRuntimeCallback = <TArgs extends readonly unknown[]>(\n name: AgUiRuntimeCallbackName,\n callback: ((...args: TArgs) => unknown) | undefined,\n ...args: TArgs\n): void => {\n void invokeUserCallback(\"react-ag-ui\", name, callback, ...args);\n};\n\n// The aggregator sends only the agui keys it owns (interrupts and\n// opaqueReasoning, each as a full replacement), so a shallow spread at the\n// custom level would drop any sibling agui state a snapshot import attached.\nconst mergeAgUiNamespace = (\n current: Record<string, unknown> | undefined,\n incoming: Record<string, unknown>,\n) => {\n const merged = { ...current, ...incoming };\n const currentNs = current?.[AG_UI_METADATA_NAMESPACE];\n const incomingNs = incoming[AG_UI_METADATA_NAMESPACE];\n if (\n typeof currentNs === \"object\" &&\n currentNs !== null &&\n typeof incomingNs === \"object\" &&\n incomingNs !== null\n ) {\n merged[AG_UI_METADATA_NAMESPACE] = { ...currentNs, ...incomingNs };\n }\n return merged;\n};\n\nexport class AgUiThreadController {\n private agent: AbstractAgent;\n private logger: Logger;\n private showThinking: boolean;\n private joinStrategy: UseAgUiRuntimeOptions[\"joinStrategy\"];\n private getRunContext: UseAgUiRuntimeOptions[\"getRunContext\"];\n private resumeTranscript: AgUiResumeTranscript;\n private autoCancelPendingToolCalls: boolean | undefined;\n private onError: ((error: Error) => void) | undefined;\n private onCancel: (() => void) | undefined;\n private readonly listeners = new Set<() => void>();\n private snapshot:\n | {\n isLoading: boolean;\n isRunning: boolean;\n messageRepository: ExportedMessageRepository;\n state: ReadonlyJSONValue | undefined;\n }\n | undefined;\n private readonly isThreadSwitching: (() => boolean) | undefined;\n private readonly reportedErrors = new WeakSet<object>();\n\n private runtime: AssistantRuntime | undefined;\n private readonly session = createMessageRepositorySession({\n decorateExport: (exported, repository) => {\n let parentId: string | null = null;\n for (const message of repository.getMessages()) {\n if (message.metadata.isOptimistic) {\n exported.messages.push({ parentId, message });\n }\n parentId = message.id;\n }\n\n return {\n ...exported,\n headId: repository.headId,\n };\n },\n });\n private state: AgUiThreadState = createAgUiThreadState();\n private abortController: AbortController | null = null;\n // The agent that started the active run. updateOptions can swap this.agent\n // mid-run, and cancelling has to reach the agent holding the live request.\n private activeRunAgent: AbstractAgent | null = null;\n private history: ThreadHistoryAdapter | undefined;\n private readonly assistantHistoryParents = new Map<string, string | null>();\n private readonly subagentParentToolCallIds = new Map<\n string,\n string | undefined\n >();\n private readonly snapshotHistoryIds = new Set<string>();\n private readonly persistedHistoryIds = new Set<string>();\n private readonly historyWrites = createHistoryWriteChain();\n private _historyImportPromise: Promise<void> | undefined;\n private _loadPromise: Promise<void> | undefined;\n\n constructor(options: CoreOptions) {\n this.agent = options.agent;\n this.logger = options.logger;\n this.showThinking = options.showThinking;\n this.joinStrategy = options.joinStrategy;\n this.getRunContext = options.getRunContext;\n this.resumeTranscript = options.resumeTranscript ?? \"full\";\n this.autoCancelPendingToolCalls = options.autoCancelPendingToolCalls;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n this.history = options.history;\n this.isThreadSwitching = options.isThreadSwitching;\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.state.isLoading,\n isRunning: this.state.isRunning,\n messageRepository: this.session.export(),\n state: this.state.stateSnapshot,\n });\n\n private dispatch(action: AgUiThreadAction): void {\n this.state = reduceAgUiThreadState(this.state, action);\n }\n\n private publishUpdate(): void {\n this.snapshot = undefined;\n for (const listener of this.listeners) listener();\n }\n\n updateOptions(options: CoreOptions) {\n this.agent = options.agent;\n this.logger = options.logger;\n this.showThinking = options.showThinking;\n this.joinStrategy = options.joinStrategy;\n this.getRunContext = options.getRunContext;\n this.resumeTranscript = options.resumeTranscript ?? \"full\";\n this.autoCancelPendingToolCalls = options.autoCancelPendingToolCalls;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n const previousHistory = this.history;\n this.history = options.history;\n if (\n this.state.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 attachRuntime(runtime: AssistantRuntime) {\n this.runtime = runtime;\n }\n\n detachRuntime() {\n this.runtime = undefined;\n void this.cancel().catch((error) => {\n this.logger.error(\"[agui] failed to cancel run during teardown\", error);\n });\n }\n\n getMessages(): readonly ThreadMessage[] {\n return this.session.getMessages();\n }\n\n getMessageRepository(): ExportedMessageRepository {\n return this.session.export();\n }\n\n getState(): ReadonlyJSONValue | undefined {\n return this.state.stateSnapshot;\n }\n\n isRunning(): boolean {\n return this.state.isRunning;\n }\n\n get isLoading(): boolean {\n return this.state.isLoading;\n }\n\n __internal_load(): Promise<void> {\n this.dispatch({ type: \"loadRequested\" });\n if (this._loadPromise) return this._loadPromise;\n if (!this.history) return Promise.resolve();\n\n const promise = this.history.load().then((repo) => {\n if (!repo) return;\n\n this.session.applyExternalMessageRepository(repo);\n this.assistantHistoryParents.clear();\n this.subagentParentToolCallIds.clear();\n this.snapshotHistoryIds.clear();\n this.persistedHistoryIds.clear();\n for (const { message } of repo.messages) {\n this.persistedHistoryIds.add(message.id);\n }\n this.publishUpdate();\n\n if (repo.state !== undefined) {\n this.loadExternalState(repo.state);\n }\n\n return repo;\n });\n\n this.dispatch({ type: \"loadStarted\" });\n this._historyImportPromise = promise.then(\n () => {\n this._historyImportPromise = undefined;\n },\n () => {\n this._historyImportPromise = undefined;\n },\n );\n\n this._loadPromise = promise\n .then(async (repo) => {\n if (repo?.unstable_resume) {\n const parentId = repo.headId ?? this.session.headId;\n const resumeStream = this.history?.resume?.bind(this.history);\n await this.startRun(\n parentId,\n this.state.lastRunConfig,\n undefined,\n resumeStream,\n );\n }\n })\n .catch((error) => {\n this.logger.error?.(\"[agui] failed to load history\", error);\n this.reportError(error);\n })\n .finally(() => {\n this.dispatch({\n type: \"loadFinished\",\n });\n this.publishUpdate();\n });\n\n this.publishUpdate();\n return this._loadPromise;\n }\n\n private waitForHistoryImport(): Promise<boolean> | undefined {\n const historyImport = this._historyImportPromise;\n if (!historyImport) return undefined;\n const generation = this.state.historyMutationGeneration;\n return historyImport.then(\n () =>\n generation === this.state.historyMutationGeneration &&\n !this.isThreadSwitching?.(),\n );\n }\n\n private deferUntilHistoryImported(callback: () => void): boolean {\n const historyImport = this._historyImportPromise;\n if (!historyImport) return false;\n const generation = this.state.historyMutationGeneration;\n void historyImport.then(() => {\n if (\n generation !== this.state.historyMutationGeneration ||\n this.isThreadSwitching?.()\n ) {\n return;\n }\n try {\n callback();\n } catch (error) {\n this.reportError(error);\n }\n });\n return true;\n }\n\n async append(message: AppendMessage): Promise<void> {\n const historyImport = this._historyImportPromise;\n if (historyImport) {\n const wasAtTail = message.parentId === this.session.headId;\n const generation = this.state.historyMutationGeneration;\n await historyImport;\n if (\n generation !== this.state.historyMutationGeneration ||\n this.isThreadSwitching?.()\n )\n return;\n if (wasAtTail) {\n message = { ...message, parentId: this.session.headId };\n }\n }\n\n const startRun = message.startRun ?? message.role === \"user\";\n let ownsThread = true;\n if (startRun) {\n this.assertNoPendingInterrupts();\n this.maybeAutoCancelPendingToolCalls();\n // Before the message is linked: callers parent it on the in-flight\n // assistant, and settling that assistant reassigns its optimistic id,\n // which would evict it and reparent this message onto a branch.\n ownsThread = this.supersedeActiveRun();\n }\n const threadMessageId = this.appendEntry(message);\n if (!startRun || !ownsThread) return;\n await this.startRun(threadMessageId, message.runConfig);\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 private maybeAutoCancelPendingToolCalls(): void {\n if (this.autoCancelPendingToolCalls === false) return;\n for (const assistant of this.getPendingToolCallMessages()) {\n this.cancelUnresolvedToolCalls(assistant.id);\n this.maybeCompleteAfterToolResults(assistant.id);\n }\n }\n\n private appendEntry(message: AppendMessage): string {\n const threadMessage = this.toThreadMessage(message);\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 return threadMessage.id;\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?: RunConfig } = {},\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n this.assertNoPendingInterrupts();\n this.maybeAutoCancelPendingToolCalls();\n await this.startRun(parentId, config.runConfig);\n }\n\n async cancel(): Promise<void> {\n this.dispatch({\n type: \"historyMutationAdvanced\",\n });\n this.abortActiveRun();\n }\n\n // abortRun is what stops an upstream agent: AbstractAgent.runAgent declares\n // two parameters and HttpAgent binds its request to a controller of its own,\n // so the run options object reaches only subclasses that read it. The local\n // abort comes last and is unconditional: its listener runs onCancel\n // synchronously, so a callback that starts another run must keep the\n // controller it installed, and a throw from a subclass's abortRun would\n // otherwise strand the thread as running.\n private abortActiveRun(): void {\n const controller = this.abortController;\n if (!controller) return;\n try {\n (this.activeRunAgent ?? this.agent).abortRun();\n } finally {\n controller.abort();\n }\n }\n\n // Starting a run supersedes the active one, and reports whether the caller\n // still owns the thread afterwards: the local abort runs onCancel\n // synchronously, so a callback that starts its own run keeps it. abortRun is a\n // subclass's code, and a throw there must not abandon the run being started,\n // unlike cancel(), where the failed operation is the caller's own. Calling\n // this twice for one run is harmless, because the second call finds no active\n // run to supersede.\n private supersedeActiveRun(): boolean {\n try {\n this.abortActiveRun();\n } catch (error) {\n this.logger.error?.(\"[agui] agent abortRun failed\", error);\n }\n if (this.abortController === null) return true;\n this.logger.debug?.(\n \"[agui] onCancel started a replacement run; dropping the superseding send\",\n );\n return false;\n }\n\n async resume(config: ResumeRunConfig): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n this.assertNoPendingInterrupts();\n await this.startRun(\n config.parentId,\n config.runConfig ?? this.state.lastRunConfig,\n undefined,\n config.stream,\n true,\n );\n }\n\n async resumeInFlightRun(messages: readonly ThreadMessage[]): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n // Without a resume stream startRun would re-run the agent from scratch.\n const resumeStream = this.history?.resume?.bind(this.history);\n if (!resumeStream) {\n const error = new Error(\n \"[agui] unstable_resume requires a ThreadHistoryAdapter with a resume() method; skipping resume after thread switch\",\n );\n this.logger.error?.(error.message);\n invokeRuntimeCallback(\"onError\", this.onError, error);\n return;\n }\n const parentId = messages.at(-1)?.id ?? null;\n try {\n await this.startRun(\n parentId,\n this.state.lastRunConfig,\n undefined,\n resumeStream,\n );\n } catch {\n // startRun already reported via onError; don't reject the switch.\n }\n }\n\n private assertNoPendingInterrupts(): void {\n if (!this.getPendingInterrupts()) return;\n throw new Error(\n \"[agui] cannot start a new run while interrupts are pending; resolve them with submitInterruptResponses()\",\n );\n }\n\n private findRequiresActionAssistant(\n reason: \"interrupt\" | \"tool-calls\",\n ): ThreadAssistantMessage | null {\n return (\n this.getTrailingAssistantTurn().findLast(\n (message) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === reason,\n ) ?? null\n );\n }\n\n private getTrailingAssistantTurn(): ThreadAssistantMessage[] {\n const messages = this.getMessages();\n const turn: ThreadAssistantMessage[] = [];\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role !== \"assistant\") break;\n turn.unshift(message as ThreadAssistantMessage);\n }\n return turn;\n }\n\n private getPendingToolCallMessages(): ThreadAssistantMessage[] {\n return this.getTrailingAssistantTurn().filter(\n (message) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\",\n );\n }\n\n getPendingInterrupts(): {\n messageId: string;\n interrupts: readonly AgUiInterrupt[];\n } | null {\n const assistant = this.findRequiresActionAssistant(\"interrupt\");\n if (!assistant) return null;\n const stored = (\n assistant.metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.interrupts;\n if (!stored?.length) return null;\n return { messageId: assistant.id, interrupts: stored };\n }\n\n getPendingToolCalls(): {\n messageId: string;\n toolCallIds: string[];\n } | null {\n const toolCallIds: string[] = [];\n let messageId: string | undefined;\n for (const assistant of this.getPendingToolCallMessages()) {\n const listed = listedPendingToolCallIds(assistant);\n for (const part of iterateToolCallParts(assistant.content)) {\n if (\n isResolvedToolCall(part) ||\n (listed && !listed.has(part.toolCallId))\n )\n continue;\n messageId ??= assistant.id;\n toolCallIds.push(part.toolCallId);\n }\n }\n return messageId === undefined ? null : { messageId, toolCallIds };\n }\n\n async submitInterruptResponses(\n responses: readonly AgUiResumeEntry[],\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const pending = this.getPendingInterrupts();\n if (!pending) {\n throw new Error(\n \"[agui] submitInterruptResponses: no pending interrupts on this thread\",\n );\n }\n\n const responsesById = this.collectInterruptResponses(\n \"submitInterruptResponses\",\n pending.interrupts,\n responses,\n );\n\n const openIds = pending.interrupts.map((i) => i.id);\n const missing = openIds.filter((id) => !responsesById.has(id));\n if (missing.length > 0) {\n throw new Error(\n `[agui] submitInterruptResponses: missing responses for open interrupts: ${missing.join(\", \")}`,\n );\n }\n\n this.assertInterruptsAnswerable(\n \"submitInterruptResponses\",\n pending.interrupts,\n responsesById,\n );\n\n await this.resumeWithResponses(\n pending.messageId,\n openIds.map((id) => responsesById.get(id)!),\n );\n }\n\n /**\n * Resumes with an already validated resume array. Answerability is checked\n * once per submission: re-checking here would let a clock crossing reject a\n * decision this runtime has already recorded, stranding the gate decided and\n * unretryable.\n */\n private async resumeWithResponses(\n messageId: string,\n resume: AgUiResumeEntry[],\n ): Promise<void> {\n const parentId = this.session.headId ?? messageId;\n this.clearPendingInterrupts(messageId, resume);\n await this.startRun(parentId, this.state.lastRunConfig, {\n entries: resume,\n interruptedMessageId: messageId,\n });\n }\n\n /**\n * A rejected decision reaches the caller through the approval seam, and\n * `onError` in addition, because a consumer watching only the runtime would\n * otherwise miss it. A failure raised by the resumed run itself was already\n * reported by `startRun` before it rethrew, so reporting it here again would\n * give the consumer two notifications for one failure.\n */\n reportError(error: unknown): void {\n if (this.reportedErrors.has(error as object)) {\n this.reportedErrors.delete(error as object);\n return;\n }\n invokeRuntimeCallback(\n \"onError\",\n this.onError,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n private assertInterruptsAnswerable(\n method: \"submitInterruptResponses\" | \"respondToToolApproval\",\n interrupts: readonly AgUiInterrupt[],\n responsesById?: ReadonlyMap<string, AgUiResumeEntry>,\n ): void {\n const now = Date.now();\n for (const interrupt of interrupts) {\n if (!interrupt.expiresAt) continue;\n const expiry = new Date(interrupt.expiresAt).getTime();\n if (Number.isNaN(expiry)) {\n throw new Error(\n `[agui] ${method}: interrupt ${interrupt.id} has malformed expiresAt \"${interrupt.expiresAt}\"`,\n );\n }\n if (\n expiry <= now &&\n responsesById?.get(interrupt.id)?.status !== \"cancelled\"\n ) {\n throw new Error(\n `[agui] ${method}: interrupt ${interrupt.id} expired at ${interrupt.expiresAt}`,\n );\n }\n }\n if (this.state.isRunning) {\n throw new Error(`[agui] ${method}: a run is already in progress`);\n }\n }\n\n async respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const pending = this.getPendingInterrupts();\n if (!pending) {\n throw new Error(\n \"[agui] respondToToolApproval: no pending interrupts on this thread\",\n );\n }\n\n // Bound against the message the gates landed on, so this check claims a\n // batch only where the projection did.\n const gatedMessage = this.session.tryGetMessage(pending.messageId)\n ?.message as ThreadAssistantMessage | undefined;\n const gated = projectAgUiToolApprovals(\n pending.interrupts,\n new Set(\n Array.from(iterateToolCallParts(gatedMessage?.content ?? [])).map(\n (part) => part.toolCallId,\n ),\n ),\n );\n const isGated = [...gated.values()].some(\n (approval) => approval.id === options.approvalId,\n );\n if (!isGated) {\n throw new Error(\n `[agui] respondToToolApproval: no pending tool-call interrupt for approval id \"${options.approvalId}\"`,\n );\n }\n\n // The decision is recorded only once the batch is known to be answerable:\n // a rejected submission would otherwise leave the gate decided and\n // unretryable, because a second click reports it as already decided.\n this.assertInterruptsAnswerable(\n \"respondToToolApproval\",\n pending.interrupts,\n );\n\n const recorded = this.session.updateMessage(\n pending.messageId,\n (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const content = withToolApprovalDecision(assistant.content, options);\n if (content === assistant.content) return assistant;\n return { ...assistant, content };\n },\n );\n if (!recorded) {\n throw new Error(\n `[agui] respondToToolApproval: approval \"${options.approvalId}\" is already decided`,\n );\n }\n this.publishUpdate();\n\n const assistant = this.session.tryGetMessage(pending.messageId)?.message as\n | ThreadAssistantMessage\n | undefined;\n if (!assistant) return;\n\n // AG-UI resumes a run with one response per open interrupt, so the run\n // stays paused until every gate in the batch has been answered.\n const resume = buildToolApprovalResume(\n assistant.content,\n pending.interrupts,\n );\n if (!resume) return;\n\n await this.resumeWithResponses(pending.messageId, resume);\n }\n\n async steerAway(\n message: CreateAppendMessage,\n responses?: readonly AgUiResumeEntry[],\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const pending = this.getPendingInterrupts();\n if (!pending) {\n const pendingTools = this.getPendingToolCalls();\n if (pendingTools) {\n if (responses?.length) {\n throw new Error(\n \"[agui] steerAway: responses are only valid for pending interrupts\",\n );\n }\n if (this.state.isRunning) {\n throw new Error(\"[agui] steerAway: a run is already in progress\");\n }\n for (const assistant of this.getPendingToolCallMessages()) {\n this.cancelUnresolvedToolCalls(assistant.id);\n this.maybeCompleteAfterToolResults(assistant.id);\n }\n const normalized = this.toAppendMessage(message);\n const threadMessageId = this.appendEntry(normalized);\n await this.startRun(threadMessageId, normalized.runConfig);\n return;\n }\n if (responses?.length) {\n throw new Error(\n \"[agui] steerAway: no pending interrupts on this thread\",\n );\n }\n await this.append(this.toAppendMessage(message));\n return;\n }\n\n const resume = this.resolveSteerAwayResume(pending.interrupts, responses);\n\n if (this.state.isRunning) {\n throw new Error(\"[agui] steerAway: a run is already in progress\");\n }\n\n const normalized = this.toAppendMessage(message);\n this.clearPendingInterrupts(pending.messageId, resume);\n const threadMessageId = this.appendEntry(normalized);\n await this.startRun(threadMessageId, normalized.runConfig, {\n entries: resume,\n interruptedMessageId: pending.messageId,\n });\n }\n\n private resolveSteerAwayResume(\n interrupts: readonly AgUiInterrupt[],\n responses: readonly AgUiResumeEntry[] | undefined,\n ): AgUiResumeEntry[] {\n const responsesById = this.collectInterruptResponses(\n \"steerAway\",\n interrupts,\n responses ?? [],\n );\n return interrupts.map(\n (interrupt) =>\n responsesById.get(interrupt.id) ?? {\n interruptId: interrupt.id,\n status: \"cancelled\",\n },\n );\n }\n\n private collectInterruptResponses(\n method: \"submitInterruptResponses\" | \"steerAway\",\n interrupts: readonly AgUiInterrupt[],\n responses: readonly AgUiResumeEntry[],\n ): Map<string, AgUiResumeEntry> {\n const known = new Set(interrupts.map((interrupt) => interrupt.id));\n const responsesById = new Map<string, AgUiResumeEntry>();\n for (const entry of responses) {\n if (!entry || typeof entry.interruptId !== \"string\") {\n throw new Error(\n `[agui] ${method}: every entry must have an interruptId`,\n );\n }\n if (entry.status !== \"resolved\" && entry.status !== \"cancelled\") {\n throw new Error(\n `[agui] ${method}: invalid status \"${entry.status}\" for interrupt ${entry.interruptId}`,\n );\n }\n if (!known.has(entry.interruptId)) {\n throw new Error(\n `[agui] ${method}: unknown interrupt id ${entry.interruptId}`,\n );\n }\n if (responsesById.has(entry.interruptId)) {\n throw new Error(\n `[agui] ${method}: duplicate response for interrupt ${entry.interruptId}`,\n );\n }\n responsesById.set(entry.interruptId, entry);\n }\n return responsesById;\n }\n\n private toAppendMessage(message: CreateAppendMessage): AppendMessage {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: this.session.headId,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId:\n message.parentId === undefined ? this.session.headId : message.parentId,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n }\n\n private clearPendingInterrupts(\n messageId: string,\n resume: readonly AgUiResumeEntry[],\n ): void {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n if (\n assistant.status?.type !== \"requires-action\" ||\n assistant.status.reason !== \"interrupt\"\n ) {\n return assistant;\n }\n const aguiMeta = assistant.metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined;\n const { interrupts: _drop, ...restAgui } = aguiMeta ?? {};\n const newCustom = { ...assistant.metadata.custom };\n if (Object.keys(restAgui).length > 0) {\n newCustom[AG_UI_METADATA_NAMESPACE] = restAgui;\n } else {\n delete newCustom[AG_UI_METADATA_NAMESPACE];\n }\n return {\n ...assistant,\n content: withSettledToolApprovals(assistant.content, resume),\n status: { type: \"complete\" as const, reason: \"unknown\" as const },\n metadata: { ...assistant.metadata, custom: newCustom },\n };\n });\n if (touched) {\n this.publishUpdate();\n this.persistSettledAssistant(messageId);\n }\n }\n\n findMessageIdForToolCall(toolCallId: string): string | undefined {\n let fallbackMessageId: string | undefined;\n const messages = this.getMessages();\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (!message || message.role !== \"assistant\") continue;\n for (const part of iterateToolCallParts(message.content)) {\n if (part.toolCallId !== toolCallId) continue;\n if (!isResolvedToolCall(part)) {\n return message.id;\n }\n fallbackMessageId ??= message.id;\n }\n }\n return fallbackMessageId;\n }\n\n private cancelUnresolvedToolCalls(messageId: string): void {\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (isResolvedToolCall(part)) return part;\n return {\n ...part,\n result: { error: \"Tool call cancelled by user\" },\n isError: true,\n };\n });\n return { ...assistant, content };\n });\n if (updated) this.publishUpdate();\n }\n\n addToolResult(options: AddToolResultOptions): void {\n if (this.deferUntilHistoryImported(() => this.addToolResult(options)))\n return;\n // Core's ToolInvocationTracker resolves a nested call to the nested\n // subagent message's id, which is not a session message; re-anchor on the\n // top-level message that owns the tree so the update can land.\n const sessionMessageId = this.session.tryGetMessage(options.messageId)\n ? options.messageId\n : this.findMessageIdForToolCall(options.toolCallId);\n if (sessionMessageId === undefined) return;\n const updated = this.session.updateMessage(sessionMessageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n let matchedToolCall = false;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== options.toolCallId) return part;\n matchedToolCall = true;\n // artifact and modelContent are optional; only override when supplied\n // so a later result that omits them keeps a stored value, and\n // emitToolResult can forward the model-facing content to the agent.\n return {\n ...part,\n result: options.result,\n isError: options.isError,\n ...(options.artifact !== undefined && { artifact: options.artifact }),\n ...(options.modelContent !== undefined && {\n modelContent: options.modelContent,\n }),\n };\n });\n if (!matchedToolCall) return message;\n const settled = mapToolCallPartsDeep(content, (part) => {\n if (!part.messages) return part;\n let changed = false;\n const messages = part.messages.map((nested) => {\n if (\n nested.role !== \"assistant\" ||\n nested.status.type !== \"requires-action\" ||\n nested.status.reason !== \"tool-calls\"\n )\n return nested;\n const listed = listedPendingToolCallIds(nested);\n if (\n Array.from(iterateToolCallParts(nested.content)).some(\n (call) =>\n !isResolvedToolCall(call) &&\n (!listed || listed.has(call.toolCallId)),\n )\n )\n return nested;\n changed = true;\n return {\n ...nested,\n status: { type: \"complete\" as const, reason: \"unknown\" as const },\n metadata: withoutPendingToolCallIds(nested.metadata),\n };\n });\n return changed ? { ...part, messages } : part;\n }).content;\n return { ...assistant, content: settled };\n });\n\n if (!updated) return;\n this.publishUpdate();\n this.maybeResumeAfterToolResults(sessionMessageId);\n }\n\n async recordToolInteraction(options: {\n messageId: string;\n toolCallId: string;\n interaction: Unstable_ToolInteraction;\n }): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const sessionMessageId = this.session.tryGetMessage(options.messageId)\n ? options.messageId\n : this.findMessageIdForToolCall(options.toolCallId);\n if (sessionMessageId === undefined) {\n throw new Error(\n `[agui] recordToolInteraction: message \"${options.messageId}\" was not found`,\n );\n }\n\n const item = this.session.tryGetMessage(sessionMessageId);\n if (!item) {\n throw new Error(\n `[agui] recordToolInteraction: message \"${sessionMessageId}\" was not found`,\n );\n }\n\n let recorded = false;\n const updated = this.session.updateMessage(sessionMessageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== options.toolCallId) return part;\n recorded = true;\n return {\n ...part,\n unstable_interactions: appendToolInteraction(\n part.unstable_interactions,\n options.interaction,\n ),\n };\n });\n return recorded ? { ...assistant, content } : assistant;\n });\n if (!recorded || !updated) {\n throw new Error(\n `[agui] recordToolInteraction: tool call \"${options.toolCallId}\" was not found on message \"${options.messageId}\"`,\n );\n }\n\n this.publishUpdate();\n\n const message = this.session.tryGetMessage(sessionMessageId)?.message;\n const history = this.history;\n if (\n !message ||\n !history?.update ||\n !this.isPersistableStatus(message.status)\n ) {\n return;\n }\n\n await this.historyWrites.chain(sessionMessageId, () =>\n history.update!({ parentId: item.parentId, message }),\n );\n }\n\n sendA2uiAction(action: Record<string, unknown>): void {\n if (this.deferUntilHistoryImported(() => this.sendA2uiAction(action)))\n return;\n this.assertNoPendingInterrupts();\n this.maybeAutoCancelPendingToolCalls();\n const parentId = this.session.headId;\n if (parentId === null) {\n this.logger.debug(\n \"[agui] sendA2uiAction: no messages to resume, dropping action\",\n );\n return;\n }\n\n const userAction = { ...action };\n delete userAction.type;\n if (!(\"timestamp\" in userAction)) {\n userAction.timestamp = new Date().toISOString();\n }\n this.dispatch({\n type: \"a2uiActionDeferred\",\n action: userAction,\n });\n\n const owner = this.abortController;\n if (owner) {\n this.dispatch({\n type: \"a2uiResumeDeferred\",\n owner,\n });\n return;\n }\n this.startResumeRun(parentId);\n }\n\n // The continuation fires whether the frontend result lands before\n // RUN_FINISHED (the status flips to requires-action only later, while the\n // run is still draining) or after it.\n private maybeResumeAfterToolResults(\n messageId: string,\n accountedResultIds?: ReadonlySet<string>,\n ): void {\n if (!this.maybeCompleteAfterToolResults(messageId)) return;\n if (accountedResultIds) {\n const message = this.session.tryGetMessage(messageId)?.message;\n if (\n message?.role !== \"assistant\" ||\n !Array.from(iterateToolCallParts(message.content)).some(\n (part) =>\n isResolvedToolCall(part) &&\n !accountedResultIds.has(part.toolCallId),\n )\n )\n return;\n }\n if (this.getPendingInterrupts()) return;\n const turn = this.getTrailingAssistantTurn();\n if (!turn.some((message) => message.id === messageId)) return;\n const owner = this.abortController;\n if (owner) {\n // A run is still draining (RUN_FINISHED arrived but the stream has not\n // closed). Defer until startRun's tail so we never start two runs.\n this.dispatch({\n type: \"resumeDeferred\",\n owner,\n messageId,\n });\n return;\n }\n if (this.getPendingToolCalls()) return;\n const headId = turn.at(-1)?.id;\n if (headId === undefined) return;\n this.startResumeRun(headId);\n }\n\n private maybeCompleteAfterToolResults(messageId: string): boolean {\n const message = this.session.tryGetMessage(messageId)?.message;\n if (!message || message.role !== \"assistant\") return false;\n const assistant = message as ThreadAssistantMessage;\n if (\n assistant.status?.type !== \"requires-action\" ||\n assistant.status.reason !== \"tool-calls\"\n ) {\n return false;\n }\n let allResolved = true;\n const listed = listedPendingToolCallIds(assistant);\n for (const part of iterateToolCallParts(assistant.content)) {\n if (listed && !listed.has(part.toolCallId)) continue;\n if (!isResolvedToolCall(part)) {\n allResolved = false;\n break;\n }\n }\n if (!allResolved) return false;\n\n const updated = this.session.updateMessage(messageId, (current) =>\n current.role === \"assistant\"\n ? {\n ...(current as ThreadAssistantMessage),\n status: { type: \"complete\" as const, reason: \"unknown\" as const },\n metadata: withoutPendingToolCallIds(current.metadata),\n }\n : current,\n );\n if (!updated) return false;\n this.publishUpdate();\n if (this.history?.update) {\n this.persistSettledAssistant(messageId);\n } else {\n this.persistAssistantHistory(messageId);\n }\n return true;\n }\n\n private startResumeRun(messageId: string): void {\n void this.startRun(messageId, this.state.lastRunConfig).catch((error) => {\n this.reportError(error);\n });\n }\n\n applyExternalMessages(messages: readonly ThreadMessage[]): void {\n messages = messages.map((message) => {\n if (message.role === \"system\" || message.metadata.modality !== undefined)\n return message;\n const modality = this.session.tryGetMessage(message.id)?.message.metadata\n .modality;\n if (modality === undefined) return message;\n return {\n ...message,\n metadata: { ...message.metadata, modality },\n } as ThreadMessage;\n });\n this.dispatch({\n type: \"a2uiContinuationsCleared\",\n });\n this.assistantHistoryParents.clear();\n\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 const retainToolResults = (\n existing: ThreadMessage | undefined,\n message: ThreadMessage,\n ): ThreadMessage =>\n existing?.role === \"assistant\" && message.role === \"assistant\"\n ? {\n ...message,\n content: this.preserveToolResults(\n existing.content,\n message.content,\n ),\n }\n : message;\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(\n expectedParentId,\n retainToolResults(existing?.message, message),\n );\n expectedParentId = message.id;\n lastAppliedId = message.id;\n }\n\n if (hardReplace) {\n const previous = new Map(\n this.getMessageRepository().messages.map(({ message }) => [\n message.id,\n message,\n ]),\n );\n this.session.clear();\n expectedParentId = null;\n lastAppliedId = null;\n seen.clear();\n for (const message of messages) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n this.session.addOrUpdateMessage(\n expectedParentId,\n retainToolResults(previous.get(message.id), message),\n );\n expectedParentId = message.id;\n lastAppliedId = message.id;\n }\n }\n\n this.session.resetHead(lastAppliedId);\n for (const messageId of seen) {\n this.maybeCompleteAfterToolResults(messageId);\n }\n }\n\n this.snapshotHistoryIds.clear();\n for (const { message } of this.getMessageRepository().messages) {\n this.snapshotHistoryIds.add(message.id);\n }\n // A soft merge leaves dropped messages off branch; only selected\n // messages with resolved tool calls can still own a continuation.\n const pendingResume = this.state.pendingResume;\n if (pendingResume) {\n const selectedResultOwnerIds = new Set(\n this.session\n .getMessages()\n .filter(hasResolvedToolCalls)\n .map((message) => message.id),\n );\n const retained = pendingResume.messageIds.filter((id) =>\n selectedResultOwnerIds.has(id),\n );\n if (retained.length !== pendingResume.messageIds.length) {\n this.dispatch({ type: \"resumeCleared\" });\n for (const messageId of retained) {\n this.dispatch({\n type: \"resumeDeferred\",\n owner: pendingResume.owner,\n messageId,\n });\n }\n }\n }\n this.publishUpdate();\n }\n\n loadExternalState(state: ReadonlyJSONValue): void {\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: state,\n });\n this.publishUpdate();\n }\n\n setState(\n next:\n | ReadonlyJSONValue\n | ((prev: ReadonlyJSONValue | undefined) => ReadonlyJSONValue),\n ): void {\n const snapshot =\n typeof next === \"function\" ? next(this.state.stateSnapshot) : next;\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot,\n });\n this.publishUpdate();\n }\n\n resetState(): void {\n this.dispatch({ type: \"resetState\" });\n this.publishUpdate();\n }\n\n resetThreadState(): void {\n this.dispatch({\n type: \"historyMutationAdvanced\",\n });\n const controller = this.abortController;\n const activeRunAgent = this.activeRunAgent;\n\n this.dispatch({ type: \"resetThread\" });\n this.subagentParentToolCallIds.clear();\n\n if (controller) {\n this.abortController = null;\n this.activeRunAgent = null;\n this.setRunning(false);\n try {\n (activeRunAgent ?? this.agent).abortRun();\n } catch (error) {\n this.logger.error?.(\"[agui] agent abortRun failed\", error);\n } finally {\n controller.abort();\n }\n } else {\n this.publishUpdate();\n }\n }\n\n private async startRun(\n parentId: string | null,\n runConfig?: RunConfig,\n resume?: ResumeDispatch,\n resumeStream?: ResumeStream,\n replayExistingMessages = false,\n ): Promise<void> {\n if (this.isThreadSwitching?.()) return;\n // A default AG-UI run supersedes the active run; the hook's opt-in message\n // queue serializes sends instead. append supersedes earlier, before it links\n // its message; this covers the entry points that start a run without one.\n if (!this.supersedeActiveRun()) return;\n\n const generation = this.state.historyMutationGeneration;\n const normalizedRunConfig = runConfig ?? {};\n this.dispatch({\n type: \"runConfigRecorded\",\n runConfig: normalizedRunConfig,\n });\n const parent =\n parentId === null ? undefined : this.session.tryGetMessage(parentId);\n const shouldEagerlyInsertAssistant =\n parentId !== null &&\n parent !== undefined &&\n parentId !== this.session.headId;\n const historicalMessages = [\n ...(shouldEagerlyInsertAssistant\n ? (this.session.tryGetMessages(parentId) ?? this.session.getMessages())\n : this.session.getMessages()),\n ];\n const runStartMessageIds = new Set(\n this.getMessageRepository().messages.map(({ message }) => message.id),\n );\n const selectedMessages = this.session.getMessages();\n const parentIndex = selectedMessages.findIndex(\n (message) => message.id === parentId,\n );\n let replayStart = parentIndex + 1;\n if (selectedMessages[parentIndex]?.role === \"assistant\") {\n replayStart = parentIndex;\n while (\n replayStart > 0 &&\n selectedMessages[replayStart - 1]?.role === \"assistant\"\n )\n replayStart--;\n }\n const replayMessageIds: string[] = [];\n if (replayExistingMessages && !resumeStream && parentIndex >= 0) {\n for (const message of selectedMessages.slice(replayStart)) {\n if (message.role !== \"assistant\") break;\n replayMessageIds.push(message.id);\n }\n }\n // Only request-delivered and producer-observed results suppress continuation.\n const accountedResultIds = new Set(\n historicalMessages.flatMap((message) =>\n message.role === \"assistant\"\n ? Array.from(iterateToolCallParts(message.content))\n .filter(isResolvedToolCall)\n .map((part) => part.toolCallId)\n : [],\n ),\n );\n const candidateContexts = new Map<string, ReplayContext>();\n for (const message of selectedMessages) {\n if (\n message.role !== \"assistant\" ||\n !replayMessageIds.includes(message.id)\n )\n continue;\n candidateContexts.set(message.id, {\n originalContent: message.content,\n accountedResultIds,\n admittedToolCallIds: actionableToolCallIds(message),\n merge: createReplayContentMerger(),\n });\n }\n let replayContexts = new Map<string, ReplayContext>();\n let lastReplayedIndex = -1;\n let replayEnded = replayMessageIds.length === 0;\n const replayTail = replayMessageIds.at(-1);\n const joinStrategy = this.joinStrategy;\n const hasRunUserBoundary = parent?.message.role === \"user\" && !resume;\n\n let pendingError: Error | null = null;\n const assistantParentId = parent ? parentId : this.session.headId;\n let assistantMessageId: string | undefined;\n let snapshotAssistantId: string | undefined;\n let replayInterruptMessageId: string | undefined;\n // A snapshot the preserve gate declines still evicts the in-flight\n // assistant; recreating under the cached id on the next content-bearing\n // emit keeps both the stream and the message identity. Status-only emits,\n // data-only content, and off-branch server-id collisions must not\n // recreate: the snapshot already carries this turn's assistant, so\n // resurrecting for custom-event data would leave a trailing data-only\n // duplicate.\n let assistantCollided = false;\n const heldMessages = new Map<string, Set<string>>();\n let frameOwnerIds = new Set<string>();\n let restrictedPendingToolCallIds: ReadonlySet<string> | undefined;\n let settlingRun = false;\n let latestSnapshot: ThreadAssistantMessage | undefined;\n let snapshotToolCallIds = new Set<string>();\n const ensureAssistant = (allowRecreate = false): string => {\n const cached = assistantMessageId;\n if (cached !== undefined && this.session.tryGetMessage(cached))\n return cached;\n if (cached !== undefined && (assistantCollided || !allowRecreate)) {\n return cached;\n }\n const repositoryHeadId = this.session.headId;\n const shouldUseSelectedParent =\n replayContexts.size === 0 &&\n (cached === undefined ||\n (shouldEagerlyInsertAssistant &&\n (repositoryHeadId === null ||\n runStartMessageIds.has(repositoryHeadId)))) &&\n // Replay candidates defer the placeholder; honor snapshots that advanced\n // the head before the producer identified its first assistant message.\n (replayMessageIds.length === 0 ||\n repositoryHeadId === null ||\n runStartMessageIds.has(repositoryHeadId));\n // Branch runs keep their selected parent unless the snapshot advanced to\n // a message introduced during this run.\n const parentId =\n shouldUseSelectedParent &&\n assistantParentId &&\n this.session.hasMessage(assistantParentId)\n ? assistantParentId\n : repositoryHeadId;\n const created = this.insertAssistantPlaceholder(parentId, cached);\n assistantMessageId = created;\n this.markPendingAssistantHistory(created, parentId);\n return created;\n };\n\n if (shouldEagerlyInsertAssistant && replayEnded) ensureAssistant();\n\n const settleHeldMessages = (terminalStatus: MessageStatus): string[] => {\n const pendingMessages: string[] = [];\n const producerPending = restrictedPendingToolCallIds;\n const canWaitForTools =\n terminalStatus.type === \"complete\" ||\n terminalStatus.type === \"requires-action\";\n if (producerPending && canWaitForTools) {\n for (const message of this.getTrailingAssistantTurn()) {\n const replay = replayContexts.get(message.id);\n if (\n message.id === assistantMessageId ||\n heldMessages.has(message.id) ||\n !replay ||\n (message.status?.type === \"requires-action\" &&\n message.status.reason === \"interrupt\")\n )\n continue;\n if (\n replay.admittedToolCallIds.size > 0 ||\n actionableToolCallIds(message).size > 0 ||\n Array.from(iterateToolCallParts(message.content)).some(\n (part) =>\n producerPending.has(part.toolCallId) &&\n !accountedResultIds.has(part.toolCallId),\n )\n )\n heldMessages.set(message.id, new Set());\n }\n }\n for (const [messageId, openToolCallIds] of heldMessages) {\n const existing = this.session.tryGetMessage(messageId);\n if (existing)\n this.markPendingAssistantHistory(messageId, existing.parentId);\n let requiresToolResult = false;\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const pendingToolCallIds = producerPending\n ? Array.from(iterateToolCallParts(assistant.content))\n .filter(\n (part) =>\n producerPending.has(part.toolCallId) &&\n (!isResolvedToolCall(part) ||\n openToolCallIds.has(part.toolCallId) ||\n (replayContexts.has(messageId) &&\n !accountedResultIds.has(part.toolCallId))),\n )\n .map((part) => part.toolCallId)\n : Array.from(openToolCallIds);\n const replay = replayContexts.get(messageId);\n if (replay) replay.admittedToolCallIds = new Set(pendingToolCallIds);\n const status: MessageStatus = canWaitForTools\n ? pendingToolCallIds.length > 0\n ? { type: \"requires-action\", reason: \"tool-calls\" }\n : { type: \"complete\", reason: \"unknown\" }\n : terminalStatus;\n requiresToolResult = status.type === \"requires-action\";\n const metadata = withoutPendingToolCallIds(assistant.metadata);\n return {\n ...assistant,\n status,\n metadata:\n status.type === \"requires-action\" &&\n (restrictedPendingToolCallIds || replayContexts.has(messageId))\n ? withPendingToolCallIds(metadata, pendingToolCallIds)\n : metadata,\n };\n });\n if (updated) {\n this.publishUpdate();\n this.persistAssistantHistory(messageId);\n if (requiresToolResult) {\n pendingMessages.push(messageId);\n }\n }\n }\n heldMessages.clear();\n return pendingMessages;\n };\n\n const accountProducerResults = (\n content: ThreadAssistantMessage[\"content\"],\n ) => {\n for (const part of iterateToolCallParts(content))\n if (isResolvedToolCall(part)) accountedResultIds.add(part.toolCallId);\n };\n const reconcileReplaySnapshot: SnapshotMessageReconciler = (\n snapshot,\n previous,\n ) => {\n // Observe the producer before preserving any local frontend results.\n accountProducerResults(snapshot.content);\n const replay = candidateContexts.get(snapshot.id);\n if (!replay) return snapshot;\n replay.admittedToolCallIds = actionableToolCallIds(snapshot);\n if (heldMessages.has(snapshot.id))\n heldMessages.set(snapshot.id, new Set(replay.admittedToolCallIds));\n if (!replayContexts.has(snapshot.id)) return snapshot;\n return previous\n ? {\n ...snapshot,\n content: this.preserveToolResults(\n previous.content,\n snapshot.content,\n replay.originalContent,\n ),\n }\n : snapshot;\n };\n\n const applyUpdate = (update: ChatModelRunResult) => {\n if (\n !assistantCollided &&\n replayContexts.size &&\n update.content !== undefined\n )\n accountProducerResults(\n update.content as ThreadAssistantMessage[\"content\"],\n );\n let ownerParts:\n | Map<string, ThreadAssistantMessage[\"content\"][number][]>\n | undefined;\n let contentOwnerIds: Set<string> | undefined;\n const hasStreamContent =\n Array.isArray(update.content) &&\n update.content.some((part) => part.type !== \"data\");\n if (!replayEnded && assistantMessageId === undefined) {\n if (!update.status || update.status.type === \"running\") return;\n // No matching producer identity arrived: retain native regeneration.\n replayEnded = true;\n if (\n replayContexts.size === 0 &&\n snapshotAssistantId !== undefined &&\n this.session.headId === snapshotAssistantId &&\n !hasStreamContent\n ) {\n if (update.status.type !== \"complete\") {\n this.updateAssistantMessage(snapshotAssistantId, {\n status: update.status,\n ...(update.metadata ? { metadata: update.metadata } : {}),\n });\n }\n return;\n }\n }\n const streamMessageId = assistantMessageId;\n let primaryMessageId = streamMessageId;\n const terminalStatus = update.status;\n const replayInterrupt =\n replayContexts.size > 0 &&\n terminalStatus?.type === \"requires-action\" &&\n terminalStatus.reason === \"interrupt\";\n if (\n streamMessageId !== undefined &&\n !assistantCollided &&\n replayContexts.size > 0 &&\n (update.content !== undefined || replayInterrupt)\n ) {\n const owners = this.getTrailingAssistantTurn().filter((message) =>\n replayContexts.has(message.id),\n );\n // Buffered calls keep their owners when a later text frame arrives.\n const grouped =\n update.content !== undefined\n ? groupReplayToolContent(owners, update.content, streamMessageId)\n : new Map([[streamMessageId, [...(update.content ?? [])]]]);\n if (update.content !== undefined) {\n const currentOwnerIds = new Set(grouped.keys());\n for (const ownerId of frameOwnerIds)\n grouped.set(ownerId, grouped.get(ownerId) ?? []);\n contentOwnerIds = new Set(grouped.keys());\n frameOwnerIds = currentOwnerIds;\n }\n ownerParts = grouped;\n if (replayInterrupt) {\n const interrupts = (\n update.metadata?.custom?.[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.interrupts;\n const approvals = projectAgUiToolApprovals(interrupts);\n for (const owner of owners) {\n if (\n Array.from(iterateToolCallParts(owner.content)).some((part) =>\n approvals.has(part.toolCallId),\n )\n )\n grouped.set(owner.id, grouped.get(owner.id) ?? []);\n }\n const anchor = owners.find(\n (message) =>\n projectAgUiToolApprovals(\n interrupts,\n new Set(\n Array.from(\n iterateToolCallParts([\n ...message.content,\n ...(grouped.get(message.id) ?? []),\n ]),\n ).map((part) => part.toolCallId),\n ),\n ).size > 0,\n );\n if (anchor) {\n primaryMessageId = anchor.id;\n replayInterruptMessageId = anchor.id;\n grouped.set(anchor.id, grouped.get(anchor.id) ?? []);\n }\n }\n }\n const pendingMessages =\n settlingRun && terminalStatus && terminalStatus.type !== \"running\"\n ? settleHeldMessages(terminalStatus)\n : [];\n const frameMessageId = ensureAssistant(hasStreamContent);\n const messageId = primaryMessageId ?? frameMessageId;\n let primaryUpdate = update;\n if (ownerParts) {\n const interrupt =\n terminalStatus?.type === \"requires-action\" &&\n terminalStatus.reason === \"interrupt\";\n const ownerStatus: MessageStatus | undefined =\n terminalStatus?.type === \"requires-action\"\n ? { type: \"complete\", reason: \"unknown\" }\n : terminalStatus;\n for (const [ownerId, content] of ownerParts) {\n const existing = this.session.tryGetMessage(ownerId);\n if (existing)\n this.markPendingAssistantHistory(ownerId, existing.parentId);\n if (ownerId === messageId) continue;\n this.updateAssistantMessage(\n ownerId,\n {\n ...(contentOwnerIds?.has(ownerId) ? { content } : {}),\n ...(ownerStatus ? { status: ownerStatus } : {}),\n },\n replayContexts.get(ownerId),\n interrupt ? new Set<string>() : restrictedPendingToolCallIds,\n );\n }\n const { content: _content, ...controlUpdate } = update;\n const content = ownerParts.get(messageId) ?? [];\n primaryUpdate = {\n ...controlUpdate,\n ...(contentOwnerIds?.has(messageId) ? { content } : {}),\n ...(ownerStatus && !interrupt && replayContexts.has(messageId)\n ? { status: ownerStatus }\n : {}),\n };\n }\n const resolved = this.updateAssistantMessage(\n messageId,\n primaryUpdate,\n replayContexts.get(messageId),\n restrictedPendingToolCallIds,\n );\n if (messageId === frameMessageId && resolved !== assistantMessageId) {\n assistantMessageId = resolved;\n }\n for (const messageId of pendingMessages) {\n this.maybeResumeAfterToolResults(\n messageId,\n replayMessageIds.includes(messageId) ? accountedResultIds : undefined,\n );\n }\n };\n\n const adoptServerMessageId = (\n serverId: string,\n startNewMessage: boolean,\n openToolCallIds: string[] = [],\n ) => {\n const existing = this.session.tryGetMessage(serverId);\n const replayIndex = replayMessageIds.indexOf(serverId);\n const adoptsReplay =\n !replayEnded &&\n !assistantCollided &&\n replayIndex > lastReplayedIndex &&\n existing?.message.role === \"assistant\" &&\n this.session.getMessages().some((message) => message.id === serverId);\n if (adoptsReplay && replayContexts.size === 0) {\n replayContexts = candidateContexts;\n const selected = this.session.getMessages();\n let tailId = serverId;\n for (const message of selected.slice(\n selected.findIndex((message) => message.id === serverId) + 1,\n )) {\n if (message.role !== \"assistant\") break;\n tailId = message.id;\n }\n this.session.selectHead(tailId);\n }\n if (startNewMessage && assistantMessageId !== undefined) {\n let hasReplayCallsToHold = false;\n const replay = replayContexts.get(assistantMessageId);\n if (replay) {\n const current =\n this.session.tryGetMessage(assistantMessageId)?.message;\n if (current?.role === \"assistant\") {\n const retainedPending = Array.from(\n iterateToolCallParts(current.content),\n ).filter(\n (part) =>\n !isResolvedToolCall(part) ||\n (replay.admittedToolCallIds.has(part.toolCallId) &&\n !accountedResultIds.has(part.toolCallId)),\n );\n hasReplayCallsToHold = retainedPending.length > 0;\n openToolCallIds = [\n ...new Set([\n ...openToolCallIds,\n ...retainedPending\n .filter((part) =>\n replay.admittedToolCallIds.has(part.toolCallId),\n )\n .map((part) => part.toolCallId),\n ]),\n ];\n }\n }\n if (openToolCallIds.length > 0 || hasReplayCallsToHold) {\n heldMessages.set(assistantMessageId, new Set(openToolCallIds));\n } else {\n applyUpdate({ status: { type: \"complete\", reason: \"unknown\" } });\n }\n const previousId = assistantMessageId;\n assistantMessageId = undefined;\n if (!adoptsReplay && this.session.tryGetMessage(previousId)) {\n const created = this.insertAssistantPlaceholder(previousId);\n assistantMessageId = created;\n this.markPendingAssistantHistory(created, previousId);\n }\n }\n if (adoptsReplay) {\n assistantMessageId = serverId;\n lastReplayedIndex = replayIndex;\n this.markPendingAssistantHistory(serverId, existing.parentId);\n return;\n }\n replayEnded = true;\n const placeholder = ensureAssistant(true);\n if (placeholder === serverId) return;\n const reassigned = this.reassignAssistantId(placeholder, serverId);\n // A collision drops the placeholder before revealing the existing\n // server message as the current head. Only messages introduced during\n // this run can replace the placeholder; regeneration must not rewrite\n // a previous branch when the server incorrectly reuses its id.\n const adoptsVisibleCollision =\n !reassigned &&\n !runStartMessageIds.has(serverId) &&\n this.session.headId === serverId;\n if (reassigned || adoptsVisibleCollision) {\n assistantMessageId = serverId;\n if (adoptsVisibleCollision) {\n const parentId =\n this.session.tryGetMessage(serverId)?.parentId ?? null;\n this.markPendingAssistantHistory(serverId, parentId);\n }\n } else {\n assistantCollided = true;\n }\n };\n\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const aggregator = new RunAggregator({\n showThinking: this.showThinking,\n joinStrategy,\n logger: this.logger,\n emit: (update) => {\n const currentSnapshotAssistant =\n assistantMessageId === undefined\n ? undefined\n : this.session.tryGetMessage(assistantMessageId)?.message;\n const listedSnapshotToolCallIds =\n currentSnapshotAssistant?.role === \"assistant\"\n ? listedPendingToolCallIds(currentSnapshotAssistant)\n : undefined;\n const hasPendingSnapshotToolCall =\n latestSnapshot?.id === assistantMessageId &&\n currentSnapshotAssistant?.role === \"assistant\" &&\n Array.from(\n iterateToolCallParts(currentSnapshotAssistant.content),\n ).some(\n (part) =>\n !isResolvedToolCall(part) &&\n (!listedSnapshotToolCallIds ||\n listedSnapshotToolCallIds.has(part.toolCallId)) &&\n (!restrictedPendingToolCallIds ||\n restrictedPendingToolCallIds.has(part.toolCallId)),\n );\n const reconciledUpdate =\n settlingRun &&\n update.status?.type === \"complete\" &&\n hasPendingSnapshotToolCall\n ? {\n ...update,\n status: {\n type: \"requires-action\",\n reason: \"tool-calls\",\n } as const,\n ...(restrictedPendingToolCallIds\n ? {\n metadata: {\n ...update.metadata,\n custom: {\n ...update.metadata?.custom,\n [AG_UI_METADATA_NAMESPACE]: {\n ...(update.metadata?.custom?.[\n AG_UI_METADATA_NAMESPACE\n ] as AgUiCustomMetadata | undefined),\n pendingToolCallIds: [\n ...restrictedPendingToolCallIds,\n ],\n },\n },\n },\n }\n : {}),\n }\n : update;\n if (\n settlingRun &&\n latestSnapshot &&\n latestSnapshot.id === assistantMessageId &&\n reconciledUpdate.status &&\n reconciledUpdate.status.type !== \"running\" &&\n reconciledUpdate.status.type !== \"requires-action\"\n ) {\n const status = reconciledUpdate.status;\n const current =\n this.session.tryGetMessage(assistantMessageId)?.message;\n const content = settleNestedContent(\n current?.role === \"assistant\"\n ? current.content\n : latestSnapshot.content,\n status,\n );\n applyUpdate({ ...reconciledUpdate, content });\n } else if (\n latestSnapshot &&\n latestSnapshot.id === assistantMessageId &&\n reconciledUpdate.content !== undefined\n ) {\n const content = this.mergeSnapshotAssistantContent(\n latestSnapshot.content,\n reconciledUpdate.content as ThreadAssistantMessage[\"content\"],\n reconciledUpdate.content.some((part) => part.type === \"reasoning\"),\n reconciledUpdate.content.some(isActivityPart),\n snapshotToolCallIds,\n );\n applyUpdate({ ...reconciledUpdate, content });\n } else {\n applyUpdate(reconciledUpdate);\n }\n const current = assistantMessageId\n ? this.session.tryGetMessage(assistantMessageId)?.message\n : undefined;\n latestSnapshot =\n !settlingRun &&\n current?.role === \"assistant\" &&\n current.id === latestSnapshot?.id\n ? current\n : undefined;\n },\n onServerMessageId: (serverId) => {\n adoptServerMessageId(serverId, false);\n },\n onTextMessageStart: (serverId, openToolCallIds) => {\n const owners = this.getTrailingAssistantTurn().filter((message) =>\n replayContexts.has(message.id),\n );\n const toolOwners = indexReplayToolOwners(owners);\n const frameOpenIds = openToolCallIds.filter((id) => {\n const ownerId = toolOwners.get(id);\n if (!ownerId || ownerId === assistantMessageId || assistantCollided)\n return true;\n const held = heldMessages.get(ownerId) ?? new Set<string>();\n held.add(id);\n heldMessages.set(ownerId, held);\n return false;\n });\n // The native accumulator just reset; prior frame contributions are\n // retained history, while removals within this frame remain authoritative.\n for (const ownerId of frameOwnerIds) {\n const replay = replayContexts.get(ownerId);\n if (replay) replay.merge = createReplayContentMerger();\n }\n frameOwnerIds.clear();\n adoptServerMessageId(serverId, true, frameOpenIds);\n },\n });\n let runFinished = false;\n const dispatch = (event: AgUiEvent) => {\n if (this.abortController !== abortController) return;\n if (event.type === \"RUN_FINISHED\") {\n runFinished = true;\n if (event.outcome?.type === \"interrupt\")\n replayInterruptMessageId = assistantMessageId ?? replayTail;\n const ids =\n event.outcome?.type === \"success\"\n ? event.outcome.pendingToolCallIds\n : undefined;\n restrictedPendingToolCallIds =\n ids === undefined ? undefined : new Set(ids);\n }\n if (event.type === \"TOOL_CALL_RESULT\") {\n if (!assistantCollided && candidateContexts.size)\n accountedResultIds.add(event.toolCallId);\n for (const openToolCallIds of heldMessages.values()) {\n openToolCallIds.delete(event.toolCallId);\n }\n }\n settlingRun =\n event.type === \"RUN_FINISHED\" ||\n event.type === \"RUN_ERROR\" ||\n event.type === \"RUN_CANCELLED\";\n const beforeSnapshot =\n event.type === \"MESSAGES_SNAPSHOT\" ? this.session.getMessages() : [];\n try {\n const nextAssistantMessageId = this.handleEvent(\n aggregator,\n event,\n assistantMessageId,\n joinStrategy,\n runStartMessageIds,\n hasRunUserBoundary,\n candidateContexts.size ? reconcileReplaySnapshot : undefined,\n );\n if (event.type === \"MESSAGES_SNAPSHOT\") {\n for (const message of beforeSnapshot) {\n const context = replayContexts.get(message.id);\n const current = this.session.tryGetMessage(message.id)?.message;\n if (context && current?.content !== message.content) {\n context.merge = createReplayContentMerger();\n frameOwnerIds.delete(message.id);\n }\n }\n assistantMessageId = nextAssistantMessageId;\n const imported = assistantMessageId\n ? this.session.tryGetMessage(assistantMessageId)?.message\n : undefined;\n const source = event.messages.find(\n (message) =>\n message?.role === \"assistant\" && message.id === imported?.id,\n );\n latestSnapshot =\n imported?.role === \"assistant\" && source ? imported : undefined;\n snapshotToolCallIds = new Set(\n Array.isArray(source?.toolCalls)\n ? source.toolCalls\n .map((call: { id?: unknown }) => call.id)\n .filter((id: unknown): id is string => typeof id === \"string\")\n : [],\n );\n if (!replayEnded && assistantMessageId === undefined) {\n const tail = this.session.getMessages().at(-1);\n snapshotAssistantId =\n tail?.role === \"assistant\" ? tail.id : undefined;\n }\n }\n } finally {\n settlingRun = false;\n }\n };\n\n this.abortController = abortController;\n const runAgentInstance = this.agent;\n this.activeRunAgent = runAgentInstance;\n\n let cancelRun = () => dispatch({ type: \"RUN_CANCELLED\" });\n abortSignal.addEventListener(\n \"abort\",\n () => {\n cancelRun();\n this.finishRun(abortController);\n invokeRuntimeCallback(\"onCancel\", this.onCancel);\n },\n { once: true },\n );\n\n this.setRunning(true);\n\n try {\n if (resumeStream) {\n // Cancel flips only the status; an aggregator RUN_CANCELLED would emit an empty snapshot and wipe the replayed content.\n cancelRun = () => {\n const current =\n assistantMessageId === undefined\n ? undefined\n : this.session.tryGetMessage(assistantMessageId)?.message;\n if (current?.status?.type === \"complete\") return;\n applyUpdate({ status: { type: \"incomplete\", reason: \"cancelled\" } });\n };\n pendingError =\n (await this.consumeResumeStream(resumeStream, {\n runConfig: normalizedRunConfig,\n threadId: this.agent.threadId || \"main\",\n parentId: assistantParentId,\n historicalMessages,\n abortSignal,\n ensureAssistant,\n applyUpdate,\n getAssistantMessageId: () => assistantMessageId,\n })) ?? null;\n } else {\n const runId = generateId();\n aggregator.handle({ type: \"RUN_STARTED\", runId });\n const input = this.buildRunInput(\n runId,\n normalizedRunConfig,\n historicalMessages,\n resume,\n );\n const subscriber = createAgUiSubscriber({\n dispatch,\n logger: this.logger,\n onRunFailed: (error) => {\n if (abortSignal.aborted) return;\n pendingError = error;\n invokeRuntimeCallback(\"onError\", this.onError, error);\n },\n });\n try {\n runAgentInstance.messages = input.messages;\n runAgentInstance.threadId = input.threadId;\n runAgentInstance.state = input.state;\n } catch {\n // ignore\n }\n const runAgent: RunAgentWithRunOptions =\n runAgentInstance.runAgent.bind(runAgentInstance);\n await runAgent(input, subscriber, { signal: abortSignal });\n }\n } catch (error) {\n // HttpAgent rethrows a failure it already passed to the subscriber's\n // onRunFailed, which reported it.\n if (!abortSignal.aborted && !pendingError) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (!runFinished) dispatch({ type: \"RUN_ERROR\", message: err.message });\n invokeRuntimeCallback(\"onError\", this.onError, err);\n pendingError = err;\n }\n } finally {\n const current = assistantMessageId\n ? this.session.tryGetMessage(assistantMessageId)?.message\n : undefined;\n if (\n this.abortController === abortController &&\n current?.role === \"assistant\" &&\n current.status?.type === \"running\"\n ) {\n // Finalization is transport cleanup, not proof of a terminal event.\n const status: MessageStatus = {\n type: \"incomplete\",\n reason: \"error\",\n error: \"The connection ended before the answer finished.\",\n };\n settleHeldMessages(status);\n applyUpdate({\n status,\n content: settleNestedContent(current.content, status),\n });\n }\n this.finishRun(abortController);\n }\n\n if (pendingError) {\n const err = pendingError;\n this.reportedErrors.add(err);\n this.clearDeferredContinuations(abortController);\n throw err;\n }\n\n const pending = replayInterruptMessageId\n ? this.getPendingInterrupts()\n : null;\n if (\n pending &&\n pending.messageId === replayInterruptMessageId &&\n replayContexts.has(pending.messageId) &&\n !abortSignal.aborted &&\n this.abortController === null &&\n generation === this.state.historyMutationGeneration &&\n !this.isThreadSwitching?.()\n ) {\n const message = this.session.tryGetMessage(pending.messageId)?.message;\n const responses =\n message?.role === \"assistant\"\n ? buildToolApprovalResume(message.content, pending.interrupts)\n : null;\n if (responses) {\n this.clearDeferredContinuations(abortController);\n try {\n await this.submitInterruptResponses(responses);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (!this.reportedErrors.has(err)) {\n this.reportError(err);\n this.reportedErrors.add(err);\n }\n throw err;\n }\n return;\n }\n }\n\n // A tool result that landed before the run settled deferred its\n // continuation here so a second run never overlaps the first.\n if (this.state.pendingResume?.owner === abortController) {\n const { messageIds } = this.state.pendingResume;\n this.dispatch({ type: \"resumeCleared\" });\n if (\n !abortSignal.aborted &&\n !this.getPendingInterrupts() &&\n !this.getPendingToolCalls()\n ) {\n const turn = this.getTrailingAssistantTurn();\n if (\n turn.some((message) => {\n if (!messageIds.includes(message.id)) return false;\n const replay = replayContexts.get(message.id);\n if (!replay) return hasResolvedToolCalls(message);\n return Array.from(iterateToolCallParts(message.content)).some(\n (part) =>\n isResolvedToolCall(part) &&\n replay.admittedToolCallIds.has(part.toolCallId) &&\n !accountedResultIds.has(part.toolCallId),\n );\n })\n ) {\n const headId = turn.at(-1)?.id;\n if (headId !== undefined) this.startResumeRun(headId);\n }\n }\n }\n\n if (this.state.pendingA2uiResumeOwner === abortController) {\n this.dispatch({\n type: \"a2uiResumeCleared\",\n });\n if (!abortSignal.aborted && this.state.pendingA2uiAction !== undefined) {\n if (this.getPendingInterrupts()) {\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n this.logger.debug(\n \"[agui] sendA2uiAction: pending interrupts, dropping action\",\n );\n return;\n }\n this.maybeAutoCancelPendingToolCalls();\n const parentId = this.session.headId;\n if (parentId !== null) {\n this.startResumeRun(parentId);\n } else {\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n this.logger.debug(\n \"[agui] sendA2uiAction: no messages to resume, dropping action\",\n );\n }\n } else {\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n }\n }\n }\n\n // Replays a persisted run's snapshots into the existing assistant message, bypassing agent.runAgent so it is not re-invoked.\n private async consumeResumeStream(\n stream: ResumeStream,\n ctx: {\n runConfig: RunConfig;\n threadId: string;\n parentId: string | null;\n historicalMessages: readonly ThreadMessage[];\n abortSignal: AbortSignal;\n ensureAssistant: () => string;\n applyUpdate: (update: ChatModelRunResult) => void;\n getAssistantMessageId: () => string | undefined;\n },\n ): Promise<Error | undefined> {\n this.dispatch({\n type: \"a2uiContinuationsCleared\",\n });\n const assistantId = ctx.ensureAssistant();\n const currentId = () => ctx.getAssistantMessageId() ?? assistantId;\n const options: ChatModelRunOptions = {\n messages: ctx.historicalMessages,\n runConfig: ctx.runConfig,\n abortSignal: ctx.abortSignal,\n context: this.runtime?.thread.getModelContext() ?? {},\n unstable_assistantMessageId: assistantId,\n unstable_threadId: ctx.threadId,\n unstable_parentId: ctx.parentId,\n unstable_getMessage: () => {\n const message = this.session.tryGetMessage(currentId())?.message;\n if (!message) {\n throw new Error(\n \"[agui] resume stream requested the assistant message before it existed\",\n );\n }\n return message;\n },\n };\n\n try {\n for await (const result of stream(options)) {\n if (ctx.abortSignal.aborted) return undefined;\n ctx.applyUpdate(result);\n }\n } catch (error) {\n if (ctx.abortSignal.aborted) return undefined;\n const err = error instanceof Error ? error : new Error(String(error));\n ctx.applyUpdate({\n status: { type: \"incomplete\", reason: \"error\", error: err.message },\n });\n invokeRuntimeCallback(\"onError\", this.onError, err);\n return err;\n }\n\n if (ctx.abortSignal.aborted) return undefined;\n const current = this.session.tryGetMessage(currentId())?.message;\n if (!current || current.status?.type === \"running\") {\n ctx.applyUpdate({ status: { type: \"complete\", reason: \"unknown\" } });\n }\n return undefined;\n }\n\n private buildRunInput(\n runId: string,\n runConfig: RunConfig | undefined,\n historyMessages: readonly ThreadMessage[] | undefined,\n resume?: ResumeDispatch,\n ) {\n const pendingA2uiAction = this.state.pendingA2uiAction;\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n const threadId = this.agent.threadId || \"main\";\n const messages = toAgUiMessages(\n this.selectRunMessages(\n historyMessages ?? this.session.getMessages(),\n resume,\n ),\n );\n const context = this.runtime?.thread.getModelContext();\n let hostContext: readonly Context[] = [];\n try {\n hostContext = this.getRunContext?.({ messages, runConfig }) ?? [];\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.logger.error(\"[agui] getRunContext failed\", err);\n invokeRuntimeCallback(\"onError\", this.onError, err);\n }\n const input = {\n threadId,\n runId,\n state:\n this.state.stateSnapshot === undefined ? {} : this.state.stateSnapshot,\n messages,\n tools: toAgUiTools(context?.tools),\n context: [\n ...(context?.system\n ? [{ description: \"system\", value: context.system }]\n : []),\n ...hostContext,\n ],\n forwardedProps: {\n ...(context?.callSettings ?? {}),\n ...(context?.config ?? {}),\n ...(runConfig?.custom ? { runConfig: runConfig.custom } : {}),\n ...(pendingA2uiAction\n ? { a2uiAction: { userAction: pendingA2uiAction } }\n : {}),\n },\n ...(resume !== undefined ? { resume: resume.entries } : {}),\n };\n return input;\n }\n\n /**\n * An anchor the thread no longer carries falls back to the whole transcript.\n * The anchor is missing exactly when a snapshot import replaced the messages\n * this resume was raised against, and a host that expects a delta tolerates\n * being told more than it knows, while one rebuilding the run from the\n * transcript cannot recover from being told less.\n */\n private selectRunMessages(\n messages: readonly ThreadMessage[],\n resume: ResumeDispatch | undefined,\n ): readonly ThreadMessage[] {\n if (resume === undefined || this.resumeTranscript !== \"appended\")\n return messages;\n const anchor = messages.findIndex(\n (message) => message.id === resume.interruptedMessageId,\n );\n if (anchor === -1) return messages;\n return messages.slice(anchor + 1);\n }\n\n private clearDeferredContinuations(owner: AbortController): void {\n if (this.state.pendingResume?.owner === owner) {\n this.dispatch({ type: \"resumeCleared\" });\n }\n if (this.state.pendingA2uiResumeOwner === owner) {\n this.dispatch({\n type: \"a2uiContinuationsCleared\",\n });\n }\n }\n\n private setRunning(running: boolean) {\n this.dispatch({\n type: running ? \"runStarted\" : \"runFinished\",\n });\n this.publishUpdate();\n }\n\n private finishRun(controller: AbortController | null) {\n if (this.abortController !== controller) return;\n this.abortController = null;\n this.activeRunAgent = null;\n this.setRunning(false);\n }\n\n private insertAssistantPlaceholder(\n parentId: string | null,\n id: string = generateOptimisticId(),\n ): string {\n const assistant: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n createdAt: new Date(),\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_state: this.state.stateSnapshot ?? null,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n isOptimistic: isOptimisticId(id),\n custom: {},\n },\n };\n this.session.addOrUpdateMessage(parentId ?? this.session.headId, assistant);\n this.session.switchToBranch(id);\n this.publishUpdate();\n return id;\n }\n\n private reassignAssistantId(oldId: string, newId: string): boolean {\n if (oldId === newId) return true;\n const oldItem = this.session.tryGetMessage(oldId);\n if (!oldItem) return false;\n\n const collidesWithExisting = this.session.hasMessage(newId);\n\n if (collidesWithExisting) {\n this.logger.debug?.(\n \"[agui] reassignAssistantId: server id already present in messages or repository, dropping placeholder\",\n { oldId, newId },\n );\n this.session.deleteMessage(oldId, oldItem.parentId ?? null);\n } else {\n const { isOptimistic: _, ...metadata } = oldItem.message.metadata;\n this.session.addOrUpdateMessage(oldItem.parentId, {\n ...oldItem.message,\n id: newId,\n metadata,\n } as ThreadMessage);\n this.session.switchToBranch(newId);\n this.session.tryDeleteMessage(oldId);\n }\n\n const pendingParent = this.assistantHistoryParents.get(oldId);\n if (pendingParent !== undefined) {\n this.assistantHistoryParents.delete(oldId);\n if (!collidesWithExisting && !this.assistantHistoryParents.has(newId)) {\n this.assistantHistoryParents.set(newId, pendingParent);\n }\n }\n\n for (const ids of [this.snapshotHistoryIds, this.persistedHistoryIds]) {\n if (ids.has(oldId)) {\n ids.delete(oldId);\n if (!collidesWithExisting) {\n ids.add(newId);\n }\n }\n }\n\n // An in-flight write completes under the id it was started with, so the\n // rename moves the chain entry and transfers the completion mark; without\n // this the resolve records the dead id and the live one appends again.\n const pendingWrite = this.historyWrites.move(\n oldId,\n collidesWithExisting ? undefined : newId,\n );\n if (pendingWrite && !collidesWithExisting) {\n void pendingWrite.then(\n () => {\n this.persistedHistoryIds.delete(oldId);\n this.persistedHistoryIds.add(newId);\n },\n () => {},\n );\n }\n\n this.publishUpdate();\n return !collidesWithExisting;\n }\n\n private updateAssistantMessage(\n messageId: string,\n update: ChatModelRunResult,\n replay?: ReplayContext,\n pendingToolCallIds?: ReadonlySet<string>,\n ): string {\n let latestStatus: MessageStatus | undefined;\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const mergedMetadata = update.metadata\n ? this.mergeAssistantMetadata(assistant.metadata, update.metadata)\n : assistant.metadata;\n latestStatus = update.status ?? assistant.status;\n let content =\n update.content !== undefined\n ? replay\n ? replay.merge(\n assistant.content,\n update.content as ThreadAssistantMessage[\"content\"],\n )\n : this.preserveToolResults(\n assistant.content,\n update.content as ThreadAssistantMessage[\"content\"],\n )\n : assistant.content;\n const calls = replay ? Array.from(iterateToolCallParts(content)) : [];\n // A retained historical call needs existing or current stream authority.\n const pending =\n pendingToolCallIds ??\n (replay\n ? new Set([\n ...replay.admittedToolCallIds,\n ...Array.from(iterateToolCallParts(update.content ?? []))\n .filter((part) => !isResolvedToolCall(part))\n .map((part) => part.toolCallId),\n ])\n : undefined);\n if (replay && latestStatus?.type !== \"running\" && pending)\n replay.admittedToolCallIds = pending;\n if (replay) {\n // Project gates against the content the user can actually answer.\n const interrupts =\n latestStatus?.type === \"requires-action\" &&\n latestStatus.reason === \"interrupt\"\n ? (\n mergedMetadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.interrupts\n : undefined;\n const approvals = projectAgUiToolApprovals(\n interrupts,\n new Set(calls.map((part) => part.toolCallId)),\n );\n const originalCalls = new Map(\n Array.from(iterateToolCallParts(replay.originalContent), (part) => [\n part.toolCallId,\n part,\n ]),\n );\n content = mapToolCallPartsDeep(content, (part) => {\n const approval = approvals.get(part.toolCallId);\n if (approval)\n return {\n ...part,\n approval:\n preserveToolApprovalDecision(\n originalCalls.get(part.toolCallId),\n { ...part, approval },\n ) ?? approval,\n };\n if (\n !part.approval ||\n part.approval.approved !== undefined ||\n part.approval.resolution\n )\n return part;\n const { approval: _approval, ...withoutApproval } = part;\n return withoutApproval;\n }).content;\n }\n if (replay && latestStatus?.type === \"complete\") {\n const listed =\n pending ??\n listedPendingToolCallIds({\n ...assistant,\n metadata: mergedMetadata,\n });\n if (\n calls.some(\n (part) =>\n (!isResolvedToolCall(part) ||\n !replay.accountedResultIds.has(part.toolCallId)) &&\n (!listed || listed.has(part.toolCallId)),\n )\n )\n latestStatus = { type: \"requires-action\", reason: \"tool-calls\" };\n }\n const admission =\n pending && replay\n ? withPendingToolCallIds(mergedMetadata, pending)\n : mergedMetadata;\n const metadata =\n latestStatus?.type === \"requires-action\" &&\n latestStatus.reason === \"tool-calls\"\n ? admission\n : replay && latestStatus?.type === \"running\"\n ? mergedMetadata\n : withoutPendingToolCallIds(admission);\n return {\n ...assistant,\n content,\n status: latestStatus,\n metadata,\n };\n });\n if (!touched) return messageId;\n\n let resolvedMessageId = messageId;\n const isSettled =\n latestStatus !== undefined && latestStatus.type !== \"running\";\n if (isSettled && isOptimisticId(messageId)) {\n const stableId = generateId();\n this.reassignAssistantId(messageId, stableId);\n resolvedMessageId = stableId;\n } else {\n this.publishUpdate();\n }\n if (this.isPersistableStatus(latestStatus)) {\n this.persistAssistantHistory(resolvedMessageId);\n }\n this.maybeResumeAfterToolResults(\n resolvedMessageId,\n replay?.accountedResultIds,\n );\n return resolvedMessageId;\n }\n\n // The RunAggregator rebuilds the assistant content from stream events only,\n // so a fresh snapshot omits results injected via addToolResult (frontend tool\n // execution). Carry those results forward so the aggregator never clobbers\n // them. Results are only ever added in this flow, so preserving is safe.\n private preserveToolResults(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n decisionSource?: ThreadAssistantMessage[\"content\"],\n ): ThreadAssistantMessage[\"content\"] {\n const preserved = new Map<string, ToolCallMessagePart>();\n for (const part of iterateToolCallParts(previous)) {\n if (isResolvedToolCall(part)) {\n preserved.set(part.toolCallId, part);\n }\n }\n const decisions = new Map(\n Array.from(iterateToolCallParts(decisionSource ?? []))\n .filter((part) => part.approval?.approved !== undefined)\n .map((part) => [part.toolCallId, part]),\n );\n if (preserved.size === 0 && decisions.size === 0) {\n return this.preserveToolInteractions(previous, next);\n }\n\n const { content: merged, changed } = mapToolCallPartsDeep(next, (part) => {\n const prior = preserved.get(part.toolCallId);\n const result = prior ? preserveToolResult(prior, part) : part;\n if (result.approval && decisions.has(part.toolCallId)) {\n const approval = preserveToolApprovalDecision(\n decisions.get(part.toolCallId),\n result,\n );\n if (approval && approval !== result.approval)\n return { ...result, approval };\n }\n return result;\n });\n return this.preserveToolInteractions(previous, changed ? merged : next);\n }\n\n private preserveToolInteractions(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n ): ThreadAssistantMessage[\"content\"] {\n const interactions = new Map<\n string,\n NonNullable<ToolCallMessagePart[\"unstable_interactions\"]>\n >();\n for (const part of iterateToolCallParts(previous)) {\n if (part.unstable_interactions !== undefined) {\n interactions.set(part.toolCallId, part.unstable_interactions);\n }\n }\n if (interactions.size === 0) return next;\n\n const { content, changed } = mapToolCallPartsDeep(next, (part) => {\n const interaction = interactions.get(part.toolCallId);\n if (interaction === undefined || part.unstable_interactions !== undefined)\n return part;\n return { ...part, unstable_interactions: interaction };\n });\n return changed ? content : next;\n }\n\n // A snapshot built from user, assistant, and tool records alone carries no\n // reasoning, activity, or custom data of its own, so locally streamed parts would be\n // lost on every refresh; keep the local ones where they streamed when the\n // snapshot has none of that kind, matching the merge rule of @ag-ui/client.\n private mergeSnapshotAssistantContent(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n snapshotHasReasoning: boolean,\n snapshotHasActivity: boolean,\n keepMissingToolCalls: ReadonlySet<string> = new Set(),\n keepPriorTranscripts = false,\n ): ThreadAssistantMessage[\"content\"] {\n const shouldKeep = (part: ThreadAssistantMessage[\"content\"][number]) =>\n part.type === \"tool-call\"\n ? keepMissingToolCalls.has(part.toolCallId) &&\n !next.some(\n (incoming) =>\n incoming.type === \"tool-call\" &&\n incoming.toolCallId === part.toolCallId,\n )\n : part.type === \"reasoning\"\n ? this.showThinking && !snapshotHasReasoning\n : part.type === \"data\" && !isActivityPart(part)\n ? !next.some(\n (incoming) =>\n incoming.type === \"data\" && incoming.name === part.name,\n )\n : isActivityPart(part) && !snapshotHasActivity;\n const kept = previous.filter(shouldKeep);\n const merged = this.reconcileSnapshotNestedContent(\n previous,\n this.preserveToolInteractions(previous, next),\n keepPriorTranscripts,\n );\n if (kept.length === 0) return merged;\n\n const mergedByType = new Map<string, number[]>();\n const mergedTools = new Map<string, number>();\n for (const [index, part] of merged.entries()) {\n if (part.type === \"tool-call\") {\n mergedTools.set(part.toolCallId, index);\n } else {\n const indexes = mergedByType.get(part.type) ?? [];\n indexes.push(index);\n mergedByType.set(part.type, indexes);\n }\n }\n\n const previousOrdinals = new Map<string, number>();\n const insertions: (typeof kept)[] = Array.from(\n { length: merged.length + 1 },\n () => [],\n );\n let predecessorIndex = -1;\n for (const part of previous) {\n if (shouldKeep(part)) {\n insertions[predecessorIndex + 1]!.push(part);\n continue;\n }\n\n let matchedIndex: number | undefined;\n if (part.type === \"tool-call\") {\n matchedIndex = mergedTools.get(part.toolCallId);\n } else {\n const ordinal = previousOrdinals.get(part.type) ?? 0;\n matchedIndex = mergedByType.get(part.type)?.[ordinal];\n previousOrdinals.set(part.type, ordinal + 1);\n }\n if (matchedIndex !== undefined) predecessorIndex = matchedIndex;\n }\n\n const result: ThreadAssistantMessage[\"content\"][number][] = [];\n for (const [index, part] of merged.entries()) {\n result.push(...insertions[index]!, part);\n }\n result.push(...insertions[merged.length]!);\n return result;\n }\n\n private reconcileSnapshotNestedContent(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n keepPriorTranscripts: boolean,\n ): ThreadAssistantMessage[\"content\"] {\n const nestedIds = new Set<string>();\n for (const part of previous) {\n if (part.type !== \"tool-call\" || !part.messages) continue;\n for (const nested of part.messages) {\n if (nested.role !== \"assistant\") continue;\n for (const call of iterateToolCallParts(nested.content)) {\n nestedIds.add(call.toolCallId);\n }\n }\n }\n\n const flattened = new Map<string, ToolCallMessagePart>();\n for (const part of next) {\n if (part.type === \"tool-call\" && nestedIds.has(part.toolCallId)) {\n flattened.set(part.toolCallId, part);\n }\n }\n const carried =\n flattened.size === 0\n ? previous\n : mapToolCallPartsDeep(previous, (part) => {\n const snapshot = flattened.get(part.toolCallId);\n if (!snapshot) return part;\n return {\n ...part,\n ...(snapshot.result !== undefined\n ? { result: snapshot.result }\n : {}),\n ...(snapshot.isError !== undefined\n ? { isError: snapshot.isError }\n : {}),\n ...(snapshot.artifact !== undefined\n ? { artifact: snapshot.artifact }\n : {}),\n };\n }).content;\n const previousCalls = new Map<string, ToolCallMessagePart>();\n for (const part of carried) {\n if (part.type !== \"tool-call\") continue;\n previousCalls.set(part.toolCallId, part);\n }\n\n return next.flatMap<ThreadAssistantMessage[\"content\"][number]>((part) => {\n if (part.type === \"tool-call\" && flattened.has(part.toolCallId)) {\n return [];\n }\n if (part.type !== \"tool-call\") return [part];\n const prior = previousCalls.get(part.toolCallId);\n if (prior?.messages === undefined) return [part];\n if (part.messages === undefined)\n return [{ ...part, messages: prior.messages }];\n if (part.messages.length === 0) return [part];\n return [\n {\n ...part,\n messages: this.mergeNestedTranscripts(\n prior.messages,\n part.messages,\n keepPriorTranscripts,\n ),\n },\n ];\n });\n }\n\n /**\n * Merges one tool call's nested transcripts message by message. The incoming\n * copy is the base for tool calls and reasoning; resolved results and calls\n * only the prior copy has carry over, and the prior text wins when it extends\n * the incoming text. Importing a snapshot keeps prior messages it lacks, a\n * prior status that is running or incomplete, and the prior status when the\n * snapshot waits on calls the merged content has already resolved.\n */\n private mergeNestedTranscripts(\n prior: readonly ThreadMessage[],\n next: readonly ThreadMessage[],\n importingSnapshot: boolean,\n ): readonly ThreadMessage[] {\n const priorById = new Map(prior.map((message) => [message.id, message]));\n const merged = next.map((message) => {\n const previous = priorById.get(message.id);\n if (previous?.role !== \"assistant\" || message.role !== \"assistant\")\n return message;\n let content = this.mergeSnapshotAssistantContent(\n previous.content,\n this.preserveToolResults(previous.content, message.content),\n message.content.some((part) => part.type === \"reasoning\"),\n message.content.some(isActivityPart),\n new Set(\n Array.from(\n iterateToolCallParts(previous.content),\n (call) => call.toolCallId,\n ),\n ),\n importingSnapshot,\n );\n const priorText = textOf(previous.content);\n const incomingText = textOf(message.content);\n if (\n priorText.length > incomingText.length &&\n priorText.startsWith(incomingText)\n ) {\n content = replaceTextParts(content, previous.content);\n }\n const status = !importingSnapshot\n ? message.status\n : previous.status.type === \"running\" ||\n previous.status.type === \"incomplete\" ||\n (message.status.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\" &&\n !Array.from(iterateToolCallParts(content)).some(\n (call) => !isResolvedToolCall(call),\n ))\n ? previous.status\n : message.status;\n return {\n ...message,\n status,\n content,\n metadata: {\n ...message.metadata,\n custom: mergeAgUiNamespace(\n previous.metadata.custom,\n message.metadata.custom,\n ),\n },\n };\n });\n if (!importingSnapshot) return merged;\n const mergedById = new Map(merged.map((message) => [message.id, message]));\n return [\n ...prior.map((message) => mergedById.get(message.id) ?? message),\n ...merged.filter((message) => !priorById.has(message.id)),\n ];\n }\n\n private mergeAssistantMetadata(\n current: ThreadAssistantMessage[\"metadata\"],\n incoming: NonNullable<ChatModelRunResult[\"metadata\"]>,\n ): ThreadAssistantMessage[\"metadata\"] {\n const annotations = incoming.unstable_annotations\n ? [...current.unstable_annotations, ...incoming.unstable_annotations]\n : current.unstable_annotations;\n const data = incoming.unstable_data\n ? [...current.unstable_data, ...incoming.unstable_data]\n : current.unstable_data;\n const steps = incoming.steps\n ? [...current.steps, ...incoming.steps]\n : current.steps;\n return {\n unstable_state:\n incoming.unstable_state !== undefined\n ? incoming.unstable_state\n : current.unstable_state,\n unstable_annotations: annotations,\n unstable_data: data,\n steps,\n ...(current.isOptimistic ? { isOptimistic: true } : {}),\n ...(incoming.timing ? { timing: incoming.timing } : {}),\n custom: incoming.custom\n ? mergeAgUiNamespace(current.custom, incoming.custom)\n : current.custom,\n };\n }\n\n private handleEvent(\n aggregator: RunAggregator,\n event: AgUiEvent,\n activeAssistantId: string | undefined,\n joinStrategy: UseAgUiRuntimeOptions[\"joinStrategy\"],\n runStartMessageIds: ReadonlySet<string>,\n hasRunUserBoundary: boolean,\n reconcileSnapshot?: SnapshotMessageReconciler,\n ): string | undefined {\n if (\n event.type === \"SUBAGENT_STARTED\" &&\n !this.subagentParentToolCallIds.has(event.subagentRunId)\n ) {\n this.subagentParentToolCallIds.set(\n event.subagentRunId,\n event.parentToolCallId,\n );\n }\n switch (event.type) {\n case \"STATE_SNAPSHOT\": {\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: event.snapshot as ReadonlyJSONValue,\n });\n this.updateActiveAssistantState(activeAssistantId);\n break;\n }\n case \"STATE_DELTA\": {\n if (event.delta.length === 0) break;\n try {\n const result = jsonpatch.applyPatch(\n this.state.stateSnapshot ?? {},\n event.delta as Operation[],\n /* validateOperation */ true,\n /* mutateDocument */ false,\n );\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: result.newDocument as ReadonlyJSONValue,\n });\n this.updateActiveAssistantState(activeAssistantId);\n } catch (error) {\n this.logger.error?.(\"[agui] failed to apply state delta\", error);\n }\n break;\n }\n case \"MESSAGES_SNAPSHOT\": {\n aggregator.handle(event);\n const previousHeadId = this.session.headId;\n const activeAssistant =\n activeAssistantId === undefined\n ? undefined\n : this.session.tryGetMessage(activeAssistantId)?.message;\n const hasActiveText =\n activeAssistant?.role === \"assistant\" &&\n activeAssistant.content.some((part) => part.type === \"text\");\n this.importMessagesSnapshot(\n event.messages,\n activeAssistantId,\n joinStrategy,\n runStartMessageIds,\n hasRunUserBoundary,\n reconcileSnapshot,\n );\n const headId = this.session.headId;\n const head =\n headId === null\n ? undefined\n : this.session.tryGetMessage(headId)?.message;\n const hasNewPendingToolCallAnswer =\n head?.role === \"assistant\" &&\n !runStartMessageIds.has(head.id) &&\n head.status?.type === \"requires-action\" &&\n head.status.reason === \"tool-calls\";\n if (\n headId !== previousHeadId &&\n (hasActiveText || hasNewPendingToolCallAnswer)\n ) {\n const nextActiveAssistantId =\n head?.role === \"assistant\" ? (headId ?? undefined) : undefined;\n if (\n activeAssistantId !== nextActiveAssistantId &&\n activeAssistantId\n ) {\n const previous =\n this.session.tryGetMessage(activeAssistantId)?.message;\n if (\n previous?.role === \"assistant\" &&\n previous.status?.type === \"running\"\n ) {\n this.updateAssistantMessage(activeAssistantId, {\n status: FALLBACK_USER_STATUS,\n content: settleNestedContent(\n previous.content,\n FALLBACK_USER_STATUS,\n ),\n });\n }\n }\n activeAssistantId = nextActiveAssistantId;\n if (hasNewPendingToolCallAnswer && head) {\n this.updateAssistantMessage(head.id, {\n status: { type: \"running\" },\n });\n }\n }\n this.updateActiveAssistantState(activeAssistantId);\n break;\n }\n case \"TOOL_CALL_RESULT\": {\n if (!aggregator.hasToolCall(event.toolCallId)) {\n const messageId = this.findMessageIdForToolCall(event.toolCallId);\n if (messageId !== undefined) {\n this.applyCrossRunToolResult(messageId, event);\n break;\n }\n }\n aggregator.handle(event);\n break;\n }\n case \"ACTIVITY_SNAPSHOT\": {\n const toolCallId = event.content[\"toolCallId\"];\n if (\n event.activityType === MCP_APPS_ACTIVITY_TYPE &&\n typeof toolCallId === \"string\" &&\n !aggregator.hasToolCall(toolCallId)\n ) {\n const messageId = this.findMessageIdForToolCall(toolCallId);\n if (messageId !== undefined) {\n this.applyCrossRunActivitySnapshot(messageId, toolCallId, event);\n break;\n }\n }\n aggregator.handle(event);\n break;\n }\n default:\n aggregator.handle(event);\n }\n return activeAssistantId;\n }\n\n private updateActiveAssistantState(messageId: string | undefined): void {\n const current =\n messageId === undefined\n ? undefined\n : this.session.tryGetMessage(messageId)?.message;\n const activeAssistantId =\n current?.role === \"assistant\" && this.session.headId === messageId\n ? messageId\n : this.session.headId;\n if (activeAssistantId !== null && activeAssistantId !== undefined) {\n this.session.updateMessage(activeAssistantId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n return {\n ...assistant,\n metadata: {\n ...assistant.metadata,\n unstable_state: this.state.stateSnapshot ?? null,\n },\n };\n });\n }\n this.publishUpdate();\n }\n\n private applyCrossRunToolResult(\n messageId: string,\n event: Extract<AgUiEvent, { type: \"TOOL_CALL_RESULT\" }>,\n ): void {\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const mcpAppUri = readMcpAppResourceUri(event.mcpResult?._meta);\n const modelText = toolContentText(event.content);\n let matchedToolCall = false;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== event.toolCallId) return part;\n matchedToolCall = true;\n // An applied activity snapshot owns part.result; a later result only\n // fills what is missing, mirroring the aggregator's finishToolCall.\n // The aggregator's flag is set only when the snapshot carried a\n // result, so app presence alone is not enough: the current result\n // must be CallToolResult-shaped (a required content array).\n const snapshotResultApplied =\n part.mcp?.app !== undefined &&\n isPlainObject(part.result) &&\n Array.isArray((part.result as Record<string, unknown>)[\"content\"]);\n if (snapshotResultApplied) {\n return {\n ...part,\n ...(part.modelContent === undefined\n ? {\n modelContent: [{ type: \"text\" as const, text: modelText }],\n }\n : {}),\n ...(part.isError === undefined\n ? typeof event.mcpResult?.isError === \"boolean\"\n ? { isError: event.mcpResult.isError }\n : event.role === \"tool\"\n ? { isError: false }\n : {}\n : {}),\n ...(event.messageId\n ? { unstable_toolMessageId: event.messageId }\n : {}),\n ...(event.metadata !== undefined\n ? {\n providerMetadata: withAgUiPartMessageMetadata(\n part.providerMetadata,\n event.metadata,\n ),\n }\n : {}),\n };\n }\n const { modelContent: _modelContent, ...partWithoutModelContent } =\n part;\n return {\n ...(event.mcpResult === undefined && Array.isArray(event.content)\n ? partWithoutModelContent\n : part),\n result: (event.mcpResult ??\n (Array.isArray(event.content)\n ? event.content\n : tryParseJSON(event.content))) as ReadonlyJSONValue,\n ...(event.mcpResult !== undefined\n ? { modelContent: [{ type: \"text\" as const, text: modelText }] }\n : {}),\n ...(typeof event.mcpResult?.isError === \"boolean\"\n ? { isError: event.mcpResult.isError }\n : event.role === \"tool\"\n ? { isError: false }\n : {}),\n ...(part.mcp === undefined && mcpAppUri !== undefined\n ? { mcp: { app: { resourceUri: mcpAppUri } } }\n : {}),\n ...(event.messageId\n ? { unstable_toolMessageId: event.messageId }\n : {}),\n ...(event.metadata !== undefined\n ? {\n providerMetadata: withAgUiPartMessageMetadata(\n part.providerMetadata,\n event.metadata,\n ),\n }\n : {}),\n };\n });\n if (!matchedToolCall) return message;\n return { ...assistant, content };\n });\n\n if (!updated) return;\n this.publishUpdate();\n // Not maybeResumeAfterToolResults: the delivering run is already in\n // flight, and a resume from the owner would reset the head past it.\n if (this.maybeCompleteAfterToolResults(messageId)) return;\n this.persistSettledAssistant(messageId);\n }\n\n private applyCrossRunActivitySnapshot(\n messageId: string,\n toolCallId: string,\n event: Extract<AgUiEvent, { type: \"ACTIVITY_SNAPSHOT\" }>,\n ): void {\n const resourceUri = event.content[\"resourceUri\"];\n if (typeof resourceUri !== \"string\" || !isMcpAppUri(resourceUri)) return;\n const serverId = event.content[\"serverId\"];\n const serverHash = event.content[\"serverHash\"];\n const appServerId =\n typeof serverId === \"string\" && serverId.length > 0\n ? serverId\n : typeof serverHash === \"string\" && serverHash.length > 0\n ? serverHash\n : undefined;\n const result = event.content[\"result\"];\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n let matchedToolCall = false;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== toolCallId) return part;\n matchedToolCall = true;\n return {\n ...part,\n mcp: {\n app: {\n resourceUri,\n ...(appServerId ? { serverId: appServerId } : {}),\n },\n },\n ...(isPlainObject(result)\n ? {\n ...(part.result !== undefined && part.modelContent === undefined\n ? {\n modelContent: [\n {\n type: \"text\" as const,\n text:\n typeof part.result === \"string\"\n ? part.result\n : JSON.stringify(part.result),\n },\n ],\n }\n : {}),\n result: result as ReadonlyJSONValue,\n isError: result[\"isError\"] === true,\n }\n : {}),\n };\n });\n if (!matchedToolCall) return message;\n return { ...assistant, content };\n });\n\n if (!updated) return;\n this.publishUpdate();\n if (this.maybeCompleteAfterToolResults(messageId)) return;\n this.persistSettledAssistant(messageId);\n }\n\n private importMessagesSnapshot(\n rawMessages: readonly unknown[],\n activeAssistantId: string | undefined,\n joinStrategy: UseAgUiRuntimeOptions[\"joinStrategy\"],\n runStartMessageIds: ReadonlySet<string>,\n hasRunUserBoundary: boolean,\n reconcileSnapshot?: SnapshotMessageReconciler,\n ) {\n try {\n const activeAssistantItem = activeAssistantId\n ? this.session.tryGetMessage(activeAssistantId)\n : undefined;\n const activeMessage = activeAssistantItem?.message;\n const activeAssistantParentId = activeAssistantItem?.parentId;\n const activeAssistant =\n activeMessage?.role === \"assistant\" ? activeMessage : undefined;\n const normalized = fromAgUiSnapshotMessages(\n rawMessages,\n { showThinking: this.showThinking },\n this.subagentParentToolCallIds,\n );\n const converted: ThreadMessage[] = [];\n for (const message of normalized) {\n try {\n const previous = message.id\n ? this.session.tryGetMessage(message.id)?.message\n : undefined;\n const fallbackStatus =\n previous?.role === \"assistant\" &&\n previous.status?.type === \"running\"\n ? previous.status\n : FALLBACK_USER_STATUS;\n converted.push(\n fromThreadMessageLike(message, generateId(), fallbackStatus),\n );\n } catch (error) {\n this.logger.error?.(\n \"[agui] failed to import message from snapshot\",\n error,\n );\n }\n }\n const snapshotHasReasoning = converted.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content.some((part) => part.type === \"reasoning\"),\n );\n const snapshotHasActivity = converted.some(\n (message) =>\n message.role === \"assistant\" && message.content.some(isActivityPart),\n );\n for (let index = 0; index < converted.length; index++) {\n const convertedMessage = converted[index]!;\n const existing = this.session.tryGetMessage(\n convertedMessage.id,\n )?.message;\n if (convertedMessage.role === \"assistant\") {\n const previous =\n existing?.role === \"assistant\" ? existing : undefined;\n const snapshot =\n reconcileSnapshot?.(convertedMessage, previous) ?? convertedMessage;\n const preservesRunningStatus =\n convertedMessage.id === activeAssistantId &&\n previous?.status?.type === \"running\" &&\n snapshot.status?.type === \"requires-action\" &&\n snapshot.status.reason === \"tool-calls\";\n converted[index] = previous\n ? {\n ...snapshot,\n ...(preservesRunningStatus ? { status: previous.status } : {}),\n content: this.mergeSnapshotAssistantContent(\n previous.content,\n snapshot.content,\n snapshotHasReasoning,\n snapshotHasActivity,\n new Set(),\n true,\n ),\n }\n : snapshot;\n }\n }\n if (joinStrategy === \"concat-content\") {\n const activeIndex = converted.findIndex(\n (message) => message.id === activeAssistantId,\n );\n const lastKnownIndex = converted.findLastIndex((message) =>\n runStartMessageIds.has(message.id),\n );\n const lastUserIndex = hasRunUserBoundary\n ? converted.findLastIndex((message) => message.role === \"user\")\n : -1;\n const startIndex =\n activeIndex >= 0\n ? activeIndex\n : lastKnownIndex >= 0 || lastUserIndex >= 0\n ? Math.max(lastKnownIndex, lastUserIndex) + 1\n : -1;\n if (startIndex >= 0 && converted[startIndex]?.role === \"assistant\") {\n let endIndex = startIndex + 1;\n while (converted[endIndex]?.role === \"assistant\") endIndex++;\n const runMessages = converted.slice(\n startIndex,\n endIndex,\n ) as ThreadAssistantMessage[];\n const includesStreamedPrefix =\n activeIndex < 0 &&\n activeAssistant?.content.some((part) => part.type !== \"data\");\n if (includesStreamedPrefix && activeAssistant) {\n runMessages.unshift(activeAssistant);\n }\n if (runMessages.length > 1) {\n const [first, ...rest] = runMessages;\n let content = runMessages.flatMap((message) => message.content);\n if (includesStreamedPrefix) {\n content = [...first!.content];\n let cursor = 0;\n const keyOf = (part: (typeof content)[number]) =>\n part.type === \"tool-call\"\n ? `tool:${part.toolCallId}`\n : part.type === \"text\" || part.type === \"reasoning\"\n ? `${part.type}:${part.text}`\n : undefined;\n for (const message of rest) {\n for (const part of message.content) {\n const key = keyOf(part);\n const match =\n key === undefined\n ? -1\n : content.findIndex(\n (previous, index) =>\n index >= cursor && keyOf(previous) === key,\n );\n if (match < 0) {\n content.push(part);\n cursor = content.length;\n } else {\n if (part.type === \"tool-call\") {\n content[match] = this.preserveToolResults(\n [content[match]!],\n [part],\n )[0]!;\n }\n cursor = match + 1;\n }\n }\n }\n }\n converted.splice(startIndex, endIndex - startIndex, {\n ...first!,\n content,\n status: rest.at(-1)!.status,\n metadata: rest.reduce(\n (metadata, message) => ({\n ...metadata,\n ...message.metadata,\n unstable_state: message.metadata.unstable_state,\n unstable_annotations: [\n ...metadata.unstable_annotations,\n ...message.metadata.unstable_annotations,\n ],\n unstable_data: [\n ...metadata.unstable_data,\n ...message.metadata.unstable_data,\n ],\n steps: [...metadata.steps, ...message.metadata.steps],\n custom: mergeAgUiNamespace(\n metadata.custom,\n message.metadata.custom,\n ),\n }),\n first!.metadata,\n ),\n });\n }\n }\n }\n const snapshotContainsActiveAssistant = converted.some(\n (message) => message.id === activeAssistant?.id,\n );\n const preservesActiveAssistant =\n activeAssistant !== undefined &&\n !snapshotContainsActiveAssistant &&\n (activeAssistant.metadata.isOptimistic !== true ||\n converted.at(-1)?.role !== \"assistant\" ||\n (activeAssistantParentId !== undefined &&\n converted.at(-1)?.id === activeAssistantParentId));\n if (preservesActiveAssistant) {\n converted.push(activeAssistant);\n }\n this.applyExternalMessages(converted);\n if (activeAssistant !== undefined) {\n const activeItem = this.session.tryGetMessage(activeAssistant.id);\n if (activeItem) {\n if (preservesActiveAssistant) {\n this.snapshotHistoryIds.delete(activeAssistant.id);\n }\n this.markPendingAssistantHistory(\n activeAssistant.id,\n activeItem.parentId,\n );\n }\n }\n } catch (error) {\n this.logger.error?.(\"[agui] failed to import messages snapshot\", error);\n }\n }\n\n private toThreadMessage(message: AppendMessage): ThreadMessage {\n return fromThreadMessageLike(\n message as any,\n generateId(),\n FALLBACK_USER_STATUS,\n );\n }\n\n private isTerminalStatus(status?: MessageStatus): boolean {\n return status?.type === \"complete\" || status?.type === \"incomplete\";\n }\n\n private isPersistableStatus(status?: MessageStatus): boolean {\n if (this.isTerminalStatus(status)) return true;\n return status?.type === \"requires-action\" && status.reason === \"interrupt\";\n }\n\n private recordHistoryEntry(parentId: string | null, message: ThreadMessage) {\n void this.appendHistoryItem(parentId, message)?.catch((error) => {\n this.logger.error?.(\"[agui] 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 persistSettledAssistant(messageId: string): void {\n const item = this.session.tryGetMessage(messageId);\n if (!this.history?.update || !item) return;\n if (!this.isTerminalStatus(item.message.status)) return;\n if (\n !this.persistedHistoryIds.has(messageId) &&\n this.historyWrites.pending(messageId) === undefined\n )\n return;\n this.markPendingAssistantHistory(messageId, item.parentId);\n this.persistAssistantHistory(messageId);\n }\n\n private persistAssistantHistory(messageId: string) {\n const history = this.history;\n if (!history) return;\n const parentId = this.assistantHistoryParents.get(messageId);\n if (parentId === undefined) return;\n const message = this.session.tryGetMessage(messageId)?.message;\n if (!message || message.role !== \"assistant\") return;\n if (!this.isPersistableStatus(message.status)) return;\n const wasPersisted = this.persistedHistoryIds.has(messageId);\n const update = history.update;\n const shouldUpdate =\n update !== undefined &&\n (wasPersisted ||\n this.snapshotHistoryIds.has(messageId) ||\n this.historyWrites.pending(messageId) !== undefined);\n\n if (shouldUpdate) {\n const write = this.historyWrites.chain(messageId, () =>\n update.call(history, { parentId, message }),\n );\n this.assistantHistoryParents.delete(messageId);\n void write.then(\n () => {\n this.persistedHistoryIds.add(messageId);\n },\n (error) => {\n const pending = this.historyWrites.pending(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, parentId);\n }\n this.logger.error?.(\"[agui] failed to update history entry\", error);\n },\n );\n return;\n }\n\n if (wasPersisted) {\n this.assistantHistoryParents.delete(messageId);\n return;\n }\n\n const write = this.appendHistoryItem(parentId, message);\n if (!write) return;\n this.assistantHistoryParents.delete(messageId);\n void write.then(\n () => {},\n (error) => {\n const pending = this.historyWrites.pending(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, parentId);\n }\n this.logger.error?.(\"[agui] failed to append history entry\", error);\n },\n );\n }\n\n private appendHistoryItem(\n parentId: string | null,\n message: ThreadMessage,\n ): Promise<void> | undefined {\n if (!this.history || this.persistedHistoryIds.has(message.id)) return;\n const pending = this.historyWrites.pending(message.id);\n if (pending) return pending;\n\n const append = this.history.append.bind(this.history);\n const write = this.historyWrites.chain(message.id, () =>\n append({ parentId, message }),\n );\n void write.then(\n () => {\n this.persistedHistoryIds.add(message.id);\n },\n () => {},\n );\n return write;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgUiThreadController.js","names":[],"sources":["../../src/runtime/AgUiThreadController.ts"],"sourcesContent":["\"use client\";\n\nimport {\n generateId,\n fromThreadMessageLike,\n isMcpAppUri,\n} from \"@assistant-ui/core\";\nimport type {\n AddToolResultOptions,\n AppendMessage,\n CreateAppendMessage,\n AssistantRuntime,\n ChatModelRunOptions,\n ChatModelRunResult,\n ExportedMessageRepository,\n MessageStatus,\n RespondToToolApprovalOptions,\n RunConfig,\n ThreadAssistantMessage,\n ThreadHistoryAdapter,\n ThreadMessage,\n ToolCallMessagePart,\n Unstable_ToolInteraction,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n createHistoryWriteChain,\n createMessageRepositorySession,\n invokeUserCallback,\n iterateToolCallParts,\n mapToolCallPartsDeep,\n} from \"@assistant-ui/core/internal\";\nimport type {\n AbstractAgent,\n AgentSubscriber,\n Context,\n RunAgentParameters,\n RunAgentResult,\n} from \"@ag-ui/client\";\nimport jsonpatch, { type Operation } from \"fast-json-patch\";\nimport {\n createAgUiThreadState,\n reduceAgUiThreadState,\n type AgUiThreadAction,\n type AgUiThreadState,\n} from \"./agUiThreadState\";\nimport type { Logger } from \"./logger\";\nimport { readMcpAppResourceUri, toolContentText } from \"./mcp-tool-result\";\nimport type {\n AgUiCustomMetadata,\n AgUiEvent,\n AgUiInterrupt,\n AgUiResumeEntry,\n AgUiResumeTranscript,\n UseAgUiRuntimeOptions,\n} from \"./types\";\nimport { AG_UI_METADATA_NAMESPACE, MCP_APPS_ACTIVITY_TYPE } from \"./types\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport {\n isPlainObject,\n RunAggregator,\n tryParseJSON,\n} from \"./adapter/run-aggregator\";\nimport {\n fromAgUiSnapshotMessages,\n toAgUiMessages,\n toAgUiTools,\n withAgUiPartMessageMetadata,\n} from \"./adapter/conversions\";\nimport { createAgUiSubscriber } from \"./adapter/subscriber\";\nimport {\n createReplayContentMerger,\n groupReplayToolContent,\n indexReplayToolOwners,\n preserveToolResult,\n} from \"./adapter/replay-content\";\nimport {\n buildToolApprovalResume,\n projectAgUiToolApprovals,\n preserveToolApprovalDecision,\n withSettledToolApprovals,\n withToolApprovalDecision,\n} from \"./adapter/tool-approval\";\n\n// The SDK does not retain initialState.\nconst agentInitialStates = new WeakMap<\n AbstractAgent,\n ReadonlyJSONValue | undefined\n>();\n\nconst getAgentInitialState = (agent: AbstractAgent) => {\n if (!agentInitialStates.has(agent)) {\n const state = agent.state;\n agentInitialStates.set(\n agent,\n state === undefined ||\n (isPlainObject(state) && Object.keys(state).length === 0)\n ? undefined\n : (structuredClone(state) as ReadonlyJSONValue),\n );\n }\n return agentInitialStates.get(agent);\n};\n\n// AbstractAgent.runAgent declares two parameters. HttpAgent ignores a third and\n// is cancelled through agent.abortRun(); the run options stay for subclasses\n// that inherit the base no-op abortRun and have no other cancellation hook.\ntype RunAgentWithRunOptions = (\n parameters: RunAgentParameters,\n subscriber: AgentSubscriber,\n options: { signal: AbortSignal },\n) => Promise<RunAgentResult>;\n\nconst optimisticPrefix = \"__optimistic__\";\nconst generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;\nconst isOptimisticId = (id: string) => id.startsWith(optimisticPrefix);\n\nconst isResolvedToolCall = (\n part: ThreadAssistantMessage[\"content\"][number],\n): boolean =>\n part.type === \"tool-call\" && \"result\" in part && part.result !== undefined;\n\nconst hasResolvedToolCalls = (message: ThreadMessage): boolean => {\n if (message.role !== \"assistant\") return false;\n for (const part of iterateToolCallParts(message.content)) {\n if (isResolvedToolCall(part)) return true;\n }\n return false;\n};\n\nconst listedPendingToolCallIds = (\n assistant: Pick<ThreadAssistantMessage, \"metadata\">,\n): ReadonlySet<string> | undefined => {\n const ids = (\n assistant.metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.pendingToolCallIds;\n return ids === undefined ? undefined : new Set(ids);\n};\n\ntype ReplayContext = {\n // Immutable history reference: partial argument frames cannot redefine consent.\n readonly originalContent: ThreadAssistantMessage[\"content\"];\n accountedResultIds: ReadonlySet<string>;\n admittedToolCallIds: ReadonlySet<string>;\n merge: ReturnType<typeof createReplayContentMerger>;\n};\n\ntype SnapshotMessageReconciler = (\n snapshot: ThreadAssistantMessage,\n previous: ThreadAssistantMessage | undefined,\n) => ThreadAssistantMessage;\n\nconst withoutPendingToolCallIds = (\n metadata: ThreadAssistantMessage[\"metadata\"],\n): ThreadAssistantMessage[\"metadata\"] => {\n const namespace = metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined;\n if (!namespace || !(\"pendingToolCallIds\" in namespace)) return metadata;\n const { pendingToolCallIds: _pendingToolCallIds, ...remainingNamespace } =\n namespace;\n const { [AG_UI_METADATA_NAMESPACE]: _namespace, ...remainingCustom } =\n metadata.custom;\n return {\n ...metadata,\n custom: {\n ...remainingCustom,\n ...(Object.keys(remainingNamespace).length > 0\n ? { [AG_UI_METADATA_NAMESPACE]: remainingNamespace }\n : {}),\n },\n };\n};\n\nconst withPendingToolCallIds = (\n metadata: ThreadAssistantMessage[\"metadata\"],\n ids: Iterable<string>,\n): ThreadAssistantMessage[\"metadata\"] => ({\n ...metadata,\n custom: {\n ...metadata.custom,\n [AG_UI_METADATA_NAMESPACE]: {\n ...(metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined),\n pendingToolCallIds: [...ids],\n },\n },\n});\n\nconst actionableToolCallIds = (\n message: ThreadMessage | undefined,\n): ReadonlySet<string> => {\n if (\n message?.role !== \"assistant\" ||\n message.status?.type !== \"requires-action\" ||\n message.status.reason !== \"tool-calls\"\n )\n return new Set();\n const permitted = listedPendingToolCallIds(message);\n return new Set(\n Array.from(iterateToolCallParts(message.content))\n .filter(\n (part) =>\n !isResolvedToolCall(part) &&\n (!permitted || permitted.has(part.toolCallId)),\n )\n .map((part) => part.toolCallId),\n );\n};\n\nconst isActivityPart = (part: ThreadAssistantMessage[\"content\"][number]) =>\n part.type === \"data\" && part.name.startsWith(\"agui-activity/\");\n\ntype ResumeStream = (\n options: ChatModelRunOptions,\n) => AsyncGenerator<ChatModelRunResult, void, unknown>;\ntype ResumeRunConfig = {\n parentId: string | null;\n sourceId: string | null;\n runConfig: RunConfig;\n stream?: ResumeStream;\n};\n\n/**\n * A resume submission, pairing the entries that answer the open interrupts with\n * the assistant message they were opened on. That message anchors the resume\n * transcript: under `resumeTranscript: \"appended\"` only what follows it is sent.\n */\ntype ResumeDispatch = {\n entries: AgUiResumeEntry[];\n interruptedMessageId: string;\n};\n\ntype CoreOptions = {\n agent: AbstractAgent;\n logger: Logger;\n showThinking: boolean;\n joinStrategy?: UseAgUiRuntimeOptions[\"joinStrategy\"];\n getRunContext?: UseAgUiRuntimeOptions[\"getRunContext\"];\n resumeTranscript?: AgUiResumeTranscript | undefined;\n autoCancelPendingToolCalls?: boolean | undefined;\n onError?: (error: Error) => void;\n onCancel?: () => void;\n history?: ThreadHistoryAdapter;\n isThreadSwitching?: () => boolean;\n};\n\nconst FALLBACK_USER_STATUS = { type: \"complete\", reason: \"unknown\" } as const;\n\nconst textOf = (content: ThreadAssistantMessage[\"content\"]) =>\n content.flatMap((part) => (part.type === \"text\" ? [part.text] : [])).join(\"\");\n\n/**\n * Swaps `content`'s text parts, in order, for `source`'s. A text part `source`\n * has beyond `content`'s text slots goes after the nearest earlier part of\n * `source` that `content` also has: a tool call by id, another part by its\n * type and position among parts of that type. With none, it goes first.\n */\nconst replaceTextParts = (\n content: ThreadAssistantMessage[\"content\"],\n source: ThreadAssistantMessage[\"content\"],\n): ThreadAssistantMessage[\"content\"] => {\n const texts = source.filter((part) => part.type === \"text\");\n const result: ThreadAssistantMessage[\"content\"][number][] = [];\n let used = 0;\n for (const part of content) {\n if (part.type !== \"text\") result.push(part);\n else if (used < texts.length) result.push(texts[used++]!);\n }\n const positionIn = (\n parts: readonly ThreadAssistantMessage[\"content\"][number][],\n part: ThreadAssistantMessage[\"content\"][number],\n ) => parts.filter((other) => other.type === part.type).indexOf(part);\n for (const text of texts.slice(used)) {\n let anchor = -1;\n for (\n let index = source.indexOf(text) - 1;\n index >= 0 && anchor < 0;\n index--\n ) {\n const before = source[index]!;\n if (before.type === \"tool-call\") {\n anchor = result.findIndex(\n (part) =>\n part.type === \"tool-call\" && part.toolCallId === before.toolCallId,\n );\n } else if (before.type === \"text\") {\n anchor = result.indexOf(before);\n } else {\n const sameType = result.filter((part) => part.type === before.type);\n const match = sameType[positionIn(source, before)];\n anchor = match ? result.indexOf(match) : -1;\n }\n }\n result.splice(anchor + 1, 0, text);\n }\n return result;\n};\n\nconst settleNestedContent = (\n content: ThreadAssistantMessage[\"content\"],\n status: MessageStatus,\n) =>\n mapToolCallPartsDeep(content, (part) =>\n part.messages\n ? {\n ...part,\n messages: part.messages.map((message) =>\n message.role === \"assistant\" && message.status?.type === \"running\"\n ? { ...message, status }\n : message,\n ),\n }\n : part,\n ).content;\n\ntype AgUiRuntimeCallbackName = \"onError\" | \"onCancel\";\n\nconst invokeRuntimeCallback = <TArgs extends readonly unknown[]>(\n name: AgUiRuntimeCallbackName,\n callback: ((...args: TArgs) => unknown) | undefined,\n ...args: TArgs\n): void => {\n void invokeUserCallback(\"react-ag-ui\", name, callback, ...args);\n};\n\n// The aggregator sends only the agui keys it owns (interrupts and\n// opaqueReasoning, each as a full replacement), so a shallow spread at the\n// custom level would drop any sibling agui state a snapshot import attached.\nconst mergeAgUiNamespace = (\n current: Record<string, unknown> | undefined,\n incoming: Record<string, unknown>,\n) => {\n const merged = { ...current, ...incoming };\n const currentNs = current?.[AG_UI_METADATA_NAMESPACE];\n const incomingNs = incoming[AG_UI_METADATA_NAMESPACE];\n if (\n typeof currentNs === \"object\" &&\n currentNs !== null &&\n typeof incomingNs === \"object\" &&\n incomingNs !== null\n ) {\n merged[AG_UI_METADATA_NAMESPACE] = { ...currentNs, ...incomingNs };\n }\n return merged;\n};\n\nexport class AgUiThreadController {\n private agent: AbstractAgent;\n private logger: Logger;\n private showThinking: boolean;\n private joinStrategy: UseAgUiRuntimeOptions[\"joinStrategy\"];\n private getRunContext: UseAgUiRuntimeOptions[\"getRunContext\"];\n private resumeTranscript: AgUiResumeTranscript;\n private autoCancelPendingToolCalls: boolean | undefined;\n private onError: ((error: Error) => void) | undefined;\n private onCancel: (() => void) | undefined;\n private readonly listeners = new Set<() => void>();\n private snapshot:\n | {\n isLoading: boolean;\n isRunning: boolean;\n messageRepository: ExportedMessageRepository;\n state: ReadonlyJSONValue | undefined;\n }\n | undefined;\n private readonly isThreadSwitching: (() => boolean) | undefined;\n private readonly reportedErrors = new WeakSet<object>();\n\n private runtime: AssistantRuntime | undefined;\n private readonly session = createMessageRepositorySession({\n decorateExport: (exported, repository) => {\n let parentId: string | null = null;\n for (const message of repository.getMessages()) {\n if (message.metadata.isOptimistic) {\n exported.messages.push({ parentId, message });\n }\n parentId = message.id;\n }\n\n return {\n ...exported,\n headId: repository.headId,\n };\n },\n });\n private state: AgUiThreadState = createAgUiThreadState();\n private abortController: AbortController | null = null;\n // The agent that started the active run. updateOptions can swap this.agent\n // mid-run, and cancelling has to reach the agent holding the live request.\n private activeRunAgent: AbstractAgent | null = null;\n private history: ThreadHistoryAdapter | undefined;\n private readonly assistantHistoryParents = new Map<string, string | null>();\n private readonly subagentParentToolCallIds = new Map<\n string,\n string | undefined\n >();\n private readonly snapshotHistoryIds = new Set<string>();\n private readonly persistedHistoryIds = new Set<string>();\n private readonly historyWrites = createHistoryWriteChain();\n private _historyImportPromise: Promise<void> | undefined;\n private _loadPromise: Promise<void> | undefined;\n\n constructor(options: CoreOptions) {\n this.agent = options.agent;\n const initialState = getAgentInitialState(this.agent);\n if (initialState !== undefined) {\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: initialState,\n });\n }\n this.logger = options.logger;\n this.showThinking = options.showThinking;\n this.joinStrategy = options.joinStrategy;\n this.getRunContext = options.getRunContext;\n this.resumeTranscript = options.resumeTranscript ?? \"full\";\n this.autoCancelPendingToolCalls = options.autoCancelPendingToolCalls;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n this.history = options.history;\n this.isThreadSwitching = options.isThreadSwitching;\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.state.isLoading,\n isRunning: this.state.isRunning,\n messageRepository: this.session.export(),\n state: this.state.stateSnapshot,\n });\n\n private dispatch(action: AgUiThreadAction): void {\n this.state = reduceAgUiThreadState(this.state, action);\n }\n\n private publishUpdate(): void {\n this.snapshot = undefined;\n for (const listener of this.listeners) listener();\n }\n\n updateOptions(options: CoreOptions) {\n const agentChanged = this.agent !== options.agent;\n this.agent = options.agent;\n if (agentChanged) {\n const initialState = getAgentInitialState(this.agent);\n if (\n this.state.stateSnapshot === undefined &&\n initialState !== undefined\n ) {\n this.dispatch({ type: \"stateSnapshot\", snapshot: initialState });\n this.publishUpdate();\n }\n }\n this.logger = options.logger;\n this.showThinking = options.showThinking;\n this.joinStrategy = options.joinStrategy;\n this.getRunContext = options.getRunContext;\n this.resumeTranscript = options.resumeTranscript ?? \"full\";\n this.autoCancelPendingToolCalls = options.autoCancelPendingToolCalls;\n this.onError = options.onError;\n this.onCancel = options.onCancel;\n const previousHistory = this.history;\n this.history = options.history;\n if (\n this.state.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 attachRuntime(runtime: AssistantRuntime) {\n this.runtime = runtime;\n }\n\n detachRuntime() {\n this.runtime = undefined;\n void this.cancel().catch((error) => {\n this.logger.error(\"[agui] failed to cancel run during teardown\", error);\n });\n }\n\n getMessages(): readonly ThreadMessage[] {\n return this.session.getMessages();\n }\n\n getMessageRepository(): ExportedMessageRepository {\n return this.session.export();\n }\n\n getState(): ReadonlyJSONValue | undefined {\n return this.state.stateSnapshot;\n }\n\n isRunning(): boolean {\n return this.state.isRunning;\n }\n\n get isLoading(): boolean {\n return this.state.isLoading;\n }\n\n __internal_load(): Promise<void> {\n this.dispatch({ type: \"loadRequested\" });\n if (this._loadPromise) return this._loadPromise;\n if (!this.history) return Promise.resolve();\n\n const promise = this.history.load().then((repo) => {\n if (!repo) return;\n\n this.session.applyExternalMessageRepository(repo);\n this.assistantHistoryParents.clear();\n this.subagentParentToolCallIds.clear();\n this.snapshotHistoryIds.clear();\n this.persistedHistoryIds.clear();\n for (const { message } of repo.messages) {\n this.persistedHistoryIds.add(message.id);\n }\n this.publishUpdate();\n\n if (repo.state !== undefined) {\n this.loadExternalState(repo.state);\n }\n\n return repo;\n });\n\n this.dispatch({ type: \"loadStarted\" });\n this._historyImportPromise = promise.then(\n () => {\n this._historyImportPromise = undefined;\n },\n () => {\n this._historyImportPromise = undefined;\n },\n );\n\n this._loadPromise = promise\n .then(async (repo) => {\n if (repo?.unstable_resume) {\n const parentId = repo.headId ?? this.session.headId;\n const resumeStream = this.history?.resume?.bind(this.history);\n await this.startRun(\n parentId,\n this.state.lastRunConfig,\n undefined,\n resumeStream,\n );\n }\n })\n .catch((error) => {\n this.logger.error?.(\"[agui] failed to load history\", error);\n this.reportError(error);\n })\n .finally(() => {\n this.dispatch({\n type: \"loadFinished\",\n });\n this.publishUpdate();\n });\n\n this.publishUpdate();\n return this._loadPromise;\n }\n\n private waitForHistoryImport(): Promise<boolean> | undefined {\n const historyImport = this._historyImportPromise;\n if (!historyImport) return undefined;\n const generation = this.state.historyMutationGeneration;\n return historyImport.then(\n () =>\n generation === this.state.historyMutationGeneration &&\n !this.isThreadSwitching?.(),\n );\n }\n\n private deferUntilHistoryImported(callback: () => void): boolean {\n const historyImport = this._historyImportPromise;\n if (!historyImport) return false;\n const generation = this.state.historyMutationGeneration;\n void historyImport.then(() => {\n if (\n generation !== this.state.historyMutationGeneration ||\n this.isThreadSwitching?.()\n ) {\n return;\n }\n try {\n callback();\n } catch (error) {\n this.reportError(error);\n }\n });\n return true;\n }\n\n async append(message: AppendMessage): Promise<void> {\n const historyImport = this._historyImportPromise;\n if (historyImport) {\n const wasAtTail = message.parentId === this.session.headId;\n const generation = this.state.historyMutationGeneration;\n await historyImport;\n if (\n generation !== this.state.historyMutationGeneration ||\n this.isThreadSwitching?.()\n )\n return;\n if (wasAtTail) {\n message = { ...message, parentId: this.session.headId };\n }\n }\n\n const startRun = message.startRun ?? message.role === \"user\";\n let ownsThread = true;\n if (startRun) {\n this.assertNoPendingInterrupts();\n this.maybeAutoCancelPendingToolCalls();\n // Before the message is linked: callers parent it on the in-flight\n // assistant, and settling that assistant reassigns its optimistic id,\n // which would evict it and reparent this message onto a branch.\n ownsThread = this.supersedeActiveRun();\n }\n const threadMessageId = this.appendEntry(message);\n if (!startRun || !ownsThread) return;\n await this.startRun(threadMessageId, message.runConfig);\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 private maybeAutoCancelPendingToolCalls(): void {\n if (this.autoCancelPendingToolCalls === false) return;\n for (const assistant of this.getPendingToolCallMessages()) {\n this.cancelUnresolvedToolCalls(assistant.id);\n this.maybeCompleteAfterToolResults(assistant.id);\n }\n }\n\n private appendEntry(message: AppendMessage): string {\n const threadMessage = this.toThreadMessage(message);\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 return threadMessage.id;\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?: RunConfig } = {},\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n this.assertNoPendingInterrupts();\n this.maybeAutoCancelPendingToolCalls();\n await this.startRun(parentId, config.runConfig);\n }\n\n async cancel(): Promise<void> {\n this.dispatch({\n type: \"historyMutationAdvanced\",\n });\n this.abortActiveRun();\n }\n\n // abortRun is what stops an upstream agent: AbstractAgent.runAgent declares\n // two parameters and HttpAgent binds its request to a controller of its own,\n // so the run options object reaches only subclasses that read it. The local\n // abort comes last and is unconditional: its listener runs onCancel\n // synchronously, so a callback that starts another run must keep the\n // controller it installed, and a throw from a subclass's abortRun would\n // otherwise strand the thread as running.\n private abortActiveRun(): void {\n const controller = this.abortController;\n if (!controller) return;\n try {\n (this.activeRunAgent ?? this.agent).abortRun();\n } finally {\n controller.abort();\n }\n }\n\n // Starting a run supersedes the active one, and reports whether the caller\n // still owns the thread afterwards: the local abort runs onCancel\n // synchronously, so a callback that starts its own run keeps it. abortRun is a\n // subclass's code, and a throw there must not abandon the run being started,\n // unlike cancel(), where the failed operation is the caller's own. Calling\n // this twice for one run is harmless, because the second call finds no active\n // run to supersede.\n private supersedeActiveRun(): boolean {\n try {\n this.abortActiveRun();\n } catch (error) {\n this.logger.error?.(\"[agui] agent abortRun failed\", error);\n }\n if (this.abortController === null) return true;\n this.logger.debug?.(\n \"[agui] onCancel started a replacement run; dropping the superseding send\",\n );\n return false;\n }\n\n async resume(config: ResumeRunConfig): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n this.assertNoPendingInterrupts();\n await this.startRun(\n config.parentId,\n config.runConfig ?? this.state.lastRunConfig,\n undefined,\n config.stream,\n true,\n );\n }\n\n async resumeInFlightRun(messages: readonly ThreadMessage[]): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n // Without a resume stream startRun would re-run the agent from scratch.\n const resumeStream = this.history?.resume?.bind(this.history);\n if (!resumeStream) {\n const error = new Error(\n \"[agui] unstable_resume requires a ThreadHistoryAdapter with a resume() method; skipping resume after thread switch\",\n );\n this.logger.error?.(error.message);\n invokeRuntimeCallback(\"onError\", this.onError, error);\n return;\n }\n const parentId = messages.at(-1)?.id ?? null;\n try {\n await this.startRun(\n parentId,\n this.state.lastRunConfig,\n undefined,\n resumeStream,\n );\n } catch {\n // startRun already reported via onError; don't reject the switch.\n }\n }\n\n private assertNoPendingInterrupts(): void {\n if (!this.getPendingInterrupts()) return;\n throw new Error(\n \"[agui] cannot start a new run while interrupts are pending; resolve them with submitInterruptResponses()\",\n );\n }\n\n private findRequiresActionAssistant(\n reason: \"interrupt\" | \"tool-calls\",\n ): ThreadAssistantMessage | null {\n return (\n this.getTrailingAssistantTurn().findLast(\n (message) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === reason,\n ) ?? null\n );\n }\n\n private getTrailingAssistantTurn(): ThreadAssistantMessage[] {\n const messages = this.getMessages();\n const turn: ThreadAssistantMessage[] = [];\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role !== \"assistant\") break;\n turn.unshift(message as ThreadAssistantMessage);\n }\n return turn;\n }\n\n private getPendingToolCallMessages(): ThreadAssistantMessage[] {\n return this.getTrailingAssistantTurn().filter(\n (message) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\",\n );\n }\n\n getPendingInterrupts(): {\n messageId: string;\n interrupts: readonly AgUiInterrupt[];\n } | null {\n const assistant = this.findRequiresActionAssistant(\"interrupt\");\n if (!assistant) return null;\n const stored = (\n assistant.metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.interrupts;\n if (!stored?.length) return null;\n return { messageId: assistant.id, interrupts: stored };\n }\n\n getPendingToolCalls(): {\n messageId: string;\n toolCallIds: string[];\n } | null {\n const toolCallIds: string[] = [];\n let messageId: string | undefined;\n for (const assistant of this.getPendingToolCallMessages()) {\n const listed = listedPendingToolCallIds(assistant);\n for (const part of iterateToolCallParts(assistant.content)) {\n if (\n isResolvedToolCall(part) ||\n (listed && !listed.has(part.toolCallId))\n )\n continue;\n messageId ??= assistant.id;\n toolCallIds.push(part.toolCallId);\n }\n }\n return messageId === undefined ? null : { messageId, toolCallIds };\n }\n\n async submitInterruptResponses(\n responses: readonly AgUiResumeEntry[],\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const pending = this.getPendingInterrupts();\n if (!pending) {\n throw new Error(\n \"[agui] submitInterruptResponses: no pending interrupts on this thread\",\n );\n }\n\n const responsesById = this.collectInterruptResponses(\n \"submitInterruptResponses\",\n pending.interrupts,\n responses,\n );\n\n const openIds = pending.interrupts.map((i) => i.id);\n const missing = openIds.filter((id) => !responsesById.has(id));\n if (missing.length > 0) {\n throw new Error(\n `[agui] submitInterruptResponses: missing responses for open interrupts: ${missing.join(\", \")}`,\n );\n }\n\n this.assertInterruptsAnswerable(\n \"submitInterruptResponses\",\n pending.interrupts,\n responsesById,\n );\n\n await this.resumeWithResponses(\n pending.messageId,\n openIds.map((id) => responsesById.get(id)!),\n );\n }\n\n /**\n * Resumes with an already validated resume array. Answerability is checked\n * once per submission: re-checking here would let a clock crossing reject a\n * decision this runtime has already recorded, stranding the gate decided and\n * unretryable.\n */\n private async resumeWithResponses(\n messageId: string,\n resume: AgUiResumeEntry[],\n ): Promise<void> {\n const parentId = this.session.headId ?? messageId;\n this.clearPendingInterrupts(messageId, resume);\n await this.startRun(parentId, this.state.lastRunConfig, {\n entries: resume,\n interruptedMessageId: messageId,\n });\n }\n\n /**\n * A rejected decision reaches the caller through the approval seam, and\n * `onError` in addition, because a consumer watching only the runtime would\n * otherwise miss it. A failure raised by the resumed run itself was already\n * reported by `startRun` before it rethrew, so reporting it here again would\n * give the consumer two notifications for one failure.\n */\n reportError(error: unknown): void {\n if (this.reportedErrors.has(error as object)) {\n this.reportedErrors.delete(error as object);\n return;\n }\n invokeRuntimeCallback(\n \"onError\",\n this.onError,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n private assertInterruptsAnswerable(\n method: \"submitInterruptResponses\" | \"respondToToolApproval\",\n interrupts: readonly AgUiInterrupt[],\n responsesById?: ReadonlyMap<string, AgUiResumeEntry>,\n ): void {\n const now = Date.now();\n for (const interrupt of interrupts) {\n if (!interrupt.expiresAt) continue;\n const expiry = new Date(interrupt.expiresAt).getTime();\n if (Number.isNaN(expiry)) {\n throw new Error(\n `[agui] ${method}: interrupt ${interrupt.id} has malformed expiresAt \"${interrupt.expiresAt}\"`,\n );\n }\n if (\n expiry <= now &&\n responsesById?.get(interrupt.id)?.status !== \"cancelled\"\n ) {\n throw new Error(\n `[agui] ${method}: interrupt ${interrupt.id} expired at ${interrupt.expiresAt}`,\n );\n }\n }\n if (this.state.isRunning) {\n throw new Error(`[agui] ${method}: a run is already in progress`);\n }\n }\n\n async respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const pending = this.getPendingInterrupts();\n if (!pending) {\n throw new Error(\n \"[agui] respondToToolApproval: no pending interrupts on this thread\",\n );\n }\n\n // Bound against the message the gates landed on, so this check claims a\n // batch only where the projection did.\n const gatedMessage = this.session.tryGetMessage(pending.messageId)\n ?.message as ThreadAssistantMessage | undefined;\n const gated = projectAgUiToolApprovals(\n pending.interrupts,\n new Set(\n Array.from(iterateToolCallParts(gatedMessage?.content ?? [])).map(\n (part) => part.toolCallId,\n ),\n ),\n );\n const isGated = [...gated.values()].some(\n (approval) => approval.id === options.approvalId,\n );\n if (!isGated) {\n throw new Error(\n `[agui] respondToToolApproval: no pending tool-call interrupt for approval id \"${options.approvalId}\"`,\n );\n }\n\n // The decision is recorded only once the batch is known to be answerable:\n // a rejected submission would otherwise leave the gate decided and\n // unretryable, because a second click reports it as already decided.\n this.assertInterruptsAnswerable(\n \"respondToToolApproval\",\n pending.interrupts,\n );\n\n const recorded = this.session.updateMessage(\n pending.messageId,\n (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const content = withToolApprovalDecision(assistant.content, options);\n if (content === assistant.content) return assistant;\n return { ...assistant, content };\n },\n );\n if (!recorded) {\n throw new Error(\n `[agui] respondToToolApproval: approval \"${options.approvalId}\" is already decided`,\n );\n }\n this.publishUpdate();\n\n const assistant = this.session.tryGetMessage(pending.messageId)?.message as\n | ThreadAssistantMessage\n | undefined;\n if (!assistant) return;\n\n // AG-UI resumes a run with one response per open interrupt, so the run\n // stays paused until every gate in the batch has been answered.\n const resume = buildToolApprovalResume(\n assistant.content,\n pending.interrupts,\n );\n if (!resume) return;\n\n await this.resumeWithResponses(pending.messageId, resume);\n }\n\n async steerAway(\n message: CreateAppendMessage,\n responses?: readonly AgUiResumeEntry[],\n ): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const pending = this.getPendingInterrupts();\n if (!pending) {\n const pendingTools = this.getPendingToolCalls();\n if (pendingTools) {\n if (responses?.length) {\n throw new Error(\n \"[agui] steerAway: responses are only valid for pending interrupts\",\n );\n }\n if (this.state.isRunning) {\n throw new Error(\"[agui] steerAway: a run is already in progress\");\n }\n for (const assistant of this.getPendingToolCallMessages()) {\n this.cancelUnresolvedToolCalls(assistant.id);\n this.maybeCompleteAfterToolResults(assistant.id);\n }\n const normalized = this.toAppendMessage(message);\n const threadMessageId = this.appendEntry(normalized);\n await this.startRun(threadMessageId, normalized.runConfig);\n return;\n }\n if (responses?.length) {\n throw new Error(\n \"[agui] steerAway: no pending interrupts on this thread\",\n );\n }\n await this.append(this.toAppendMessage(message));\n return;\n }\n\n const resume = this.resolveSteerAwayResume(pending.interrupts, responses);\n\n if (this.state.isRunning) {\n throw new Error(\"[agui] steerAway: a run is already in progress\");\n }\n\n const normalized = this.toAppendMessage(message);\n this.clearPendingInterrupts(pending.messageId, resume);\n const threadMessageId = this.appendEntry(normalized);\n await this.startRun(threadMessageId, normalized.runConfig, {\n entries: resume,\n interruptedMessageId: pending.messageId,\n });\n }\n\n private resolveSteerAwayResume(\n interrupts: readonly AgUiInterrupt[],\n responses: readonly AgUiResumeEntry[] | undefined,\n ): AgUiResumeEntry[] {\n const responsesById = this.collectInterruptResponses(\n \"steerAway\",\n interrupts,\n responses ?? [],\n );\n return interrupts.map(\n (interrupt) =>\n responsesById.get(interrupt.id) ?? {\n interruptId: interrupt.id,\n status: \"cancelled\",\n },\n );\n }\n\n private collectInterruptResponses(\n method: \"submitInterruptResponses\" | \"steerAway\",\n interrupts: readonly AgUiInterrupt[],\n responses: readonly AgUiResumeEntry[],\n ): Map<string, AgUiResumeEntry> {\n const known = new Set(interrupts.map((interrupt) => interrupt.id));\n const responsesById = new Map<string, AgUiResumeEntry>();\n for (const entry of responses) {\n if (!entry || typeof entry.interruptId !== \"string\") {\n throw new Error(\n `[agui] ${method}: every entry must have an interruptId`,\n );\n }\n if (entry.status !== \"resolved\" && entry.status !== \"cancelled\") {\n throw new Error(\n `[agui] ${method}: invalid status \"${entry.status}\" for interrupt ${entry.interruptId}`,\n );\n }\n if (!known.has(entry.interruptId)) {\n throw new Error(\n `[agui] ${method}: unknown interrupt id ${entry.interruptId}`,\n );\n }\n if (responsesById.has(entry.interruptId)) {\n throw new Error(\n `[agui] ${method}: duplicate response for interrupt ${entry.interruptId}`,\n );\n }\n responsesById.set(entry.interruptId, entry);\n }\n return responsesById;\n }\n\n private toAppendMessage(message: CreateAppendMessage): AppendMessage {\n if (typeof message === \"string\") {\n return {\n createdAt: new Date(),\n parentId: this.session.headId,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n };\n }\n return {\n createdAt: message.createdAt ?? new Date(),\n parentId:\n message.parentId === undefined ? this.session.headId : message.parentId,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n content: message.content,\n attachments: message.attachments ?? [],\n metadata: message.metadata ?? { custom: {} },\n runConfig: message.runConfig ?? {},\n startRun: message.startRun,\n } as AppendMessage;\n }\n\n private clearPendingInterrupts(\n messageId: string,\n resume: readonly AgUiResumeEntry[],\n ): void {\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n if (\n assistant.status?.type !== \"requires-action\" ||\n assistant.status.reason !== \"interrupt\"\n ) {\n return assistant;\n }\n const aguiMeta = assistant.metadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined;\n const { interrupts: _drop, ...restAgui } = aguiMeta ?? {};\n const newCustom = { ...assistant.metadata.custom };\n if (Object.keys(restAgui).length > 0) {\n newCustom[AG_UI_METADATA_NAMESPACE] = restAgui;\n } else {\n delete newCustom[AG_UI_METADATA_NAMESPACE];\n }\n return {\n ...assistant,\n content: withSettledToolApprovals(assistant.content, resume),\n status: { type: \"complete\" as const, reason: \"unknown\" as const },\n metadata: { ...assistant.metadata, custom: newCustom },\n };\n });\n if (touched) {\n this.publishUpdate();\n this.persistSettledAssistant(messageId);\n }\n }\n\n findMessageIdForToolCall(toolCallId: string): string | undefined {\n let fallbackMessageId: string | undefined;\n const messages = this.getMessages();\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (!message || message.role !== \"assistant\") continue;\n for (const part of iterateToolCallParts(message.content)) {\n if (part.toolCallId !== toolCallId) continue;\n if (!isResolvedToolCall(part)) {\n return message.id;\n }\n fallbackMessageId ??= message.id;\n }\n }\n return fallbackMessageId;\n }\n\n private cancelUnresolvedToolCalls(messageId: string): void {\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (isResolvedToolCall(part)) return part;\n return {\n ...part,\n result: { error: \"Tool call cancelled by user\" },\n isError: true,\n };\n });\n return { ...assistant, content };\n });\n if (updated) this.publishUpdate();\n }\n\n addToolResult(options: AddToolResultOptions): void {\n if (this.deferUntilHistoryImported(() => this.addToolResult(options)))\n return;\n // Core's ToolInvocationTracker resolves a nested call to the nested\n // subagent message's id, which is not a session message; re-anchor on the\n // top-level message that owns the tree so the update can land.\n const sessionMessageId = this.session.tryGetMessage(options.messageId)\n ? options.messageId\n : this.findMessageIdForToolCall(options.toolCallId);\n if (sessionMessageId === undefined) return;\n const updated = this.session.updateMessage(sessionMessageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n let matchedToolCall = false;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== options.toolCallId) return part;\n matchedToolCall = true;\n // artifact and modelContent are optional; only override when supplied\n // so a later result that omits them keeps a stored value, and\n // emitToolResult can forward the model-facing content to the agent.\n return {\n ...part,\n result: options.result,\n isError: options.isError,\n ...(options.artifact !== undefined && { artifact: options.artifact }),\n ...(options.modelContent !== undefined && {\n modelContent: options.modelContent,\n }),\n };\n });\n if (!matchedToolCall) return message;\n const settled = mapToolCallPartsDeep(content, (part) => {\n if (!part.messages) return part;\n let changed = false;\n const messages = part.messages.map((nested) => {\n if (\n nested.role !== \"assistant\" ||\n nested.status.type !== \"requires-action\" ||\n nested.status.reason !== \"tool-calls\"\n )\n return nested;\n const listed = listedPendingToolCallIds(nested);\n if (\n Array.from(iterateToolCallParts(nested.content)).some(\n (call) =>\n !isResolvedToolCall(call) &&\n (!listed || listed.has(call.toolCallId)),\n )\n )\n return nested;\n changed = true;\n return {\n ...nested,\n status: { type: \"complete\" as const, reason: \"unknown\" as const },\n metadata: withoutPendingToolCallIds(nested.metadata),\n };\n });\n return changed ? { ...part, messages } : part;\n }).content;\n return { ...assistant, content: settled };\n });\n\n if (!updated) return;\n this.publishUpdate();\n this.maybeResumeAfterToolResults(sessionMessageId);\n }\n\n async recordToolInteraction(options: {\n messageId: string;\n toolCallId: string;\n interaction: Unstable_ToolInteraction;\n }): Promise<void> {\n const historyImport = this.waitForHistoryImport();\n if (historyImport && !(await historyImport)) return;\n const sessionMessageId = this.session.tryGetMessage(options.messageId)\n ? options.messageId\n : this.findMessageIdForToolCall(options.toolCallId);\n if (sessionMessageId === undefined) {\n throw new Error(\n `[agui] recordToolInteraction: message \"${options.messageId}\" was not found`,\n );\n }\n\n const item = this.session.tryGetMessage(sessionMessageId);\n if (!item) {\n throw new Error(\n `[agui] recordToolInteraction: message \"${sessionMessageId}\" was not found`,\n );\n }\n\n let recorded = false;\n const updated = this.session.updateMessage(sessionMessageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== options.toolCallId) return part;\n recorded = true;\n return {\n ...part,\n unstable_interactions: appendToolInteraction(\n part.unstable_interactions,\n options.interaction,\n ),\n };\n });\n return recorded ? { ...assistant, content } : assistant;\n });\n if (!recorded || !updated) {\n throw new Error(\n `[agui] recordToolInteraction: tool call \"${options.toolCallId}\" was not found on message \"${options.messageId}\"`,\n );\n }\n\n this.publishUpdate();\n\n const message = this.session.tryGetMessage(sessionMessageId)?.message;\n const history = this.history;\n if (\n !message ||\n !history?.update ||\n !this.isPersistableStatus(message.status)\n ) {\n return;\n }\n\n await this.historyWrites.chain(sessionMessageId, () =>\n history.update!({ parentId: item.parentId, message }),\n );\n }\n\n sendA2uiAction(action: Record<string, unknown>): void {\n if (this.deferUntilHistoryImported(() => this.sendA2uiAction(action)))\n return;\n this.assertNoPendingInterrupts();\n this.maybeAutoCancelPendingToolCalls();\n const parentId = this.session.headId;\n if (parentId === null) {\n this.logger.debug(\n \"[agui] sendA2uiAction: no messages to resume, dropping action\",\n );\n return;\n }\n\n const userAction = { ...action };\n delete userAction.type;\n if (!(\"timestamp\" in userAction)) {\n userAction.timestamp = new Date().toISOString();\n }\n this.dispatch({\n type: \"a2uiActionDeferred\",\n action: userAction,\n });\n\n const owner = this.abortController;\n if (owner) {\n this.dispatch({\n type: \"a2uiResumeDeferred\",\n owner,\n });\n return;\n }\n this.startResumeRun(parentId);\n }\n\n // The continuation fires whether the frontend result lands before\n // RUN_FINISHED (the status flips to requires-action only later, while the\n // run is still draining) or after it.\n private maybeResumeAfterToolResults(\n messageId: string,\n accountedResultIds?: ReadonlySet<string>,\n ): void {\n if (!this.maybeCompleteAfterToolResults(messageId)) return;\n if (accountedResultIds) {\n const message = this.session.tryGetMessage(messageId)?.message;\n if (\n message?.role !== \"assistant\" ||\n !Array.from(iterateToolCallParts(message.content)).some(\n (part) =>\n isResolvedToolCall(part) &&\n !accountedResultIds.has(part.toolCallId),\n )\n )\n return;\n }\n if (this.getPendingInterrupts()) return;\n const turn = this.getTrailingAssistantTurn();\n if (!turn.some((message) => message.id === messageId)) return;\n const owner = this.abortController;\n if (owner) {\n // A run is still draining (RUN_FINISHED arrived but the stream has not\n // closed). Defer until startRun's tail so we never start two runs.\n this.dispatch({\n type: \"resumeDeferred\",\n owner,\n messageId,\n });\n return;\n }\n if (this.getPendingToolCalls()) return;\n const headId = turn.at(-1)?.id;\n if (headId === undefined) return;\n this.startResumeRun(headId);\n }\n\n private maybeCompleteAfterToolResults(messageId: string): boolean {\n const message = this.session.tryGetMessage(messageId)?.message;\n if (!message || message.role !== \"assistant\") return false;\n const assistant = message as ThreadAssistantMessage;\n if (\n assistant.status?.type !== \"requires-action\" ||\n assistant.status.reason !== \"tool-calls\"\n ) {\n return false;\n }\n let allResolved = true;\n const listed = listedPendingToolCallIds(assistant);\n for (const part of iterateToolCallParts(assistant.content)) {\n if (listed && !listed.has(part.toolCallId)) continue;\n if (!isResolvedToolCall(part)) {\n allResolved = false;\n break;\n }\n }\n if (!allResolved) return false;\n\n const updated = this.session.updateMessage(messageId, (current) =>\n current.role === \"assistant\"\n ? {\n ...(current as ThreadAssistantMessage),\n status: { type: \"complete\" as const, reason: \"unknown\" as const },\n metadata: withoutPendingToolCallIds(current.metadata),\n }\n : current,\n );\n if (!updated) return false;\n this.publishUpdate();\n if (this.history?.update) {\n this.persistSettledAssistant(messageId);\n } else {\n this.persistAssistantHistory(messageId);\n }\n return true;\n }\n\n private startResumeRun(messageId: string): void {\n void this.startRun(messageId, this.state.lastRunConfig).catch((error) => {\n this.reportError(error);\n });\n }\n\n applyExternalMessages(messages: readonly ThreadMessage[]): void {\n messages = messages.map((message) => {\n if (message.role === \"system\" || message.metadata.modality !== undefined)\n return message;\n const modality = this.session.tryGetMessage(message.id)?.message.metadata\n .modality;\n if (modality === undefined) return message;\n return {\n ...message,\n metadata: { ...message.metadata, modality },\n } as ThreadMessage;\n });\n this.dispatch({\n type: \"a2uiContinuationsCleared\",\n });\n this.assistantHistoryParents.clear();\n\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 const retainToolResults = (\n existing: ThreadMessage | undefined,\n message: ThreadMessage,\n ): ThreadMessage =>\n existing?.role === \"assistant\" && message.role === \"assistant\"\n ? {\n ...message,\n content: this.preserveToolResults(\n existing.content,\n message.content,\n ),\n }\n : message;\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(\n expectedParentId,\n retainToolResults(existing?.message, message),\n );\n expectedParentId = message.id;\n lastAppliedId = message.id;\n }\n\n if (hardReplace) {\n const previous = new Map(\n this.getMessageRepository().messages.map(({ message }) => [\n message.id,\n message,\n ]),\n );\n this.session.clear();\n expectedParentId = null;\n lastAppliedId = null;\n seen.clear();\n for (const message of messages) {\n if (seen.has(message.id)) continue;\n seen.add(message.id);\n this.session.addOrUpdateMessage(\n expectedParentId,\n retainToolResults(previous.get(message.id), message),\n );\n expectedParentId = message.id;\n lastAppliedId = message.id;\n }\n }\n\n this.session.resetHead(lastAppliedId);\n for (const messageId of seen) {\n this.maybeCompleteAfterToolResults(messageId);\n }\n }\n\n this.snapshotHistoryIds.clear();\n for (const { message } of this.getMessageRepository().messages) {\n this.snapshotHistoryIds.add(message.id);\n }\n // A soft merge leaves dropped messages off branch; only selected\n // messages with resolved tool calls can still own a continuation.\n const pendingResume = this.state.pendingResume;\n if (pendingResume) {\n const selectedResultOwnerIds = new Set(\n this.session\n .getMessages()\n .filter(hasResolvedToolCalls)\n .map((message) => message.id),\n );\n const retained = pendingResume.messageIds.filter((id) =>\n selectedResultOwnerIds.has(id),\n );\n if (retained.length !== pendingResume.messageIds.length) {\n this.dispatch({ type: \"resumeCleared\" });\n for (const messageId of retained) {\n this.dispatch({\n type: \"resumeDeferred\",\n owner: pendingResume.owner,\n messageId,\n });\n }\n }\n }\n this.publishUpdate();\n }\n\n loadExternalState(state: ReadonlyJSONValue): void {\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: state,\n });\n this.publishUpdate();\n }\n\n setState(\n next:\n | ReadonlyJSONValue\n | ((prev: ReadonlyJSONValue | undefined) => ReadonlyJSONValue),\n ): void {\n const snapshot =\n typeof next === \"function\" ? next(this.state.stateSnapshot) : next;\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot,\n });\n this.publishUpdate();\n }\n\n resetState(): void {\n this.dispatch({ type: \"resetState\" });\n this.publishUpdate();\n }\n\n resetThreadState(): void {\n this.dispatch({\n type: \"historyMutationAdvanced\",\n });\n const controller = this.abortController;\n const activeRunAgent = this.activeRunAgent;\n\n this.dispatch({ type: \"resetThread\" });\n this.subagentParentToolCallIds.clear();\n\n if (controller) {\n this.abortController = null;\n this.activeRunAgent = null;\n this.setRunning(false);\n try {\n (activeRunAgent ?? this.agent).abortRun();\n } catch (error) {\n this.logger.error?.(\"[agui] agent abortRun failed\", error);\n } finally {\n controller.abort();\n }\n } else {\n this.publishUpdate();\n }\n }\n\n private async startRun(\n parentId: string | null,\n runConfig?: RunConfig,\n resume?: ResumeDispatch,\n resumeStream?: ResumeStream,\n replayExistingMessages = false,\n ): Promise<void> {\n if (this.isThreadSwitching?.()) return;\n // A default AG-UI run supersedes the active run; the hook's opt-in message\n // queue serializes sends instead. append supersedes earlier, before it links\n // its message; this covers the entry points that start a run without one.\n if (!this.supersedeActiveRun()) return;\n\n const generation = this.state.historyMutationGeneration;\n const normalizedRunConfig = runConfig ?? {};\n this.dispatch({\n type: \"runConfigRecorded\",\n runConfig: normalizedRunConfig,\n });\n const parent =\n parentId === null ? undefined : this.session.tryGetMessage(parentId);\n const shouldEagerlyInsertAssistant =\n parentId !== null &&\n parent !== undefined &&\n parentId !== this.session.headId;\n const historicalMessages = [\n ...(shouldEagerlyInsertAssistant\n ? (this.session.tryGetMessages(parentId) ?? this.session.getMessages())\n : this.session.getMessages()),\n ];\n const runStartMessageIds = new Set(\n this.getMessageRepository().messages.map(({ message }) => message.id),\n );\n const selectedMessages = this.session.getMessages();\n const parentIndex = selectedMessages.findIndex(\n (message) => message.id === parentId,\n );\n let replayStart = parentIndex + 1;\n if (selectedMessages[parentIndex]?.role === \"assistant\") {\n replayStart = parentIndex;\n while (\n replayStart > 0 &&\n selectedMessages[replayStart - 1]?.role === \"assistant\"\n )\n replayStart--;\n }\n const replayMessageIds: string[] = [];\n if (replayExistingMessages && !resumeStream && parentIndex >= 0) {\n for (const message of selectedMessages.slice(replayStart)) {\n if (message.role !== \"assistant\") break;\n replayMessageIds.push(message.id);\n }\n }\n // Only request-delivered and producer-observed results suppress continuation.\n const accountedResultIds = new Set(\n historicalMessages.flatMap((message) =>\n message.role === \"assistant\"\n ? Array.from(iterateToolCallParts(message.content))\n .filter(isResolvedToolCall)\n .map((part) => part.toolCallId)\n : [],\n ),\n );\n const candidateContexts = new Map<string, ReplayContext>();\n for (const message of selectedMessages) {\n if (\n message.role !== \"assistant\" ||\n !replayMessageIds.includes(message.id)\n )\n continue;\n candidateContexts.set(message.id, {\n originalContent: message.content,\n accountedResultIds,\n admittedToolCallIds: actionableToolCallIds(message),\n merge: createReplayContentMerger(),\n });\n }\n let replayContexts = new Map<string, ReplayContext>();\n let lastReplayedIndex = -1;\n let replayEnded = replayMessageIds.length === 0;\n const replayTail = replayMessageIds.at(-1);\n const joinStrategy = this.joinStrategy;\n const hasRunUserBoundary = parent?.message.role === \"user\" && !resume;\n\n let pendingError: Error | null = null;\n const assistantParentId = parent ? parentId : this.session.headId;\n let assistantMessageId: string | undefined;\n let snapshotAssistantId: string | undefined;\n let replayInterruptMessageId: string | undefined;\n // A snapshot the preserve gate declines still evicts the in-flight\n // assistant; recreating under the cached id on the next content-bearing\n // emit keeps both the stream and the message identity. Status-only emits,\n // data-only content, and off-branch server-id collisions must not\n // recreate: the snapshot already carries this turn's assistant, so\n // resurrecting for custom-event data would leave a trailing data-only\n // duplicate.\n let assistantCollided = false;\n const heldMessages = new Map<string, Set<string>>();\n let frameOwnerIds = new Set<string>();\n let restrictedPendingToolCallIds: ReadonlySet<string> | undefined;\n let settlingRun = false;\n let latestSnapshot: ThreadAssistantMessage | undefined;\n let snapshotToolCallIds = new Set<string>();\n const ensureAssistant = (allowRecreate = false): string => {\n const cached = assistantMessageId;\n if (cached !== undefined && this.session.tryGetMessage(cached))\n return cached;\n if (cached !== undefined && (assistantCollided || !allowRecreate)) {\n return cached;\n }\n const repositoryHeadId = this.session.headId;\n const shouldUseSelectedParent =\n replayContexts.size === 0 &&\n (cached === undefined ||\n (shouldEagerlyInsertAssistant &&\n (repositoryHeadId === null ||\n runStartMessageIds.has(repositoryHeadId)))) &&\n // Replay candidates defer the placeholder; honor snapshots that advanced\n // the head before the producer identified its first assistant message.\n (replayMessageIds.length === 0 ||\n repositoryHeadId === null ||\n runStartMessageIds.has(repositoryHeadId));\n // Branch runs keep their selected parent unless the snapshot advanced to\n // a message introduced during this run.\n const parentId =\n shouldUseSelectedParent &&\n assistantParentId &&\n this.session.hasMessage(assistantParentId)\n ? assistantParentId\n : repositoryHeadId;\n const created = this.insertAssistantPlaceholder(parentId, cached);\n assistantMessageId = created;\n this.markPendingAssistantHistory(created, parentId);\n return created;\n };\n\n if (shouldEagerlyInsertAssistant && replayEnded) ensureAssistant();\n\n const settleHeldMessages = (terminalStatus: MessageStatus): string[] => {\n const pendingMessages: string[] = [];\n const producerPending = restrictedPendingToolCallIds;\n const canWaitForTools =\n terminalStatus.type === \"complete\" ||\n terminalStatus.type === \"requires-action\";\n if (producerPending && canWaitForTools) {\n for (const message of this.getTrailingAssistantTurn()) {\n const replay = replayContexts.get(message.id);\n if (\n message.id === assistantMessageId ||\n heldMessages.has(message.id) ||\n !replay ||\n (message.status?.type === \"requires-action\" &&\n message.status.reason === \"interrupt\")\n )\n continue;\n if (\n replay.admittedToolCallIds.size > 0 ||\n actionableToolCallIds(message).size > 0 ||\n Array.from(iterateToolCallParts(message.content)).some(\n (part) =>\n producerPending.has(part.toolCallId) &&\n !accountedResultIds.has(part.toolCallId),\n )\n )\n heldMessages.set(message.id, new Set());\n }\n }\n for (const [messageId, openToolCallIds] of heldMessages) {\n const existing = this.session.tryGetMessage(messageId);\n if (existing)\n this.markPendingAssistantHistory(messageId, existing.parentId);\n let requiresToolResult = false;\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const pendingToolCallIds = producerPending\n ? Array.from(iterateToolCallParts(assistant.content))\n .filter(\n (part) =>\n producerPending.has(part.toolCallId) &&\n (!isResolvedToolCall(part) ||\n openToolCallIds.has(part.toolCallId) ||\n (replayContexts.has(messageId) &&\n !accountedResultIds.has(part.toolCallId))),\n )\n .map((part) => part.toolCallId)\n : Array.from(openToolCallIds);\n const replay = replayContexts.get(messageId);\n if (replay) replay.admittedToolCallIds = new Set(pendingToolCallIds);\n const status: MessageStatus = canWaitForTools\n ? pendingToolCallIds.length > 0\n ? { type: \"requires-action\", reason: \"tool-calls\" }\n : { type: \"complete\", reason: \"unknown\" }\n : terminalStatus;\n requiresToolResult = status.type === \"requires-action\";\n const metadata = withoutPendingToolCallIds(assistant.metadata);\n return {\n ...assistant,\n status,\n metadata:\n status.type === \"requires-action\" &&\n (restrictedPendingToolCallIds || replayContexts.has(messageId))\n ? withPendingToolCallIds(metadata, pendingToolCallIds)\n : metadata,\n };\n });\n if (updated) {\n this.publishUpdate();\n this.persistAssistantHistory(messageId);\n if (requiresToolResult) {\n pendingMessages.push(messageId);\n }\n }\n }\n heldMessages.clear();\n return pendingMessages;\n };\n\n const accountProducerResults = (\n content: ThreadAssistantMessage[\"content\"],\n ) => {\n for (const part of iterateToolCallParts(content))\n if (isResolvedToolCall(part)) accountedResultIds.add(part.toolCallId);\n };\n const reconcileReplaySnapshot: SnapshotMessageReconciler = (\n snapshot,\n previous,\n ) => {\n // Observe the producer before preserving any local frontend results.\n accountProducerResults(snapshot.content);\n const replay = candidateContexts.get(snapshot.id);\n if (!replay) return snapshot;\n replay.admittedToolCallIds = actionableToolCallIds(snapshot);\n if (heldMessages.has(snapshot.id))\n heldMessages.set(snapshot.id, new Set(replay.admittedToolCallIds));\n if (!replayContexts.has(snapshot.id)) return snapshot;\n return previous\n ? {\n ...snapshot,\n content: this.preserveToolResults(\n previous.content,\n snapshot.content,\n replay.originalContent,\n ),\n }\n : snapshot;\n };\n\n const applyUpdate = (update: ChatModelRunResult) => {\n if (\n !assistantCollided &&\n replayContexts.size &&\n update.content !== undefined\n )\n accountProducerResults(\n update.content as ThreadAssistantMessage[\"content\"],\n );\n let ownerParts:\n | Map<string, ThreadAssistantMessage[\"content\"][number][]>\n | undefined;\n let contentOwnerIds: Set<string> | undefined;\n const hasStreamContent =\n Array.isArray(update.content) &&\n update.content.some((part) => part.type !== \"data\");\n if (!replayEnded && assistantMessageId === undefined) {\n if (!update.status || update.status.type === \"running\") return;\n // No matching producer identity arrived: retain native regeneration.\n replayEnded = true;\n if (\n replayContexts.size === 0 &&\n snapshotAssistantId !== undefined &&\n this.session.headId === snapshotAssistantId &&\n !hasStreamContent\n ) {\n if (update.status.type !== \"complete\") {\n this.updateAssistantMessage(snapshotAssistantId, {\n status: update.status,\n ...(update.metadata ? { metadata: update.metadata } : {}),\n });\n }\n return;\n }\n }\n const streamMessageId = assistantMessageId;\n let primaryMessageId = streamMessageId;\n const terminalStatus = update.status;\n const replayInterrupt =\n replayContexts.size > 0 &&\n terminalStatus?.type === \"requires-action\" &&\n terminalStatus.reason === \"interrupt\";\n if (\n streamMessageId !== undefined &&\n !assistantCollided &&\n replayContexts.size > 0 &&\n (update.content !== undefined || replayInterrupt)\n ) {\n const owners = this.getTrailingAssistantTurn().filter((message) =>\n replayContexts.has(message.id),\n );\n // Buffered calls keep their owners when a later text frame arrives.\n const grouped =\n update.content !== undefined\n ? groupReplayToolContent(owners, update.content, streamMessageId)\n : new Map([[streamMessageId, [...(update.content ?? [])]]]);\n if (update.content !== undefined) {\n const currentOwnerIds = new Set(grouped.keys());\n for (const ownerId of frameOwnerIds)\n grouped.set(ownerId, grouped.get(ownerId) ?? []);\n contentOwnerIds = new Set(grouped.keys());\n frameOwnerIds = currentOwnerIds;\n }\n ownerParts = grouped;\n if (replayInterrupt) {\n const interrupts = (\n update.metadata?.custom?.[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.interrupts;\n const approvals = projectAgUiToolApprovals(interrupts);\n for (const owner of owners) {\n if (\n Array.from(iterateToolCallParts(owner.content)).some((part) =>\n approvals.has(part.toolCallId),\n )\n )\n grouped.set(owner.id, grouped.get(owner.id) ?? []);\n }\n const anchor = owners.find(\n (message) =>\n projectAgUiToolApprovals(\n interrupts,\n new Set(\n Array.from(\n iterateToolCallParts([\n ...message.content,\n ...(grouped.get(message.id) ?? []),\n ]),\n ).map((part) => part.toolCallId),\n ),\n ).size > 0,\n );\n if (anchor) {\n primaryMessageId = anchor.id;\n replayInterruptMessageId = anchor.id;\n grouped.set(anchor.id, grouped.get(anchor.id) ?? []);\n }\n }\n }\n const pendingMessages =\n settlingRun && terminalStatus && terminalStatus.type !== \"running\"\n ? settleHeldMessages(terminalStatus)\n : [];\n const frameMessageId = ensureAssistant(hasStreamContent);\n const messageId = primaryMessageId ?? frameMessageId;\n let primaryUpdate = update;\n if (ownerParts) {\n const interrupt =\n terminalStatus?.type === \"requires-action\" &&\n terminalStatus.reason === \"interrupt\";\n const ownerStatus: MessageStatus | undefined =\n terminalStatus?.type === \"requires-action\"\n ? { type: \"complete\", reason: \"unknown\" }\n : terminalStatus;\n for (const [ownerId, content] of ownerParts) {\n const existing = this.session.tryGetMessage(ownerId);\n if (existing)\n this.markPendingAssistantHistory(ownerId, existing.parentId);\n if (ownerId === messageId) continue;\n this.updateAssistantMessage(\n ownerId,\n {\n ...(contentOwnerIds?.has(ownerId) ? { content } : {}),\n ...(ownerStatus ? { status: ownerStatus } : {}),\n },\n replayContexts.get(ownerId),\n interrupt ? new Set<string>() : restrictedPendingToolCallIds,\n );\n }\n const { content: _content, ...controlUpdate } = update;\n const content = ownerParts.get(messageId) ?? [];\n primaryUpdate = {\n ...controlUpdate,\n ...(contentOwnerIds?.has(messageId) ? { content } : {}),\n ...(ownerStatus && !interrupt && replayContexts.has(messageId)\n ? { status: ownerStatus }\n : {}),\n };\n }\n const resolved = this.updateAssistantMessage(\n messageId,\n primaryUpdate,\n replayContexts.get(messageId),\n restrictedPendingToolCallIds,\n );\n if (messageId === frameMessageId && resolved !== assistantMessageId) {\n assistantMessageId = resolved;\n }\n for (const messageId of pendingMessages) {\n this.maybeResumeAfterToolResults(\n messageId,\n replayMessageIds.includes(messageId) ? accountedResultIds : undefined,\n );\n }\n };\n\n const adoptServerMessageId = (\n serverId: string,\n startNewMessage: boolean,\n openToolCallIds: string[] = [],\n ) => {\n const existing = this.session.tryGetMessage(serverId);\n const replayIndex = replayMessageIds.indexOf(serverId);\n const adoptsReplay =\n !replayEnded &&\n !assistantCollided &&\n replayIndex > lastReplayedIndex &&\n existing?.message.role === \"assistant\" &&\n this.session.getMessages().some((message) => message.id === serverId);\n if (adoptsReplay && replayContexts.size === 0) {\n replayContexts = candidateContexts;\n const selected = this.session.getMessages();\n let tailId = serverId;\n for (const message of selected.slice(\n selected.findIndex((message) => message.id === serverId) + 1,\n )) {\n if (message.role !== \"assistant\") break;\n tailId = message.id;\n }\n this.session.selectHead(tailId);\n }\n if (startNewMessage && assistantMessageId !== undefined) {\n let hasReplayCallsToHold = false;\n const replay = replayContexts.get(assistantMessageId);\n if (replay) {\n const current =\n this.session.tryGetMessage(assistantMessageId)?.message;\n if (current?.role === \"assistant\") {\n const retainedPending = Array.from(\n iterateToolCallParts(current.content),\n ).filter(\n (part) =>\n !isResolvedToolCall(part) ||\n (replay.admittedToolCallIds.has(part.toolCallId) &&\n !accountedResultIds.has(part.toolCallId)),\n );\n hasReplayCallsToHold = retainedPending.length > 0;\n openToolCallIds = [\n ...new Set([\n ...openToolCallIds,\n ...retainedPending\n .filter((part) =>\n replay.admittedToolCallIds.has(part.toolCallId),\n )\n .map((part) => part.toolCallId),\n ]),\n ];\n }\n }\n if (openToolCallIds.length > 0 || hasReplayCallsToHold) {\n heldMessages.set(assistantMessageId, new Set(openToolCallIds));\n } else {\n applyUpdate({ status: { type: \"complete\", reason: \"unknown\" } });\n }\n const previousId = assistantMessageId;\n assistantMessageId = undefined;\n if (!adoptsReplay && this.session.tryGetMessage(previousId)) {\n const created = this.insertAssistantPlaceholder(previousId);\n assistantMessageId = created;\n this.markPendingAssistantHistory(created, previousId);\n }\n }\n if (adoptsReplay) {\n assistantMessageId = serverId;\n lastReplayedIndex = replayIndex;\n this.markPendingAssistantHistory(serverId, existing.parentId);\n return;\n }\n replayEnded = true;\n const placeholder = ensureAssistant(true);\n if (placeholder === serverId) return;\n const reassigned = this.reassignAssistantId(placeholder, serverId);\n // A collision drops the placeholder before revealing the existing\n // server message as the current head. Only messages introduced during\n // this run can replace the placeholder; regeneration must not rewrite\n // a previous branch when the server incorrectly reuses its id.\n const adoptsVisibleCollision =\n !reassigned &&\n !runStartMessageIds.has(serverId) &&\n this.session.headId === serverId;\n if (reassigned || adoptsVisibleCollision) {\n assistantMessageId = serverId;\n if (adoptsVisibleCollision) {\n const parentId =\n this.session.tryGetMessage(serverId)?.parentId ?? null;\n this.markPendingAssistantHistory(serverId, parentId);\n }\n } else {\n assistantCollided = true;\n }\n };\n\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const aggregator = new RunAggregator({\n showThinking: this.showThinking,\n joinStrategy,\n logger: this.logger,\n emit: (update) => {\n const currentSnapshotAssistant =\n assistantMessageId === undefined\n ? undefined\n : this.session.tryGetMessage(assistantMessageId)?.message;\n const listedSnapshotToolCallIds =\n currentSnapshotAssistant?.role === \"assistant\"\n ? listedPendingToolCallIds(currentSnapshotAssistant)\n : undefined;\n const hasPendingSnapshotToolCall =\n latestSnapshot?.id === assistantMessageId &&\n currentSnapshotAssistant?.role === \"assistant\" &&\n Array.from(\n iterateToolCallParts(currentSnapshotAssistant.content),\n ).some(\n (part) =>\n !isResolvedToolCall(part) &&\n (!listedSnapshotToolCallIds ||\n listedSnapshotToolCallIds.has(part.toolCallId)) &&\n (!restrictedPendingToolCallIds ||\n restrictedPendingToolCallIds.has(part.toolCallId)),\n );\n const reconciledUpdate =\n settlingRun &&\n update.status?.type === \"complete\" &&\n hasPendingSnapshotToolCall\n ? {\n ...update,\n status: {\n type: \"requires-action\",\n reason: \"tool-calls\",\n } as const,\n ...(restrictedPendingToolCallIds\n ? {\n metadata: {\n ...update.metadata,\n custom: {\n ...update.metadata?.custom,\n [AG_UI_METADATA_NAMESPACE]: {\n ...(update.metadata?.custom?.[\n AG_UI_METADATA_NAMESPACE\n ] as AgUiCustomMetadata | undefined),\n pendingToolCallIds: [\n ...restrictedPendingToolCallIds,\n ],\n },\n },\n },\n }\n : {}),\n }\n : update;\n if (\n settlingRun &&\n latestSnapshot &&\n latestSnapshot.id === assistantMessageId &&\n reconciledUpdate.status &&\n reconciledUpdate.status.type !== \"running\" &&\n reconciledUpdate.status.type !== \"requires-action\"\n ) {\n const status = reconciledUpdate.status;\n const current =\n this.session.tryGetMessage(assistantMessageId)?.message;\n const content = settleNestedContent(\n current?.role === \"assistant\"\n ? current.content\n : latestSnapshot.content,\n status,\n );\n applyUpdate({ ...reconciledUpdate, content });\n } else if (\n latestSnapshot &&\n latestSnapshot.id === assistantMessageId &&\n reconciledUpdate.content !== undefined\n ) {\n const content = this.mergeSnapshotAssistantContent(\n latestSnapshot.content,\n reconciledUpdate.content as ThreadAssistantMessage[\"content\"],\n reconciledUpdate.content.some((part) => part.type === \"reasoning\"),\n reconciledUpdate.content.some(isActivityPart),\n snapshotToolCallIds,\n );\n applyUpdate({ ...reconciledUpdate, content });\n } else {\n applyUpdate(reconciledUpdate);\n }\n const current = assistantMessageId\n ? this.session.tryGetMessage(assistantMessageId)?.message\n : undefined;\n latestSnapshot =\n !settlingRun &&\n current?.role === \"assistant\" &&\n current.id === latestSnapshot?.id\n ? current\n : undefined;\n },\n onServerMessageId: (serverId) => {\n adoptServerMessageId(serverId, false);\n },\n onTextMessageStart: (serverId, openToolCallIds) => {\n const owners = this.getTrailingAssistantTurn().filter((message) =>\n replayContexts.has(message.id),\n );\n const toolOwners = indexReplayToolOwners(owners);\n const frameOpenIds = openToolCallIds.filter((id) => {\n const ownerId = toolOwners.get(id);\n if (!ownerId || ownerId === assistantMessageId || assistantCollided)\n return true;\n const held = heldMessages.get(ownerId) ?? new Set<string>();\n held.add(id);\n heldMessages.set(ownerId, held);\n return false;\n });\n // The native accumulator just reset; prior frame contributions are\n // retained history, while removals within this frame remain authoritative.\n for (const ownerId of frameOwnerIds) {\n const replay = replayContexts.get(ownerId);\n if (replay) replay.merge = createReplayContentMerger();\n }\n frameOwnerIds.clear();\n adoptServerMessageId(serverId, true, frameOpenIds);\n },\n });\n let runFinished = false;\n const dispatch = (event: AgUiEvent) => {\n if (this.abortController !== abortController) return;\n if (event.type === \"RUN_FINISHED\") {\n runFinished = true;\n if (event.outcome?.type === \"interrupt\")\n replayInterruptMessageId = assistantMessageId ?? replayTail;\n const ids =\n event.outcome?.type === \"success\"\n ? event.outcome.pendingToolCallIds\n : undefined;\n restrictedPendingToolCallIds =\n ids === undefined ? undefined : new Set(ids);\n }\n if (event.type === \"TOOL_CALL_RESULT\") {\n if (!assistantCollided && candidateContexts.size)\n accountedResultIds.add(event.toolCallId);\n for (const openToolCallIds of heldMessages.values()) {\n openToolCallIds.delete(event.toolCallId);\n }\n }\n settlingRun =\n event.type === \"RUN_FINISHED\" ||\n event.type === \"RUN_ERROR\" ||\n event.type === \"RUN_CANCELLED\";\n const beforeSnapshot =\n event.type === \"MESSAGES_SNAPSHOT\" ? this.session.getMessages() : [];\n try {\n const nextAssistantMessageId = this.handleEvent(\n aggregator,\n event,\n assistantMessageId,\n joinStrategy,\n runStartMessageIds,\n hasRunUserBoundary,\n candidateContexts.size ? reconcileReplaySnapshot : undefined,\n );\n if (event.type === \"MESSAGES_SNAPSHOT\") {\n for (const message of beforeSnapshot) {\n const context = replayContexts.get(message.id);\n const current = this.session.tryGetMessage(message.id)?.message;\n if (context && current?.content !== message.content) {\n context.merge = createReplayContentMerger();\n frameOwnerIds.delete(message.id);\n }\n }\n assistantMessageId = nextAssistantMessageId;\n const imported = assistantMessageId\n ? this.session.tryGetMessage(assistantMessageId)?.message\n : undefined;\n const source = event.messages.find(\n (message) =>\n message?.role === \"assistant\" && message.id === imported?.id,\n );\n latestSnapshot =\n imported?.role === \"assistant\" && source ? imported : undefined;\n snapshotToolCallIds = new Set(\n Array.isArray(source?.toolCalls)\n ? source.toolCalls\n .map((call: { id?: unknown }) => call.id)\n .filter((id: unknown): id is string => typeof id === \"string\")\n : [],\n );\n if (!replayEnded && assistantMessageId === undefined) {\n const tail = this.session.getMessages().at(-1);\n snapshotAssistantId =\n tail?.role === \"assistant\" ? tail.id : undefined;\n }\n }\n } finally {\n settlingRun = false;\n }\n };\n\n this.abortController = abortController;\n const runAgentInstance = this.agent;\n this.activeRunAgent = runAgentInstance;\n\n let cancelRun = () => dispatch({ type: \"RUN_CANCELLED\" });\n abortSignal.addEventListener(\n \"abort\",\n () => {\n cancelRun();\n this.finishRun(abortController);\n invokeRuntimeCallback(\"onCancel\", this.onCancel);\n },\n { once: true },\n );\n\n this.setRunning(true);\n\n try {\n if (resumeStream) {\n // Cancel flips only the status; an aggregator RUN_CANCELLED would emit an empty snapshot and wipe the replayed content.\n cancelRun = () => {\n const current =\n assistantMessageId === undefined\n ? undefined\n : this.session.tryGetMessage(assistantMessageId)?.message;\n if (current?.status?.type === \"complete\") return;\n applyUpdate({ status: { type: \"incomplete\", reason: \"cancelled\" } });\n };\n pendingError =\n (await this.consumeResumeStream(resumeStream, {\n runConfig: normalizedRunConfig,\n threadId: this.agent.threadId || \"main\",\n parentId: assistantParentId,\n historicalMessages,\n abortSignal,\n ensureAssistant,\n applyUpdate,\n getAssistantMessageId: () => assistantMessageId,\n })) ?? null;\n } else {\n const runId = generateId();\n aggregator.handle({ type: \"RUN_STARTED\", runId });\n const input = this.buildRunInput(\n runId,\n normalizedRunConfig,\n historicalMessages,\n resume,\n );\n const subscriber = createAgUiSubscriber({\n dispatch,\n logger: this.logger,\n onRunFailed: (error) => {\n if (abortSignal.aborted) return;\n pendingError = error;\n invokeRuntimeCallback(\"onError\", this.onError, error);\n },\n });\n try {\n runAgentInstance.messages = input.messages;\n runAgentInstance.threadId = input.threadId;\n runAgentInstance.state = input.state;\n } catch {\n // ignore\n }\n const runAgent: RunAgentWithRunOptions =\n runAgentInstance.runAgent.bind(runAgentInstance);\n await runAgent(input, subscriber, { signal: abortSignal });\n }\n } catch (error) {\n // HttpAgent rethrows a failure it already passed to the subscriber's\n // onRunFailed, which reported it.\n if (!abortSignal.aborted && !pendingError) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (!runFinished) dispatch({ type: \"RUN_ERROR\", message: err.message });\n invokeRuntimeCallback(\"onError\", this.onError, err);\n pendingError = err;\n }\n } finally {\n const current = assistantMessageId\n ? this.session.tryGetMessage(assistantMessageId)?.message\n : undefined;\n if (\n this.abortController === abortController &&\n current?.role === \"assistant\" &&\n current.status?.type === \"running\"\n ) {\n // Finalization is transport cleanup, not proof of a terminal event.\n const status: MessageStatus = {\n type: \"incomplete\",\n reason: \"error\",\n error: \"The connection ended before the answer finished.\",\n };\n settleHeldMessages(status);\n applyUpdate({\n status,\n content: settleNestedContent(current.content, status),\n });\n }\n this.finishRun(abortController);\n }\n\n if (pendingError) {\n const err = pendingError;\n this.reportedErrors.add(err);\n this.clearDeferredContinuations(abortController);\n throw err;\n }\n\n const pending = replayInterruptMessageId\n ? this.getPendingInterrupts()\n : null;\n if (\n pending &&\n pending.messageId === replayInterruptMessageId &&\n replayContexts.has(pending.messageId) &&\n !abortSignal.aborted &&\n this.abortController === null &&\n generation === this.state.historyMutationGeneration &&\n !this.isThreadSwitching?.()\n ) {\n const message = this.session.tryGetMessage(pending.messageId)?.message;\n const responses =\n message?.role === \"assistant\"\n ? buildToolApprovalResume(message.content, pending.interrupts)\n : null;\n if (responses) {\n this.clearDeferredContinuations(abortController);\n try {\n await this.submitInterruptResponses(responses);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (!this.reportedErrors.has(err)) {\n this.reportError(err);\n this.reportedErrors.add(err);\n }\n throw err;\n }\n return;\n }\n }\n\n // A tool result that landed before the run settled deferred its\n // continuation here so a second run never overlaps the first.\n if (this.state.pendingResume?.owner === abortController) {\n const { messageIds } = this.state.pendingResume;\n this.dispatch({ type: \"resumeCleared\" });\n if (\n !abortSignal.aborted &&\n !this.getPendingInterrupts() &&\n !this.getPendingToolCalls()\n ) {\n const turn = this.getTrailingAssistantTurn();\n if (\n turn.some((message) => {\n if (!messageIds.includes(message.id)) return false;\n const replay = replayContexts.get(message.id);\n if (!replay) return hasResolvedToolCalls(message);\n return Array.from(iterateToolCallParts(message.content)).some(\n (part) =>\n isResolvedToolCall(part) &&\n replay.admittedToolCallIds.has(part.toolCallId) &&\n !accountedResultIds.has(part.toolCallId),\n );\n })\n ) {\n const headId = turn.at(-1)?.id;\n if (headId !== undefined) this.startResumeRun(headId);\n }\n }\n }\n\n if (this.state.pendingA2uiResumeOwner === abortController) {\n this.dispatch({\n type: \"a2uiResumeCleared\",\n });\n if (!abortSignal.aborted && this.state.pendingA2uiAction !== undefined) {\n if (this.getPendingInterrupts()) {\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n this.logger.debug(\n \"[agui] sendA2uiAction: pending interrupts, dropping action\",\n );\n return;\n }\n this.maybeAutoCancelPendingToolCalls();\n const parentId = this.session.headId;\n if (parentId !== null) {\n this.startResumeRun(parentId);\n } else {\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n this.logger.debug(\n \"[agui] sendA2uiAction: no messages to resume, dropping action\",\n );\n }\n } else {\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n }\n }\n }\n\n // Replays a persisted run's snapshots into the existing assistant message, bypassing agent.runAgent so it is not re-invoked.\n private async consumeResumeStream(\n stream: ResumeStream,\n ctx: {\n runConfig: RunConfig;\n threadId: string;\n parentId: string | null;\n historicalMessages: readonly ThreadMessage[];\n abortSignal: AbortSignal;\n ensureAssistant: () => string;\n applyUpdate: (update: ChatModelRunResult) => void;\n getAssistantMessageId: () => string | undefined;\n },\n ): Promise<Error | undefined> {\n this.dispatch({\n type: \"a2uiContinuationsCleared\",\n });\n const assistantId = ctx.ensureAssistant();\n const currentId = () => ctx.getAssistantMessageId() ?? assistantId;\n const options: ChatModelRunOptions = {\n messages: ctx.historicalMessages,\n runConfig: ctx.runConfig,\n abortSignal: ctx.abortSignal,\n context: this.runtime?.thread.getModelContext() ?? {},\n unstable_assistantMessageId: assistantId,\n unstable_threadId: ctx.threadId,\n unstable_parentId: ctx.parentId,\n unstable_getMessage: () => {\n const message = this.session.tryGetMessage(currentId())?.message;\n if (!message) {\n throw new Error(\n \"[agui] resume stream requested the assistant message before it existed\",\n );\n }\n return message;\n },\n };\n\n try {\n for await (const result of stream(options)) {\n if (ctx.abortSignal.aborted) return undefined;\n ctx.applyUpdate(result);\n }\n } catch (error) {\n if (ctx.abortSignal.aborted) return undefined;\n const err = error instanceof Error ? error : new Error(String(error));\n ctx.applyUpdate({\n status: { type: \"incomplete\", reason: \"error\", error: err.message },\n });\n invokeRuntimeCallback(\"onError\", this.onError, err);\n return err;\n }\n\n if (ctx.abortSignal.aborted) return undefined;\n const current = this.session.tryGetMessage(currentId())?.message;\n if (!current || current.status?.type === \"running\") {\n ctx.applyUpdate({ status: { type: \"complete\", reason: \"unknown\" } });\n }\n return undefined;\n }\n\n private buildRunInput(\n runId: string,\n runConfig: RunConfig | undefined,\n historyMessages: readonly ThreadMessage[] | undefined,\n resume?: ResumeDispatch,\n ) {\n const pendingA2uiAction = this.state.pendingA2uiAction;\n this.dispatch({\n type: \"a2uiActionCleared\",\n });\n const threadId = this.agent.threadId || \"main\";\n const messages = toAgUiMessages(\n this.selectRunMessages(\n historyMessages ?? this.session.getMessages(),\n resume,\n ),\n );\n const context = this.runtime?.thread.getModelContext();\n let hostContext: readonly Context[] = [];\n try {\n hostContext = this.getRunContext?.({ messages, runConfig }) ?? [];\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.logger.error(\"[agui] getRunContext failed\", err);\n invokeRuntimeCallback(\"onError\", this.onError, err);\n }\n const input = {\n threadId,\n runId,\n state:\n this.state.stateSnapshot === undefined ? {} : this.state.stateSnapshot,\n messages,\n tools: toAgUiTools(context?.tools),\n context: [\n ...(context?.system\n ? [{ description: \"system\", value: context.system }]\n : []),\n ...hostContext,\n ],\n forwardedProps: {\n ...(context?.callSettings ?? {}),\n ...(context?.config ?? {}),\n ...(runConfig?.custom ? { runConfig: runConfig.custom } : {}),\n ...(pendingA2uiAction\n ? { a2uiAction: { userAction: pendingA2uiAction } }\n : {}),\n },\n ...(resume !== undefined ? { resume: resume.entries } : {}),\n };\n return input;\n }\n\n /**\n * An anchor the thread no longer carries falls back to the whole transcript.\n * The anchor is missing exactly when a snapshot import replaced the messages\n * this resume was raised against, and a host that expects a delta tolerates\n * being told more than it knows, while one rebuilding the run from the\n * transcript cannot recover from being told less.\n */\n private selectRunMessages(\n messages: readonly ThreadMessage[],\n resume: ResumeDispatch | undefined,\n ): readonly ThreadMessage[] {\n if (resume === undefined || this.resumeTranscript !== \"appended\")\n return messages;\n const anchor = messages.findIndex(\n (message) => message.id === resume.interruptedMessageId,\n );\n if (anchor === -1) return messages;\n return messages.slice(anchor + 1);\n }\n\n private clearDeferredContinuations(owner: AbortController): void {\n if (this.state.pendingResume?.owner === owner) {\n this.dispatch({ type: \"resumeCleared\" });\n }\n if (this.state.pendingA2uiResumeOwner === owner) {\n this.dispatch({\n type: \"a2uiContinuationsCleared\",\n });\n }\n }\n\n private setRunning(running: boolean) {\n this.dispatch({\n type: running ? \"runStarted\" : \"runFinished\",\n });\n this.publishUpdate();\n }\n\n private finishRun(controller: AbortController | null) {\n if (this.abortController !== controller) return;\n this.abortController = null;\n this.activeRunAgent = null;\n this.setRunning(false);\n }\n\n private insertAssistantPlaceholder(\n parentId: string | null,\n id: string = generateOptimisticId(),\n ): string {\n const assistant: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n createdAt: new Date(),\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_state: this.state.stateSnapshot ?? null,\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n isOptimistic: isOptimisticId(id),\n custom: {},\n },\n };\n this.session.addOrUpdateMessage(parentId ?? this.session.headId, assistant);\n this.session.switchToBranch(id);\n this.publishUpdate();\n return id;\n }\n\n private reassignAssistantId(oldId: string, newId: string): boolean {\n if (oldId === newId) return true;\n const oldItem = this.session.tryGetMessage(oldId);\n if (!oldItem) return false;\n\n const collidesWithExisting = this.session.hasMessage(newId);\n\n if (collidesWithExisting) {\n this.logger.debug?.(\n \"[agui] reassignAssistantId: server id already present in messages or repository, dropping placeholder\",\n { oldId, newId },\n );\n this.session.deleteMessage(oldId, oldItem.parentId ?? null);\n } else {\n const { isOptimistic: _, ...metadata } = oldItem.message.metadata;\n this.session.addOrUpdateMessage(oldItem.parentId, {\n ...oldItem.message,\n id: newId,\n metadata,\n } as ThreadMessage);\n this.session.switchToBranch(newId);\n this.session.tryDeleteMessage(oldId);\n }\n\n const pendingParent = this.assistantHistoryParents.get(oldId);\n if (pendingParent !== undefined) {\n this.assistantHistoryParents.delete(oldId);\n if (!collidesWithExisting && !this.assistantHistoryParents.has(newId)) {\n this.assistantHistoryParents.set(newId, pendingParent);\n }\n }\n\n for (const ids of [this.snapshotHistoryIds, this.persistedHistoryIds]) {\n if (ids.has(oldId)) {\n ids.delete(oldId);\n if (!collidesWithExisting) {\n ids.add(newId);\n }\n }\n }\n\n // An in-flight write completes under the id it was started with, so the\n // rename moves the chain entry and transfers the completion mark; without\n // this the resolve records the dead id and the live one appends again.\n const pendingWrite = this.historyWrites.move(\n oldId,\n collidesWithExisting ? undefined : newId,\n );\n if (pendingWrite && !collidesWithExisting) {\n void pendingWrite.then(\n () => {\n this.persistedHistoryIds.delete(oldId);\n this.persistedHistoryIds.add(newId);\n },\n () => {},\n );\n }\n\n this.publishUpdate();\n return !collidesWithExisting;\n }\n\n private updateAssistantMessage(\n messageId: string,\n update: ChatModelRunResult,\n replay?: ReplayContext,\n pendingToolCallIds?: ReadonlySet<string>,\n ): string {\n let latestStatus: MessageStatus | undefined;\n const touched = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const mergedMetadata = update.metadata\n ? this.mergeAssistantMetadata(assistant.metadata, update.metadata)\n : assistant.metadata;\n latestStatus = update.status ?? assistant.status;\n let content =\n update.content !== undefined\n ? replay\n ? replay.merge(\n assistant.content,\n update.content as ThreadAssistantMessage[\"content\"],\n )\n : this.preserveToolResults(\n assistant.content,\n update.content as ThreadAssistantMessage[\"content\"],\n )\n : assistant.content;\n const calls = Array.from(iterateToolCallParts(content));\n // A retained historical call needs existing or current stream authority.\n const pending =\n pendingToolCallIds ??\n (replay\n ? new Set([\n ...replay.admittedToolCallIds,\n ...Array.from(iterateToolCallParts(update.content ?? []))\n .filter((part) => !isResolvedToolCall(part))\n .map((part) => part.toolCallId),\n ])\n : undefined);\n if (replay && latestStatus?.type !== \"running\" && pending)\n replay.admittedToolCallIds = pending;\n if (\n replay ||\n (latestStatus?.type === \"requires-action\" &&\n latestStatus.reason === \"interrupt\")\n ) {\n // Project gates against the content the user can actually answer.\n const interrupts =\n latestStatus?.type === \"requires-action\" &&\n latestStatus.reason === \"interrupt\"\n ? (\n mergedMetadata.custom[AG_UI_METADATA_NAMESPACE] as\n | AgUiCustomMetadata\n | undefined\n )?.interrupts\n : undefined;\n const approvals = projectAgUiToolApprovals(\n interrupts,\n new Set(calls.map((part) => part.toolCallId)),\n );\n const originalCalls = new Map(\n Array.from(\n iterateToolCallParts(replay?.originalContent ?? assistant.content),\n (part) => [part.toolCallId, part],\n ),\n );\n content = mapToolCallPartsDeep(content, (part) => {\n const approval = approvals.get(part.toolCallId);\n if (approval)\n return {\n ...part,\n approval:\n preserveToolApprovalDecision(\n originalCalls.get(part.toolCallId),\n { ...part, approval },\n ) ?? approval,\n };\n if (\n !part.approval ||\n part.approval.approved !== undefined ||\n part.approval.resolution\n )\n return part;\n const { approval: _approval, ...withoutApproval } = part;\n return withoutApproval;\n }).content;\n }\n if (replay && latestStatus?.type === \"complete\") {\n const listed =\n pending ??\n listedPendingToolCallIds({\n ...assistant,\n metadata: mergedMetadata,\n });\n if (\n calls.some(\n (part) =>\n (!isResolvedToolCall(part) ||\n !replay.accountedResultIds.has(part.toolCallId)) &&\n (!listed || listed.has(part.toolCallId)),\n )\n )\n latestStatus = { type: \"requires-action\", reason: \"tool-calls\" };\n }\n const admission =\n pending && replay\n ? withPendingToolCallIds(mergedMetadata, pending)\n : mergedMetadata;\n const metadata =\n latestStatus?.type === \"requires-action\" &&\n latestStatus.reason === \"tool-calls\"\n ? admission\n : replay && latestStatus?.type === \"running\"\n ? mergedMetadata\n : withoutPendingToolCallIds(admission);\n return {\n ...assistant,\n content,\n status: latestStatus,\n metadata,\n };\n });\n if (!touched) return messageId;\n\n let resolvedMessageId = messageId;\n const isSettled =\n latestStatus !== undefined && latestStatus.type !== \"running\";\n if (isSettled && isOptimisticId(messageId)) {\n const stableId = generateId();\n this.reassignAssistantId(messageId, stableId);\n resolvedMessageId = stableId;\n } else {\n this.publishUpdate();\n }\n if (this.isPersistableStatus(latestStatus)) {\n this.persistAssistantHistory(resolvedMessageId);\n }\n this.maybeResumeAfterToolResults(\n resolvedMessageId,\n replay?.accountedResultIds,\n );\n return resolvedMessageId;\n }\n\n // The RunAggregator rebuilds the assistant content from stream events only,\n // so a fresh snapshot omits results injected via addToolResult (frontend tool\n // execution). Carry those results forward so the aggregator never clobbers\n // them. Results are only ever added in this flow, so preserving is safe.\n private preserveToolResults(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n decisionSource?: ThreadAssistantMessage[\"content\"],\n ): ThreadAssistantMessage[\"content\"] {\n const preserved = new Map<string, ToolCallMessagePart>();\n for (const part of iterateToolCallParts(previous)) {\n if (isResolvedToolCall(part)) {\n preserved.set(part.toolCallId, part);\n }\n }\n const decisions = new Map(\n Array.from(iterateToolCallParts(decisionSource ?? []))\n .filter((part) => part.approval?.approved !== undefined)\n .map((part) => [part.toolCallId, part]),\n );\n if (preserved.size === 0 && decisions.size === 0) {\n return this.preserveToolInteractions(previous, next);\n }\n\n const { content: merged, changed } = mapToolCallPartsDeep(next, (part) => {\n const prior = preserved.get(part.toolCallId);\n const result = prior ? preserveToolResult(prior, part) : part;\n if (result.approval && decisions.has(part.toolCallId)) {\n const approval = preserveToolApprovalDecision(\n decisions.get(part.toolCallId),\n result,\n );\n if (approval && approval !== result.approval)\n return { ...result, approval };\n }\n return result;\n });\n return this.preserveToolInteractions(previous, changed ? merged : next);\n }\n\n private preserveToolInteractions(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n ): ThreadAssistantMessage[\"content\"] {\n const interactions = new Map<\n string,\n NonNullable<ToolCallMessagePart[\"unstable_interactions\"]>\n >();\n for (const part of iterateToolCallParts(previous)) {\n if (part.unstable_interactions !== undefined) {\n interactions.set(part.toolCallId, part.unstable_interactions);\n }\n }\n if (interactions.size === 0) return next;\n\n const { content, changed } = mapToolCallPartsDeep(next, (part) => {\n const interaction = interactions.get(part.toolCallId);\n if (interaction === undefined || part.unstable_interactions !== undefined)\n return part;\n return { ...part, unstable_interactions: interaction };\n });\n return changed ? content : next;\n }\n\n // A snapshot built from user, assistant, and tool records alone carries no\n // reasoning, activity, or custom data of its own, so locally streamed parts would be\n // lost on every refresh; keep the local ones where they streamed when the\n // snapshot has none of that kind, matching the merge rule of @ag-ui/client.\n private mergeSnapshotAssistantContent(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n snapshotHasReasoning: boolean,\n snapshotHasActivity: boolean,\n keepMissingToolCalls: ReadonlySet<string> = new Set(),\n keepPriorTranscripts = false,\n ): ThreadAssistantMessage[\"content\"] {\n const shouldKeep = (part: ThreadAssistantMessage[\"content\"][number]) =>\n part.type === \"tool-call\"\n ? keepMissingToolCalls.has(part.toolCallId) &&\n !next.some(\n (incoming) =>\n incoming.type === \"tool-call\" &&\n incoming.toolCallId === part.toolCallId,\n )\n : part.type === \"reasoning\"\n ? this.showThinking && !snapshotHasReasoning\n : part.type === \"data\" && !isActivityPart(part)\n ? !next.some(\n (incoming) =>\n incoming.type === \"data\" && incoming.name === part.name,\n )\n : isActivityPart(part) && !snapshotHasActivity;\n const kept = previous.filter(shouldKeep);\n const merged = this.reconcileSnapshotNestedContent(\n previous,\n this.preserveToolInteractions(previous, next),\n keepPriorTranscripts,\n );\n if (kept.length === 0) return merged;\n\n const mergedByType = new Map<string, number[]>();\n const mergedTools = new Map<string, number>();\n for (const [index, part] of merged.entries()) {\n if (part.type === \"tool-call\") {\n mergedTools.set(part.toolCallId, index);\n } else {\n const indexes = mergedByType.get(part.type) ?? [];\n indexes.push(index);\n mergedByType.set(part.type, indexes);\n }\n }\n\n const previousOrdinals = new Map<string, number>();\n const insertions: (typeof kept)[] = Array.from(\n { length: merged.length + 1 },\n () => [],\n );\n let predecessorIndex = -1;\n for (const part of previous) {\n if (shouldKeep(part)) {\n insertions[predecessorIndex + 1]!.push(part);\n continue;\n }\n\n let matchedIndex: number | undefined;\n if (part.type === \"tool-call\") {\n matchedIndex = mergedTools.get(part.toolCallId);\n } else {\n const ordinal = previousOrdinals.get(part.type) ?? 0;\n matchedIndex = mergedByType.get(part.type)?.[ordinal];\n previousOrdinals.set(part.type, ordinal + 1);\n }\n if (matchedIndex !== undefined) predecessorIndex = matchedIndex;\n }\n\n const result: ThreadAssistantMessage[\"content\"][number][] = [];\n for (const [index, part] of merged.entries()) {\n result.push(...insertions[index]!, part);\n }\n result.push(...insertions[merged.length]!);\n return result;\n }\n\n private reconcileSnapshotNestedContent(\n previous: ThreadAssistantMessage[\"content\"],\n next: ThreadAssistantMessage[\"content\"],\n keepPriorTranscripts: boolean,\n ): ThreadAssistantMessage[\"content\"] {\n const nestedIds = new Set<string>();\n for (const part of previous) {\n if (part.type !== \"tool-call\" || !part.messages) continue;\n for (const nested of part.messages) {\n if (nested.role !== \"assistant\") continue;\n for (const call of iterateToolCallParts(nested.content)) {\n nestedIds.add(call.toolCallId);\n }\n }\n }\n\n const flattened = new Map<string, ToolCallMessagePart>();\n for (const part of next) {\n if (part.type === \"tool-call\" && nestedIds.has(part.toolCallId)) {\n flattened.set(part.toolCallId, part);\n }\n }\n const carried =\n flattened.size === 0\n ? previous\n : mapToolCallPartsDeep(previous, (part) => {\n const snapshot = flattened.get(part.toolCallId);\n if (!snapshot) return part;\n return {\n ...part,\n ...(snapshot.result !== undefined\n ? { result: snapshot.result }\n : {}),\n ...(snapshot.isError !== undefined\n ? { isError: snapshot.isError }\n : {}),\n ...(snapshot.artifact !== undefined\n ? { artifact: snapshot.artifact }\n : {}),\n };\n }).content;\n const previousCalls = new Map<string, ToolCallMessagePart>();\n for (const part of carried) {\n if (part.type !== \"tool-call\") continue;\n previousCalls.set(part.toolCallId, part);\n }\n\n return next.flatMap<ThreadAssistantMessage[\"content\"][number]>((part) => {\n if (part.type === \"tool-call\" && flattened.has(part.toolCallId)) {\n return [];\n }\n if (part.type !== \"tool-call\") return [part];\n const prior = previousCalls.get(part.toolCallId);\n if (prior?.messages === undefined) return [part];\n if (part.messages === undefined)\n return [{ ...part, messages: prior.messages }];\n if (part.messages.length === 0) return [part];\n return [\n {\n ...part,\n messages: this.mergeNestedTranscripts(\n prior.messages,\n part.messages,\n keepPriorTranscripts,\n ),\n },\n ];\n });\n }\n\n /**\n * Merges one tool call's nested transcripts message by message. The incoming\n * copy is the base for tool calls and reasoning; resolved results and calls\n * only the prior copy has carry over, and the prior text wins when it extends\n * the incoming text. Importing a snapshot keeps prior messages it lacks, a\n * prior status that is running or incomplete, and the prior status when the\n * snapshot waits on calls the merged content has already resolved.\n */\n private mergeNestedTranscripts(\n prior: readonly ThreadMessage[],\n next: readonly ThreadMessage[],\n importingSnapshot: boolean,\n ): readonly ThreadMessage[] {\n const priorById = new Map(prior.map((message) => [message.id, message]));\n const merged = next.map((message) => {\n const previous = priorById.get(message.id);\n if (previous?.role !== \"assistant\" || message.role !== \"assistant\")\n return message;\n let content = this.mergeSnapshotAssistantContent(\n previous.content,\n this.preserveToolResults(previous.content, message.content),\n message.content.some((part) => part.type === \"reasoning\"),\n message.content.some(isActivityPart),\n new Set(\n Array.from(\n iterateToolCallParts(previous.content),\n (call) => call.toolCallId,\n ),\n ),\n importingSnapshot,\n );\n const priorText = textOf(previous.content);\n const incomingText = textOf(message.content);\n if (\n priorText.length > incomingText.length &&\n priorText.startsWith(incomingText)\n ) {\n content = replaceTextParts(content, previous.content);\n }\n const status = !importingSnapshot\n ? message.status\n : previous.status.type === \"running\" ||\n previous.status.type === \"incomplete\" ||\n (message.status.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\" &&\n !Array.from(iterateToolCallParts(content)).some(\n (call) => !isResolvedToolCall(call),\n ))\n ? previous.status\n : message.status;\n return {\n ...message,\n status,\n content,\n metadata: {\n ...message.metadata,\n custom: mergeAgUiNamespace(\n previous.metadata.custom,\n message.metadata.custom,\n ),\n },\n };\n });\n if (!importingSnapshot) return merged;\n const mergedById = new Map(merged.map((message) => [message.id, message]));\n return [\n ...prior.map((message) => mergedById.get(message.id) ?? message),\n ...merged.filter((message) => !priorById.has(message.id)),\n ];\n }\n\n private mergeAssistantMetadata(\n current: ThreadAssistantMessage[\"metadata\"],\n incoming: NonNullable<ChatModelRunResult[\"metadata\"]>,\n ): ThreadAssistantMessage[\"metadata\"] {\n const annotations = incoming.unstable_annotations\n ? [...current.unstable_annotations, ...incoming.unstable_annotations]\n : current.unstable_annotations;\n const data = incoming.unstable_data\n ? [...current.unstable_data, ...incoming.unstable_data]\n : current.unstable_data;\n const steps = incoming.steps\n ? [...current.steps, ...incoming.steps]\n : current.steps;\n return {\n unstable_state:\n incoming.unstable_state !== undefined\n ? incoming.unstable_state\n : current.unstable_state,\n unstable_annotations: annotations,\n unstable_data: data,\n steps,\n ...(current.isOptimistic ? { isOptimistic: true } : {}),\n ...(incoming.timing ? { timing: incoming.timing } : {}),\n custom: incoming.custom\n ? mergeAgUiNamespace(current.custom, incoming.custom)\n : current.custom,\n };\n }\n\n private handleEvent(\n aggregator: RunAggregator,\n event: AgUiEvent,\n activeAssistantId: string | undefined,\n joinStrategy: UseAgUiRuntimeOptions[\"joinStrategy\"],\n runStartMessageIds: ReadonlySet<string>,\n hasRunUserBoundary: boolean,\n reconcileSnapshot?: SnapshotMessageReconciler,\n ): string | undefined {\n if (\n event.type === \"SUBAGENT_STARTED\" &&\n !this.subagentParentToolCallIds.has(event.subagentRunId)\n ) {\n this.subagentParentToolCallIds.set(\n event.subagentRunId,\n event.parentToolCallId,\n );\n }\n switch (event.type) {\n case \"STATE_SNAPSHOT\": {\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: event.snapshot as ReadonlyJSONValue,\n });\n this.updateActiveAssistantState(activeAssistantId);\n break;\n }\n case \"STATE_DELTA\": {\n if (event.delta.length === 0) break;\n try {\n const result = jsonpatch.applyPatch(\n this.state.stateSnapshot ?? {},\n event.delta as Operation[],\n /* validateOperation */ true,\n /* mutateDocument */ false,\n );\n this.dispatch({\n type: \"stateSnapshot\",\n snapshot: result.newDocument as ReadonlyJSONValue,\n });\n this.updateActiveAssistantState(activeAssistantId);\n } catch (error) {\n this.logger.error?.(\"[agui] failed to apply state delta\", error);\n }\n break;\n }\n case \"MESSAGES_SNAPSHOT\": {\n aggregator.handle(event);\n const previousHeadId = this.session.headId;\n const activeAssistant =\n activeAssistantId === undefined\n ? undefined\n : this.session.tryGetMessage(activeAssistantId)?.message;\n const hasActiveText =\n activeAssistant?.role === \"assistant\" &&\n activeAssistant.content.some((part) => part.type === \"text\");\n this.importMessagesSnapshot(\n event.messages,\n activeAssistantId,\n joinStrategy,\n runStartMessageIds,\n hasRunUserBoundary,\n reconcileSnapshot,\n );\n const headId = this.session.headId;\n const head =\n headId === null\n ? undefined\n : this.session.tryGetMessage(headId)?.message;\n const hasNewPendingToolCallAnswer =\n head?.role === \"assistant\" &&\n !runStartMessageIds.has(head.id) &&\n head.status?.type === \"requires-action\" &&\n head.status.reason === \"tool-calls\";\n if (\n headId !== previousHeadId &&\n (hasActiveText || hasNewPendingToolCallAnswer)\n ) {\n const nextActiveAssistantId =\n head?.role === \"assistant\" ? (headId ?? undefined) : undefined;\n if (\n activeAssistantId !== nextActiveAssistantId &&\n activeAssistantId\n ) {\n const previous =\n this.session.tryGetMessage(activeAssistantId)?.message;\n if (\n previous?.role === \"assistant\" &&\n previous.status?.type === \"running\"\n ) {\n this.updateAssistantMessage(activeAssistantId, {\n status: FALLBACK_USER_STATUS,\n content: settleNestedContent(\n previous.content,\n FALLBACK_USER_STATUS,\n ),\n });\n }\n }\n activeAssistantId = nextActiveAssistantId;\n if (activeAssistantId && joinStrategy !== \"concat-content\") {\n aggregator.rebaseMessage(activeAssistantId);\n }\n if (hasNewPendingToolCallAnswer && head) {\n this.updateAssistantMessage(head.id, {\n status: { type: \"running\" },\n });\n }\n }\n this.updateActiveAssistantState(activeAssistantId);\n break;\n }\n case \"TOOL_CALL_RESULT\": {\n if (!aggregator.hasToolCall(event.toolCallId)) {\n const messageId = this.findMessageIdForToolCall(event.toolCallId);\n if (messageId !== undefined) {\n this.applyCrossRunToolResult(messageId, event);\n break;\n }\n }\n aggregator.handle(event);\n break;\n }\n case \"ACTIVITY_SNAPSHOT\": {\n const toolCallId = event.content[\"toolCallId\"];\n if (\n event.activityType === MCP_APPS_ACTIVITY_TYPE &&\n typeof toolCallId === \"string\" &&\n !aggregator.hasToolCall(toolCallId)\n ) {\n const messageId = this.findMessageIdForToolCall(toolCallId);\n if (messageId !== undefined) {\n this.applyCrossRunActivitySnapshot(messageId, toolCallId, event);\n break;\n }\n }\n aggregator.handle(event);\n break;\n }\n default:\n aggregator.handle(event);\n }\n return activeAssistantId;\n }\n\n private updateActiveAssistantState(messageId: string | undefined): void {\n const current =\n messageId === undefined\n ? undefined\n : this.session.tryGetMessage(messageId)?.message;\n const activeAssistantId =\n current?.role === \"assistant\" && this.session.headId === messageId\n ? messageId\n : this.session.headId;\n if (activeAssistantId !== null && activeAssistantId !== undefined) {\n this.session.updateMessage(activeAssistantId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n return {\n ...assistant,\n metadata: {\n ...assistant.metadata,\n unstable_state: this.state.stateSnapshot ?? null,\n },\n };\n });\n }\n this.publishUpdate();\n }\n\n private applyCrossRunToolResult(\n messageId: string,\n event: Extract<AgUiEvent, { type: \"TOOL_CALL_RESULT\" }>,\n ): void {\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n const mcpAppUri = readMcpAppResourceUri(event.mcpResult?._meta);\n const modelText = toolContentText(event.content);\n let matchedToolCall = false;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== event.toolCallId) return part;\n matchedToolCall = true;\n // An applied activity snapshot owns part.result; a later result only\n // fills what is missing, mirroring the aggregator's finishToolCall.\n // The aggregator's flag is set only when the snapshot carried a\n // result, so app presence alone is not enough: the current result\n // must be CallToolResult-shaped (a required content array).\n const snapshotResultApplied =\n part.mcp?.app !== undefined &&\n isPlainObject(part.result) &&\n Array.isArray((part.result as Record<string, unknown>)[\"content\"]);\n if (snapshotResultApplied) {\n return {\n ...part,\n ...(part.modelContent === undefined\n ? {\n modelContent: [{ type: \"text\" as const, text: modelText }],\n }\n : {}),\n ...(part.isError === undefined\n ? typeof event.mcpResult?.isError === \"boolean\"\n ? { isError: event.mcpResult.isError }\n : event.role === \"tool\"\n ? { isError: false }\n : {}\n : {}),\n ...(event.messageId\n ? { unstable_toolMessageId: event.messageId }\n : {}),\n ...(event.metadata !== undefined\n ? {\n providerMetadata: withAgUiPartMessageMetadata(\n part.providerMetadata,\n event.metadata,\n ),\n }\n : {}),\n };\n }\n const { modelContent: _modelContent, ...partWithoutModelContent } =\n part;\n return {\n ...(event.mcpResult === undefined && Array.isArray(event.content)\n ? partWithoutModelContent\n : part),\n result: (event.mcpResult ??\n (Array.isArray(event.content)\n ? event.content\n : tryParseJSON(event.content))) as ReadonlyJSONValue,\n ...(event.mcpResult !== undefined\n ? { modelContent: [{ type: \"text\" as const, text: modelText }] }\n : {}),\n ...(typeof event.mcpResult?.isError === \"boolean\"\n ? { isError: event.mcpResult.isError }\n : event.role === \"tool\"\n ? { isError: false }\n : {}),\n ...(part.mcp === undefined && mcpAppUri !== undefined\n ? { mcp: { app: { resourceUri: mcpAppUri } } }\n : {}),\n ...(event.messageId\n ? { unstable_toolMessageId: event.messageId }\n : {}),\n ...(event.metadata !== undefined\n ? {\n providerMetadata: withAgUiPartMessageMetadata(\n part.providerMetadata,\n event.metadata,\n ),\n }\n : {}),\n };\n });\n if (!matchedToolCall) return message;\n return { ...assistant, content };\n });\n\n if (!updated) return;\n this.publishUpdate();\n // Not maybeResumeAfterToolResults: the delivering run is already in\n // flight, and a resume from the owner would reset the head past it.\n if (this.maybeCompleteAfterToolResults(messageId)) return;\n this.persistSettledAssistant(messageId);\n }\n\n private applyCrossRunActivitySnapshot(\n messageId: string,\n toolCallId: string,\n event: Extract<AgUiEvent, { type: \"ACTIVITY_SNAPSHOT\" }>,\n ): void {\n const resourceUri = event.content[\"resourceUri\"];\n if (typeof resourceUri !== \"string\" || !isMcpAppUri(resourceUri)) return;\n const serverId = event.content[\"serverId\"];\n const serverHash = event.content[\"serverHash\"];\n const appServerId =\n typeof serverId === \"string\" && serverId.length > 0\n ? serverId\n : typeof serverHash === \"string\" && serverHash.length > 0\n ? serverHash\n : undefined;\n const result = event.content[\"result\"];\n const updated = this.session.updateMessage(messageId, (message) => {\n if (message.role !== \"assistant\") return message;\n const assistant = message as ThreadAssistantMessage;\n let matchedToolCall = false;\n const { content } = mapToolCallPartsDeep(assistant.content, (part) => {\n if (part.toolCallId !== toolCallId) return part;\n matchedToolCall = true;\n return {\n ...part,\n mcp: {\n app: {\n resourceUri,\n ...(appServerId ? { serverId: appServerId } : {}),\n },\n },\n ...(isPlainObject(result)\n ? {\n ...(part.result !== undefined && part.modelContent === undefined\n ? {\n modelContent: [\n {\n type: \"text\" as const,\n text:\n typeof part.result === \"string\"\n ? part.result\n : JSON.stringify(part.result),\n },\n ],\n }\n : {}),\n result: result as ReadonlyJSONValue,\n isError: result[\"isError\"] === true,\n }\n : {}),\n };\n });\n if (!matchedToolCall) return message;\n return { ...assistant, content };\n });\n\n if (!updated) return;\n this.publishUpdate();\n if (this.maybeCompleteAfterToolResults(messageId)) return;\n this.persistSettledAssistant(messageId);\n }\n\n private importMessagesSnapshot(\n rawMessages: readonly unknown[],\n activeAssistantId: string | undefined,\n joinStrategy: UseAgUiRuntimeOptions[\"joinStrategy\"],\n runStartMessageIds: ReadonlySet<string>,\n hasRunUserBoundary: boolean,\n reconcileSnapshot?: SnapshotMessageReconciler,\n ) {\n try {\n const activeAssistantItem = activeAssistantId\n ? this.session.tryGetMessage(activeAssistantId)\n : undefined;\n const activeMessage = activeAssistantItem?.message;\n const activeAssistantParentId = activeAssistantItem?.parentId;\n const activeAssistant =\n activeMessage?.role === \"assistant\" ? activeMessage : undefined;\n const normalized = fromAgUiSnapshotMessages(\n rawMessages,\n { showThinking: this.showThinking },\n this.subagentParentToolCallIds,\n );\n const converted: ThreadMessage[] = [];\n for (const message of normalized) {\n try {\n const previous = message.id\n ? this.session.tryGetMessage(message.id)?.message\n : undefined;\n const fallbackStatus =\n previous?.role === \"assistant\" &&\n previous.status?.type === \"running\"\n ? previous.status\n : FALLBACK_USER_STATUS;\n converted.push(\n fromThreadMessageLike(message, generateId(), fallbackStatus),\n );\n } catch (error) {\n this.logger.error?.(\n \"[agui] failed to import message from snapshot\",\n error,\n );\n }\n }\n const snapshotHasReasoning = converted.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content.some((part) => part.type === \"reasoning\"),\n );\n const snapshotHasActivity = converted.some(\n (message) =>\n message.role === \"assistant\" && message.content.some(isActivityPart),\n );\n for (let index = 0; index < converted.length; index++) {\n const convertedMessage = converted[index]!;\n const existing = this.session.tryGetMessage(\n convertedMessage.id,\n )?.message;\n if (convertedMessage.role === \"assistant\") {\n const previous =\n existing?.role === \"assistant\" ? existing : undefined;\n const snapshot =\n reconcileSnapshot?.(convertedMessage, previous) ?? convertedMessage;\n const preservesRunningStatus =\n convertedMessage.id === activeAssistantId &&\n previous?.status?.type === \"running\" &&\n snapshot.status?.type === \"requires-action\" &&\n snapshot.status.reason === \"tool-calls\";\n const previousToolCallIds = new Set(\n Array.from(\n iterateToolCallParts(previous?.content ?? []),\n (call) => call.toolCallId,\n ),\n );\n const preservesSettledStatus =\n convertedMessage.id !== activeAssistantId &&\n this.isTerminalStatus(previous?.status) &&\n snapshot.status?.type === \"requires-action\" &&\n snapshot.status.reason === \"tool-calls\" &&\n Array.from(iterateToolCallParts(snapshot.content)).every(\n (call) =>\n isResolvedToolCall(call) ||\n previousToolCallIds.has(call.toolCallId),\n );\n converted[index] = previous\n ? {\n ...snapshot,\n ...(preservesRunningStatus || preservesSettledStatus\n ? { status: previous.status }\n : {}),\n content: this.mergeSnapshotAssistantContent(\n previous.content,\n snapshot.content,\n snapshotHasReasoning,\n snapshotHasActivity,\n new Set(),\n true,\n ),\n }\n : snapshot;\n }\n }\n if (joinStrategy === \"concat-content\") {\n const activeIndex = converted.findIndex(\n (message) => message.id === activeAssistantId,\n );\n const lastKnownIndex = converted.findLastIndex((message) =>\n runStartMessageIds.has(message.id),\n );\n const lastUserIndex = hasRunUserBoundary\n ? converted.findLastIndex((message) => message.role === \"user\")\n : -1;\n const startIndex =\n activeIndex >= 0\n ? activeIndex\n : lastKnownIndex >= 0 || lastUserIndex >= 0\n ? Math.max(lastKnownIndex, lastUserIndex) + 1\n : -1;\n if (startIndex >= 0 && converted[startIndex]?.role === \"assistant\") {\n let endIndex = startIndex + 1;\n while (converted[endIndex]?.role === \"assistant\") endIndex++;\n const runMessages = converted.slice(\n startIndex,\n endIndex,\n ) as ThreadAssistantMessage[];\n const includesStreamedPrefix =\n activeIndex < 0 &&\n activeAssistant?.content.some((part) => part.type !== \"data\");\n if (includesStreamedPrefix && activeAssistant) {\n runMessages.unshift(activeAssistant);\n }\n if (runMessages.length > 1) {\n const [first, ...rest] = runMessages;\n let content = runMessages.flatMap((message) => message.content);\n if (includesStreamedPrefix) {\n content = [...first!.content];\n let cursor = 0;\n const keyOf = (part: (typeof content)[number]) =>\n part.type === \"tool-call\"\n ? `tool:${part.toolCallId}`\n : part.type === \"text\" || part.type === \"reasoning\"\n ? `${part.type}:${part.text}`\n : undefined;\n for (const message of rest) {\n for (const part of message.content) {\n const key = keyOf(part);\n const match =\n key === undefined\n ? -1\n : content.findIndex(\n (previous, index) =>\n index >= cursor && keyOf(previous) === key,\n );\n if (match < 0) {\n content.push(part);\n cursor = content.length;\n } else {\n if (part.type === \"tool-call\") {\n content[match] = this.preserveToolResults(\n [content[match]!],\n [part],\n )[0]!;\n }\n cursor = match + 1;\n }\n }\n }\n }\n converted.splice(startIndex, endIndex - startIndex, {\n ...first!,\n content,\n status: rest.at(-1)!.status,\n metadata: rest.reduce(\n (metadata, message) => ({\n ...metadata,\n ...message.metadata,\n unstable_state: message.metadata.unstable_state,\n unstable_annotations: [\n ...metadata.unstable_annotations,\n ...message.metadata.unstable_annotations,\n ],\n unstable_data: [\n ...metadata.unstable_data,\n ...message.metadata.unstable_data,\n ],\n steps: [...metadata.steps, ...message.metadata.steps],\n custom: mergeAgUiNamespace(\n metadata.custom,\n message.metadata.custom,\n ),\n }),\n first!.metadata,\n ),\n });\n }\n }\n }\n const snapshotContainsActiveAssistant = converted.some(\n (message) => message.id === activeAssistant?.id,\n );\n const preservesActiveAssistant =\n activeAssistant !== undefined &&\n !snapshotContainsActiveAssistant &&\n (activeAssistant.metadata.isOptimistic !== true ||\n converted.at(-1)?.role !== \"assistant\" ||\n (activeAssistantParentId !== undefined &&\n converted.at(-1)?.id === activeAssistantParentId));\n if (preservesActiveAssistant) {\n converted.push(activeAssistant);\n }\n this.applyExternalMessages(converted);\n if (activeAssistant !== undefined) {\n const activeItem = this.session.tryGetMessage(activeAssistant.id);\n if (activeItem) {\n if (preservesActiveAssistant) {\n this.snapshotHistoryIds.delete(activeAssistant.id);\n }\n this.markPendingAssistantHistory(\n activeAssistant.id,\n activeItem.parentId,\n );\n }\n }\n } catch (error) {\n this.logger.error?.(\"[agui] failed to import messages snapshot\", error);\n }\n }\n\n private toThreadMessage(message: AppendMessage): ThreadMessage {\n return fromThreadMessageLike(\n message as any,\n generateId(),\n FALLBACK_USER_STATUS,\n );\n }\n\n private isTerminalStatus(status?: MessageStatus): boolean {\n return status?.type === \"complete\" || status?.type === \"incomplete\";\n }\n\n private isPersistableStatus(status?: MessageStatus): boolean {\n if (this.isTerminalStatus(status)) return true;\n return status?.type === \"requires-action\" && status.reason === \"interrupt\";\n }\n\n private recordHistoryEntry(parentId: string | null, message: ThreadMessage) {\n void this.appendHistoryItem(parentId, message)?.catch((error) => {\n this.logger.error?.(\"[agui] 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 persistSettledAssistant(messageId: string): void {\n const item = this.session.tryGetMessage(messageId);\n if (!this.history?.update || !item) return;\n if (!this.isTerminalStatus(item.message.status)) return;\n if (\n !this.persistedHistoryIds.has(messageId) &&\n this.historyWrites.pending(messageId) === undefined\n )\n return;\n this.markPendingAssistantHistory(messageId, item.parentId);\n this.persistAssistantHistory(messageId);\n }\n\n private persistAssistantHistory(messageId: string) {\n const history = this.history;\n if (!history) return;\n const parentId = this.assistantHistoryParents.get(messageId);\n if (parentId === undefined) return;\n const message = this.session.tryGetMessage(messageId)?.message;\n if (!message || message.role !== \"assistant\") return;\n if (!this.isPersistableStatus(message.status)) return;\n const wasPersisted = this.persistedHistoryIds.has(messageId);\n const update = history.update;\n const shouldUpdate =\n update !== undefined &&\n (wasPersisted ||\n this.snapshotHistoryIds.has(messageId) ||\n this.historyWrites.pending(messageId) !== undefined);\n\n if (shouldUpdate) {\n const write = this.historyWrites.chain(messageId, () =>\n update.call(history, { parentId, message }),\n );\n this.assistantHistoryParents.delete(messageId);\n void write.then(\n () => {\n this.persistedHistoryIds.add(messageId);\n },\n (error) => {\n const pending = this.historyWrites.pending(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, parentId);\n }\n this.logger.error?.(\"[agui] failed to update history entry\", error);\n },\n );\n return;\n }\n\n if (wasPersisted) {\n this.assistantHistoryParents.delete(messageId);\n return;\n }\n\n const write = this.appendHistoryItem(parentId, message);\n if (!write) return;\n this.assistantHistoryParents.delete(messageId);\n void write.then(\n () => {},\n (error) => {\n const pending = this.historyWrites.pending(messageId);\n if (pending === undefined || pending === write) {\n this.assistantHistoryParents.set(messageId, parentId);\n }\n this.logger.error?.(\"[agui] failed to append history entry\", error);\n },\n );\n }\n\n private appendHistoryItem(\n parentId: string | null,\n message: ThreadMessage,\n ): Promise<void> | undefined {\n if (!this.history || this.persistedHistoryIds.has(message.id)) return;\n const pending = this.historyWrites.pending(message.id);\n if (pending) return pending;\n\n const append = this.history.append.bind(this.history);\n const write = this.historyWrites.chain(message.id, () =>\n append({ parentId, message }),\n );\n void write.then(\n () => {\n this.persistedHistoryIds.add(message.id);\n },\n () => {},\n );\n return write;\n }\n}\n"],"mappings":"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"}
|