@assistant-ui/react 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalThread.d.ts","names":[],"sources":["../../src/client/ExternalThread.ts"],"mappings":";;;;KAoDY,wBAAwB;EAClC;;KA0BU;EACV,mBAAmB;EACnB;EACA;EACA,QAAQ;EACR;;;;;;;EAOA;;;;;EAKA,SAAS,SAAS;EAClB,UAAU,SAAS;EACnB,YAAY;EACZ;EACA;EACA;EACA,oBAAoB,SAAS;;EAE7B,qBAAqB,SAAS;EAC9B,wBAAwB;EACxB,oBAAoB;;EAEpB,QAAQ;;EAER,WAAW;;EAEX,2BAA2B,SAAS;;cA20BzB,4CAAc,SAAA,yBAAA"}
1
+ {"version":3,"file":"ExternalThread.d.ts","names":[],"sources":["../../src/client/ExternalThread.ts"],"mappings":";;;;KAqDY,wBAAwB;EAClC;;KAgBU;EACV,mBAAmB;EACnB;EACA;EACA,QAAQ;EACR;;;;;;;EAOA;;;;;EAKA,SAAS,SAAS;EAClB,UAAU,SAAS;EACnB,YAAY;EACZ;EACA;EACA;EACA,oBAAoB,SAAS;;EAE7B,qBAAqB,SAAS;EAC9B,wBAAwB;EACxB,oBAAoB;;EAEpB,QAAQ;;EAER,WAAW;;EAEX,2BAA2B,SAAS;;cAw0BzB,4CAAc,SAAA,yBAAA"}
@@ -6,20 +6,14 @@ import { useEffect, useEffectEvent, useRef, useState } from "@assistant-ui/tap/r
6
6
  import { ToolResponse } from "assistant-stream";
7
7
  import { ModelContext, Suggestions } from "@assistant-ui/core/store";
8
8
  import { resource, withKey } from "@assistant-ui/tap";
9
- import { fileMatchesAccept, getThreadMessageText, isCreateAttachment, resolveToolApprovalResponse } from "@assistant-ui/core/internal";
9
+ import { fileMatchesAccept, getThreadMessageText, isCreateAttachment, resolveToolApprovalResponse, toMessagePartStatus } from "@assistant-ui/core/internal";
10
10
  //#region src/client/ExternalThread.ts
11
11
  const EMPTY_QUEUE_ITEMS = [];
12
12
  const EMPTY_BRANCH_IDS = [];
13
13
  const COMPLETE_STATUS = Object.freeze({ type: "complete" });
14
14
  const derivePartStatus = (message, partIndex, part) => {
15
- if (message.role !== "assistant" || !message.status) return COMPLETE_STATUS;
16
- if (part.type === "tool-call") {
17
- if (!part.result) return message.status;
18
- return COMPLETE_STATUS;
19
- }
20
- const isLastPart = partIndex === Math.max(0, message.content.length - 1);
21
- if (message.status.type === "requires-action") return COMPLETE_STATUS;
22
- return isLastPart ? message.status : COMPLETE_STATUS;
15
+ if (!message.status) return COMPLETE_STATUS;
16
+ return toMessagePartStatus(message, partIndex, part);
23
17
  };
