@assistant-ui/react 0.15.5 → 0.15.7

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":";;;;KAsDY,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;;cAo1BzB,4CAAc,SAAA,yBAAA"}
1
+ {"version":3,"file":"ExternalThread.d.ts","names":[],"sources":["../../src/client/ExternalThread.ts"],"mappings":";;;;KAsDY,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;;cAq1BzB,4CAAc,SAAA,yBAAA"}
@@ -380,7 +380,7 @@ const useLiveState = (initial) => {
380
380
  return t1;
381
381
  };
382
382
  const useComposerClientResource = (t0) => {
383
- const $ = c(99);
383
+ const $ = c(100);
384
384
  const { type, isEditing, canCancel, isSendDisabled: t1, onCancel, onBeginEdit, onSend, message, queue, attachmentAdapter } = t0;
385
385
  const isSendDisabled = t1 === void 0 ? false : t1;
386
386
  const [text, setText, textRef] = useLiveState("");
@@ -638,7 +638,7 @@ const useComposerClientResource = (t0) => {
638
638
  $[65] = t18;
639
639
  } else t18 = $[65];
640
640
  let t19;
641
- if ($[66] !== attachmentAdapter || $[67] !== attachmentsRef || $[68] !== canCancel || $[69] !== isEditing || $[70] !== isSendDisabled || $[71] !== onSend || $[72] !== queue || $[73] !== quoteRef || $[74] !== roleRef || $[75] !== runConfigRef || $[76] !== setAttachments || $[77] !== setQuote || $[78] !== setText || $[79] !== textRef) {
641
+ if ($[66] !== attachmentAdapter || $[67] !== attachmentsRef || $[68] !== canCancel || $[69] !== isEditing || $[70] !== isSendDisabled || $[71] !== onSend || $[72] !== queue || $[73] !== quoteRef || $[74] !== roleRef || $[75] !== runConfigRef || $[76] !== setAttachments || $[77] !== setQuote || $[78] !== setText || $[79] !== textRef || $[80] !== type) {
642
642
  t19 = (opts) => {
643
643
  const currentQuote = quoteRef.current;
644
644
  const currentText = textRef.current;
@@ -663,7 +663,7 @@ const useComposerClientResource = (t0) => {
663
663
  startRun: opts?.startRun,
664
664
  metadata: { custom: { ...currentQuote ? { quote: currentQuote } : {} } }
665
665
  };
666
- if (queue) if (opts?.steer ?? canCancel) queue.steer(composedMessage);
666
+ if (queue && type === "thread") if (opts?.steer ?? canCancel) queue.steer(composedMessage);
667
667
  else queue.enqueue(composedMessage);
668
668
  else onSend?.(composedMessage);
669
669
  };
@@ -689,27 +689,28 @@ const useComposerClientResource = (t0) => {
689
689
  $[77] = setQuote;
690
690
  $[78] = setText;
691
691
  $[79] = textRef;
692
- $[80] = t19;
693
- } else t19 = $[80];
692
+ $[80] = type;
693
+ $[81] = t19;
694
+ } else t19 = $[81];
694
695
  let t20;
695
- if ($[81] !== onBeginEdit) {
696
+ if ($[82] !== onBeginEdit) {
696
697
  t20 = () => {
697
698
  onBeginEdit?.();
698
699
  };
699
- $[81] = onBeginEdit;
700
- $[82] = t20;
701
- } else t20 = $[82];
700
+ $[82] = onBeginEdit;
701
+ $[83] = t20;
702
+ } else t20 = $[83];
702
703
  let t21;
703
- if ($[83] !== queueItemClients) {
704
+ if ($[84] !== queueItemClients) {
704
705
  t21 = (selector_0) => {
705
706
  if ("id" in selector_0) return queueItemClients.get({ key: selector_0.id });
706
707
  return queueItemClients.get(selector_0);
707
708
  };
708
- $[83] = queueItemClients;
709
- $[84] = t21;
710
- } else t21 = $[84];
709
+ $[84] = queueItemClients;
710
+ $[85] = t21;
711
+ } else t21 = $[85];
711
712
  let t22;
712
- if ($[85] !== onCancel || $[86] !== setQuote || $[87] !== setRole || $[88] !== setRunConfig || $[89] !== setText || $[90] !== t14 || $[91] !== t15 || $[92] !== t16 || $[93] !== t17 || $[94] !== t18 || $[95] !== t19 || $[96] !== t20 || $[97] !== t21) {
713
+ if ($[86] !== onCancel || $[87] !== setQuote || $[88] !== setRole || $[89] !== setRunConfig || $[90] !== setText || $[91] !== t14 || $[92] !== t15 || $[93] !== t16 || $[94] !== t17 || $[95] !== t18 || $[96] !== t19 || $[97] !== t20 || $[98] !== t21) {
713
714
  t22 = {
714
715
  getState: t14,
715
716
  setText,
@@ -727,21 +728,21 @@ const useComposerClientResource = (t0) => {
727
728
  setQuote,
728
729
  queueItem: t21
729
730
  };
730
- $[85] = onCancel;
731
- $[86] = setQuote;
732
- $[87] = setRole;
733
- $[88] = setRunConfig;
734
- $[89] = setText;
735
- $[90] = t14;
736
- $[91] = t15;
737
- $[92] = t16;
738
- $[93] = t17;
739
- $[94] = t18;
740
- $[95] = t19;
741
- $[96] = t20;
742
- $[97] = t21;
743
- $[98] = t22;
744
- } else t22 = $[98];
731
+ $[86] = onCancel;
732
+ $[87] = setQuote;
733
+ $[88] = setRole;
734
+ $[89] = setRunConfig;
735
+ $[90] = setText;
736
+ $[91] = t14;
737
+ $[92] = t15;
738
+ $[93] = t16;
739
+ $[94] = t17;
740
+ $[95] = t18;
741
+ $[96] = t19;
742
+ $[97] = t20;
743
+ $[98] = t21;
744
+ $[99] = t22;
745
+ } else t22 = $[99];
745
746
  return t22;
746
747
  };
747
748
  const ComposerClientResource = resource(useComposerClientResource);
@@ -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","QueuePlacement","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","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","onMove","placement","steer","lane","insertAfter","move","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","steerItems","laneItems","items","queueItems","queueItemClients","accept","isEmpty","trim","canSend","attachmentAccept","dictation","fileOrAttachment","file","name","contentType","add","newAttachment","Math","random","toString","substring","prev_1","newAttachment_0","prev_2","removed_0","removed_1","t19","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","t20","t21","t22","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","message_1","composerQueue","hasQueue","hasBranches","hasEdit","hasReload","hasAttachments","_temp10","messageStates","edit","refetchThread","feedback","voice","switchBranchDuringRun","unstable_copy","isDisabled","capabilities","suggestions","message_2","appendMessage","t23","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 QueuePlacement,\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 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 onMove,\n onRemove,\n}: {\n item: QueueItemState;\n onMove: (placement: QueuePlacement) => void;\n onRemove: () => void;\n}): ClientOutput<\"queueItem\"> => {\n return {\n getState: () => item,\n steer: () => onMove({ lane: \"steer\", insertAfter: null }),\n move: onMove,\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 steerItems = queue?.steerItems ?? EMPTY_QUEUE_ITEMS;\n const laneItems = queue?.items ?? EMPTY_QUEUE_ITEMS;\n const queueItems = useMemo(\n () =>\n steerItems.length === 0\n ? laneItems\n : laneItems.length === 0\n ? steerItems\n : [...steerItems, ...laneItems],\n [steerItems, laneItems],\n );\n const queueItemClients = useClientLookup(\n queueItems.map((item) =>\n withKey(\n item.id,\n QueueItemClient({\n item,\n onMove: (placement) => queue?.move(item.id, placement),\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 if (opts?.steer ?? canCancel) queue.steer(composedMessage);\n else queue.enqueue(composedMessage);\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 } | { id: string }) => {\n if (\"id\" in selector) {\n return queueItemClients.get({ key: selector.id });\n }\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 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 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) =>\n queue.enqueue({ ...message, parentId: message.parentId ?? headId }),\n steer: (message) =>\n queue.steer({ ...message, parentId: message.parentId ?? headId }),\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 refetchThread: false,\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);\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","QueuePlacement","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","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","onMove","placement","steer","lane","insertAfter","move","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","steerItems","laneItems","items","queueItems","queueItemClients","accept","isEmpty","trim","canSend","attachmentAccept","dictation","fileOrAttachment","file","name","contentType","add","newAttachment","Math","random","toString","substring","prev_1","newAttachment_0","prev_2","removed_0","removed_1","t19","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","t20","t21","t22","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","message_1","composerQueue","hasQueue","hasBranches","hasEdit","hasReload","hasAttachments","_temp10","messageStates","edit","refetchThread","feedback","voice","switchBranchDuringRun","unstable_copy","isDisabled","capabilities","suggestions","message_2","appendMessage","t23","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 QueuePlacement,\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 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 onMove,\n onRemove,\n}: {\n item: QueueItemState;\n onMove: (placement: QueuePlacement) => void;\n onRemove: () => void;\n}): ClientOutput<\"queueItem\"> => {\n return {\n getState: () => item,\n steer: () => onMove({ lane: \"steer\", insertAfter: null }),\n move: onMove,\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 steerItems = queue?.steerItems ?? EMPTY_QUEUE_ITEMS;\n const laneItems = queue?.items ?? EMPTY_QUEUE_ITEMS;\n const queueItems = useMemo(\n () =>\n steerItems.length === 0\n ? laneItems\n : laneItems.length === 0\n ? steerItems\n : [...steerItems, ...laneItems],\n [steerItems, laneItems],\n );\n const queueItemClients = useClientLookup(\n queueItems.map((item) =>\n withKey(\n item.id,\n QueueItemClient({\n item,\n onMove: (placement) => queue?.move(item.id, placement),\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 // edit sends carry a sourceId contract; only thread sends queue\n if (queue && type === \"thread\") {\n if (opts?.steer ?? canCancel) queue.steer(composedMessage);\n else queue.enqueue(composedMessage);\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 } | { id: string }) => {\n if (\"id\" in selector) {\n return queueItemClients.get({ key: selector.id });\n }\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 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 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) =>\n queue.enqueue({ ...message, parentId: message.parentId ?? headId }),\n steer: (message) =>\n queue.steer({ ...message, parentId: message.parentId ?? headId }),\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 refetchThread: false,\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);\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 +1 @@
1
- {"version":3,"file":"ComposerAttachmentDropzone.d.ts","names":[],"sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"mappings":";;kBAgBiB;OACH,UAAU;OACV,QAAQ,MAAM,eAAe;IACvC;IACA,SAAS;IACT;;;cAIS,qCAAmC,MAAA,0BAAA,MAAA,eAAA;EANlC;EACD,SAAA;EACE;IA+Fb,MAAA,cAAA"}
1
+ {"version":3,"file":"ComposerAttachmentDropzone.d.ts","names":[],"sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"mappings":";;kBAgBiB;OACH,UAAU;OACV,QAAQ,MAAM,eAAe;IACvC;IACA,SAAS;IACT;;;cAIS,qCAAmC,MAAA,0BAAA,MAAA,eAAA;EANlC;EACD,SAAA;EACE;IA8Gb,MAAA,cAAA"}
@@ -7,36 +7,48 @@ import { composeEventHandlers } from "@radix-ui/primitive";
7
7
  import { Slot } from "radix-ui";
8
8
  //#region src/primitives/composer/ComposerAttachmentDropzone.tsx
9
9
  const ComposerPrimitiveAttachmentDropzone = forwardRef((t0, ref) => {
10
- const $ = c(30);
10
+ const $ = c(32);
11
11
  const { disabled, asChild: t1, render, children, ...rest } = t0;
12
12
  const asChild = t1 === void 0 ? false : t1;
13
13
  const [isDragging, setIsDragging] = useState(false);
14
14
  const aui = useAui();
15
15
  let t2;
16
- if ($[0] !== disabled) {
16
+ if ($[0] !== aui || $[1] !== disabled) {
17
17
  t2 = (e) => {
18
18
  if (disabled) return;
19
+ if (!e.dataTransfer.types.includes("Files")) return;
19
20
  e.preventDefault();
21
+ if (!aui.thread.getState().capabilities.attachments) {
22
+ e.dataTransfer.dropEffect = "none";
23
+ return;
24
+ }
20
25
  setIsDragging(true);
21
26
  };
22
- $[0] = disabled;
23
- $[1] = t2;
24
- } else t2 = $[1];
27
+ $[0] = aui;
28
+ $[1] = disabled;
29
+ $[2] = t2;
30
+ } else t2 = $[2];
25
31
  const handleDragEnterCapture = t2;
26
32
  let t3;
27
- if ($[2] !== disabled || $[3] !== isDragging) {
33
+ if ($[3] !== aui || $[4] !== disabled || $[5] !== isDragging) {
28
34
  t3 = (e_0) => {
29
35
  if (disabled) return;
36
+ if (!e_0.dataTransfer.types.includes("Files")) return;
30
37
  e_0.preventDefault();
38
+ if (!aui.thread.getState().capabilities.attachments) {
39
+ e_0.dataTransfer.dropEffect = "none";
40
+ return;
41
+ }
31
42
  if (!isDragging) setIsDragging(true);
32
43
  };
33
- $[2] = disabled;
34
- $[3] = isDragging;
35
- $[4] = t3;
36
- } else t3 = $[4];
44
+ $[3] = aui;
45
+ $[4] = disabled;
46
+ $[5] = isDragging;
47
+ $[6] = t3;
48
+ } else t3 = $[6];
37
49
  const handleDragOverCapture = t3;
38
50
  let t4;
39
- if ($[5] !== disabled) {
51
+ if ($[7] !== disabled) {
40
52
  t4 = (e_1) => {
41
53
  if (disabled) return;
42
54
  e_1.preventDefault();
@@ -44,40 +56,42 @@ const ComposerPrimitiveAttachmentDropzone = forwardRef((t0, ref) => {
44
56
  if (next && e_1.currentTarget.contains(next)) return;
45
57
  setIsDragging(false);
46
58
  };
47
- $[5] = disabled;
48
- $[6] = t4;
49
- } else t4 = $[6];
59
+ $[7] = disabled;
60
+ $[8] = t4;
61
+ } else t4 = $[8];
50
62
  const handleDragLeaveCapture = t4;
51
63
  let t5;
52
- if ($[7] !== aui || $[8] !== disabled) {
64
+ if ($[9] !== aui || $[10] !== disabled) {
53
65
  t5 = async (e_2) => {
54
66
  if (disabled) return;
55
- e_2.preventDefault();
56
67
  setIsDragging(false);
68
+ if (!e_2.dataTransfer.types.includes("Files")) return;
69
+ e_2.preventDefault();
57
70
  const files = Array.from(e_2.dataTransfer.files);
71
+ if (!aui.thread.getState().capabilities.attachments || files.length === 0) return;
58
72
  await Promise.all(files.map(async (file) => {
59
73
  try {
60
74
  await aui.composer.addAttachment(file);
61
75
  } catch {}
62
76
  }));
63
77
  };
64
- $[7] = aui;
65
- $[8] = disabled;
66
- $[9] = t5;
67
- } else t5 = $[9];
78
+ $[9] = aui;
79
+ $[10] = disabled;
80
+ $[11] = t5;
81
+ } else t5 = $[11];
68
82
  const handleDrop = t5;
69
83
  let t6;
70
- if ($[10] !== isDragging) {
84
+ if ($[12] !== isDragging) {
71
85
  t6 = isDragging ? { "data-dragging": "true" } : null;
72
- $[10] = isDragging;
73
- $[11] = t6;
74
- } else t6 = $[11];
86
+ $[12] = isDragging;
87
+ $[13] = t6;
88
+ } else t6 = $[13];
75
89
  const t7 = composeEventHandlers(rest.onDragEnterCapture, handleDragEnterCapture);
76
90
  const t8 = composeEventHandlers(rest.onDragOverCapture, handleDragOverCapture);
77
91
  const t9 = composeEventHandlers(rest.onDragLeaveCapture, handleDragLeaveCapture);
78
92
  const t10 = composeEventHandlers(rest.onDropCapture, handleDrop);
79
93
  let t11;
80
- if ($[12] !== ref || $[13] !== rest || $[14] !== t10 || $[15] !== t6 || $[16] !== t7 || $[17] !== t8 || $[18] !== t9) {
94
+ if ($[14] !== ref || $[15] !== rest || $[16] !== t10 || $[17] !== t6 || $[18] !== t7 || $[19] !== t8 || $[20] !== t9) {
81
95
  t11 = {
82
96
  ...t6,
83
97
  ...rest,
@@ -87,49 +101,49 @@ const ComposerPrimitiveAttachmentDropzone = forwardRef((t0, ref) => {
87
101
  onDropCapture: t10,
88
102
  ref
89
103
  };
90
- $[12] = ref;
91
- $[13] = rest;
92
- $[14] = t10;
93
- $[15] = t6;
94
- $[16] = t7;
95
- $[17] = t8;
96
- $[18] = t9;
97
- $[19] = t11;
98
- } else t11 = $[19];
104
+ $[14] = ref;
105
+ $[15] = rest;
106
+ $[16] = t10;
107
+ $[17] = t6;
108
+ $[18] = t7;
109
+ $[19] = t8;
110
+ $[20] = t9;
111
+ $[21] = t11;
112
+ } else t11 = $[21];
99
113
  const mergedProps = t11;
100
114
  if (render && isValidElement(render)) {
101
115
  const t12 = children !== void 0 ? children : render.props.children;
102
116
  let t13;
103
- if ($[20] !== render || $[21] !== t12) {
117
+ if ($[22] !== render || $[23] !== t12) {
104
118
  t13 = cloneElement(render, void 0, t12);
105
- $[20] = render;
106
- $[21] = t12;
107
- $[22] = t13;
108
- } else t13 = $[22];
119
+ $[22] = render;
120
+ $[23] = t12;
121
+ $[24] = t13;
122
+ } else t13 = $[24];
109
123
  let t14;
110
- if ($[23] !== mergedProps || $[24] !== t13) {
124
+ if ($[25] !== mergedProps || $[26] !== t13) {
111
125
  t14 = /* @__PURE__ */ jsx(Slot.Root, {
112
126
  ...mergedProps,
113
127
  children: t13
114
128
  });
115
- $[23] = mergedProps;
116
- $[24] = t13;
117
- $[25] = t14;
118
- } else t14 = $[25];
129
+ $[25] = mergedProps;
130
+ $[26] = t13;
131
+ $[27] = t14;
132
+ } else t14 = $[27];
119
133
  return t14;
120
134
  }
121
135
  const Comp = asChild ? Slot.Root : "div";
122
136
  let t12;
123
- if ($[26] !== Comp || $[27] !== children || $[28] !== mergedProps) {
137
+ if ($[28] !== Comp || $[29] !== children || $[30] !== mergedProps) {
124
138
  t12 = /* @__PURE__ */ jsx(Comp, {
125
139
  ...mergedProps,
126
140
  children
127
141
  });
128
- $[26] = Comp;
129
- $[27] = children;
130
- $[28] = mergedProps;
131
- $[29] = t12;
132
- } else t12 = $[29];
142
+ $[28] = Comp;
143
+ $[29] = children;
144
+ $[30] = mergedProps;
145
+ $[31] = t12;
146
+ } else t12 = $[31];
133
147
  return t12;
134
148
  });
135
149
  ComposerPrimitiveAttachmentDropzone.displayName = "ComposerPrimitive.AttachmentDropzone";
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerAttachmentDropzone.js","names":["c","_c","forwardRef","useCallback","useState","ReactElement","cloneElement","isValidElement","composeEventHandlers","Slot","React","useAui","ComposerPrimitiveAttachmentDropzone","Element","HTMLDivElement","Props","HTMLAttributes","asChild","render","disabled","t0","ref","$","t1","children","rest","undefined","isDragging","setIsDragging","aui","t2","e","preventDefault","handleDragEnterCapture","t3","e_0","handleDragOverCapture","t4","e_1","next","relatedTarget","Node","currentTarget","contains","handleDragLeaveCapture","t5","e_2","files","Array","from","dataTransfer","Promise","all","map","file","composer","addAttachment","handleDrop","t6","t7","onDragEnterCapture","t8","onDragOverCapture","t9","onDragLeaveCapture","t10","onDropCapture","t11","mergedProps","renderChildren","props","Record","t12","ReactNode","t13","t14","Comp","Root","displayName"],"sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type ReactElement,\n cloneElement,\n isValidElement,\n} from \"react\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Slot } from \"radix-ui\";\nimport type React from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\n\nexport namespace ComposerPrimitiveAttachmentDropzone {\n export type Element = HTMLDivElement;\n export type Props = React.HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean | undefined;\n render?: ReactElement | undefined;\n disabled?: boolean | undefined;\n };\n}\n\nexport const ComposerPrimitiveAttachmentDropzone = forwardRef<\n HTMLDivElement,\n ComposerPrimitiveAttachmentDropzone.Props\n>(({ disabled, asChild = false, render, children, ...rest }, ref) => {\n const [isDragging, setIsDragging] = useState(false);\n const aui = useAui();\n\n const handleDragEnterCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n },\n [disabled],\n );\n\n const handleDragOverCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n if (!isDragging) setIsDragging(true);\n },\n [disabled, isDragging],\n );\n\n const handleDragLeaveCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) {\n return;\n }\n setIsDragging(false);\n },\n [disabled],\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(false);\n const files = Array.from(e.dataTransfer.files);\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer.addAttachment(file);\n } catch {\n // The composer runtime emits composer.attachmentAddError before rejecting;\n // the readonly and empty-thread stubs only throw.\n }\n }),\n );\n },\n [disabled, aui],\n );\n\n const mergedProps = {\n ...(isDragging ? { \"data-dragging\": \"true\" } : null),\n ...rest,\n onDragEnterCapture: composeEventHandlers(\n rest.onDragEnterCapture,\n handleDragEnterCapture,\n ),\n onDragOverCapture: composeEventHandlers(\n rest.onDragOverCapture,\n handleDragOverCapture,\n ),\n onDragLeaveCapture: composeEventHandlers(\n rest.onDragLeaveCapture,\n handleDragLeaveCapture,\n ),\n onDropCapture: composeEventHandlers(rest.onDropCapture, handleDrop),\n ref,\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n children !== undefined\n ? children\n : (render.props as Record<string, unknown>).children;\n return (\n <Slot.Root {...mergedProps}>\n {cloneElement(render, undefined, renderChildren as React.ReactNode)}\n </Slot.Root>\n );\n }\n\n const Comp = asChild ? Slot.Root : \"div\";\n return <Comp {...mergedProps}>{children}</Comp>;\n});\n\nComposerPrimitiveAttachmentDropzone.displayName =\n \"ComposerPrimitive.AttachmentDropzone\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ComposerAttachmentDropzone.js","names":["c","_c","forwardRef","useCallback","useState","ReactElement","cloneElement","isValidElement","composeEventHandlers","Slot","React","useAui","ComposerPrimitiveAttachmentDropzone","Element","HTMLDivElement","Props","HTMLAttributes","asChild","render","disabled","t0","ref","$","t1","children","rest","undefined","isDragging","setIsDragging","aui","t2","e","dataTransfer","types","includes","preventDefault","thread","getState","capabilities","attachments","dropEffect","handleDragEnterCapture","t3","e_0","handleDragOverCapture","t4","e_1","next","relatedTarget","Node","currentTarget","contains","handleDragLeaveCapture","t5","e_2","files","Array","from","length","Promise","all","map","file","composer","addAttachment","handleDrop","t6","t7","onDragEnterCapture","t8","onDragOverCapture","t9","onDragLeaveCapture","t10","onDropCapture","t11","mergedProps","renderChildren","props","Record","t12","ReactNode","t13","t14","Comp","Root","displayName"],"sources":["../../../src/primitives/composer/ComposerAttachmentDropzone.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type ReactElement,\n cloneElement,\n isValidElement,\n} from \"react\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Slot } from \"radix-ui\";\nimport type React from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\n\nexport namespace ComposerPrimitiveAttachmentDropzone {\n export type Element = HTMLDivElement;\n export type Props = React.HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean | undefined;\n render?: ReactElement | undefined;\n disabled?: boolean | undefined;\n };\n}\n\nexport const ComposerPrimitiveAttachmentDropzone = forwardRef<\n HTMLDivElement,\n ComposerPrimitiveAttachmentDropzone.Props\n>(({ disabled, asChild = false, render, children, ...rest }, ref) => {\n const [isDragging, setIsDragging] = useState(false);\n const aui = useAui();\n\n // An unprevented file drop navigates the tab to the file, so file drags are\n // claimed via preventDefault even when the runtime does not support attachments.\n const handleDragEnterCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n if (!e.dataTransfer.types.includes(\"Files\")) return;\n e.preventDefault();\n if (!aui.thread.getState().capabilities.attachments) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n setIsDragging(true);\n },\n [disabled, aui],\n );\n\n const handleDragOverCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n if (!e.dataTransfer.types.includes(\"Files\")) return;\n e.preventDefault();\n if (!aui.thread.getState().capabilities.attachments) {\n e.dataTransfer.dropEffect = \"none\";\n return;\n }\n if (!isDragging) setIsDragging(true);\n },\n [disabled, isDragging, aui],\n );\n\n const handleDragLeaveCapture = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n const next = e.relatedTarget as Node | null;\n if (next && e.currentTarget.contains(next)) {\n return;\n }\n setIsDragging(false);\n },\n [disabled],\n );\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n if (disabled) return;\n setIsDragging(false);\n if (!e.dataTransfer.types.includes(\"Files\")) return;\n e.preventDefault();\n const files = Array.from(e.dataTransfer.files);\n if (!aui.thread.getState().capabilities.attachments || files.length === 0)\n return;\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer.addAttachment(file);\n } catch {\n // The composer runtime emits composer.attachmentAddError before rejecting;\n // the readonly and empty-thread stubs only throw.\n }\n }),\n );\n },\n [disabled, aui],\n );\n\n const mergedProps = {\n ...(isDragging ? { \"data-dragging\": \"true\" } : null),\n ...rest,\n onDragEnterCapture: composeEventHandlers(\n rest.onDragEnterCapture,\n handleDragEnterCapture,\n ),\n onDragOverCapture: composeEventHandlers(\n rest.onDragOverCapture,\n handleDragOverCapture,\n ),\n onDragLeaveCapture: composeEventHandlers(\n rest.onDragLeaveCapture,\n handleDragLeaveCapture,\n ),\n onDropCapture: composeEventHandlers(rest.onDropCapture, handleDrop),\n ref,\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n children !== undefined\n ? children\n : (render.props as Record<string, unknown>).children;\n return (\n <Slot.Root {...mergedProps}>\n {cloneElement(render, undefined, renderChildren as React.ReactNode)}\n </Slot.Root>\n );\n }\n\n const Comp = asChild ? Slot.Root : \"div\";\n return <Comp {...mergedProps}>{children}</Comp>;\n});\n\nComposerPrimitiveAttachmentDropzone.displayName =\n \"ComposerPrimitive.AttachmentDropzone\";\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.5",
3
+ "version": "0.15.7",
4
4
  "description": "Open-source TypeScript/React library for building production-grade AI chat experiences",
5
5
  "keywords": [
6
6
  "ai",
@@ -54,9 +54,16 @@
54
54
  "README.md"
55
55
  ],
56
56
  "sideEffects": false,
57
+ "scripts": {
58
+ "prepack": "cp ../../README.md /tmp/aui-readme-pack.md && mv /tmp/aui-readme-pack.md ./README.md",
59
+ "postpack": "rm -f ./README.md && ln -s ../../README.md ./README.md",
60
+ "build": "aui-build",
61
+ "test": "vitest run",
62
+ "test:watch": "vitest"
63
+ },
57
64
  "dependencies": {
58
- "@assistant-ui/core": "^0.3.6",
59
- "@assistant-ui/store": "^0.3.4",
65
+ "@assistant-ui/core": "^0.3.7",
66
+ "@assistant-ui/store": "^0.3.5",
60
67
  "@assistant-ui/tap": "^0.9.10",
61
68
  "@radix-ui/primitive": "^1.1.7",
62
69
  "@radix-ui/react-collection": "^1.1.15",
@@ -90,6 +97,8 @@
90
97
  }
91
98
  },
92
99
  "devDependencies": {
100
+ "@assistant-ui/vite": "workspace:*",
101
+ "@assistant-ui/x-buildutils": "workspace:*",
93
102
  "@testing-library/react": "^16.3.2",
94
103
  "@types/json-schema": "^7.0.15",
95
104
  "@types/node": "^26.1.1",
@@ -98,9 +107,7 @@
98
107
  "jsdom": "^29.1.1",
99
108
  "react": "^19.2.8",
100
109
  "react-dom": "^19.2.8",
101
- "vitest": "^4.1.10",
102
- "@assistant-ui/vite": "0.0.11",
103
- "@assistant-ui/x-buildutils": "0.0.21"
110
+ "vitest": "^4.1.10"
104
111
  },
105
112
  "publishConfig": {
106
113
  "access": "public",
@@ -114,10 +121,5 @@
114
121
  },
115
122
  "bugs": {
116
123
  "url": "https://github.com/assistant-ui/assistant-ui/issues"
117
- },
118
- "scripts": {
119
- "build": "aui-build",
120
- "test": "vitest run",
121
- "test:watch": "vitest"
122
124
  }
123
- }
125
+ }
@@ -672,7 +672,8 @@ const useComposerClientResource = ({
672
672
  custom: { ...(currentQuote ? { quote: currentQuote } : {}) },
673
673
  },
674
674
  };
675
- if (queue) {
675
+ // edit sends carry a sourceId contract; only thread sends queue
676
+ if (queue && type === "thread") {
676
677
  if (opts?.steer ?? canCancel) queue.steer(composedMessage);
677
678
  else queue.enqueue(composedMessage);
678
679
  } else {
@@ -6,7 +6,10 @@ import { createRoot, type Root } from "react-dom/client";
6
6
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
7
  import { ComposerPrimitiveAttachmentDropzone } from "./ComposerAttachmentDropzone";
8
8
 
9
- const addAttachment = vi.fn<(file: File) => Promise<void>>();
9
+ const { addAttachment, threadCapabilities } = vi.hoisted(() => ({
10
+ addAttachment: vi.fn<(file: File) => Promise<void>>(),
11
+ threadCapabilities: { attachments: true },
12
+ }));
10
13
 
11
14
  (globalThis as Record<string, unknown>).IS_REACT_ACT_ENVIRONMENT = true;
12
15
 
@@ -18,14 +21,26 @@ vi.mock("@assistant-ui/store", async (importOriginal) => {
18
21
  composer: {
19
22
  addAttachment,
20
23
  },
24
+ thread: {
25
+ getState: () => ({ capabilities: threadCapabilities }),
26
+ },
21
27
  }),
22
28
  };
23
29
  });
24
30
 
25
- const createDropEvent = (files: File[]) => {
31
+ const createDropEvent = (files: File[], types: string[] = ["Files"]) => {
26
32
  const event = new Event("drop", { bubbles: true, cancelable: true });
27
33
  Object.defineProperty(event, "dataTransfer", {
28
- value: { files },
34
+ value: { files, types },
35
+ configurable: true,
36
+ });
37
+ return event;
38
+ };
39
+
40
+ const createDragEvent = (type: string, types: string[]) => {
41
+ const event = new Event(type, { bubbles: true, cancelable: true });
42
+ Object.defineProperty(event, "dataTransfer", {
43
+ value: { files: [], types },
29
44
  configurable: true,
30
45
  });
31
46
  return event;
@@ -37,6 +52,7 @@ describe("ComposerPrimitiveAttachmentDropzone", () => {
37
52
 
38
53
  beforeEach(async () => {
39
54
  addAttachment.mockReset();
55
+ threadCapabilities.attachments = true;
40
56
  container = document.createElement("div");
41
57
  document.body.appendChild(container);
42
58
  root = createRoot(container);
@@ -123,4 +139,88 @@ describe("ComposerPrimitiveAttachmentDropzone", () => {
123
139
  expect(errorSpy).not.toHaveBeenCalled();
124
140
  errorSpy.mockRestore();
125
141
  });
142
+
143
+ it("highlights on file drags", async () => {
144
+ const dropzone = container.querySelector("[data-testid='dropzone']");
145
+ expect(dropzone).not.toBeNull();
146
+
147
+ const event = createDragEvent("dragenter", ["Files"]);
148
+ await act(async () => {
149
+ dropzone!.dispatchEvent(event);
150
+ });
151
+
152
+ expect(dropzone!.getAttribute("data-dragging")).toBe("true");
153
+ expect(event.defaultPrevented).toBe(true);
154
+ });
155
+
156
+ it("ignores non-file drags", async () => {
157
+ const dropzone = container.querySelector("[data-testid='dropzone']");
158
+ expect(dropzone).not.toBeNull();
159
+
160
+ const enter = createDragEvent("dragenter", ["text/plain"]);
161
+ const over = createDragEvent("dragover", ["text/plain"]);
162
+ await act(async () => {
163
+ dropzone!.dispatchEvent(enter);
164
+ dropzone!.dispatchEvent(over);
165
+ });
166
+
167
+ expect(dropzone!.hasAttribute("data-dragging")).toBe(false);
168
+ expect(enter.defaultPrevented).toBe(false);
169
+ expect(over.defaultPrevented).toBe(false);
170
+ });
171
+
172
+ it("claims file drags without highlighting when the runtime does not support attachments", async () => {
173
+ threadCapabilities.attachments = false;
174
+ const dropzone = container.querySelector("[data-testid='dropzone']");
175
+ expect(dropzone).not.toBeNull();
176
+
177
+ const enter = createDragEvent("dragenter", ["Files"]);
178
+ const drop = createDropEvent([
179
+ new File(["a"], "first.txt", { type: "text/plain" }),
180
+ ]);
181
+ await act(async () => {
182
+ dropzone!.dispatchEvent(enter);
183
+ dropzone!.dispatchEvent(drop);
184
+ });
185
+
186
+ expect(dropzone!.hasAttribute("data-dragging")).toBe(false);
187
+ expect(enter.defaultPrevented).toBe(true);
188
+ expect((enter as unknown as DragEvent).dataTransfer!.dropEffect).toBe(
189
+ "none",
190
+ );
191
+ expect(drop.defaultPrevented).toBe(true);
192
+ expect(addAttachment).not.toHaveBeenCalled();
193
+ });
194
+
195
+ it("clears the highlight and keeps a file drop claimed when it yields no files", async () => {
196
+ const dropzone = container.querySelector("[data-testid='dropzone']");
197
+ expect(dropzone).not.toBeNull();
198
+
199
+ await act(async () => {
200
+ dropzone!.dispatchEvent(createDragEvent("dragenter", ["Files"]));
201
+ });
202
+ expect(dropzone!.getAttribute("data-dragging")).toBe("true");
203
+
204
+ const drop = createDropEvent([], ["Files"]);
205
+ await act(async () => {
206
+ dropzone!.dispatchEvent(drop);
207
+ });
208
+
209
+ expect(dropzone!.hasAttribute("data-dragging")).toBe(false);
210
+ expect(drop.defaultPrevented).toBe(true);
211
+ expect(addAttachment).not.toHaveBeenCalled();
212
+ });
213
+
214
+ it("lets non-file drops pass through", async () => {
215
+ const dropzone = container.querySelector("[data-testid='dropzone']");
216
+ expect(dropzone).not.toBeNull();
217
+
218
+ const drop = createDropEvent([], []);
219
+ await act(async () => {
220
+ dropzone!.dispatchEvent(drop);
221
+ });
222
+
223
+ expect(drop.defaultPrevented).toBe(false);
224
+ expect(addAttachment).not.toHaveBeenCalled();
225
+ });
126
226
  });
@@ -30,22 +30,34 @@ export const ComposerPrimitiveAttachmentDropzone = forwardRef<
30
30
  const [isDragging, setIsDragging] = useState(false);
31
31
  const aui = useAui();
32
32
 
33
+ // An unprevented file drop navigates the tab to the file, so file drags are
34
+ // claimed via preventDefault even when the runtime does not support attachments.
33
35
  const handleDragEnterCapture = useCallback(
34
36
  (e: React.DragEvent) => {
35
37
  if (disabled) return;
38
+ if (!e.dataTransfer.types.includes("Files")) return;
36
39
  e.preventDefault();
40
+ if (!aui.thread.getState().capabilities.attachments) {
41
+ e.dataTransfer.dropEffect = "none";
42
+ return;
43
+ }
37
44
  setIsDragging(true);
38
45
  },
39
- [disabled],
46
+ [disabled, aui],
40
47
  );
41
48
 
42
49
  const handleDragOverCapture = useCallback(
43
50
  (e: React.DragEvent) => {
44
51
  if (disabled) return;
52
+ if (!e.dataTransfer.types.includes("Files")) return;
45
53
  e.preventDefault();
54
+ if (!aui.thread.getState().capabilities.attachments) {
55
+ e.dataTransfer.dropEffect = "none";
56
+ return;
57
+ }
46
58
  if (!isDragging) setIsDragging(true);
47
59
  },
48
- [disabled, isDragging],
60
+ [disabled, isDragging, aui],
49
61
  );
50
62
 
51
63
  const handleDragLeaveCapture = useCallback(
@@ -64,9 +76,12 @@ export const ComposerPrimitiveAttachmentDropzone = forwardRef<
64
76
  const handleDrop = useCallback(
65
77
  async (e: React.DragEvent) => {
66
78
  if (disabled) return;
67
- e.preventDefault();
68
79
  setIsDragging(false);
80
+ if (!e.dataTransfer.types.includes("Files")) return;
81
+ e.preventDefault();
69
82
  const files = Array.from(e.dataTransfer.files);
83
+ if (!aui.thread.getState().capabilities.attachments || files.length === 0)
84
+ return;
70
85
  await Promise.all(
71
86
  files.map(async (file) => {
72
87
  try {
@@ -279,6 +279,49 @@ describe("ExternalThread composer", () => {
279
279
  expect(enqueue).not.toHaveBeenCalled();
280
280
  });
281
281
 
282
+ it("routes edit-composer sends to onEdit with sourceId, bypassing the queue", async () => {
283
+ const onEdit = vi.fn();
284
+ const enqueue = vi.fn();
285
+ const steer = vi.fn();
286
+ const { aui } = renderThread({
287
+ messages: [
288
+ {
289
+ id: "u1",
290
+ role: "user",
291
+ content: [{ type: "text", text: "hi" }],
292
+ createdAt: new Date(0),
293
+ attachments: [],
294
+ metadata: { custom: {} },
295
+ } as unknown as ExternalThreadMessage,
296
+ ],
297
+ isRunning: false,
298
+ onEdit,
299
+ queue: {
300
+ items: [],
301
+ steerItems: [],
302
+ enqueue,
303
+ steer,
304
+ move: vi.fn(),
305
+ edit: vi.fn(),
306
+ remove: vi.fn(),
307
+ },
308
+ });
309
+
310
+ const composer = () => aui().thread.message({ id: "u1" }).composer();
311
+ composer().beginEdit();
312
+ await waitFor(() => expect(composer().getState().isEditing).toBe(true));
313
+ composer().setText("edited");
314
+ composer().send();
315
+
316
+ await waitFor(() => expect(onEdit).toHaveBeenCalledTimes(1));
317
+ expect(onEdit.mock.calls[0]![0]).toMatchObject({
318
+ sourceId: "u1",
319
+ content: [{ type: "text", text: "edited" }],
320
+ });
321
+ expect(enqueue).not.toHaveBeenCalled();
322
+ expect(steer).not.toHaveBeenCalled();
323
+ });
324
+
282
325
  it("still refuses to send an empty composer synchronously after a send", async () => {
283
326
  const onNew = vi.fn();
284
327
  const { aui } = renderThread({ messages: [], isRunning: false, onNew });
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 AgentbaseAI Inc.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.