@assistant-ui/react 0.15.5 → 0.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/ExternalThread.d.ts.map +1 -1
- package/dist/client/ExternalThread.js +30 -29
- package/dist/client/ExternalThread.js.map +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerAttachmentDropzone.js +64 -50
- package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
- package/package.json +14 -12
- package/src/client/ExternalThread.ts +2 -1
- package/src/primitives/composer/ComposerAttachmentDropzone.test.tsx +103 -3
- package/src/primitives/composer/ComposerAttachmentDropzone.tsx +18 -3
- package/src/tests/external-thread-parity.test.tsx +43 -0
- package/LICENSE +0 -21
|
@@ -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;;
|
|
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(
|
|
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] =
|
|
693
|
-
|
|
692
|
+
$[80] = type;
|
|
693
|
+
$[81] = t19;
|
|
694
|
+
} else t19 = $[81];
|
|
694
695
|
let t20;
|
|
695
|
-
if ($[
|
|
696
|
+
if ($[82] !== onBeginEdit) {
|
|
696
697
|
t20 = () => {
|
|
697
698
|
onBeginEdit?.();
|
|
698
699
|
};
|
|
699
|
-
$[
|
|
700
|
-
$[
|
|
701
|
-
} else t20 = $[
|
|
700
|
+
$[82] = onBeginEdit;
|
|
701
|
+
$[83] = t20;
|
|
702
|
+
} else t20 = $[83];
|
|
702
703
|
let t21;
|
|
703
|
-
if ($[
|
|
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
|
-
$[
|
|
709
|
-
$[
|
|
710
|
-
} else t21 = $[
|
|
709
|
+
$[84] = queueItemClients;
|
|
710
|
+
$[85] = t21;
|
|
711
|
+
} else t21 = $[85];
|
|
711
712
|
let t22;
|
|
712
|
-
if ($[
|
|
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
|
-
$[
|
|
731
|
-
$[
|
|
732
|
-
$[
|
|
733
|
-
$[
|
|
734
|
-
$[
|
|
735
|
-
$[
|
|
736
|
-
$[
|
|
737
|
-
$[
|
|
738
|
-
$[
|
|
739
|
-
$[
|
|
740
|
-
$[
|
|
741
|
-
$[
|
|
742
|
-
$[
|
|
743
|
-
$[
|
|
744
|
-
} else t22 = $[
|
|
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;
|
|
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(
|
|
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] =
|
|
23
|
-
$[1] =
|
|
24
|
-
|
|
27
|
+
$[0] = aui;
|
|
28
|
+
$[1] = disabled;
|
|
29
|
+
$[2] = t2;
|
|
30
|
+
} else t2 = $[2];
|
|
25
31
|
const handleDragEnterCapture = t2;
|
|
26
32
|
let t3;
|
|
27
|
-
if ($[
|
|
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
|
-
$[
|
|
34
|
-
$[
|
|
35
|
-
$[
|
|
36
|
-
|
|
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 ($[
|
|
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
|
-
$[
|
|
48
|
-
$[
|
|
49
|
-
} else t4 = $[
|
|
59
|
+
$[7] = disabled;
|
|
60
|
+
$[8] = t4;
|
|
61
|
+
} else t4 = $[8];
|
|
50
62
|
const handleDragLeaveCapture = t4;
|
|
51
63
|
let t5;
|
|
52
|
-
if ($[
|
|
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
|
-
$[
|
|
65
|
-
$[
|
|
66
|
-
$[
|
|
67
|
-
} else t5 = $[
|
|
78
|
+
$[9] = aui;
|
|
79
|
+
$[10] = disabled;
|
|
80
|
+
$[11] = t5;
|
|
81
|
+
} else t5 = $[11];
|
|
68
82
|
const handleDrop = t5;
|
|
69
83
|
let t6;
|
|
70
|
-
if ($[
|
|
84
|
+
if ($[12] !== isDragging) {
|
|
71
85
|
t6 = isDragging ? { "data-dragging": "true" } : null;
|
|
72
|
-
$[
|
|
73
|
-
$[
|
|
74
|
-
} else t6 = $[
|
|
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 ($[
|
|
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
|
-
$[
|
|
91
|
-
$[
|
|
92
|
-
$[
|
|
93
|
-
$[
|
|
94
|
-
$[
|
|
95
|
-
$[
|
|
96
|
-
$[
|
|
97
|
-
$[
|
|
98
|
-
} else t11 = $[
|
|
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 ($[
|
|
117
|
+
if ($[22] !== render || $[23] !== t12) {
|
|
104
118
|
t13 = cloneElement(render, void 0, t12);
|
|
105
|
-
$[
|
|
106
|
-
$[
|
|
107
|
-
$[
|
|
108
|
-
} else t13 = $[
|
|
119
|
+
$[22] = render;
|
|
120
|
+
$[23] = t12;
|
|
121
|
+
$[24] = t13;
|
|
122
|
+
} else t13 = $[24];
|
|
109
123
|
let t14;
|
|
110
|
-
if ($[
|
|
124
|
+
if ($[25] !== mergedProps || $[26] !== t13) {
|
|
111
125
|
t14 = /* @__PURE__ */ jsx(Slot.Root, {
|
|
112
126
|
...mergedProps,
|
|
113
127
|
children: t13
|
|
114
128
|
});
|
|
115
|
-
$[
|
|
116
|
-
$[
|
|
117
|
-
$[
|
|
118
|
-
} else t14 = $[
|
|
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 ($[
|
|
137
|
+
if ($[28] !== Comp || $[29] !== children || $[30] !== mergedProps) {
|
|
124
138
|
t12 = /* @__PURE__ */ jsx(Comp, {
|
|
125
139
|
...mergedProps,
|
|
126
140
|
children
|
|
127
141
|
});
|
|
128
|
-
$[
|
|
129
|
-
$[
|
|
130
|
-
$[
|
|
131
|
-
$[
|
|
132
|
-
} else t12 = $[
|
|
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","
|
|
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.
|
|
3
|
+
"version": "0.15.6",
|
|
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.
|
|
59
|
-
"@assistant-ui/store": "^0.3.
|
|
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
|
-
|
|
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.
|
|
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.
|