24
18
  const useMessageClient = (t0) => {
25
19
  const $ = c(65);
@@ -255,26 +249,27 @@ const MessageClient = resource(useMessageClient);
255
249
  const usePartResource = (t0) => {
256
250
  const $ = c(20);
257
251
  const { part, status, messageId, onRespondToToolApproval, onAddToolResult, onResumeToolCall } = t0;
258
- let t1;
259
- if ($[0] !== part || $[1] !== status) {
260
- t1 = {
252
+ const t1 = status;
253
+ let t2;
254
+ if ($[0] !== part || $[1] !== t1) {
255
+ t2 = {
261
256
  ...part,
262
- status
257
+ status: t1
263
258
  };
264
259
  $[0] = part;
265
- $[1] = status;
266
- $[2] = t1;
267
- } else t1 = $[2];
268
- const state = t1;
269
- let t2;
260
+ $[1] = t1;
261
+ $[2] = t2;
262
+ } else t2 = $[2];
263
+ const state = t2;
264
+ let t3;
270
265
  if ($[3] !== state) {
271
- t2 = () => state;
266
+ t3 = () => state;
272
267
  $[3] = state;
273
- $[4] = t2;
274
- } else t2 = $[4];
275
- let t3;
268
+ $[4] = t3;
269
+ } else t3 = $[4];
270
+ let t4;
276
271
  if ($[5] !== messageId || $[6] !== onAddToolResult || $[7] !== part) {
277
- t3 = (result) => {
272
+ t4 = (result) => {
278
273
  if (!onAddToolResult) throw new Error("Runtime does not support tool results (onAddToolResult is not set).");
279
274
  if (part.type !== "tool-call") throw new Error("Tried to add tool result on non-tool message part");
280
275
  const response = ToolResponse.toResponse(result);
@@ -291,11 +286,11 @@ const usePartResource = (t0) => {
291
286
  $[5] = messageId;
292
287
  $[6] = onAddToolResult;
293
288
  $[7] = part;
294
- $[8] = t3;
295
- } else t3 = $[8];
296
- let t4;
289
+ $[8] = t4;
290
+ } else t4 = $[8];
291
+ let t5;
297
292
  if ($[9] !== onResumeToolCall || $[10] !== part) {
298
- t4 = (payload) => {
293
+ t5 = (payload) => {
299
294
  if (!onResumeToolCall) throw new Error("Runtime does not support resuming tool calls (onResumeToolCall is not set).");
300
295
  if (part.type !== "tool-call") throw new Error("Tried to resume tool call on non-tool message part");
301
296
  onResumeToolCall({
@@ -305,11 +300,11 @@ const usePartResource = (t0) => {
305
300
  };
306
301
  $[9] = onResumeToolCall;
307
302
  $[10] = part;
308
- $[11] = t4;
309
- } else t4 = $[11];
310
- let t5;
303
+ $[11] = t5;
304
+ } else t5 = $[11];
305
+ let t6;
311
306
  if ($[12] !== onRespondToToolApproval || $[13] !== part) {
312
- t5 = (response_0) => {
307
+ t6 = (response_0) => {
313
308
  if (!onRespondToToolApproval) throw new Error("Runtime does not support tool approvals.");
314
309
  if (part.type !== "tool-call") throw new Error("Tried to respond to tool approval on non-tool message part");
315
310
  if (!part.approval || part.approval.approved !== void 0 || part.approval.resolution !== void 0) throw new Error("Tool call has no pending approval");
@@ -317,23 +312,23 @@ const usePartResource = (t0) => {
317
312
  };
318
313
  $[12] = onRespondToToolApproval;
319
314
  $[13] = part;
320
- $[14] = t5;
321
- } else t5 = $[14];
322
- let t6;
323
- if ($[15] !== t2 || $[16] !== t3 || $[17] !== t4 || $[18] !== t5) {
324
- t6 = {
325
- getState: t2,
326
- addToolResult: t3,
327
- resumeToolCall: t4,
328
- respondToToolApproval: t5
315
+ $[14] = t6;
316
+ } else t6 = $[14];
317
+ let t7;
318
+ if ($[15] !== t3 || $[16] !== t4 || $[17] !== t5 || $[18] !== t6) {
319
+ t7 = {
320
+ getState: t3,
321
+ addToolResult: t4,
322
+ resumeToolCall: t5,
323
+ respondToToolApproval: t6
329
324
  };
330
- $[15] = t2;
331
- $[16] = t3;
332
- $[17] = t4;
333
- $[18] = t5;
334
- $[19] = t6;
335
- } else t6 = $[19];
336
- return t6;
325
+ $[15] = t3;
326
+ $[16] = t4;
327
+ $[17] = t5;
328
+ $[18] = t6;
329
+ $[19] = t7;
330
+ } else t7 = $[19];
331
+ return t7;
337
332
  };
338
333
  const PartResource = resource(usePartResource);
339
334
  const useAttachmentResource = ({ attachment, onRemove }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalThread.js","names":["useState","useMemo","useEffect","useEffectEvent","useCallback","useRef","resource","withKey","ClientElement","ClientOutput","useClientLookup","attachTransformScopes","useClientResource","Derived","AddToolResultOptions","AppendMessage","Attachment","AttachmentAdapter","CreateAttachment","PendingAttachment","RespondToToolApprovalOptions","ResumeToolCallOptions","MessagePartStatus","ThreadAssistantMessagePart","ThreadUserMessagePart","ThreadMessage","ToolCallMessagePartStatus","ExternalThreadQueueAdapter","ExternalThreadBranchAdapter","ToolResponse","ReadonlyJSONValue","QueueItemState","ComposerSendOptions","fileMatchesAccept","getThreadMessageText","isCreateAttachment","resolveToolApprovalResponse","ModelContext","Suggestions","Tools","DataRenderers","SingleThreadList","EMPTY_QUEUE_ITEMS","EMPTY_BRANCH_IDS","ExternalThreadMessage","id","COMPLETE_STATUS","Object","freeze","type","derivePartStatus","message","partIndex","part","role","status","result","isLastPart","Math","max","content","length","ExternalThreadProps","messages","isRunning","isLoading","state","extras","isSendDisabled","onNew","onEdit","onReload","parentId","onStartRun","onCancel","onResume","onAddToolResult","options","onResumeToolCall","onLoadExternalState","attachmentAdapter","queue","branches","onRespondToToolApproval","MessageClientProps","index","useMessageClient","t0","$","_c","isCopied","setIsCopied","isHovering","setIsHovering","isEditing","setIsEditing","t1","map","idx","PartResource","messageId","partClients","t2","attachments","t3","_temp2","attachmentClients","t4","Symbol","for","handleBeginEdit","t5","handleCancelEdit","t6","msg","clear","sourceId","handleSendEdit","t7","ComposerClientResource","canCancel","onBeginEdit","onSend","composerClient","branchIds","t8","getBranches","indexOf","branchIndex","branchNumber","branchCount","t9","t10","isLast","speech","undefined","parts","composer","t11","t12","methods","t13","t14","t15","position","branchId","target","switchToBranch","t16","selector","get","findIndex","p","toolCallId","t17","selector_0","key","t18","getState","delete","_temp3","reload","speak","_temp4","stopSpeaking","_temp5","submitFeedback","_temp6","getCopyText","attachment","MessageClient","PartResourceProps","usePartResource","Error","response","toResponse","toolName","isError","artifact","modelContent","payload","response_0","approval","approved","resolution","addToolResult","resumeToolCall","respondToToolApproval","AttachmentResourceProps","onRemove","Promise","useAttachmentResource","remove","AttachmentResource","ComposerClientResourceProps","useQueueItemClient","item","onSteer","steer","QueueItemClient","drainAdapterAdd","ReturnType","upsert","asyncIterator","useLiveState","initial","setState","ref","next","current","prev","T","set","const","useComposerClientResource","text","setText","textRef","setRole","roleRef","runConfig","setRunConfig","runConfigRef","setAttachments","attachmentsRef","quote","setQuote","quoteRef","textParts","filter","_temp7","messageText","_temp8","join","updateFromMessage","a","removed","all","_temp9","a_1","removePendingAttachments","attachment_0","prev_0","a_2","upsertAttachment","queueItems","items","queueItemClients","accept","trim","isEmpty","canSend","attachmentAccept","dictation","fileOrAttachment","file","name","contentType","add","newAttachment","random","toString","substring","prev_1","newAttachment_0","prev_2","removed_0","t19","removed_1","t20","opts","currentQuote","currentText","currentAttachments","isEmpty_0","dispatch","sendAttachments","composedMessage","createdAt","Date","startRun","metadata","custom","enqueue","attachment_1","send","then","error","prev_3","prev_4","prev_5","console","t21","t22","t23","addAttachment","clearAttachments","reset","cancel","beginEdit","startDictation","_temp0","stopDictation","_temp1","queueItem","dedupeMessagesById","seenIds","Set","deduped","i","has","warn","push","reverse","useExternalThread","messagesProp","threadState","messageIndex","m","handleReload","props","messageClients","handleCancelRun","at","handleSendNew","headId","message_0","composerQueue","hasQueue","hasBranches","hasEdit","hasReload","hasAttachments","_temp10","messageStates","edit","feedback","voice","switchBranchDuringRun","unstable_copy","isDisabled","capabilities","suggestions","message_1","appendMessage","state_0","t24","t25","append","deleteMessage","_temp11","resumeRun","cancelRun","importExternalState","getModelContext","_temp12","export","_temp13","import","_temp14","_temp15","_temp16","connectVoice","_temp17","disconnectVoice","_temp18","getVoiceVolume","_temp19","subscribeVoiceVolume","_temp21","muteVoice","_temp22","unmuteVoice","_temp23","ExternalThread","scopes","parent","threads","source","threadElement","thread","query","aui","threadListItem","modelContext","tools","dataRenderers","_temp","part_0","a_0","s","arr","config","_temp20"],"sources":["../../src/client/ExternalThread.ts"],"sourcesContent":["import {\n useState,\n useMemo,\n useEffect,\n useEffectEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport {\n type ClientElement,\n type ClientOutput,\n useClientLookup,\n attachTransformScopes,\n useClientResource,\n Derived,\n} from \"@assistant-ui/store\";\n\nimport type {\n AddToolResultOptions,\n AppendMessage,\n Attachment,\n AttachmentAdapter,\n CreateAttachment,\n PendingAttachment,\n RespondToToolApprovalOptions,\n ResumeToolCallOptions,\n MessagePartStatus,\n ThreadAssistantMessagePart,\n ThreadUserMessagePart,\n ThreadMessage,\n ToolCallMessagePartStatus,\n ExternalThreadQueueAdapter,\n ExternalThreadBranchAdapter,\n} from \"@assistant-ui/core\";\nimport { ToolResponse } from \"assistant-stream\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport type { QueueItemState } from \"@assistant-ui/core/store\";\nimport type { ComposerSendOptions } from \"@assistant-ui/core/store\";\nimport {\n fileMatchesAccept,\n getThreadMessageText,\n isCreateAttachment,\n resolveToolApprovalResponse,\n} from \"@assistant-ui/core/internal\";\nimport { ModelContext, Suggestions } from \"@assistant-ui/core/store\";\nimport { Tools, DataRenderers } from \"@assistant-ui/core/react\";\nimport { SingleThreadList } from \"./SingleThreadList\";\n\nconst EMPTY_QUEUE_ITEMS: readonly QueueItemState[] = [];\nconst EMPTY_BRANCH_IDS: readonly string[] = [];\n\nexport type ExternalThreadMessage = ThreadMessage & {\n id: string;\n};\n\nconst COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\n\n// Legacy runtime parity (toMessagePartStatus): a tool call without a result\n// carries its message's status; the last part of a streaming message streams.\nconst derivePartStatus = (\n message: ExternalThreadMessage,\n partIndex: number,\n part: ThreadAssistantMessagePart | ThreadUserMessagePart,\n): ToolCallMessagePartStatus => {\n if (message.role !== \"assistant\" || !message.status) return COMPLETE_STATUS;\n\n if (part.type === \"tool-call\") {\n if (!part.result) return message.status as ToolCallMessagePartStatus;\n return COMPLETE_STATUS;\n }\n\n const isLastPart = partIndex === Math.max(0, message.content.length - 1);\n if (message.status.type === \"requires-action\") return COMPLETE_STATUS;\n return isLastPart ? (message.status as MessagePartStatus) : COMPLETE_STATUS;\n};\n\nexport type ExternalThreadProps = {\n messages: readonly ExternalThreadMessage[];\n isRunning?: boolean;\n isLoading?: boolean | undefined;\n state?: ReadonlyJSONValue | undefined;\n extras?: unknown;\n /**\n * Whether sending new messages is currently disabled. When `true`, the\n * thread composer's input remains usable but `send()` is a no-op and\n * `composer.canSend` is `false`. Edit composers (saving message edits)\n * intentionally ignore this flag.\n */\n isSendDisabled?: boolean;\n /**\n * Callback for new messages (non-queue runtimes).\n * @note Unused when `queue` is provided — new messages are routed through `queue.enqueue` instead.\n */\n onNew?: (message: AppendMessage) => void;\n onEdit?: (message: AppendMessage) => void;\n onReload?: (parentId: string | null) => void;\n onStartRun?: () => void;\n onCancel?: () => void;\n onResume?: (() => void) | undefined;\n onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;\n /** Callback for resuming a tool call that is waiting for human input. */\n onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;\n onLoadExternalState?: ((state: unknown) => void) | undefined;\n attachmentAdapter?: AttachmentAdapter | undefined;\n /** Queue adapter for runtimes that support message queuing and steering. */\n queue?: ExternalThreadQueueAdapter;\n /** Branch adapter for runtimes that track sibling variants of messages. */\n branches?: ExternalThreadBranchAdapter;\n /** Callback for tool approval decisions. Absent: responding to an approval throws a capability error. */\n onRespondToToolApproval?: (options: RespondToToolApprovalOptions) => void;\n};\n\ntype MessageClientProps = {\n message: ExternalThreadMessage;\n index: number;\n parentId: string | null;\n onEdit?: (message: AppendMessage) => void;\n onReload?: () => void;\n queue?: ExternalThreadQueueAdapter | undefined;\n branches?: ExternalThreadBranchAdapter | undefined;\n onRespondToToolApproval?:\n | ((options: RespondToToolApprovalOptions) => void)\n | undefined;\n onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;\n onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;\n attachmentAdapter?: AttachmentAdapter | undefined;\n};\n\n// Message Client - minimal implementation\nconst useMessageClient = ({\n message,\n index,\n parentId,\n onEdit,\n onReload,\n queue,\n branches,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n attachmentAdapter,\n}: MessageClientProps): ClientOutput<\"message\"> => {\n const [isCopied, setIsCopied] = useState(false);\n const [isHovering, setIsHovering] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n\n const partClients = useClientLookup(\n message.content.map((part, idx) =>\n withKey(\n idx,\n PartResource({\n part,\n status: derivePartStatus(message, idx, part),\n messageId: message.id,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n }),\n ),\n ),\n );\n\n const attachmentClients = useClientLookup(\n (message.attachments ?? []).map((attachment) =>\n withKey(\n attachment.id,\n AttachmentResource({\n attachment,\n onRemove: () => {},\n }),\n ),\n ),\n );\n\n const handleBeginEdit = () => {\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setIsEditing(false);\n };\n\n const handleSendEdit = (msg: AppendMessage) => {\n queue?.clear(\"edit\");\n onEdit?.({\n ...msg,\n parentId,\n sourceId: message.id,\n });\n setIsEditing(false);\n };\n\n const composerClient = useClientResource(\n ComposerClientResource({\n type: \"edit\",\n isEditing,\n canCancel: true,\n onCancel: handleCancelEdit,\n onBeginEdit: handleBeginEdit,\n onSend: handleSendEdit,\n message,\n queue,\n attachmentAdapter,\n }),\n );\n\n const branchIds = branches?.getBranches(message.id) ?? EMPTY_BRANCH_IDS;\n const branchIndex = branchIds.indexOf(message.id);\n const branchNumber = branchIndex === -1 ? 1 : branchIndex + 1;\n const branchCount = branchIndex === -1 ? 1 : branchIds.length;\n\n const state = useMemo(() => {\n return {\n ...message,\n attachments: message.attachments ?? [],\n parentId,\n isLast: false, // Will be set by thread\n branchNumber,\n branchCount,\n speech: undefined,\n parts: partClients.state,\n isCopied,\n isHovering,\n index,\n composer: composerClient.state,\n };\n }, [\n message,\n parentId,\n isCopied,\n isHovering,\n index,\n composerClient.state,\n partClients.state,\n branchNumber,\n branchCount,\n ]);\n\n return {\n getState: () => state,\n composer: () => composerClient.methods,\n delete: () => {},\n reload: () => {\n onReload?.();\n },\n speak: () => {},\n stopSpeaking: () => {},\n submitFeedback: () => {},\n switchToBranch: ({ position, branchId }) => {\n if (!branches) return;\n const target =\n branchId ??\n (branchIndex === -1\n ? undefined\n : position === \"previous\"\n ? branchIds[branchIndex - 1]\n : position === \"next\"\n ? branchIds[branchIndex + 1]\n : undefined);\n if (target !== undefined && target !== message.id)\n branches.switchToBranch(target);\n },\n getCopyText: () => getThreadMessageText(message),\n part: (selector) => {\n if (\"index\" in selector) {\n return partClients.get(selector);\n }\n const partIndex = state.parts.findIndex(\n (p) => p.type === \"tool-call\" && p.toolCallId === selector.toolCallId,\n );\n return partClients.get({ index: partIndex });\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachmentClients.get({ key: selector.id });\n }\n return attachmentClients.get(selector);\n },\n setIsCopied,\n setIsHovering,\n };\n};\n\nconst MessageClient = resource(useMessageClient);\n\ntype PartResourceProps = {\n part: ThreadAssistantMessagePart | ThreadUserMessagePart;\n status: ToolCallMessagePartStatus;\n messageId: string;\n onRespondToToolApproval?:\n | ((options: RespondToToolApprovalOptions) => void)\n | undefined;\n onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;\n onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;\n};\n\n// Part Client - minimal implementation\nconst usePartResource = ({\n part,\n status,\n messageId,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n}: PartResourceProps): ClientOutput<\"part\"> => {\n const state = useMemo(\n () => ({\n ...part,\n status,\n }),\n [part, status],\n );\n\n return {\n getState: () => state,\n addToolResult: (result) => {\n if (!onAddToolResult)\n throw new Error(\n \"Runtime does not support tool results (onAddToolResult is not set).\",\n );\n if (part.type !== \"tool-call\")\n throw new Error(\"Tried to add tool result on non-tool message part\");\n\n const response = ToolResponse.toResponse(result);\n onAddToolResult({\n messageId,\n toolName: part.toolName,\n toolCallId: part.toolCallId,\n result: response.result as ReadonlyJSONValue,\n isError: response.isError,\n ...(response.artifact !== undefined && { artifact: response.artifact }),\n ...(response.modelContent !== undefined && {\n modelContent: response.modelContent,\n }),\n });\n },\n resumeToolCall: (payload) => {\n if (!onResumeToolCall)\n throw new Error(\n \"Runtime does not support resuming tool calls (onResumeToolCall is not set).\",\n );\n if (part.type !== \"tool-call\")\n throw new Error(\"Tried to resume tool call on non-tool message part\");\n\n onResumeToolCall({ toolCallId: part.toolCallId, payload });\n },\n respondToToolApproval: (response) => {\n if (!onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n\n if (part.type !== \"tool-call\")\n throw new Error(\n \"Tried to respond to tool approval on non-tool message part\",\n );\n\n if (\n !part.approval ||\n part.approval.approved !== undefined ||\n part.approval.resolution !== undefined\n )\n throw new Error(\"Tool call has no pending approval\");\n\n onRespondToToolApproval(\n resolveToolApprovalResponse(part.approval, response),\n );\n },\n };\n};\n\nconst PartResource = resource(usePartResource);\n\ntype AttachmentResourceProps = {\n attachment: Attachment;\n onRemove?: () => void | Promise<void>;\n};\n\n// Attachment Client - minimal implementation\nconst useAttachmentResource = ({\n attachment,\n onRemove,\n}: AttachmentResourceProps): ClientOutput<\"attachment\"> => {\n return {\n getState: () => attachment,\n remove: async () => {\n await onRemove?.();\n },\n };\n};\n\nconst AttachmentResource = resource(useAttachmentResource);\n\ntype ComposerClientResourceProps = {\n type: \"thread\" | \"edit\";\n isEditing: boolean;\n canCancel: boolean;\n isSendDisabled?: boolean;\n onCancel: () => void;\n onBeginEdit?: () => void;\n onSend?: (message: AppendMessage) => void;\n message?: ExternalThreadMessage;\n queue?: ExternalThreadQueueAdapter | undefined;\n attachmentAdapter?: AttachmentAdapter | undefined;\n};\n\nconst useQueueItemClient = ({\n item,\n onSteer,\n onRemove,\n}: {\n item: QueueItemState;\n onSteer: () => void;\n onRemove: () => void;\n}): ClientOutput<\"queueItem\"> => {\n return {\n getState: () => item,\n steer: onSteer,\n remove: onRemove,\n };\n};\n\nconst QueueItemClient = resource(useQueueItemClient);\n\nconst drainAdapterAdd = async (\n result: ReturnType<AttachmentAdapter[\"add\"]>,\n upsert: (attachment: Attachment) => void,\n) => {\n if (Symbol.asyncIterator in result) {\n for await (const attachment of result) {\n upsert(attachment);\n }\n } else {\n upsert(await result);\n }\n};\n\n// State whose setter tracks the latest value in a ref, so imperative\n// call sequences (setText immediately followed by send) observe the write\n// before React re-renders — legacy composer parity.\nconst useLiveState = <T>(initial: T) => {\n const [state, setState] = useState(initial);\n const ref = useRef(state);\n const set = useCallback((next: T | ((prev: T) => T)) => {\n ref.current =\n typeof next === \"function\" ? (next as (prev: T) => T)(ref.current) : next;\n setState(ref.current);\n }, []);\n return [state, set, ref] as const;\n};\n\n// Composer Client - minimal implementation\nconst useComposerClientResource = ({\n type,\n isEditing,\n canCancel,\n isSendDisabled = false,\n onCancel,\n onBeginEdit,\n onSend,\n message,\n queue,\n attachmentAdapter,\n}: ComposerClientResourceProps): ClientOutput<\"composer\"> => {\n const [text, setText, textRef] = useLiveState(\"\");\n const [role, setRole, roleRef] = useLiveState<\n \"user\" | \"assistant\" | \"system\"\n >(\"user\");\n const [runConfig, setRunConfig, runConfigRef] = useLiveState<\n Record<string, unknown>\n >({});\n const [attachments, setAttachments, attachmentsRef] = useLiveState<\n readonly Attachment[]\n >([]);\n const [quote, setQuote, quoteRef] = useLiveState<\n { readonly text: string; readonly messageId: string } | undefined\n >(undefined);\n\n // Update composer values when editing begins\n const updateFromMessage = useEffectEvent(() => {\n if (message) {\n // Extract text from message content (text parts only)\n const textParts = message.content.filter((part) => part.type === \"text\");\n const messageText = textParts\n .map((part) => (\"text\" in part ? part.text : \"\"))\n .join(\"\\n\\n\");\n\n setText(messageText);\n setRole(message.role);\n setAttachments(message.attachments ?? []);\n }\n });\n\n useEffect(() => {\n if (isEditing) {\n updateFromMessage();\n }\n }, [isEditing]);\n\n const attachmentClients = useClientLookup(\n attachments.map((attachment) =>\n withKey(\n attachment.id,\n AttachmentResource({\n attachment,\n onRemove: async () => {\n await attachmentAdapter?.remove(attachment);\n setAttachments((prev) =>\n prev.filter((a) => a.id !== attachment.id),\n );\n },\n }),\n ),\n ),\n );\n\n const removePendingAttachments = async (removed: readonly Attachment[]) => {\n if (!attachmentAdapter) return;\n await Promise.all(\n removed\n .filter((a) => a.status.type !== \"complete\")\n .map((a) => attachmentAdapter.remove(a)),\n );\n };\n\n const upsertAttachment = (attachment: Attachment) => {\n setAttachments((prev) => {\n const idx = prev.findIndex((a) => a.id === attachment.id);\n if (idx === -1) return [...prev, attachment];\n const next = [...prev];\n next[idx] = attachment;\n return next;\n });\n };\n\n const queueItems = queue?.items ?? EMPTY_QUEUE_ITEMS;\n const queueItemClients = useClientLookup(\n queueItems.map((item) =>\n withKey(\n item.id,\n QueueItemClient({\n item,\n onSteer: () => queue?.steer(item.id),\n onRemove: () => queue?.remove(item.id),\n }),\n ),\n ),\n );\n\n const state = useMemo(() => {\n const isEmpty = !text.trim() && !attachments.length;\n return {\n text,\n role,\n attachments: attachmentClients.state,\n runConfig,\n isEditing,\n canCancel,\n canSend: isEditing && !isEmpty && !isSendDisabled,\n attachmentAccept: attachmentAdapter?.accept ?? \"*\",\n isEmpty,\n type,\n dictation: undefined,\n quote,\n queue: queueItems,\n };\n }, [\n text,\n role,\n attachmentClients.state,\n runConfig,\n isEditing,\n canCancel,\n isSendDisabled,\n type,\n attachments.length,\n quote,\n queueItems,\n attachmentAdapter?.accept,\n ]);\n\n return {\n getState: () => state,\n setText,\n setRole,\n setRunConfig,\n addAttachment: async (fileOrAttachment: File | CreateAttachment) => {\n if (attachmentAdapter) {\n const file = isCreateAttachment(fileOrAttachment)\n ? {\n name: fileOrAttachment.name,\n type: fileOrAttachment.contentType ?? \"\",\n }\n : { name: fileOrAttachment.name, type: fileOrAttachment.type };\n if (!fileMatchesAccept(file, attachmentAdapter.accept))\n throw new Error(\n `File type ${file.type || \"unknown\"} is not accepted. Accepted types: ${attachmentAdapter.accept}`,\n );\n }\n if (!isCreateAttachment(fileOrAttachment) && attachmentAdapter) {\n await drainAdapterAdd(\n attachmentAdapter.add({ file: fileOrAttachment }),\n upsertAttachment,\n );\n } else if (!isCreateAttachment(fileOrAttachment)) {\n const newAttachment: Attachment = {\n id: Math.random().toString(36).substring(7),\n type: \"file\",\n name: fileOrAttachment.name,\n contentType: fileOrAttachment.type,\n file: fileOrAttachment,\n status: { type: \"complete\" },\n content: [],\n };\n setAttachments((prev) => [...prev, newAttachment]);\n } else {\n const newAttachment: Attachment = {\n id: fileOrAttachment.id ?? Math.random().toString(36).substring(7),\n type: fileOrAttachment.type ?? \"document\",\n name: fileOrAttachment.name,\n contentType: fileOrAttachment.contentType,\n content: fileOrAttachment.content,\n status: { type: \"complete\" },\n };\n setAttachments((prev) => [...prev, newAttachment]);\n }\n },\n clearAttachments: async () => {\n const removed = attachmentsRef.current;\n setAttachments([]);\n await removePendingAttachments(removed);\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachmentClients.get({ key: selector.id });\n }\n return attachmentClients.get(selector);\n },\n reset: async () => {\n const removed = attachmentsRef.current;\n setText(\"\");\n setRole(\"user\");\n setRunConfig({});\n setAttachments([]);\n setQuote(undefined);\n await removePendingAttachments(removed);\n },\n send: (opts?: ComposerSendOptions) => {\n const currentQuote = quoteRef.current;\n const currentText = textRef.current;\n const currentAttachments = attachmentsRef.current;\n const isEmpty = !currentText.trim() && !currentAttachments.length;\n if (!isEditing || isEmpty || isSendDisabled) return;\n\n setText(\"\");\n setAttachments([]);\n setQuote(undefined);\n\n const dispatch = (sendAttachments: readonly Attachment[]) => {\n const composedMessage: AppendMessage = {\n role: roleRef.current,\n content: currentText\n ? [{ type: \"text\" as const, text: currentText }]\n : [],\n attachments: sendAttachments as any,\n createdAt: new Date(),\n parentId: null,\n sourceId: null,\n runConfig: runConfigRef.current,\n startRun: opts?.startRun,\n metadata: {\n custom: { ...(currentQuote ? { quote: currentQuote } : {}) },\n },\n };\n if (queue) {\n queue.enqueue(composedMessage, { steer: opts?.steer ?? false });\n } else {\n onSend?.(composedMessage);\n }\n };\n\n if (attachmentAdapter && currentAttachments.length > 0) {\n void Promise.all(\n currentAttachments.map((attachment) =>\n attachment.status.type === \"complete\"\n ? attachment\n : attachmentAdapter.send(attachment as PendingAttachment),\n ),\n ).then(dispatch, (error) => {\n // Upload failed: merge the failed send back into the draft.\n setText((prev) =>\n currentText && prev\n ? currentText + \"\\n\" + prev\n : currentText || prev,\n );\n setQuote((prev) => prev ?? currentQuote);\n setAttachments((prev) => [...currentAttachments, ...prev]);\n console.error(\"Failed to send attachments\", error);\n });\n } else {\n dispatch(currentAttachments);\n }\n },\n cancel: onCancel,\n beginEdit: () => {\n onBeginEdit?.();\n },\n startDictation: () => {},\n stopDictation: () => {},\n setQuote,\n queueItem: (selector: { index: number }) => {\n return queueItemClients.get(selector);\n },\n };\n};\n\nconst ComposerClientResource = resource(useComposerClientResource);\n\nconst dedupeMessagesById = (messages: readonly ExternalThreadMessage[]) => {\n const seenIds = new Set<string>();\n const deduped: ExternalThreadMessage[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (seenIds.has(message.id)) {\n console.warn(\n `ExternalThread: duplicate message id \"${message.id}\" in the provided messages array; keeping the last occurrence.`,\n );\n continue;\n }\n seenIds.add(message.id);\n deduped.push(message);\n }\n return deduped.length === messages.length ? messages : deduped.reverse();\n};\n\n// External Thread Client\nconst useExternalThread = ({\n messages: messagesProp,\n isRunning = false,\n isLoading = false,\n state: threadState,\n extras,\n isSendDisabled = false,\n onNew,\n onEdit,\n onReload,\n onStartRun,\n onCancel,\n onResume,\n onAddToolResult,\n onResumeToolCall,\n onLoadExternalState,\n attachmentAdapter,\n queue,\n branches,\n onRespondToToolApproval,\n}: ExternalThreadProps): ClientOutput<\"thread\"> => {\n const messages = useMemo(\n () => dedupeMessagesById(messagesProp),\n [messagesProp],\n );\n\n const handleReload = (messageId: string) => {\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) return;\n\n const parentId = messageIndex > 0 ? messages[messageIndex - 1]!.id : null;\n queue?.clear(\"reload\");\n onReload?.(parentId);\n };\n\n const messageClients = useClientLookup(\n messages.map((msg, index) => {\n const props: MessageClientProps = {\n message: msg,\n index,\n parentId: index > 0 ? messages[index - 1]!.id : null,\n onReload: () => handleReload(msg.id),\n queue,\n branches,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n attachmentAdapter,\n };\n if (onEdit) props.onEdit = onEdit;\n return withKey(msg.id, MessageClient(props));\n }),\n );\n\n const handleCancelRun = () => {\n queue?.clear(\"cancel-run\");\n onCancel?.();\n };\n\n const handleSendNew = (message: AppendMessage) => {\n // The composer does not know the thread; stamp the current head as the\n // parent (legacy composer parity).\n onNew?.({ ...message, parentId: messages.at(-1)?.id ?? null });\n };\n\n const headId = messages.at(-1)?.id ?? null;\n const composerQueue = useMemo(\n (): ExternalThreadQueueAdapter | undefined =>\n queue && {\n ...queue,\n enqueue: (message, options) =>\n queue.enqueue(\n { ...message, parentId: message.parentId ?? headId },\n options,\n ),\n },\n [queue, headId],\n );\n\n const composerClient = useClientResource(\n ComposerClientResource({\n type: \"thread\",\n isEditing: true,\n canCancel: isRunning,\n isSendDisabled,\n onCancel: handleCancelRun,\n onSend: handleSendNew,\n queue: composerQueue,\n attachmentAdapter,\n }),\n );\n\n const hasQueue = !!queue;\n const hasBranches = !!branches;\n const hasEdit = !!onEdit;\n const hasReload = !!onReload;\n const hasAttachments = !!attachmentAdapter;\n const state = useMemo(() => {\n const messageStates = messageClients.state.map((s, idx, arr) => ({\n ...s,\n isLast: idx === arr.length - 1,\n }));\n\n return {\n isEmpty: messages.length === 0,\n isDisabled: false,\n isLoading,\n isRunning,\n capabilities: {\n edit: hasEdit,\n delete: false,\n reload: hasReload,\n cancel: isRunning,\n speech: false,\n attachments: hasAttachments,\n feedback: false,\n voice: false,\n switchToBranch: hasBranches,\n switchBranchDuringRun: false,\n unstable_copy: false,\n dictation: false,\n queue: hasQueue,\n },\n messages: messageStates,\n state: threadState ?? {},\n suggestions: [],\n extras,\n speech: undefined,\n voice: undefined,\n composer: composerClient.state,\n };\n }, [\n messages,\n isRunning,\n isLoading,\n threadState,\n extras,\n hasQueue,\n hasBranches,\n hasEdit,\n hasReload,\n hasAttachments,\n messageClients.state,\n composerClient.state,\n ]);\n\n return {\n getState: () => state,\n composer: () => composerClient.methods,\n append: (message) => {\n const appendMessage: AppendMessage =\n typeof message === \"string\"\n ? {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n }\n : {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\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 };\n if (queue) {\n queue.enqueue(appendMessage, { steer: false });\n } else {\n onNew?.(appendMessage);\n }\n },\n deleteMessage: () => {},\n startRun: () => {\n onStartRun?.();\n },\n resumeRun: () => {\n if (!onResume)\n throw new Error(\n \"Runtime does not support resuming runs (onResume is not set).\",\n );\n onResume();\n },\n cancelRun: handleCancelRun,\n importExternalState: (state: unknown) => {\n if (!onLoadExternalState)\n throw new Error(\n \"Runtime does not support importing external states (onLoadExternalState is not set).\",\n );\n onLoadExternalState(state);\n },\n getModelContext: () => ({ tools: {}, config: {} }),\n export: () => ({ messages: [] }),\n import: () => {},\n reset: () => {},\n message: (selector) => {\n if (\"id\" in selector) {\n return messageClients.get({ key: selector.id });\n }\n return messageClients.get(selector);\n },\n stopSpeaking: () => {},\n connectVoice: () => {},\n disconnectVoice: () => {},\n getVoiceVolume: () => 0,\n subscribeVoiceVolume: () => () => {},\n muteVoice: () => {},\n unmuteVoice: () => {},\n };\n};\n\nexport const ExternalThread = resource(useExternalThread);\n\nattachTransformScopes(useExternalThread, (scopes, parent) => {\n if (!scopes.threads && parent.threads.source === null) {\n const threadElement = scopes.thread as ClientElement<\"thread\">;\n scopes.threads = SingleThreadList({ thread: threadElement });\n // scopes mount in key order; re-declare thread after the threads source it resolves from\n delete scopes.thread;\n scopes.thread = Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.thread(\"main\"),\n });\n }\n\n if (!scopes.threadListItem && parent.threadListItem.source === null) {\n scopes.threadListItem = Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.item(\"main\"),\n });\n }\n\n scopes.composer ??= Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.thread.composer(),\n });\n\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n if (!scopes.suggestions && parent.suggestions.source === null) {\n scopes.suggestions = Suggestions();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"ExternalThread.js","names":["useState","useMemo","useEffect","useEffectEvent","useCallback","useRef","resource","withKey","ClientElement","ClientOutput","useClientLookup","attachTransformScopes","useClientResource","Derived","AddToolResultOptions","AppendMessage","Attachment","AttachmentAdapter","CreateAttachment","PendingAttachment","RespondToToolApprovalOptions","ResumeToolCallOptions","MessagePartStatus","ThreadAssistantMessagePart","ThreadUserMessagePart","ThreadMessage","ToolCallMessagePartStatus","ExternalThreadQueueAdapter","ExternalThreadBranchAdapter","ToolResponse","ReadonlyJSONValue","QueueItemState","ComposerSendOptions","fileMatchesAccept","getThreadMessageText","isCreateAttachment","resolveToolApprovalResponse","toMessagePartStatus","ModelContext","Suggestions","Tools","DataRenderers","SingleThreadList","EMPTY_QUEUE_ITEMS","EMPTY_BRANCH_IDS","ExternalThreadMessage","id","COMPLETE_STATUS","Object","freeze","type","derivePartStatus","message","partIndex","part","status","ExternalThreadProps","messages","isRunning","isLoading","state","extras","isSendDisabled","onNew","onEdit","onReload","parentId","onStartRun","onCancel","onResume","onAddToolResult","options","onResumeToolCall","onLoadExternalState","attachmentAdapter","queue","branches","onRespondToToolApproval","MessageClientProps","index","useMessageClient","t0","$","_c","isCopied","setIsCopied","isHovering","setIsHovering","isEditing","setIsEditing","t1","content","map","idx","PartResource","messageId","partClients","t2","attachments","t3","_temp2","attachmentClients","t4","Symbol","for","handleBeginEdit","t5","handleCancelEdit","t6","msg","clear","sourceId","handleSendEdit","t7","ComposerClientResource","canCancel","onBeginEdit","onSend","composerClient","branchIds","t8","getBranches","indexOf","branchIndex","branchNumber","branchCount","length","t9","t10","isLast","speech","undefined","parts","composer","t11","t12","methods","t13","t14","t15","position","branchId","target","switchToBranch","t16","selector","get","findIndex","p","toolCallId","t17","selector_0","key","t18","getState","delete","_temp3","reload","speak","_temp4","stopSpeaking","_temp5","submitFeedback","_temp6","getCopyText","attachment","MessageClient","PartResourceProps","usePartResource","result","Error","response","toResponse","toolName","isError","artifact","modelContent","payload","response_0","approval","approved","resolution","addToolResult","resumeToolCall","respondToToolApproval","AttachmentResourceProps","onRemove","Promise","useAttachmentResource","remove","AttachmentResource","ComposerClientResourceProps","useQueueItemClient","item","onSteer","steer","QueueItemClient","drainAdapterAdd","ReturnType","upsert","asyncIterator","useLiveState","initial","setState","ref","next","current","prev","T","set","const","useComposerClientResource","text","setText","textRef","role","setRole","roleRef","runConfig","setRunConfig","runConfigRef","setAttachments","attachmentsRef","quote","setQuote","quoteRef","textParts","filter","_temp7","messageText","_temp8","join","updateFromMessage","a","removed","all","_temp9","a_1","removePendingAttachments","attachment_0","prev_0","a_2","upsertAttachment","queueItems","items","queueItemClients","accept","trim","isEmpty","canSend","attachmentAccept","dictation","fileOrAttachment","file","name","contentType","add","newAttachment","Math","random","toString","substring","prev_1","newAttachment_0","prev_2","removed_0","t19","removed_1","t20","opts","currentQuote","currentText","currentAttachments","isEmpty_0","dispatch","sendAttachments","composedMessage","createdAt","Date","startRun","metadata","custom","enqueue","attachment_1","send","then","error","prev_3","prev_4","prev_5","console","t21","t22","t23","addAttachment","clearAttachments","reset","cancel","beginEdit","startDictation","_temp0","stopDictation","_temp1","queueItem","dedupeMessagesById","seenIds","Set","deduped","i","has","warn","push","reverse","useExternalThread","messagesProp","threadState","messageIndex","m","handleReload","props","messageClients","handleCancelRun","at","handleSendNew","headId","message_0","composerQueue","hasQueue","hasBranches","hasEdit","hasReload","hasAttachments","_temp10","messageStates","edit","feedback","voice","switchBranchDuringRun","unstable_copy","isDisabled","capabilities","suggestions","message_1","appendMessage","state_0","t24","t25","append","deleteMessage","_temp11","resumeRun","cancelRun","importExternalState","getModelContext","_temp12","export","_temp13","import","_temp14","_temp15","_temp16","connectVoice","_temp17","disconnectVoice","_temp18","getVoiceVolume","_temp19","subscribeVoiceVolume","_temp21","muteVoice","_temp22","unmuteVoice","_temp23","ExternalThread","scopes","parent","threads","source","threadElement","thread","query","aui","threadListItem","modelContext","tools","dataRenderers","_temp","part_0","a_0","s","arr","config","_temp20"],"sources":["../../src/client/ExternalThread.ts"],"sourcesContent":["import {\n useState,\n useMemo,\n useEffect,\n useEffectEvent,\n useCallback,\n useRef,\n} from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport {\n type ClientElement,\n type ClientOutput,\n useClientLookup,\n attachTransformScopes,\n useClientResource,\n Derived,\n} from \"@assistant-ui/store\";\n\nimport type {\n AddToolResultOptions,\n AppendMessage,\n Attachment,\n AttachmentAdapter,\n CreateAttachment,\n PendingAttachment,\n RespondToToolApprovalOptions,\n ResumeToolCallOptions,\n MessagePartStatus,\n ThreadAssistantMessagePart,\n ThreadUserMessagePart,\n ThreadMessage,\n ToolCallMessagePartStatus,\n ExternalThreadQueueAdapter,\n ExternalThreadBranchAdapter,\n} from \"@assistant-ui/core\";\nimport { ToolResponse } from \"assistant-stream\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport type { QueueItemState } from \"@assistant-ui/core/store\";\nimport type { ComposerSendOptions } from \"@assistant-ui/core/store\";\nimport {\n fileMatchesAccept,\n getThreadMessageText,\n isCreateAttachment,\n resolveToolApprovalResponse,\n toMessagePartStatus,\n} from \"@assistant-ui/core/internal\";\nimport { ModelContext, Suggestions } from \"@assistant-ui/core/store\";\nimport { Tools, DataRenderers } from \"@assistant-ui/core/react\";\nimport { SingleThreadList } from \"./SingleThreadList\";\n\nconst EMPTY_QUEUE_ITEMS: readonly QueueItemState[] = [];\nconst EMPTY_BRANCH_IDS: readonly string[] = [];\n\nexport type ExternalThreadMessage = ThreadMessage & {\n id: string;\n};\n\nconst COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\n\nconst derivePartStatus = (\n message: ExternalThreadMessage,\n partIndex: number,\n part: ThreadAssistantMessagePart | ThreadUserMessagePart,\n): ToolCallMessagePartStatus => {\n if (!message.status) return COMPLETE_STATUS;\n return toMessagePartStatus(message, partIndex, part);\n};\n\nexport type ExternalThreadProps = {\n messages: readonly ExternalThreadMessage[];\n isRunning?: boolean;\n isLoading?: boolean | undefined;\n state?: ReadonlyJSONValue | undefined;\n extras?: unknown;\n /**\n * Whether sending new messages is currently disabled. When `true`, the\n * thread composer's input remains usable but `send()` is a no-op and\n * `composer.canSend` is `false`. Edit composers (saving message edits)\n * intentionally ignore this flag.\n */\n isSendDisabled?: boolean;\n /**\n * Callback for new messages (non-queue runtimes).\n * @note Unused when `queue` is provided — new messages are routed through `queue.enqueue` instead.\n */\n onNew?: (message: AppendMessage) => void;\n onEdit?: (message: AppendMessage) => void;\n onReload?: (parentId: string | null) => void;\n onStartRun?: () => void;\n onCancel?: () => void;\n onResume?: (() => void) | undefined;\n onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;\n /** Callback for resuming a tool call that is waiting for human input. */\n onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;\n onLoadExternalState?: ((state: unknown) => void) | undefined;\n attachmentAdapter?: AttachmentAdapter | undefined;\n /** Queue adapter for runtimes that support message queuing and steering. */\n queue?: ExternalThreadQueueAdapter;\n /** Branch adapter for runtimes that track sibling variants of messages. */\n branches?: ExternalThreadBranchAdapter;\n /** Callback for tool approval decisions. Absent: responding to an approval throws a capability error. */\n onRespondToToolApproval?: (options: RespondToToolApprovalOptions) => void;\n};\n\ntype MessageClientProps = {\n message: ExternalThreadMessage;\n index: number;\n parentId: string | null;\n onEdit?: (message: AppendMessage) => void;\n onReload?: () => void;\n queue?: ExternalThreadQueueAdapter | undefined;\n branches?: ExternalThreadBranchAdapter | undefined;\n onRespondToToolApproval?:\n | ((options: RespondToToolApprovalOptions) => void)\n | undefined;\n onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;\n onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;\n attachmentAdapter?: AttachmentAdapter | undefined;\n};\n\n// Message Client - minimal implementation\nconst useMessageClient = ({\n message,\n index,\n parentId,\n onEdit,\n onReload,\n queue,\n branches,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n attachmentAdapter,\n}: MessageClientProps): ClientOutput<\"message\"> => {\n const [isCopied, setIsCopied] = useState(false);\n const [isHovering, setIsHovering] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n\n const partClients = useClientLookup(\n message.content.map((part, idx) =>\n withKey(\n idx,\n PartResource({\n part,\n status: derivePartStatus(message, idx, part),\n messageId: message.id,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n }),\n ),\n ),\n );\n\n const attachmentClients = useClientLookup(\n (message.attachments ?? []).map((attachment) =>\n withKey(\n attachment.id,\n AttachmentResource({\n attachment,\n onRemove: () => {},\n }),\n ),\n ),\n );\n\n const handleBeginEdit = () => {\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setIsEditing(false);\n };\n\n const handleSendEdit = (msg: AppendMessage) => {\n queue?.clear(\"edit\");\n onEdit?.({\n ...msg,\n parentId,\n sourceId: message.id,\n });\n setIsEditing(false);\n };\n\n const composerClient = useClientResource(\n ComposerClientResource({\n type: \"edit\",\n isEditing,\n canCancel: true,\n onCancel: handleCancelEdit,\n onBeginEdit: handleBeginEdit,\n onSend: handleSendEdit,\n message,\n queue,\n attachmentAdapter,\n }),\n );\n\n const branchIds = branches?.getBranches(message.id) ?? EMPTY_BRANCH_IDS;\n const branchIndex = branchIds.indexOf(message.id);\n const branchNumber = branchIndex === -1 ? 1 : branchIndex + 1;\n const branchCount = branchIndex === -1 ? 1 : branchIds.length;\n\n const state = useMemo(() => {\n return {\n ...message,\n attachments: message.attachments ?? [],\n parentId,\n isLast: false, // Will be set by thread\n branchNumber,\n branchCount,\n speech: undefined,\n parts: partClients.state,\n isCopied,\n isHovering,\n index,\n composer: composerClient.state,\n };\n }, [\n message,\n parentId,\n isCopied,\n isHovering,\n index,\n composerClient.state,\n partClients.state,\n branchNumber,\n branchCount,\n ]);\n\n return {\n getState: () => state,\n composer: () => composerClient.methods,\n delete: () => {},\n reload: () => {\n onReload?.();\n },\n speak: () => {},\n stopSpeaking: () => {},\n submitFeedback: () => {},\n switchToBranch: ({ position, branchId }) => {\n if (!branches) return;\n const target =\n branchId ??\n (branchIndex === -1\n ? undefined\n : position === \"previous\"\n ? branchIds[branchIndex - 1]\n : position === \"next\"\n ? branchIds[branchIndex + 1]\n : undefined);\n if (target !== undefined && target !== message.id)\n branches.switchToBranch(target);\n },\n getCopyText: () => getThreadMessageText(message),\n part: (selector) => {\n if (\"index\" in selector) {\n return partClients.get(selector);\n }\n const partIndex = state.parts.findIndex(\n (p) => p.type === \"tool-call\" && p.toolCallId === selector.toolCallId,\n );\n return partClients.get({ index: partIndex });\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachmentClients.get({ key: selector.id });\n }\n return attachmentClients.get(selector);\n },\n setIsCopied,\n setIsHovering,\n };\n};\n\nconst MessageClient = resource(useMessageClient);\n\ntype PartResourceProps = {\n part: ThreadAssistantMessagePart | ThreadUserMessagePart;\n status: ToolCallMessagePartStatus;\n messageId: string;\n onRespondToToolApproval?:\n | ((options: RespondToToolApprovalOptions) => void)\n | undefined;\n onAddToolResult?: ((options: AddToolResultOptions) => void) | undefined;\n onResumeToolCall?: ((options: ResumeToolCallOptions) => void) | undefined;\n};\n\n// Part Client - minimal implementation\nconst usePartResource = ({\n part,\n status,\n messageId,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n}: PartResourceProps): ClientOutput<\"part\"> => {\n const state = useMemo(\n () => ({ ...part, status: status as MessagePartStatus }),\n [part, status],\n );\n\n return {\n getState: () => state,\n addToolResult: (result) => {\n if (!onAddToolResult)\n throw new Error(\n \"Runtime does not support tool results (onAddToolResult is not set).\",\n );\n if (part.type !== \"tool-call\")\n throw new Error(\"Tried to add tool result on non-tool message part\");\n\n const response = ToolResponse.toResponse(result);\n onAddToolResult({\n messageId,\n toolName: part.toolName,\n toolCallId: part.toolCallId,\n result: response.result as ReadonlyJSONValue,\n isError: response.isError,\n ...(response.artifact !== undefined && { artifact: response.artifact }),\n ...(response.modelContent !== undefined && {\n modelContent: response.modelContent,\n }),\n });\n },\n resumeToolCall: (payload) => {\n if (!onResumeToolCall)\n throw new Error(\n \"Runtime does not support resuming tool calls (onResumeToolCall is not set).\",\n );\n if (part.type !== \"tool-call\")\n throw new Error(\"Tried to resume tool call on non-tool message part\");\n\n onResumeToolCall({ toolCallId: part.toolCallId, payload });\n },\n respondToToolApproval: (response) => {\n if (!onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n\n if (part.type !== \"tool-call\")\n throw new Error(\n \"Tried to respond to tool approval on non-tool message part\",\n );\n\n if (\n !part.approval ||\n part.approval.approved !== undefined ||\n part.approval.resolution !== undefined\n )\n throw new Error(\"Tool call has no pending approval\");\n\n onRespondToToolApproval(\n resolveToolApprovalResponse(part.approval, response),\n );\n },\n };\n};\n\nconst PartResource = resource(usePartResource);\n\ntype AttachmentResourceProps = {\n attachment: Attachment;\n onRemove?: () => void | Promise<void>;\n};\n\n// Attachment Client - minimal implementation\nconst useAttachmentResource = ({\n attachment,\n onRemove,\n}: AttachmentResourceProps): ClientOutput<\"attachment\"> => {\n return {\n getState: () => attachment,\n remove: async () => {\n await onRemove?.();\n },\n };\n};\n\nconst AttachmentResource = resource(useAttachmentResource);\n\ntype ComposerClientResourceProps = {\n type: \"thread\" | \"edit\";\n isEditing: boolean;\n canCancel: boolean;\n isSendDisabled?: boolean;\n onCancel: () => void;\n onBeginEdit?: () => void;\n onSend?: (message: AppendMessage) => void;\n message?: ExternalThreadMessage;\n queue?: ExternalThreadQueueAdapter | undefined;\n attachmentAdapter?: AttachmentAdapter | undefined;\n};\n\nconst useQueueItemClient = ({\n item,\n onSteer,\n onRemove,\n}: {\n item: QueueItemState;\n onSteer: () => void;\n onRemove: () => void;\n}): ClientOutput<\"queueItem\"> => {\n return {\n getState: () => item,\n steer: onSteer,\n remove: onRemove,\n };\n};\n\nconst QueueItemClient = resource(useQueueItemClient);\n\nconst drainAdapterAdd = async (\n result: ReturnType<AttachmentAdapter[\"add\"]>,\n upsert: (attachment: Attachment) => void,\n) => {\n if (Symbol.asyncIterator in result) {\n for await (const attachment of result) {\n upsert(attachment);\n }\n } else {\n upsert(await result);\n }\n};\n\n// State whose setter tracks the latest value in a ref, so imperative\n// call sequences (setText immediately followed by send) observe the write\n// before React re-renders — legacy composer parity.\nconst useLiveState = <T>(initial: T) => {\n const [state, setState] = useState(initial);\n const ref = useRef(state);\n const set = useCallback((next: T | ((prev: T) => T)) => {\n ref.current =\n typeof next === \"function\" ? (next as (prev: T) => T)(ref.current) : next;\n setState(ref.current);\n }, []);\n return [state, set, ref] as const;\n};\n\n// Composer Client - minimal implementation\nconst useComposerClientResource = ({\n type,\n isEditing,\n canCancel,\n isSendDisabled = false,\n onCancel,\n onBeginEdit,\n onSend,\n message,\n queue,\n attachmentAdapter,\n}: ComposerClientResourceProps): ClientOutput<\"composer\"> => {\n const [text, setText, textRef] = useLiveState(\"\");\n const [role, setRole, roleRef] = useLiveState<\n \"user\" | \"assistant\" | \"system\"\n >(\"user\");\n const [runConfig, setRunConfig, runConfigRef] = useLiveState<\n Record<string, unknown>\n >({});\n const [attachments, setAttachments, attachmentsRef] = useLiveState<\n readonly Attachment[]\n >([]);\n const [quote, setQuote, quoteRef] = useLiveState<\n { readonly text: string; readonly messageId: string } | undefined\n >(undefined);\n\n // Update composer values when editing begins\n const updateFromMessage = useEffectEvent(() => {\n if (message) {\n // Extract text from message content (text parts only)\n const textParts = message.content.filter((part) => part.type === \"text\");\n const messageText = textParts\n .map((part) => (\"text\" in part ? part.text : \"\"))\n .join(\"\\n\\n\");\n\n setText(messageText);\n setRole(message.role);\n setAttachments(message.attachments ?? []);\n }\n });\n\n useEffect(() => {\n if (isEditing) {\n updateFromMessage();\n }\n }, [isEditing]);\n\n const attachmentClients = useClientLookup(\n attachments.map((attachment) =>\n withKey(\n attachment.id,\n AttachmentResource({\n attachment,\n onRemove: async () => {\n await attachmentAdapter?.remove(attachment);\n setAttachments((prev) =>\n prev.filter((a) => a.id !== attachment.id),\n );\n },\n }),\n ),\n ),\n );\n\n const removePendingAttachments = async (removed: readonly Attachment[]) => {\n if (!attachmentAdapter) return;\n await Promise.all(\n removed\n .filter((a) => a.status.type !== \"complete\")\n .map((a) => attachmentAdapter.remove(a)),\n );\n };\n\n const upsertAttachment = (attachment: Attachment) => {\n setAttachments((prev) => {\n const idx = prev.findIndex((a) => a.id === attachment.id);\n if (idx === -1) return [...prev, attachment];\n const next = [...prev];\n next[idx] = attachment;\n return next;\n });\n };\n\n const queueItems = queue?.items ?? EMPTY_QUEUE_ITEMS;\n const queueItemClients = useClientLookup(\n queueItems.map((item) =>\n withKey(\n item.id,\n QueueItemClient({\n item,\n onSteer: () => queue?.steer(item.id),\n onRemove: () => queue?.remove(item.id),\n }),\n ),\n ),\n );\n\n const state = useMemo(() => {\n const isEmpty = !text.trim() && !attachments.length;\n return {\n text,\n role,\n attachments: attachmentClients.state,\n runConfig,\n isEditing,\n canCancel,\n canSend: isEditing && !isEmpty && !isSendDisabled,\n attachmentAccept: attachmentAdapter?.accept ?? \"*\",\n isEmpty,\n type,\n dictation: undefined,\n quote,\n queue: queueItems,\n };\n }, [\n text,\n role,\n attachmentClients.state,\n runConfig,\n isEditing,\n canCancel,\n isSendDisabled,\n type,\n attachments.length,\n quote,\n queueItems,\n attachmentAdapter?.accept,\n ]);\n\n return {\n getState: () => state,\n setText,\n setRole,\n setRunConfig,\n addAttachment: async (fileOrAttachment: File | CreateAttachment) => {\n if (attachmentAdapter) {\n const file = isCreateAttachment(fileOrAttachment)\n ? {\n name: fileOrAttachment.name,\n type: fileOrAttachment.contentType ?? \"\",\n }\n : { name: fileOrAttachment.name, type: fileOrAttachment.type };\n if (!fileMatchesAccept(file, attachmentAdapter.accept))\n throw new Error(\n `File type ${file.type || \"unknown\"} is not accepted. Accepted types: ${attachmentAdapter.accept}`,\n );\n }\n if (!isCreateAttachment(fileOrAttachment) && attachmentAdapter) {\n await drainAdapterAdd(\n attachmentAdapter.add({ file: fileOrAttachment }),\n upsertAttachment,\n );\n } else if (!isCreateAttachment(fileOrAttachment)) {\n const newAttachment: Attachment = {\n id: Math.random().toString(36).substring(7),\n type: \"file\",\n name: fileOrAttachment.name,\n contentType: fileOrAttachment.type,\n file: fileOrAttachment,\n status: { type: \"complete\" },\n content: [],\n };\n setAttachments((prev) => [...prev, newAttachment]);\n } else {\n const newAttachment: Attachment = {\n id: fileOrAttachment.id ?? Math.random().toString(36).substring(7),\n type: fileOrAttachment.type ?? \"document\",\n name: fileOrAttachment.name,\n contentType: fileOrAttachment.contentType,\n content: fileOrAttachment.content,\n status: { type: \"complete\" },\n };\n setAttachments((prev) => [...prev, newAttachment]);\n }\n },\n clearAttachments: async () => {\n const removed = attachmentsRef.current;\n setAttachments([]);\n await removePendingAttachments(removed);\n },\n attachment: (selector) => {\n if (\"id\" in selector) {\n return attachmentClients.get({ key: selector.id });\n }\n return attachmentClients.get(selector);\n },\n reset: async () => {\n const removed = attachmentsRef.current;\n setText(\"\");\n setRole(\"user\");\n setRunConfig({});\n setAttachments([]);\n setQuote(undefined);\n await removePendingAttachments(removed);\n },\n send: (opts?: ComposerSendOptions) => {\n const currentQuote = quoteRef.current;\n const currentText = textRef.current;\n const currentAttachments = attachmentsRef.current;\n const isEmpty = !currentText.trim() && !currentAttachments.length;\n if (!isEditing || isEmpty || isSendDisabled) return;\n\n setText(\"\");\n setAttachments([]);\n setQuote(undefined);\n\n const dispatch = (sendAttachments: readonly Attachment[]) => {\n const composedMessage: AppendMessage = {\n role: roleRef.current,\n content: currentText\n ? [{ type: \"text\" as const, text: currentText }]\n : [],\n attachments: sendAttachments as any,\n createdAt: new Date(),\n parentId: null,\n sourceId: null,\n runConfig: runConfigRef.current,\n startRun: opts?.startRun,\n metadata: {\n custom: { ...(currentQuote ? { quote: currentQuote } : {}) },\n },\n };\n if (queue) {\n queue.enqueue(composedMessage, { steer: opts?.steer ?? false });\n } else {\n onSend?.(composedMessage);\n }\n };\n\n if (attachmentAdapter && currentAttachments.length > 0) {\n void Promise.all(\n currentAttachments.map((attachment) =>\n attachment.status.type === \"complete\"\n ? attachment\n : attachmentAdapter.send(attachment as PendingAttachment),\n ),\n ).then(dispatch, (error) => {\n // Upload failed: merge the failed send back into the draft.\n setText((prev) =>\n currentText && prev\n ? currentText + \"\\n\" + prev\n : currentText || prev,\n );\n setQuote((prev) => prev ?? currentQuote);\n setAttachments((prev) => [...currentAttachments, ...prev]);\n console.error(\"Failed to send attachments\", error);\n });\n } else {\n dispatch(currentAttachments);\n }\n },\n cancel: onCancel,\n beginEdit: () => {\n onBeginEdit?.();\n },\n startDictation: () => {},\n stopDictation: () => {},\n setQuote,\n queueItem: (selector: { index: number }) => {\n return queueItemClients.get(selector);\n },\n };\n};\n\nconst ComposerClientResource = resource(useComposerClientResource);\n\nconst dedupeMessagesById = (messages: readonly ExternalThreadMessage[]) => {\n const seenIds = new Set<string>();\n const deduped: ExternalThreadMessage[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (seenIds.has(message.id)) {\n console.warn(\n `ExternalThread: duplicate message id \"${message.id}\" in the provided messages array; keeping the last occurrence.`,\n );\n continue;\n }\n seenIds.add(message.id);\n deduped.push(message);\n }\n return deduped.length === messages.length ? messages : deduped.reverse();\n};\n\n// External Thread Client\nconst useExternalThread = ({\n messages: messagesProp,\n isRunning = false,\n isLoading = false,\n state: threadState,\n extras,\n isSendDisabled = false,\n onNew,\n onEdit,\n onReload,\n onStartRun,\n onCancel,\n onResume,\n onAddToolResult,\n onResumeToolCall,\n onLoadExternalState,\n attachmentAdapter,\n queue,\n branches,\n onRespondToToolApproval,\n}: ExternalThreadProps): ClientOutput<\"thread\"> => {\n const messages = useMemo(\n () => dedupeMessagesById(messagesProp),\n [messagesProp],\n );\n\n const handleReload = (messageId: string) => {\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) return;\n\n const parentId = messageIndex > 0 ? messages[messageIndex - 1]!.id : null;\n queue?.clear(\"reload\");\n onReload?.(parentId);\n };\n\n const messageClients = useClientLookup(\n messages.map((msg, index) => {\n const props: MessageClientProps = {\n message: msg,\n index,\n parentId: index > 0 ? messages[index - 1]!.id : null,\n onReload: () => handleReload(msg.id),\n queue,\n branches,\n onRespondToToolApproval,\n onAddToolResult,\n onResumeToolCall,\n attachmentAdapter,\n };\n if (onEdit) props.onEdit = onEdit;\n return withKey(msg.id, MessageClient(props));\n }),\n );\n\n const handleCancelRun = () => {\n queue?.clear(\"cancel-run\");\n onCancel?.();\n };\n\n const handleSendNew = (message: AppendMessage) => {\n // The composer does not know the thread; stamp the current head as the\n // parent (legacy composer parity).\n onNew?.({ ...message, parentId: messages.at(-1)?.id ?? null });\n };\n\n const headId = messages.at(-1)?.id ?? null;\n const composerQueue = useMemo(\n (): ExternalThreadQueueAdapter | undefined =>\n queue && {\n ...queue,\n enqueue: (message, options) =>\n queue.enqueue(\n { ...message, parentId: message.parentId ?? headId },\n options,\n ),\n },\n [queue, headId],\n );\n\n const composerClient = useClientResource(\n ComposerClientResource({\n type: \"thread\",\n isEditing: true,\n canCancel: isRunning,\n isSendDisabled,\n onCancel: handleCancelRun,\n onSend: handleSendNew,\n queue: composerQueue,\n attachmentAdapter,\n }),\n );\n\n const hasQueue = !!queue;\n const hasBranches = !!branches;\n const hasEdit = !!onEdit;\n const hasReload = !!onReload;\n const hasAttachments = !!attachmentAdapter;\n const state = useMemo(() => {\n const messageStates = messageClients.state.map((s, idx, arr) => ({\n ...s,\n isLast: idx === arr.length - 1,\n }));\n\n return {\n isEmpty: messages.length === 0,\n isDisabled: false,\n isLoading,\n isRunning,\n capabilities: {\n edit: hasEdit,\n delete: false,\n reload: hasReload,\n cancel: isRunning,\n speech: false,\n attachments: hasAttachments,\n feedback: false,\n voice: false,\n switchToBranch: hasBranches,\n switchBranchDuringRun: false,\n unstable_copy: false,\n dictation: false,\n queue: hasQueue,\n },\n messages: messageStates,\n state: threadState ?? {},\n suggestions: [],\n extras,\n speech: undefined,\n voice: undefined,\n composer: composerClient.state,\n };\n }, [\n messages,\n isRunning,\n isLoading,\n threadState,\n extras,\n hasQueue,\n hasBranches,\n hasEdit,\n hasReload,\n hasAttachments,\n messageClients.state,\n composerClient.state,\n ]);\n\n return {\n getState: () => state,\n composer: () => composerClient.methods,\n append: (message) => {\n const appendMessage: AppendMessage =\n typeof message === \"string\"\n ? {\n createdAt: new Date(),\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n metadata: { custom: {} },\n }\n : {\n createdAt: message.createdAt ?? new Date(),\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\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 };\n if (queue) {\n queue.enqueue(appendMessage, { steer: false });\n } else {\n onNew?.(appendMessage);\n }\n },\n deleteMessage: () => {},\n startRun: () => {\n onStartRun?.();\n },\n resumeRun: () => {\n if (!onResume)\n throw new Error(\n \"Runtime does not support resuming runs (onResume is not set).\",\n );\n onResume();\n },\n cancelRun: handleCancelRun,\n importExternalState: (state: unknown) => {\n if (!onLoadExternalState)\n throw new Error(\n \"Runtime does not support importing external states (onLoadExternalState is not set).\",\n );\n onLoadExternalState(state);\n },\n getModelContext: () => ({ tools: {}, config: {} }),\n export: () => ({ messages: [] }),\n import: () => {},\n reset: () => {},\n message: (selector) => {\n if (\"id\" in selector) {\n return messageClients.get({ key: selector.id });\n }\n return messageClients.get(selector);\n },\n stopSpeaking: () => {},\n connectVoice: () => {},\n disconnectVoice: () => {},\n getVoiceVolume: () => 0,\n subscribeVoiceVolume: () => () => {},\n muteVoice: () => {},\n unmuteVoice: () => {},\n };\n};\n\nexport const ExternalThread = resource(useExternalThread);\n\nattachTransformScopes(useExternalThread, (scopes, parent) => {\n if (!scopes.threads && parent.threads.source === null) {\n const threadElement = scopes.thread as ClientElement<\"thread\">;\n scopes.threads = SingleThreadList({ thread: threadElement });\n // scopes mount in key order; re-declare thread after the threads source it resolves from\n delete scopes.thread;\n scopes.thread = Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.thread(\"main\"),\n });\n }\n\n if (!scopes.threadListItem && parent.threadListItem.source === null) {\n scopes.threadListItem = Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.item(\"main\"),\n });\n }\n\n scopes.composer ??= Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.thread.composer(),\n });\n\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n if (!scopes.suggestions && parent.suggestions.source === null) {\n scopes.suggestions = Suggestions();\n }\n});\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useAui, useAuiState } from "@assistant-ui/store";
2
+ import { useAuiState } from "@assistant-ui/store";
3
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
4
  import { useEffect, useState } from "@assistant-ui/tap/react-shim";
5
5
  //#region src/hooks/useToolCallElapsed.ts
@@ -22,48 +22,43 @@ import { useEffect, useState } from "@assistant-ui/tap/react-shim";
22
22
  * ```
23
23
  */
24
24
  const useToolCallElapsed = () => {
25
- const $ = c(7);
26
- const hasPart = useAui().part.source !== null;
25
+ const $ = c(3);
26
+ const timing = useAuiState(_temp);
27
+ const partRunning = useAuiState(_temp2);
28
+ const running = timing !== void 0 && timing.completedAt === void 0 && partRunning;
29
+ const [now, setNow] = useState(_temp3);
27
30
  let t0;
28
- if ($[0] !== hasPart) {
29
- t0 = (s) => hasPart && s.part.type === "tool-call" ? s.part.timing : void 0;
30
- $[0] = hasPart;
31
- $[1] = t0;
32
- } else t0 = $[1];
33
- const timing = useAuiState(t0);
34
31
  let t1;
35
- if ($[2] !== hasPart) {
36
- t1 = (s_0) => hasPart && s_0.part.type === "tool-call" && s_0.part.status.type === "running";
37
- $[2] = hasPart;
38
- $[3] = t1;
39
- } else t1 = $[3];
40
- const partRunning = useAuiState(t1);
41
- const running = timing !== void 0 && timing.completedAt === void 0 && partRunning;
42
- const [now, setNow] = useState(_temp);
43
- let t2;
44
- let t3;
45
- if ($[4] !== running) {
46
- t2 = () => {
32
+ if ($[0] !== running) {
33
+ t0 = () => {
47
34
  if (!running) return;
48
35
  setNow(Date.now());
49
36
  const id = setInterval(() => setNow(Date.now()), 1e3);
50
37
  return () => clearInterval(id);
51
38
  };
52
- t3 = [running];
53
- $[4] = running;
54
- $[5] = t2;
55
- $[6] = t3;
39
+ t1 = [running];
40
+ $[0] = running;
41
+ $[1] = t0;
42
+ $[2] = t1;
56
43
  } else {
57
- t2 = $[5];
58
- t3 = $[6];
44
+ t0 = $[1];
45
+ t1 = $[2];
59
46
  }
60
- useEffect(t2, t3);
47
+ useEffect(t0, t1);
61
48
  if (timing === void 0) return;
62
49
  if (timing.completedAt !== void 0) return Math.max(0, timing.completedAt - timing.startedAt);
63
50
  if (!running) return;
64
51
  return Math.max(0, now - timing.startedAt);
65
52
  };
66
- function _temp() {
53
+ function _temp(s) {
54
+ const part = s.optional.part;
55
+ return part?.type === "tool-call" ? part.timing : void 0;
56
+ }
57
+ function _temp2(s_0) {
58
+ const part_0 = s_0.optional.part;
59
+ return part_0?.type === "tool-call" && part_0.status.type === "running";
60
+ }
61
+ function _temp3() {
67
62
  return Date.now();
68
63
  }
69
64
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useToolCallElapsed.js","names":["c","_c","useEffect","useState","useAui","useAuiState","useToolCallElapsed","$","aui","hasPart","part","source","t0","s","type","timing","undefined","t1","s_0","status","partRunning","running","completedAt","now","setNow","_temp","t2","t3","Date","id","setInterval","clearInterval","Math","max","startedAt"],"sources":["../../src/hooks/useToolCallElapsed.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\n/**\n * Hook that returns the elapsed wall-clock time of the current tool call in\n * milliseconds, ticking once per second while the call runs.\n *\n * Reads `part.timing`. Returns `undefined` when the part is not a tool call,\n * carries no timing, ended without a recorded completion (the duration is\n * unknown), or when no message part scope is available (so kit components\n * stay renderable standalone, e.g. in docs previews).\n *\n * @example\n * ```tsx\n * function ToolDuration() {\n * const elapsedMs = useToolCallElapsed();\n * if (elapsedMs === undefined) return null;\n * return <span>{(elapsedMs / 1000).toFixed(1)}s</span>;\n * }\n * ```\n */\nexport const useToolCallElapsed = (): number | undefined => {\n const aui = useAui();\n const hasPart = aui.part.source !== null;\n const timing = useAuiState((s) =>\n hasPart && s.part.type === \"tool-call\" ? s.part.timing : undefined,\n );\n const partRunning = useAuiState(\n (s) =>\n hasPart &&\n s.part.type === \"tool-call\" &&\n s.part.status.type === \"running\",\n );\n const running =\n timing !== undefined && timing.completedAt === undefined && partRunning;\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (!running) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [running]);\n\n if (timing === undefined) return undefined;\n if (timing.completedAt !== undefined)\n return Math.max(0, timing.completedAt - timing.startedAt);\n if (!running) return undefined;\n return Math.max(0, now - timing.startedAt);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAaM,2BAAqB;CAAA,MAAAC,IAAAN,EAAA,CAAA;CAEhC,MAAAQ,UADYL,OACII,CAAG,CAAAE,KAAKC,WAAY;CAAK,IAAAC;CAAA,IAAAL,EAAA,OAAAE,SAAA;EACdG,MAAAC,MACzBJ,WAAWI,EAACH,KAAKI,SAAU,cAAcD,EAACH,KAAKK,SAA/CC,KAAAA;EAAkET,EAAA,KAAAE;EAAAF,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CADpE,MAAAQ,SAAeV,YAAYO,EAE3B;CAAE,IAAAK;CAAA,IAAAV,EAAA,OAAAE,SAAA;EAEAQ,MAAAC,QACET,WACAI,IAACH,KAAKI,SAAU,eAChBD,IAACH,KAAKS,OAAOL,SAAU;EAASP,EAAA,KAAAE;EAAAF,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAJpC,MAAAa,cAAoBf,YAClBY,EAIF;CACA,MAAAI,UACEN,WAAWC,KAAAA,KAAaD,OAAMO,gBAAiBN,KAAAA,KAA/CI;CACF,MAAA,CAAAG,KAAAC,UAAsBrB,SAASsB,KAAgB;CAAE,IAAAC;CAAA,IAAAC;CAAA,IAAApB,EAAA,OAAAc,SAAA;EAEvCK,WAAA;GACR,IAAI,CAACL,SAAO;GACZG,OAAOI,KAAIL,IAAK,CAAC;GACjB,MAAAM,KAAWC,kBAAkBN,OAAOI,KAAIL,IAAK,CAAC,GAAG,GAAI;GAAE,aAC1CQ,cAAcF,EAAE;EAAC;EAC7BF,KAAA,CAACN,OAAO;EAACd,EAAA,KAAAc;EAAAd,EAAA,KAAAmB;EAAAnB,EAAA,KAAAoB;CAAA,OAAA;EAAAD,KAAAnB,EAAA;EAAAoB,KAAApB,EAAA;CAAA;CALZL,UAAUwB,IAKPC,EAAS;CAEZ,IAAIZ,WAAWC,KAAAA,GAAS;CACxB,IAAID,OAAMO,gBAAiBN,KAAAA,GAAS,OAC3BgB,KAAIC,IAAK,GAAGlB,OAAMO,cAAeP,OAAMmB,SAAU;CAC1D,IAAI,CAACb,SAAO;CAAmB,OACxBW,KAAIC,IAAK,GAAGV,MAAMR,OAAMmB,SAAU;AAAC;AA3BV,SAAAT,QAAA;CAAA,OAcKG,KAAIL,IAAK;AAAC"}
1
+ {"version":3,"file":"useToolCallElapsed.js","names":["c","_c","useEffect","useState","useAuiState","useToolCallElapsed","$","timing","_temp","partRunning","_temp2","running","undefined","completedAt","now","setNow","_temp3","t0","t1","Date","id","setInterval","clearInterval","Math","max","startedAt","s","part","optional","type","s_0","part_0","status"],"sources":["../../src/hooks/useToolCallElapsed.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\n/**\n * Hook that returns the elapsed wall-clock time of the current tool call in\n * milliseconds, ticking once per second while the call runs.\n *\n * Reads `part.timing`. Returns `undefined` when the part is not a tool call,\n * carries no timing, ended without a recorded completion (the duration is\n * unknown), or when no message part scope is available (so kit components\n * stay renderable standalone, e.g. in docs previews).\n *\n * @example\n * ```tsx\n * function ToolDuration() {\n * const elapsedMs = useToolCallElapsed();\n * if (elapsedMs === undefined) return null;\n * return <span>{(elapsedMs / 1000).toFixed(1)}s</span>;\n * }\n * ```\n */\nexport const useToolCallElapsed = (): number | undefined => {\n const timing = useAuiState((s) => {\n const part = s.optional.part;\n return part?.type === \"tool-call\" ? part.timing : undefined;\n });\n const partRunning = useAuiState((s) => {\n const part = s.optional.part;\n return part?.type === \"tool-call\" && part.status.type === \"running\";\n });\n const running =\n timing !== undefined && timing.completedAt === undefined && partRunning;\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (!running) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [running]);\n\n if (timing === undefined) return undefined;\n if (timing.completedAt !== undefined)\n return Math.max(0, timing.completedAt - timing.startedAt);\n if (!running) return undefined;\n return Math.max(0, now - timing.startedAt);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAaK,2BAAqB;CAAA,MAAAC,IAAAL,EAAA,CAAA;CAChC,MAAAM,SAAeH,YAAYI,KAG1B;CACD,MAAAC,cAAoBL,YAAYM,MAG/B;CACD,MAAAC,UACEJ,WAAWK,KAAAA,KAAaL,OAAMM,gBAAiBD,KAAAA,KAA/CH;CACF,MAAA,CAAAK,KAAAC,UAAsBZ,SAASa,MAAgB;CAAE,IAAAC;CAAA,IAAAC;CAAA,IAAAZ,EAAA,OAAAK,SAAA;EAEvCM,WAAA;GACR,IAAI,CAACN,SAAO;GACZI,OAAOI,KAAIL,IAAK,CAAC;GACjB,MAAAM,KAAWC,kBAAkBN,OAAOI,KAAIL,IAAK,CAAC,GAAG,GAAI;GAAE,aAC1CQ,cAAcF,EAAE;EAAC;EAC7BF,KAAA,CAACP,OAAO;EAACL,EAAA,KAAAK;EAAAL,EAAA,KAAAW;EAAAX,EAAA,KAAAY;CAAA,OAAA;EAAAD,KAAAX,EAAA;EAAAY,KAAAZ,EAAA;CAAA;CALZJ,UAAUe,IAKPC,EAAS;CAEZ,IAAIX,WAAWK,KAAAA,GAAS;CACxB,IAAIL,OAAMM,gBAAiBD,KAAAA,GAAS,OAC3BW,KAAIC,IAAK,GAAGjB,OAAMM,cAAeN,OAAMkB,SAAU;CAC1D,IAAI,CAACd,SAAO;CAAmB,OACxBY,KAAIC,IAAK,GAAGV,MAAMP,OAAMkB,SAAU;AAAC;AAxBV,SAAAjB,MAAAkB,GAAA;CAE9B,MAAAC,OAAaD,EAACE,SAASD;CAAM,OACtBA,MAAIE,SAAW,cAAcF,KAAIpB,SAAjCK,KAAAA;AAAoD;AAH7B,SAAAF,OAAAoB,KAAA;CAM9B,MAAAC,SAAaL,IAACE,SAASD;CAAM,OACtBA,QAAIE,SAAW,eAAeF,OAAIK,OAAOH,SAAU;AAAS;AAPrC,SAAAb,SAAA;CAAA,OAWKG,KAAIL,IAAK;AAAC"}
package/dist/index.d.ts CHANGED
@@ -77,7 +77,7 @@ import "./mcp-apps/index.js";
77
77
  import { AssistantClient, AssistantEventCallback, AssistantEventName, AssistantEventPayload, AssistantEventScope, AssistantEventSelector, AssistantState, AuiIf, AuiProvider, useAui, useAuiEvent, useAuiState } from "@assistant-ui/store";
78
78
  import { AssistantContextConfig, AssistantDataUI, AssistantDataUIProps, AssistantInteractableProps, AssistantTool, AssistantToolProps, AssistantToolUI, AssistantToolUIProps, DataMessagePartComponent, DataMessagePartProps, DataRenderers, EmptyMessagePartComponent, EmptyMessagePartProps, EnrichedPartState, FileMessagePartComponent, FileMessagePartProps, GenerativeUIComponentRegistry, GenerativeUIMessagePartComponent, GenerativeUIMessagePartProps, GenerativeUIRender, GenerativeUIRenderError, GenerativeUIRenderProps, GroupByContext, ImageMessagePartComponent, ImageMessagePartProps, Interactables, McpAppResourceOutput, McpToolkitDefinition, McpToolkitEntry, McpToolkitToolConfig, PartState, ProviderToolConfig, QuoteMessagePartComponent, QuoteMessagePartProps, ReasoningGroupComponent, ReasoningGroupProps, ReasoningMessagePartComponent, ReasoningMessagePartProps, RuntimeAdapterProvider, RuntimeAdapters, SourceMessagePartComponent, SourceMessagePartProps, TextMessagePartComponent, TextMessagePartProps, ToolArgsStatus, ToolCallMessagePartComponent, ToolCallMessagePartProps, ToolCallText, ToolDefinition, Toolkit, ToolkitDefinition, ToolkitDefinitionEntry, Tools, Unstable_AudioMessagePartComponent, Unstable_AudioMessagePartProps, Unstable_InferInteractableState, Unstable_InteractableConfig, Unstable_InteractableDefinition, Unstable_InteractablePersistedState, Unstable_InteractablePersistenceAdapter, Unstable_InteractablePersistenceStatus, Unstable_InteractableRegistration, Unstable_InteractableStateSchema, Unstable_InteractableToolConfig, Unstable_InteractableToolRenderProps, Unstable_InteractableVersionInfo, Unstable_InteractablesClientSchema, Unstable_InteractablesConfig, Unstable_InteractablesMethods, Unstable_InteractablesState, defineMcpToolkit, defineToolkit, externalTool, groupPartByType, hitl, hitlTool, humanTool, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, providerTool, stubTool, unstable_Interactables, unstable_interactableTool, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useThreadMessageIds, useAssistantContext, useAssistantDataUI, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAuiToolOverrides, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useRuntimeAdapters, useToolArgsStatus, useVoiceControls, useVoiceState, useVoiceVolume } from "@assistant-ui/core/react";
79
79
  import { AssistantCloud } from "assistant-cloud";
80
- import { AddToolResultOptions, AppendMessage, AssistantFrameHost, AssistantFrameProvider, AssistantRuntime, Attachment, AttachmentAdapter, AttachmentRuntime, AttachmentState, AttachmentStatus, ChatModelAdapter, ChatModelRunOptions, ChatModelRunResult, ChatModelRunUpdate, CompleteAttachment, ComposerRuntime, ComposerState, CompositeAttachmentAdapter, CreateAppendMessage, CreateAttachment, CreateResumeRunConfig, CreateStartRunConfig, DataMessagePart, DictationAdapter, DictationState, EditComposerRuntime, EditComposerState, ExportedMessageRepository, ExportedMessageRepositoryItem, ExternalStoreAdapter, ExternalStoreBranchChange, ExternalStoreMessageConverter, ExternalStoreSharedOptions, ExternalStoreThreadData, ExternalStoreThreadListAdapter, ExternalThreadBranchAdapter, ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, FeedbackAdapter, FileMessagePart, FrameMessage, FrameMessageType, GenerativeUIMessagePart, GenerativeUINode, GenerativeUISpec, GenericThreadHistoryAdapter, ImageMessagePart, InMemoryThreadListAdapter, LanguageModelConfig, LanguageModelV1CallSettings, LocalRuntimeOptionsBase, MessageFormatAdapter, MessageFormatItem, MessageFormatRepository, MessagePartRuntime, MessagePartState, MessagePartStatus, MessageQueueController, MessageQueueDriver, MessageRuntime, MessageState, MessageStatus, MessageStorageEntry, MessageTiming, ModelContext, ModelContextProvider, ModelContextRegistry, ModelContextRegistryInstructionHandle, ModelContextRegistryProviderHandle, ModelContextRegistryToolHandle, PartProviderMetadata, PendingAttachment, QuoteInfo, RealtimeVoiceAdapter, ReasoningMessagePart, RemoteThreadListAdapter, RespondToToolApprovalOptions, SerializedModelContext, SerializedTool, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SourceMessagePart, SourceProviderMetadata, SpeechSynthesisAdapter, SubmitFeedbackOptions, SuggestionAdapter, TextMessagePart, ThreadAssistantMessage, ThreadAssistantMessagePart, ThreadComposerRuntime, ThreadComposerState, ThreadHistoryAdapter, ThreadListItemRuntime, ThreadListItemState, ThreadListItemStatus, ThreadListRuntime, ThreadListState, ThreadMessage, ThreadMessageLike, ThreadRuntime, ThreadState, ThreadSuggestion, ThreadSystemMessage, ThreadUserMessage, ThreadUserMessagePart, ToolApprovalOption, ToolApprovalOptionKind, ToolApprovalResponse, ToolCallMessagePart, ToolCallMessagePartStatus, ToolCallTiming, ToolModelContentPart, Unstable_AudioMessagePart, Unstable_DirectiveFormatter, Unstable_DirectiveSegment, Unstable_InteractableSnapshotEntry, Unstable_InteractableVersion, Unstable_TriggerItem, Unsubscribe, VoiceSessionControls, VoiceSessionHelpers, VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createVoiceSession, fromThreadMessageLike, generateId, getExternalStoreMessages, mergeModelContexts, pickExternalStoreSharedOptions, tool, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions } from "@assistant-ui/core";
80
+ import { AddToolResultOptions, AppendMessage, AssistantFrameHost, AssistantFrameProvider, AssistantRuntime, Attachment, AttachmentAdapter, AttachmentRuntime, AttachmentState, AttachmentStatus, ChatModelAdapter, ChatModelRunOptions, ChatModelRunResult, ChatModelRunUpdate, CompleteAttachment, ComposerRuntime, ComposerState, CompositeAttachmentAdapter, CreateAppendMessage, CreateAttachment, CreateResumeRunConfig, CreateStartRunConfig, DataMessagePart, DictationAdapter, DictationState, EditComposerRuntime, EditComposerState, ExportedMessageRepository, ExportedMessageRepositoryItem, ExternalStoreAdapter, ExternalStoreBranchChange, ExternalStoreMessageConverter, ExternalStoreSharedOptions, ExternalStoreThreadData, ExternalStoreThreadListAdapter, ExternalThreadBranchAdapter, ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, FeedbackAdapter, FileMessagePart, FrameMessage, FrameMessageType, GenerativeUIMessagePart, GenerativeUINode, GenerativeUISpec, GenericThreadHistoryAdapter, ImageMessagePart, InMemoryThreadListAdapter, LanguageModelConfig, LanguageModelV1CallSettings, LocalRuntimeOptionsBase, MessageFormatAdapter, MessageFormatItem, MessageFormatRepository, MessagePartRuntime, MessagePartState, MessagePartStatus, MessagePartStreamStatus, MessageQueueController, MessageQueueDriver, MessageRuntime, MessageState, MessageStatus, MessageStorageEntry, MessageTiming, ModelContext, ModelContextProvider, ModelContextRegistry, ModelContextRegistryInstructionHandle, ModelContextRegistryProviderHandle, ModelContextRegistryToolHandle, PartProviderMetadata, PendingAttachment, QuoteInfo, RealtimeVoiceAdapter, ReasoningMessagePart, RemoteThreadListAdapter, RespondToToolApprovalOptions, SerializedModelContext, SerializedTool, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SourceMessagePart, SourceProviderMetadata, SpeechSynthesisAdapter, SubmitFeedbackOptions, SuggestionAdapter, TextMessagePart, ThreadAssistantMessage, ThreadAssistantMessagePart, ThreadComposerRuntime, ThreadComposerState, ThreadHistoryAdapter, ThreadListItemRuntime, ThreadListItemState, ThreadListItemStatus, ThreadListRuntime, ThreadListState, ThreadMessage, ThreadMessageLike, ThreadRuntime, ThreadState, ThreadSuggestion, ThreadSystemMessage, ThreadUserMessage, ThreadUserMessagePart, ToolApprovalOption, ToolApprovalOptionKind, ToolApprovalResponse, ToolCallMessagePart, ToolCallMessagePartStatus, ToolCallTiming, ToolModelContentPart, Unstable_AudioMessagePart, Unstable_DirectiveFormatter, Unstable_DirectiveSegment, Unstable_InteractableSnapshotEntry, Unstable_InteractableVersion, Unstable_TriggerItem, Unsubscribe, VoiceSessionControls, VoiceSessionHelpers, VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createVoiceSession, fromThreadMessageLike, generateId, getExternalStoreMessages, mergeModelContexts, pickExternalStoreSharedOptions, tool, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions } from "@assistant-ui/core";
81
81
  import { Tool } from "assistant-stream";
82
82
  import { ChainOfThoughtClient, ComposerSendOptions, ModelContext as ModelContextClient, QueueItemMethods, QueueItemState, SuggestionConfig, Suggestions } from "@assistant-ui/core/store";
83
- export { actionBarMore_d_exports as ActionBarMorePrimitive, actionBar_d_exports as ActionBarPrimitive, type AddToolResultOptions, type AppendMessage, type Assistant, type AssistantClient, AssistantCloud, type AssistantContextConfig, type AssistantDataUI, type AssistantDataUIProps, type AssistantEventCallback, type AssistantEventName, type AssistantEventPayload, type AssistantEventScope, type AssistantEventSelector, AssistantFrameHost, AssistantFrameProvider, type AssistantInteractableProps, assistantModal_d_exports as AssistantModalPrimitive, type AssistantRuntime, AssistantRuntimeProvider, type AssistantState, type AssistantTool, type AssistantToolProps, type AssistantToolUI, type AssistantToolUIProps, type AssistantTransportCommand, type AssistantTransportConnectionMetadata, type AssistantTransportProtocol, type Attachment, type AttachmentAdapter, attachment_d_exports as AttachmentPrimitive, type AttachmentRuntime, type AttachmentState, type AttachmentStatus, AuiIf, AuiProvider, branchPicker_d_exports as BranchPickerPrimitive, ChainOfThoughtByIndicesProvider, ChainOfThoughtClient, chainOfThought_d_exports as ChainOfThoughtPrimitive, type ChatModelAdapter, type ChatModelRunOptions, type ChatModelRunResult, type ChatModelRunUpdate, CloudFileAttachmentAdapter, type CompleteAttachment, ComposerAttachmentByIndexProvider, composer_d_exports as ComposerPrimitive, type ComposerRuntime, type ComposerSendOptions, type ComposerState, CompositeAttachmentAdapter, type CreateAppendMessage, type CreateAttachment, type CreateResumeRunConfig, type CreateStartRunConfig, type DataMessagePart, type DataMessagePartComponent, type DataMessagePartProps, DataRenderers, DevToolsHooks, DevToolsProviderApi, type DictationAdapter, type DictationState, type EditComposerRuntime, type EditComposerState, type EmptyMessagePartComponent, type EmptyMessagePartProps, type EnrichedPartState, error_d_exports as ErrorPrimitive, ExportedMessageRepository, type ExportedMessageRepositoryItem, type ExternalStoreAdapter, type ExternalStoreBranchChange, type ExternalStoreMessageConverter, type ExternalStoreSharedOptions, type ExternalStoreThreadData, type ExternalStoreThreadListAdapter, ExternalThread, type ExternalThreadBranchAdapter, type ExternalThreadMessage, type ExternalThreadProps, type ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, type FeedbackAdapter, type FileMessagePart, type FileMessagePartComponent, type FileMessagePartProps, type FrameMessage, type FrameMessageType, type GenerativeUIComponentRegistry, type GenerativeUIMessagePart, type GenerativeUIMessagePartComponent, type GenerativeUIMessagePartProps, type GenerativeUINode, GenerativeUIRender, GenerativeUIRenderError, type GenerativeUIRenderProps, type GenerativeUISpec, type GenericThreadHistoryAdapter, type GroupByContext, internal_d_exports as INTERNAL, type ImageMessagePart, type ImageMessagePartComponent, type ImageMessagePartProps, InMemoryThreadList, InMemoryThreadListAdapter, type InMemoryThreadListProps, Interactables, type LanguageModelConfig, type LanguageModelV1CallSettings, type LocalRuntimeOptions, type LocalRuntimeOptionsBase, type McpAppDisplayMode, type McpAppHostContext, type McpAppHostInfo, type McpAppMetadata, McpAppRenderer, type McpAppRendererOptions, type McpAppResource, type McpAppResourceCSP, type McpAppResourceMeta, type McpAppResourceOutput, type McpAppSandboxConfig, type McpAppToolCallParams, type McpAppsHost, McpAppsRemoteHost, type McpAppsRemoteHostOptions, type McpToolkitDefinition, type McpToolkitEntry, type McpToolkitToolConfig, MessageAttachmentByIndexProvider, MessageByIndexProvider, type MessageFormatAdapter, type MessageFormatItem, type MessageFormatRepository, messagePart_d_exports as MessagePartPrimitive, type MessagePartRuntime, type MessagePartState, type MessagePartStatus, message_d_exports as MessagePrimitive, MessageProvider, type MessageQueueController, type MessageQueueDriver, type MessageRuntime, type MessageState, type MessageStatus, type MessageStorageEntry, type MessageTiming, type ModelContext, ModelContextClient, type ModelContextProvider, ModelContextRegistry, type ModelContextRegistryInstructionHandle, type ModelContextRegistryProviderHandle, type ModelContextRegistryToolHandle, PartByIndexProvider, type PartProviderMetadata, type PartState, type PendingAttachment, type ProviderToolConfig, type QueueItemMethods, queueItem_d_exports as QueueItemPrimitive, type QueueItemState, type QuoteInfo, type QuoteMessagePartComponent, type QuoteMessagePartProps, ReadonlyThreadProvider, type RealtimeVoiceAdapter, type ReasoningGroupComponent, type ReasoningGroupProps, type ReasoningMessagePart, type ReasoningMessagePartComponent, type ReasoningMessagePartProps, type RemoteThreadListAdapter, type RespondToToolApprovalOptions, RuntimeAdapterProvider, type RuntimeAdapters, selectionToolbar_d_exports as SelectionToolbarPrimitive, type SendCommandsRequestBody, type SerializedModelContext, type SerializedTool, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SingleThreadList, type SmoothOptions, type SourceMessagePart, type SourceMessagePartComponent, type SourceMessagePartProps, type SourceProviderMetadata, type SpeechSynthesisAdapter, type SubmitFeedbackOptions, type SuggestionAdapter, SuggestionByIndexProvider, type SuggestionConfig, suggestion_d_exports as SuggestionPrimitive, Suggestions, type TextMessagePart, type TextMessagePartComponent, type TextMessagePartProps, TextMessagePartProvider, type ThreadAssistantMessage, type ThreadAssistantMessagePart, type ThreadComposerRuntime, type ThreadComposerState, type ThreadHistoryAdapter, ThreadListItemByIndexProvider, threadListItemMore_d_exports as ThreadListItemMorePrimitive, threadListItem_d_exports as ThreadListItemPrimitive, type ThreadListItemRuntime, ThreadListItemRuntimeProvider, type ThreadListItemState, type ThreadListItemStatus, threadList_d_exports as ThreadListPrimitive, type ThreadListRuntime, type ThreadListState, type ThreadMessage, type ThreadMessageLike, thread_d_exports as ThreadPrimitive, type ThreadRuntime, type ThreadState, type ThreadSuggestion, type ThreadSystemMessage, type ThreadUserMessage, type ThreadUserMessagePart, type ThreadViewportState, type Tool, type ToolApprovalOption, type ToolApprovalOptionKind, type ToolApprovalResponse, type ToolArgsStatus, type ToolCallMessagePart, type ToolCallMessagePartComponent, type ToolCallMessagePartMcpMetadata, type ToolCallMessagePartProps, type ToolCallMessagePartStatus, type ToolCallText, type ToolCallTiming, type ToolDefinition, type ToolExecutionStatus, type ToolModelContentPart, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, Tools, type Unstable_AudioMessagePart, type Unstable_AudioMessagePartComponent, type Unstable_AudioMessagePartProps, type Unstable_ComposerInput, type Unstable_ComposerInputHistory, type Unstable_DirectiveFormatter, type Unstable_DirectiveSegment, type Unstable_IconComponent, type Unstable_InferInteractableState, type Unstable_InteractableConfig, type Unstable_InteractableDefinition, type Unstable_InteractablePersistedState, type Unstable_InteractablePersistenceAdapter, type Unstable_InteractablePersistenceStatus, type Unstable_InteractableRegistration, type Unstable_InteractableSnapshotEntry, type Unstable_InteractableStateSchema, type Unstable_InteractableToolConfig, type Unstable_InteractableToolRenderProps, type Unstable_InteractableVersion, type Unstable_InteractableVersionInfo, type Unstable_InteractablesClientSchema, type Unstable_InteractablesConfig, type Unstable_InteractablesMethods, type Unstable_InteractablesState, type Unstable_Mention, type Unstable_MentionCategory, type Unstable_MentionDirective, type Unstable_MessageStallDetection, type Unstable_MessageStallDetectionOptions, type Unstable_ModelContextToolsOptions, type RegisteredTrigger as Unstable_RegisteredTrigger, type Unstable_SlashCommand, type Unstable_SlashCommandAction, type TriggerBehavior as Unstable_TriggerBehavior, type Unstable_TriggerItem, type Unstable_TriggerPopoverAriaProps, type Unstable_UseComposerInputOptions, type Unstable_UseLiveCompletionAdapterOptions, type Unstable_UseMentionAdapterOptions, type Unstable_UseSlashCommandAdapterOptions, type Unsubscribe, type VoiceSessionControls, type VoiceSessionHelpers, type VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createVoiceSession, defineMcpToolkit, defineToolkit, externalTool, fromThreadMessageLike, generateId, getExternalStoreMessages, getMcpAppFromToolPart, groupPartByType, hitl, hitlTool, humanTool, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, makeAssistantVisible, mergeModelContexts, pickExternalStoreSharedOptions, providerTool, stubTool, tool, unstable_Interactables, convertExternalMessages as unstable_convertExternalMessages, createMessageConverter as unstable_createMessageConverter, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions, unstable_interactableTool, unstable_useComposerInput, unstable_useComposerInputHistory, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useLiveCompletionAdapter, unstable_useMentionAdapter, unstable_useMessageStallDetection, unstable_useSlashCommandAdapter, unstable_useThreadMessageIds, unstable_useTriggerPopoverAriaProps, useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext, useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional, useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext, useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional, useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers, useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional, useAssistantContext, useAssistantDataUI, useAssistantFrameHost, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState, useAui, useAuiEvent, useAuiState, useAuiToolOverrides, useCloudThreadListAdapter, useCloudThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessagePartData, useMessagePartFile, useMessagePartImage, useMessagePartReasoning, useMessagePartSource, useMessagePartText, useMessageQuote, useMessageTiming, useRemoteThreadListRuntime, useRuntimeAdapters, useScrollLock, useSmooth, useThreadViewport, useThreadViewportAutoScroll, useThreadViewportStore, useToolArgsStatus, useToolCallElapsed, useVoiceControls, useVoiceState, useVoiceVolume };
83
+ export { actionBarMore_d_exports as ActionBarMorePrimitive, actionBar_d_exports as ActionBarPrimitive, type AddToolResultOptions, type AppendMessage, type Assistant, type AssistantClient, AssistantCloud, type AssistantContextConfig, type AssistantDataUI, type AssistantDataUIProps, type AssistantEventCallback, type AssistantEventName, type AssistantEventPayload, type AssistantEventScope, type AssistantEventSelector, AssistantFrameHost, AssistantFrameProvider, type AssistantInteractableProps, assistantModal_d_exports as AssistantModalPrimitive, type AssistantRuntime, AssistantRuntimeProvider, type AssistantState, type AssistantTool, type AssistantToolProps, type AssistantToolUI, type AssistantToolUIProps, type AssistantTransportCommand, type AssistantTransportConnectionMetadata, type AssistantTransportProtocol, type Attachment, type AttachmentAdapter, attachment_d_exports as AttachmentPrimitive, type AttachmentRuntime, type AttachmentState, type AttachmentStatus, AuiIf, AuiProvider, branchPicker_d_exports as BranchPickerPrimitive, ChainOfThoughtByIndicesProvider, ChainOfThoughtClient, chainOfThought_d_exports as ChainOfThoughtPrimitive, type ChatModelAdapter, type ChatModelRunOptions, type ChatModelRunResult, type ChatModelRunUpdate, CloudFileAttachmentAdapter, type CompleteAttachment, ComposerAttachmentByIndexProvider, composer_d_exports as ComposerPrimitive, type ComposerRuntime, type ComposerSendOptions, type ComposerState, CompositeAttachmentAdapter, type CreateAppendMessage, type CreateAttachment, type CreateResumeRunConfig, type CreateStartRunConfig, type DataMessagePart, type DataMessagePartComponent, type DataMessagePartProps, DataRenderers, DevToolsHooks, DevToolsProviderApi, type DictationAdapter, type DictationState, type EditComposerRuntime, type EditComposerState, type EmptyMessagePartComponent, type EmptyMessagePartProps, type EnrichedPartState, error_d_exports as ErrorPrimitive, ExportedMessageRepository, type ExportedMessageRepositoryItem, type ExternalStoreAdapter, type ExternalStoreBranchChange, type ExternalStoreMessageConverter, type ExternalStoreSharedOptions, type ExternalStoreThreadData, type ExternalStoreThreadListAdapter, ExternalThread, type ExternalThreadBranchAdapter, type ExternalThreadMessage, type ExternalThreadProps, type ExternalThreadQueueAdapter, FRAME_MESSAGE_CHANNEL, type FeedbackAdapter, type FileMessagePart, type FileMessagePartComponent, type FileMessagePartProps, type FrameMessage, type FrameMessageType, type GenerativeUIComponentRegistry, type GenerativeUIMessagePart, type GenerativeUIMessagePartComponent, type GenerativeUIMessagePartProps, type GenerativeUINode, GenerativeUIRender, GenerativeUIRenderError, type GenerativeUIRenderProps, type GenerativeUISpec, type GenericThreadHistoryAdapter, type GroupByContext, internal_d_exports as INTERNAL, type ImageMessagePart, type ImageMessagePartComponent, type ImageMessagePartProps, InMemoryThreadList, InMemoryThreadListAdapter, type InMemoryThreadListProps, Interactables, type LanguageModelConfig, type LanguageModelV1CallSettings, type LocalRuntimeOptions, type LocalRuntimeOptionsBase, type McpAppDisplayMode, type McpAppHostContext, type McpAppHostInfo, type McpAppMetadata, McpAppRenderer, type McpAppRendererOptions, type McpAppResource, type McpAppResourceCSP, type McpAppResourceMeta, type McpAppResourceOutput, type McpAppSandboxConfig, type McpAppToolCallParams, type McpAppsHost, McpAppsRemoteHost, type McpAppsRemoteHostOptions, type McpToolkitDefinition, type McpToolkitEntry, type McpToolkitToolConfig, MessageAttachmentByIndexProvider, MessageByIndexProvider, type MessageFormatAdapter, type MessageFormatItem, type MessageFormatRepository, messagePart_d_exports as MessagePartPrimitive, type MessagePartRuntime, type MessagePartState, type MessagePartStatus, type MessagePartStreamStatus, message_d_exports as MessagePrimitive, MessageProvider, type MessageQueueController, type MessageQueueDriver, type MessageRuntime, type MessageState, type MessageStatus, type MessageStorageEntry, type MessageTiming, type ModelContext, ModelContextClient, type ModelContextProvider, ModelContextRegistry, type ModelContextRegistryInstructionHandle, type ModelContextRegistryProviderHandle, type ModelContextRegistryToolHandle, PartByIndexProvider, type PartProviderMetadata, type PartState, type PendingAttachment, type ProviderToolConfig, type QueueItemMethods, queueItem_d_exports as QueueItemPrimitive, type QueueItemState, type QuoteInfo, type QuoteMessagePartComponent, type QuoteMessagePartProps, ReadonlyThreadProvider, type RealtimeVoiceAdapter, type ReasoningGroupComponent, type ReasoningGroupProps, type ReasoningMessagePart, type ReasoningMessagePartComponent, type ReasoningMessagePartProps, type RemoteThreadListAdapter, type RespondToToolApprovalOptions, RuntimeAdapterProvider, type RuntimeAdapters, selectionToolbar_d_exports as SelectionToolbarPrimitive, type SendCommandsRequestBody, type SerializedModelContext, type SerializedTool, SimpleImageAttachmentAdapter, SimpleTextAttachmentAdapter, SingleThreadList, type SmoothOptions, type SourceMessagePart, type SourceMessagePartComponent, type SourceMessagePartProps, type SourceProviderMetadata, type SpeechSynthesisAdapter, type SubmitFeedbackOptions, type SuggestionAdapter, SuggestionByIndexProvider, type SuggestionConfig, suggestion_d_exports as SuggestionPrimitive, Suggestions, type TextMessagePart, type TextMessagePartComponent, type TextMessagePartProps, TextMessagePartProvider, type ThreadAssistantMessage, type ThreadAssistantMessagePart, type ThreadComposerRuntime, type ThreadComposerState, type ThreadHistoryAdapter, ThreadListItemByIndexProvider, threadListItemMore_d_exports as ThreadListItemMorePrimitive, threadListItem_d_exports as ThreadListItemPrimitive, type ThreadListItemRuntime, ThreadListItemRuntimeProvider, type ThreadListItemState, type ThreadListItemStatus, threadList_d_exports as ThreadListPrimitive, type ThreadListRuntime, type ThreadListState, type ThreadMessage, type ThreadMessageLike, thread_d_exports as ThreadPrimitive, type ThreadRuntime, type ThreadState, type ThreadSuggestion, type ThreadSystemMessage, type ThreadUserMessage, type ThreadUserMessagePart, type ThreadViewportState, type Tool, type ToolApprovalOption, type ToolApprovalOptionKind, type ToolApprovalResponse, type ToolArgsStatus, type ToolCallMessagePart, type ToolCallMessagePartComponent, type ToolCallMessagePartMcpMetadata, type ToolCallMessagePartProps, type ToolCallMessagePartStatus, type ToolCallText, type ToolCallTiming, type ToolDefinition, type ToolExecutionStatus, type ToolModelContentPart, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, Tools, type Unstable_AudioMessagePart, type Unstable_AudioMessagePartComponent, type Unstable_AudioMessagePartProps, type Unstable_ComposerInput, type Unstable_ComposerInputHistory, type Unstable_DirectiveFormatter, type Unstable_DirectiveSegment, type Unstable_IconComponent, type Unstable_InferInteractableState, type Unstable_InteractableConfig, type Unstable_InteractableDefinition, type Unstable_InteractablePersistedState, type Unstable_InteractablePersistenceAdapter, type Unstable_InteractablePersistenceStatus, type Unstable_InteractableRegistration, type Unstable_InteractableSnapshotEntry, type Unstable_InteractableStateSchema, type Unstable_InteractableToolConfig, type Unstable_InteractableToolRenderProps, type Unstable_InteractableVersion, type Unstable_InteractableVersionInfo, type Unstable_InteractablesClientSchema, type Unstable_InteractablesConfig, type Unstable_InteractablesMethods, type Unstable_InteractablesState, type Unstable_Mention, type Unstable_MentionCategory, type Unstable_MentionDirective, type Unstable_MessageStallDetection, type Unstable_MessageStallDetectionOptions, type Unstable_ModelContextToolsOptions, type RegisteredTrigger as Unstable_RegisteredTrigger, type Unstable_SlashCommand, type Unstable_SlashCommandAction, type TriggerBehavior as Unstable_TriggerBehavior, type Unstable_TriggerItem, type Unstable_TriggerPopoverAriaProps, type Unstable_UseComposerInputOptions, type Unstable_UseLiveCompletionAdapterOptions, type Unstable_UseMentionAdapterOptions, type Unstable_UseSlashCommandAdapterOptions, type Unsubscribe, type VoiceSessionControls, type VoiceSessionHelpers, type VoiceSessionState, WebSpeechDictationAdapter, WebSpeechSynthesisAdapter, bindExternalStoreMessage, createMessageQueue, createVoiceSession, defineMcpToolkit, defineToolkit, externalTool, fromThreadMessageLike, generateId, getExternalStoreMessages, getMcpAppFromToolPart, groupPartByType, hitl, hitlTool, humanTool, makeAssistantDataUI, makeAssistantTool, makeAssistantToolUI, makeAssistantVisible, mergeModelContexts, pickExternalStoreSharedOptions, providerTool, stubTool, tool, unstable_Interactables, convertExternalMessages as unstable_convertExternalMessages, createMessageConverter as unstable_createMessageConverter, unstable_defaultDirectiveFormatter, unstable_formatInteractableSnapshot, unstable_getInteractableSnapshots, unstable_getInteractableVersions, unstable_interactableTool, unstable_useComposerInput, unstable_useComposerInputHistory, unstable_useInteractable, unstable_useInteractableState, unstable_useInteractableVersions, unstable_useLiveCompletionAdapter, unstable_useMentionAdapter, unstable_useMessageStallDetection, unstable_useSlashCommandAdapter, unstable_useThreadMessageIds, unstable_useTriggerPopoverAriaProps, useTriggerPopoverRootContext as unstable_useTriggerPopoverRootContext, useTriggerPopoverRootContextOptional as unstable_useTriggerPopoverRootContextOptional, useTriggerPopoverScopeContext as unstable_useTriggerPopoverScopeContext, useTriggerPopoverScopeContextOptional as unstable_useTriggerPopoverScopeContextOptional, useTriggerPopoverTriggers as unstable_useTriggerPopoverTriggers, useTriggerPopoverTriggersOptional as unstable_useTriggerPopoverTriggersOptional, useAssistantContext, useAssistantDataUI, useAssistantFrameHost, useAssistantInstructions, useAssistantInteractable, useAssistantTool, useAssistantToolUI, useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState, useAui, useAuiEvent, useAuiState, useAuiToolOverrides, useCloudThreadListAdapter, useCloudThreadListRuntime, useExternalMessageConverter, useExternalStoreRuntime, useExternalStoreSharedOptions, useInlineRender, useInteractableState, useLocalRuntime, useMessagePartData, useMessagePartFile, useMessagePartImage, useMessagePartReasoning, useMessagePartSource, useMessagePartText, useMessageQuote, useMessageTiming, useRemoteThreadListRuntime, useRuntimeAdapters, useScrollLock, useSmooth, useThreadViewport, useThreadViewportAutoScroll, useThreadViewportStore, useToolArgsStatus, useToolCallElapsed, useVoiceControls, useVoiceState, useVoiceVolume };
@@ -1,6 +1,6 @@
1
1
  import { ExportedMessageRepositoryItem } from "../runtime-cores/utils/MessageRepository.js";
2
2
  import { CloudMessage } from "assistant-cloud";
3
- import { CompleteAttachment, DataMessagePart, FileMessagePart, ImageMessagePart, MessageStatus, SourceProviderMetadata, TextMessagePart, ThreadMessage, ToolApprovalOption, Unstable_AudioMessagePart } from "@assistant-ui/core";
3
+ import { CompleteAttachment, MessageStatus, SourceProviderMetadata, ThreadMessage, ToolApprovalOption } from "@assistant-ui/core";
4
4
  import { ReadonlyJSONObject, ReadonlyJSONValue } from "assistant-stream/utils";
5
5
  //#region src/legacy-runtime/cloud/auiV0.d.ts
6
6
  type AuiV0ToolApproval = {
@@ -58,7 +58,29 @@ type AuiV0MessagePart = {
58
58
  readonly mimeType: string;
59
59
  readonly filename?: string;
60
60
  };
61
- type AuiV0AttachmentPart = TextMessagePart | ImageMessagePart | FileMessagePart | Unstable_AudioMessagePart | DataMessagePart<ReadonlyJSONValue>;
61
+ type AuiV0AttachmentPart = {
62
+ readonly type: "text";
63
+ readonly text: string;
64
+ } | {
65
+ readonly type: "image";
66
+ readonly image: string;
67
+ readonly filename?: string;
68
+ } | {
69
+ readonly type: "file";
70
+ readonly data: string;
71
+ readonly mimeType: string;
72
+ readonly filename?: string;
73
+ } | {
74
+ readonly type: "audio";
75
+ readonly audio: {
76
+ readonly data: string;
77
+ readonly format: "mp3" | "wav";
78
+ };
79
+ } | {
80
+ readonly type: "data";
81
+ readonly name: string;
82
+ readonly data: ReadonlyJSONValue;
83
+ };
62
84
  type AuiV0Attachment = {
63
85
  readonly id: string;
64
86
  readonly type: CompleteAttachment["type"];
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"mappings":";;;;;KAqBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;;KAGV,sBACD,kBACA,mBACA,kBACA,4BACA,gBAAgB;KAEf;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBAkDL,YAAY,SAAS,gBAAgB;iBA6FrC,YACd,cAAc;EAAiB;IAC9B"}
1
+ {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"mappings":";;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;;KAGV;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBAwEL,YAAY,SAAS,gBAAgB;iBA6FrC,YACd,cAAc;EAAiB;IAC9B"}
@@ -4,14 +4,33 @@ import { isJSONValue } from "@assistant-ui/core/internal";
4
4
  const encodeAttachmentPart = (part) => {
5
5
  const type = part.type;
6
6
  switch (type) {
7
- case "text":
8
- case "image":
9
- case "file":
10
- case "audio": return part;
7
+ case "text": return {
8
+ type: "text",
9
+ text: part.text
10
+ };
11
+ case "image": return {
12
+ type: "image",
13
+ image: part.image,
14
+ ...part.filename != null ? { filename: part.filename } : void 0
15
+ };
16
+ case "file": return {
17
+ type: "file",
18
+ data: part.data,
19
+ mimeType: part.mimeType,
20
+ ...part.filename != null ? { filename: part.filename } : void 0
21
+ };
22
+ case "audio": return {
23
+ type: "audio",
24
+ audio: {
25
+ data: part.audio.data,
26
+ format: part.audio.format
27
+ }
28
+ };
11
29
  case "data":
12
30
  if (!isJSONValue(part.data)) console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);
13
31
  return {
14
- ...part,
32
+ type: "data",
33
+ name: part.name,
15
34
  data: part.data
16
35
  };
17
36
  default: throw new Error(`Attachment part type not supported by aui/v0: ${type}`);
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.js","names":["CompleteAttachment","DataMessagePart","FileMessagePart","ImageMessagePart","MessageStatus","SourceProviderMetadata","ThreadMessage","TextMessagePart","ToolApprovalOption","Unstable_AudioMessagePart","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","approved","reason","isAutomatic","options","optionId","resolution","AuiV0MessagePart","type","text","sourceType","url","title","providerMetadata","mediaType","filename","toolCallId","toolName","args","result","isError","approval","argsText","image","data","mimeType","AuiV0AttachmentPart","AuiV0Attachment","name","contentType","status","content","AuiV0Message","role","attachments","metadata","unstable_state","unstable_annotations","unstable_data","steps","usage","inputTokens","outputTokens","custom","encodeAttachmentPart","part","console","warn","JSON","stringify","unhandledType","Error","encodeAttachments","message","length","undefined","map","auiV0Encode","auiV0Decode","cloudMessage","format","payload","createdAt","created_at","parentId","parent_id"],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"sourcesContent":["import type {\n CompleteAttachment,\n DataMessagePart,\n FileMessagePart,\n ImageMessagePart,\n MessageStatus,\n SourceProviderMetadata,\n ThreadMessage,\n TextMessagePart,\n ToolApprovalOption,\n Unstable_AudioMessagePart,\n} from \"@assistant-ui/core\";\nimport { fromThreadMessageLike } from \"../runtime-cores/external-store/ThreadMessageLike\";\nimport type { CloudMessage } from \"assistant-cloud\";\nimport { isJSONValue } from \"@assistant-ui/core/internal\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\nimport type { ExportedMessageRepositoryItem } from \"../runtime-cores/utils/MessageRepository\";\n\ntype AuiV0ToolApproval = {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n};\n\ntype AuiV0MessagePart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"reasoning\";\n readonly text: string;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"url\";\n readonly id: string;\n readonly url: string;\n readonly title?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"document\";\n readonly id: string;\n readonly title: string;\n readonly mediaType: string;\n readonly filename?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: ReadonlyJSONObject;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly argsText: string;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n };\n\ntype AuiV0AttachmentPart =\n | TextMessagePart\n | ImageMessagePart\n | FileMessagePart\n | Unstable_AudioMessagePart\n | DataMessagePart<ReadonlyJSONValue>;\n\ntype AuiV0Attachment = {\n readonly id: string;\n readonly type: CompleteAttachment[\"type\"];\n readonly name: string;\n readonly contentType?: string;\n readonly status: CompleteAttachment[\"status\"];\n readonly content: readonly AuiV0AttachmentPart[];\n};\n\ntype AuiV0Message = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly status?: MessageStatus;\n readonly content: readonly AuiV0MessagePart[];\n readonly attachments?: readonly AuiV0Attachment[];\n readonly metadata: {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations: readonly ReadonlyJSONValue[];\n readonly unstable_data: readonly ReadonlyJSONValue[];\n readonly steps: readonly {\n readonly usage?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n };\n }[];\n readonly custom: ReadonlyJSONObject;\n };\n};\n\nconst encodeAttachmentPart = (\n part: CompleteAttachment[\"content\"][number],\n): AuiV0AttachmentPart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n case \"image\":\n case \"file\":\n case \"audio\":\n return part;\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);\n }\n return { ...part, data: part.data as ReadonlyJSONValue };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Attachment part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n};\n\nconst encodeAttachments = (\n message: ThreadMessage,\n): readonly AuiV0Attachment[] | undefined => {\n if (message.role !== \"user\" || message.attachments.length === 0) {\n return undefined;\n }\n\n return message.attachments.map(\n ({ id, type, name, contentType, status, content }) => ({\n id,\n type,\n name,\n status,\n ...(contentType != null ? { contentType } : undefined),\n content: content.map(encodeAttachmentPart),\n }),\n );\n};\n\nexport function auiV0Encode(message: ThreadMessage): AuiV0Message {\n // info: ID and createdAt are ignored (we use the server value instead)\n const status: MessageStatus | undefined =\n message.status?.type === \"running\"\n ? { type: \"incomplete\", reason: \"cancelled\" }\n : message.status;\n const attachments = encodeAttachments(message);\n\n return {\n role: message.role,\n content: message.content.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"reasoning\":\n return { type: \"reasoning\", text: part.text };\n\n case \"source\":\n if (part.sourceType === \"url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.id,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n }\n\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.id,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null\n ? { filename: part.filename }\n : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n\n case \"tool-call\": {\n if (!isJSONValue(part.result)) {\n console.warn(\n `tool-call result is not JSON! ${JSON.stringify(part)}`,\n );\n }\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n ...(JSON.stringify(part.args) === part.argsText\n ? { args: part.args }\n : { argsText: part.argsText }),\n ...(part.result\n ? { result: part.result as ReadonlyJSONValue }\n : undefined),\n ...(part.isError ? { isError: true } : undefined),\n ...(part.approval ? { approval: part.approval } : undefined),\n };\n }\n\n case \"image\":\n return { type: \"image\", image: part.image };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : undefined),\n };\n\n default: {\n const unhandledType: \"audio\" | \"data\" | \"generative-ui\" = type;\n throw new Error(\n `Message part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n }),\n metadata: message.metadata as AuiV0Message[\"metadata\"],\n ...(status ? { status } : undefined),\n ...(attachments ? { attachments } : undefined),\n };\n}\n\nexport function auiV0Decode(\n cloudMessage: CloudMessage & { format: \"aui/v0\" },\n): ExportedMessageRepositoryItem {\n const payload = cloudMessage.content as unknown as AuiV0Message;\n const message = fromThreadMessageLike(\n {\n id: cloudMessage.id,\n createdAt: cloudMessage.created_at,\n ...payload,\n },\n cloudMessage.id,\n { type: \"complete\", reason: \"unknown\" },\n );\n\n return {\n parentId: cloudMessage.parent_id,\n message,\n };\n}\n"],"mappings":";;;AAyHA,MAAM6D,wBACJC,SACwB;CACxB,MAAMrC,OAAOqC,KAAKrC;CAClB,QAAQA,MAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAOqC;EAET,KAAK;GACH,IAAI,CAAClD,YAAYkD,KAAKrB,IAAI,GACxBsB,QAAQC,KAAK,gCAAgCC,KAAKC,UAAUJ,IAAI,GAAG;GAErE,OAAO;IAAE,GAAGA;IAAMrB,MAAMqB,KAAKrB;GAA0B;EAGzD,SAEE,MAAM,IAAI2B,MACR,iDAAiDD,MACnD;CAEJ;AACF;AAEA,MAAME,qBACJC,YAC2C;CAC3C,IAAIA,QAAQpB,SAAS,UAAUoB,QAAQnB,YAAYoB,WAAW,GAC5D;CAGF,OAAOD,QAAQnB,YAAYsB,KACxB,EAAExD,IAAIQ,MAAMoB,MAAMC,aAAaC,QAAQC,eAAe;EACrD/B;EACAQ;EACAoB;EACAE;EACA,GAAID,eAAe,OAAO,EAAEA,YAAY,IAAI0B,KAAAA;EAC5CxB,SAASA,QAAQyB,IAAIZ,oBAAoB;CAC3C,EACF;AACF;AAEA,SAAgBa,YAAYJ,SAAsC;CAEhE,MAAMvB,SACJuB,QAAQvB,QAAQtB,SAAS,YACrB;EAAEA,MAAM;EAAcN,QAAQ;CAAY,IAC1CmD,QAAQvB;CACd,MAAMI,cAAckB,kBAAkBC,OAAO;CAE7C,OAAO;EACLpB,MAAMoB,QAAQpB;EACdF,SAASsB,QAAQtB,QAAQyB,KAAKX,SAAS;GACrC,MAAMrC,OAAOqC,KAAKrC;GAClB,QAAQA,MAAR;IACE,KAAK,QACH,OAAO;KAAEA,MAAM;KAAQC,MAAMoC,KAAKpC;IAAK;IAEzC,KAAK,aACH,OAAO;KAAED,MAAM;KAAaC,MAAMoC,KAAKpC;IAAK;IAE9C,KAAK;KACH,IAAIoC,KAAKnC,eAAe,OACtB,OAAO;MACLF,MAAM;MACNE,YAAY;MACZV,IAAI6C,KAAK7C;MACTW,KAAKkC,KAAKlC;MACV,GAAIkC,KAAKjC,SAAS,OAAO,EAAEA,OAAOiC,KAAKjC,MAAM,IAAI2C,KAAAA;MACjD,GAAIV,KAAKhC,oBAAoB,OACzB,EAAEA,kBAAkBgC,KAAKhC,iBAAiB,IAC1C0C,KAAAA;KACN;KAGF,OAAO;MACL/C,MAAM;MACNE,YAAY;MACZV,IAAI6C,KAAK7C;MACTY,OAAOiC,KAAKjC;MACZE,WAAW+B,KAAK/B;MAChB,GAAI+B,KAAK9B,YAAY,OACjB,EAAEA,UAAU8B,KAAK9B,SAAS,IAC1BwC,KAAAA;MACJ,GAAIV,KAAKhC,oBAAoB,OACzB,EAAEA,kBAAkBgC,KAAKhC,iBAAiB,IAC1C0C,KAAAA;KACN;IAEF,KAAK;KACH,IAAI,CAAC5D,YAAYkD,KAAK1B,MAAM,GAC1B2B,QAAQC,KACN,iCAAiCC,KAAKC,UAAUJ,IAAI,GACtD;KAEF,OAAO;MACLrC,MAAM;MACNQ,YAAY6B,KAAK7B;MACjBC,UAAU4B,KAAK5B;MACf,GAAI+B,KAAKC,UAAUJ,KAAK3B,IAAI,MAAM2B,KAAKvB,WACnC,EAAEJ,MAAM2B,KAAK3B,KAAK,IAClB,EAAEI,UAAUuB,KAAKvB,SAAS;MAC9B,GAAIuB,KAAK1B,SACL,EAAEA,QAAQ0B,KAAK1B,OAA4B,IAC3CoC,KAAAA;MACJ,GAAIV,KAAKzB,UAAU,EAAEA,SAAS,KAAK,IAAImC,KAAAA;MACvC,GAAIV,KAAKxB,WAAW,EAAEA,UAAUwB,KAAKxB,SAAS,IAAIkC,KAAAA;KACpD;IAGF,KAAK,SACH,OAAO;KAAE/C,MAAM;KAASe,OAAOsB,KAAKtB;IAAM;IAE5C,KAAK,QACH,OAAO;KACLf,MAAM;KACNgB,MAAMqB,KAAKrB;KACXC,UAAUoB,KAAKpB;KACf,GAAIoB,KAAK9B,WAAW,EAAEA,UAAU8B,KAAK9B,SAAS,IAAIwC,KAAAA;IACpD;IAEF,SAEE,MAAM,IAAIJ,MACR,8CAA8CD,MAChD;GAEJ;EACF,CAAC;EACDf,UAAUkB,QAAQlB;EAClB,GAAIL,SAAS,EAAEA,OAAO,IAAIyB,KAAAA;EAC1B,GAAIrB,cAAc,EAAEA,YAAY,IAAIqB,KAAAA;CACtC;AACF;AAEA,SAAgBG,YACdC,cAC+B;CAC/B,MAAME,UAAUF,aAAa5B;CAC7B,MAAMsB,UAAU5D,sBACd;EACEO,IAAI2D,aAAa3D;EACjB8D,WAAWH,aAAaI;EACxB,GAAGF;CACL,GACAF,aAAa3D,IACb;EAAEQ,MAAM;EAAYN,QAAQ;CAAU,CACxC;CAEA,OAAO;EACL8D,UAAUL,aAAaM;EACvBZ;CACF;AACF"}
1
+ {"version":3,"file":"auiV0.js","names":["CompleteAttachment","MessageStatus","SourceProviderMetadata","ThreadMessage","ToolApprovalOption","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","approved","reason","isAutomatic","options","optionId","resolution","AuiV0MessagePart","type","text","sourceType","url","title","providerMetadata","mediaType","filename","toolCallId","toolName","args","result","isError","approval","argsText","image","data","mimeType","AuiV0AttachmentPart","audio","format","name","AuiV0Attachment","contentType","status","content","AuiV0Message","role","attachments","metadata","unstable_state","unstable_annotations","unstable_data","steps","usage","inputTokens","outputTokens","custom","encodeAttachmentPart","part","undefined","console","warn","JSON","stringify","unhandledType","Error","encodeAttachments","message","length","map","auiV0Encode","auiV0Decode","cloudMessage","payload","createdAt","created_at","parentId","parent_id"],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"sourcesContent":["import type {\n CompleteAttachment,\n MessageStatus,\n SourceProviderMetadata,\n ThreadMessage,\n ToolApprovalOption,\n} from \"@assistant-ui/core\";\nimport { fromThreadMessageLike } from \"../runtime-cores/external-store/ThreadMessageLike\";\nimport type { CloudMessage } from \"assistant-cloud\";\nimport { isJSONValue } from \"@assistant-ui/core/internal\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\nimport type { ExportedMessageRepositoryItem } from \"../runtime-cores/utils/MessageRepository\";\n\ntype AuiV0ToolApproval = {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n};\n\ntype AuiV0MessagePart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"reasoning\";\n readonly text: string;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"url\";\n readonly id: string;\n readonly url: string;\n readonly title?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"document\";\n readonly id: string;\n readonly title: string;\n readonly mediaType: string;\n readonly filename?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: ReadonlyJSONObject;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly argsText: string;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n };\n\ntype AuiV0AttachmentPart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"audio\";\n readonly audio: {\n readonly data: string;\n readonly format: \"mp3\" | \"wav\";\n };\n }\n | {\n readonly type: \"data\";\n readonly name: string;\n readonly data: ReadonlyJSONValue;\n };\n\ntype AuiV0Attachment = {\n readonly id: string;\n readonly type: CompleteAttachment[\"type\"];\n readonly name: string;\n readonly contentType?: string;\n readonly status: CompleteAttachment[\"status\"];\n readonly content: readonly AuiV0AttachmentPart[];\n};\n\ntype AuiV0Message = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly status?: MessageStatus;\n readonly content: readonly AuiV0MessagePart[];\n readonly attachments?: readonly AuiV0Attachment[];\n readonly metadata: {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations: readonly ReadonlyJSONValue[];\n readonly unstable_data: readonly ReadonlyJSONValue[];\n readonly steps: readonly {\n readonly usage?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n };\n }[];\n readonly custom: ReadonlyJSONObject;\n };\n};\n\nconst encodeAttachmentPart = (\n part: CompleteAttachment[\"content\"][number],\n): AuiV0AttachmentPart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"image\":\n return {\n type: \"image\",\n image: part.image,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"audio\":\n return {\n type: \"audio\",\n audio: { data: part.audio.data, format: part.audio.format },\n };\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);\n }\n return {\n type: \"data\",\n name: part.name,\n data: part.data as ReadonlyJSONValue,\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Attachment part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n};\n\nconst encodeAttachments = (\n message: ThreadMessage,\n): readonly AuiV0Attachment[] | undefined => {\n if (message.role !== \"user\" || message.attachments.length === 0) {\n return undefined;\n }\n\n return message.attachments.map(\n ({ id, type, name, contentType, status, content }) => ({\n id,\n type,\n name,\n status,\n ...(contentType != null ? { contentType } : undefined),\n content: content.map(encodeAttachmentPart),\n }),\n );\n};\n\nexport function auiV0Encode(message: ThreadMessage): AuiV0Message {\n // info: ID and createdAt are ignored (we use the server value instead)\n const status: MessageStatus | undefined =\n message.status?.type === \"running\"\n ? { type: \"incomplete\", reason: \"cancelled\" }\n : message.status;\n const attachments = encodeAttachments(message);\n\n return {\n role: message.role,\n content: message.content.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"reasoning\":\n return { type: \"reasoning\", text: part.text };\n\n case \"source\":\n if (part.sourceType === \"url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.id,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n }\n\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.id,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null\n ? { filename: part.filename }\n : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n\n case \"tool-call\": {\n if (!isJSONValue(part.result)) {\n console.warn(\n `tool-call result is not JSON! ${JSON.stringify(part)}`,\n );\n }\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n ...(JSON.stringify(part.args) === part.argsText\n ? { args: part.args }\n : { argsText: part.argsText }),\n ...(part.result\n ? { result: part.result as ReadonlyJSONValue }\n : undefined),\n ...(part.isError ? { isError: true } : undefined),\n ...(part.approval ? { approval: part.approval } : undefined),\n };\n }\n\n case \"image\":\n return { type: \"image\", image: part.image };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : undefined),\n };\n\n default: {\n const unhandledType: \"audio\" | \"data\" | \"generative-ui\" = type;\n throw new Error(\n `Message part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n }),\n metadata: message.metadata as AuiV0Message[\"metadata\"],\n ...(status ? { status } : undefined),\n ...(attachments ? { attachments } : undefined),\n };\n}\n\nexport function auiV0Decode(\n cloudMessage: CloudMessage & { format: \"aui/v0\" },\n): ExportedMessageRepositoryItem {\n const payload = cloudMessage.content as unknown as AuiV0Message;\n const message = fromThreadMessageLike(\n {\n id: cloudMessage.id,\n createdAt: cloudMessage.created_at,\n ...payload,\n },\n cloudMessage.id,\n { type: \"complete\", reason: \"unknown\" },\n );\n\n return {\n parentId: cloudMessage.parent_id,\n message,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react",
3
- "version": "0.15.0",
3
+ "version": "0.15.2",
4
4
  "description": "Open-source TypeScript/React library for building production-grade AI chat experiences",
5
5
  "keywords": [
6
6
  "ai",
@@ -55,9 +55,9 @@
55
55
  ],
56
56
  "sideEffects": false,
57
57
  "dependencies": {
58
- "@assistant-ui/core": "^0.3.0",
59
- "@assistant-ui/store": "^0.3.0",
60
- "@assistant-ui/tap": "^0.9.7",
58
+ "@assistant-ui/core": "^0.3.3",
59
+ "@assistant-ui/store": "^0.3.1",
60
+ "@assistant-ui/tap": "^0.9.9",
61
61
  "@radix-ui/primitive": "^1.1.7",
62
62
  "@radix-ui/react-collection": "^1.1.15",
63
63
  "@radix-ui/react-compose-refs": "^1.1.5",
@@ -67,7 +67,7 @@
67
67
  "@radix-ui/react-use-controllable-state": "^1.2.6",
68
68
  "@radix-ui/react-use-escape-keydown": "^1.1.5",
69
69
  "assistant-cloud": "^0.1.37",
70
- "assistant-stream": "^0.3.29",
70
+ "assistant-stream": "^0.3.30",
71
71
  "nanoid": "^6.0.0",
72
72
  "radix-ui": "^1.6.7",
73
73
  "react-textarea-autosize": "^8.5.9",
@@ -42,6 +42,7 @@ import {
42
42
  getThreadMessageText,
43
43
  isCreateAttachment,
44
44
  resolveToolApprovalResponse,
45
+ toMessagePartStatus,
45
46
  } from "@assistant-ui/core/internal";
46
47
  import { ModelContext, Suggestions } from "@assistant-ui/core/store";
47
48
  import { Tools, DataRenderers } from "@assistant-ui/core/react";
@@ -58,23 +59,13 @@ const COMPLETE_STATUS: MessagePartStatus = Object.freeze({
58
59
  type: "complete",
59
60
  });
60
61
 
61
- // Legacy runtime parity (toMessagePartStatus): a tool call without a result
62
- // carries its message's status; the last part of a streaming message streams.
63
62
  const derivePartStatus = (
64
63
  message: ExternalThreadMessage,
65
64
  partIndex: number,
66
65
  part: ThreadAssistantMessagePart | ThreadUserMessagePart,
67
66
  ): ToolCallMessagePartStatus => {
68
- if (message.role !== "assistant" || !message.status) return COMPLETE_STATUS;
69
-
70
- if (part.type === "tool-call") {
71
- if (!part.result) return message.status as ToolCallMessagePartStatus;
72
- return COMPLETE_STATUS;
73
- }
74
-
75
- const isLastPart = partIndex === Math.max(0, message.content.length - 1);
76
- if (message.status.type === "requires-action") return COMPLETE_STATUS;
77
- return isLastPart ? (message.status as MessagePartStatus) : COMPLETE_STATUS;
67
+ if (!message.status) return COMPLETE_STATUS;
68
+ return toMessagePartStatus(message, partIndex, part);
78
69
  };
79
70
 
80
71
  export type ExternalThreadProps = {
@@ -307,10 +298,7 @@ const usePartResource = ({
307
298
  onResumeToolCall,
308
299
  }: PartResourceProps): ClientOutput<"part"> => {
309
300
  const state = useMemo(
310
- () => ({
311
- ...part,
312
- status,
313
- }),
301
+ () => ({ ...part, status: status as MessagePartStatus }),
314
302
  [part, status],
315
303
  );
316
304
 
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useEffect, useState } from "react";
4
- import { useAui, useAuiState } from "@assistant-ui/store";
4
+ import { useAuiState } from "@assistant-ui/store";
5
5
 
6
6
  /**
7
7
  * Hook that returns the elapsed wall-clock time of the current tool call in
@@ -22,17 +22,14 @@ import { useAui, useAuiState } from "@assistant-ui/store";
22
22
  * ```
23
23
  */
24
24
  export const useToolCallElapsed = (): number | undefined => {
25
- const aui = useAui();
26
- const hasPart = aui.part.source !== null;
27
- const timing = useAuiState((s) =>
28
- hasPart && s.part.type === "tool-call" ? s.part.timing : undefined,
29
- );
30
- const partRunning = useAuiState(
31
- (s) =>
32
- hasPart &&
33
- s.part.type === "tool-call" &&
34
- s.part.status.type === "running",
35
- );
25
+ const timing = useAuiState((s) => {
26
+ const part = s.optional.part;
27
+ return part?.type === "tool-call" ? part.timing : undefined;
28
+ });
29
+ const partRunning = useAuiState((s) => {
30
+ const part = s.optional.part;
31
+ return part?.type === "tool-call" && part.status.type === "running";
32
+ });
36
33
  const running =
37
34
  timing !== undefined && timing.completedAt === undefined && partRunning;
38
35
  const [now, setNow] = useState(() => Date.now());
package/src/index.ts CHANGED
@@ -358,6 +358,7 @@ export type {
358
358
  ToolModelContentPart,
359
359
  MessageStatus,
360
360
  MessagePartStatus,
361
+ MessagePartStreamStatus,
361
362
  ToolCallMessagePartStatus,
362
363
  MessageTiming,
363
364
  ThreadUserMessagePart,
@@ -1,14 +1,9 @@
1
1
  import type {
2
2
  CompleteAttachment,
3
- DataMessagePart,
4
- FileMessagePart,
5
- ImageMessagePart,
6
3
  MessageStatus,
7
4
  SourceProviderMetadata,
8
5
  ThreadMessage,
9
- TextMessagePart,
10
6
  ToolApprovalOption,
11
- Unstable_AudioMessagePart,
12
7
  } from "@assistant-ui/core";
13
8
  import { fromThreadMessageLike } from "../runtime-cores/external-store/ThreadMessageLike";
14
9
  import type { CloudMessage } from "assistant-cloud";
@@ -85,11 +80,33 @@ type AuiV0MessagePart =
85
80
  };
86
81
 
87
82
  type AuiV0AttachmentPart =
88
- | TextMessagePart
89
- | ImageMessagePart
90
- | FileMessagePart
91
- | Unstable_AudioMessagePart
92
- | DataMessagePart<ReadonlyJSONValue>;
83
+ | {
84
+ readonly type: "text";
85
+ readonly text: string;
86
+ }
87
+ | {
88
+ readonly type: "image";
89
+ readonly image: string;
90
+ readonly filename?: string;
91
+ }
92
+ | {
93
+ readonly type: "file";
94
+ readonly data: string;
95
+ readonly mimeType: string;
96
+ readonly filename?: string;
97
+ }
98
+ | {
99
+ readonly type: "audio";
100
+ readonly audio: {
101
+ readonly data: string;
102
+ readonly format: "mp3" | "wav";
103
+ };
104
+ }
105
+ | {
106
+ readonly type: "data";
107
+ readonly name: string;
108
+ readonly data: ReadonlyJSONValue;
109
+ };
93
110
 
94
111
  type AuiV0Attachment = {
95
112
  readonly id: string;
@@ -125,16 +142,38 @@ const encodeAttachmentPart = (
125
142
  const type = part.type;
126
143
  switch (type) {
127
144
  case "text":
145
+ return { type: "text", text: part.text };
146
+
128
147
  case "image":
148
+ return {
149
+ type: "image",
150
+ image: part.image,
151
+ ...(part.filename != null ? { filename: part.filename } : undefined),
152
+ };
153
+
129
154
  case "file":
155
+ return {
156
+ type: "file",
157
+ data: part.data,
158
+ mimeType: part.mimeType,
159
+ ...(part.filename != null ? { filename: part.filename } : undefined),
160
+ };
161
+
130
162
  case "audio":
131
- return part;
163
+ return {
164
+ type: "audio",
165
+ audio: { data: part.audio.data, format: part.audio.format },
166
+ };
132
167
 
133
168
  case "data": {
134
169
  if (!isJSONValue(part.data)) {
135
170
  console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);
136
171
  }
137
- return { ...part, data: part.data as ReadonlyJSONValue };
172
+ return {
173
+ type: "data",
174
+ name: part.name,
175
+ data: part.data as ReadonlyJSONValue,
176
+ };
138
177
  }
139
178
 
140
179
  default: {
@@ -36,29 +36,36 @@ const renderThread = (props: ExternalThreadProps) => {
36
36
  };
37
37
  };
38
38
 
39
- const assistantMessage = (
39
+ const assistantMessageWithContent = (
40
40
  status: ThreadMessage["status"],
41
- result?: string,
41
+ content: ExternalThreadMessage["content"],
42
+ id = "a1",
42
43
  ): ExternalThreadMessage =>
43
44
  ({
44
- id: "a1",
45
+ id,
45
46
  role: "assistant",
46
- content: [
47
- { type: "text", text: "let me check" },
48
- {
49
- type: "tool-call",
50
- toolCallId: "tc1",
51
- toolName: "probe_tool",
52
- args: {},
53
- argsText: "{}",
54
- ...(result !== undefined && { result }),
55
- },
56
- ],
47
+ content,
57
48
  createdAt: new Date(0),
58
49
  status,
59
50
  metadata: { custom: {} },
60
51
  }) as unknown as ExternalThreadMessage;
61
52
 
53
+ const assistantMessage = (
54
+ status: ThreadMessage["status"],
55
+ result?: string,
56
+ ): ExternalThreadMessage =>
57
+ assistantMessageWithContent(status, [
58
+ { type: "text", text: "let me check" },
59
+ {
60
+ type: "tool-call",
61
+ toolCallId: "tc1",
62
+ toolName: "probe_tool",
63
+ args: {},
64
+ argsText: "{}",
65
+ ...(result !== undefined && { result }),
66
+ },
67
+ ]);
68
+
62
69
  describe("ExternalThread part status", () => {
63
70
  it("gives an unresolved tool call its message's status", () => {
64
71
  const { aui } = renderThread({
@@ -70,14 +77,99 @@ describe("ExternalThread part status", () => {
70
77
  expect(part("tc1").status).toEqual({ type: "running" });
71
78
  });
72
79
 
73
- it("marks a resolved tool call complete and streams only the last part", () => {
80
+ it("uses positional fallback for statusless parts and resolved tool calls", () => {
74
81
  const { aui } = renderThread({
75
- messages: [assistantMessage({ type: "running" }, "ok")],
82
+ messages: [
83
+ assistantMessage({ type: "running" }, "ok"),
84
+ assistantMessageWithContent(
85
+ { type: "running" },
86
+ [
87
+ { type: "text", text: "first" },
88
+ { type: "reasoning", text: "last" },
89
+ ],
90
+ "a2",
91
+ ),
92
+ ],
76
93
  isRunning: true,
77
94
  });
78
95
  const state = aui().thread.message({ id: "a1" }).getState();
79
96
  expect(state.parts[0]!.status).toEqual({ type: "complete" });
80
97
  expect(state.parts[1]!.status).toEqual({ type: "complete" });
98
+ const fallbackState = aui().thread.message({ id: "a2" }).getState();
99
+ expect(fallbackState.parts[0]!.status).toEqual({ type: "complete" });
100
+ expect(fallbackState.parts[1]!.status).toEqual({ type: "running" });
101
+ });
102
+
103
+ it("honours supplied statuses while the message is running", () => {
104
+ const { aui } = renderThread({
105
+ messages: [
106
+ assistantMessageWithContent({ type: "running" }, [
107
+ { type: "text", text: "first", status: { type: "running" } },
108
+ {
109
+ type: "reasoning",
110
+ text: "last",
111
+ status: { type: "complete" },
112
+ },
113
+ ]),
114
+ ],
115
+ isRunning: true,
116
+ });
117
+ const state = aui().thread.message({ id: "a1" }).getState();
118
+
119
+ expect(state.parts[0]!.status).toEqual({ type: "running" });
120
+ expect(state.parts[1]!.status).toEqual({ type: "complete" });
121
+ });
122
+
123
+ it("ignores supplied statuses after the message completes", () => {
124
+ const { aui } = renderThread({
125
+ messages: [
126
+ assistantMessageWithContent({ type: "complete", reason: "stop" }, [
127
+ { type: "text", text: "truncated", status: { type: "running" } },
128
+ ]),
129
+ ],
130
+ isRunning: false,
131
+ });
132
+
133
+ expect(
134
+ aui().thread.message({ id: "a1" }).part({ index: 0 }).getState().status,
135
+ ).toEqual({ type: "complete", reason: "stop" });
136
+ });
137
+
138
+ it("normalizes supplied upstream statuses", () => {
139
+ const { aui } = renderThread({
140
+ messages: [
141
+ assistantMessageWithContent(
142
+ { type: "running" },
143
+ // assistant-stream sends shapes core's MessagePartStatus does not
144
+ // declare (a reason on complete, an unlisted incomplete reason);
145
+ // the normalizer absorbs them.
146
+ [
147
+ {
148
+ type: "text",
149
+ text: "done",
150
+ status: { type: "complete", reason: "unknown" },
151
+ },
152
+ {
153
+ type: "reasoning",
154
+ text: "interrupted",
155
+ status: {
156
+ type: "incomplete",
157
+ reason: "unknown",
158
+ error: "upstream error",
159
+ },
160
+ },
161
+ ] as unknown as ExternalThreadMessage["content"],
162
+ ),
163
+ ],
164
+ isRunning: true,
165
+ });
166
+ const state = aui().thread.message({ id: "a1" }).getState();
167
+
168
+ expect(state.parts[0]!.status).toEqual({ type: "complete" });
169
+ expect(state.parts[1]!.status).toEqual({
170
+ type: "incomplete",
171
+ reason: "other",
172
+ });
81
173
  });
82
174
 
83
175
  it("keeps parts complete on requires-action and user messages", () => {