@assistant-ui/core 0.3.10 → 0.3.12

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.
Files changed (53) hide show
  1. package/dist/index.d.ts +5 -4
  2. package/dist/index.js.map +1 -1
  3. package/dist/internal.d.ts +6 -5
  4. package/dist/internal.js +5 -4
  5. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  6. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +17 -10
  7. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  8. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  9. package/dist/react/runtimes/external-message-converter.js +15 -2
  10. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  11. package/dist/runtime/api/message-runtime.d.ts +2 -3
  12. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  13. package/dist/runtime/api/message-runtime.js +2 -16
  14. package/dist/runtime/api/message-runtime.js.map +1 -1
  15. package/dist/runtime/internal.d.ts +4 -4
  16. package/dist/runtime/internal.js +4 -4
  17. package/dist/store/clients/external-thread.d.ts +54 -0
  18. package/dist/store/clients/external-thread.d.ts.map +1 -0
  19. package/dist/store/clients/external-thread.js +1354 -0
  20. package/dist/store/clients/external-thread.js.map +1 -0
  21. package/dist/store/clients/single-thread-list.d.ts +9 -0
  22. package/dist/store/clients/single-thread-list.d.ts.map +1 -0
  23. package/dist/store/clients/single-thread-list.js +171 -0
  24. package/dist/store/clients/single-thread-list.js.map +1 -0
  25. package/dist/store/index.d.ts +3 -1
  26. package/dist/store/index.js +3 -1
  27. package/dist/types/augmentations.d.ts +33 -0
  28. package/dist/types/augmentations.d.ts.map +1 -0
  29. package/dist/types/augmentations.js +0 -0
  30. package/dist/utils/normalizePartStatus.d.ts +3 -2
  31. package/dist/utils/normalizePartStatus.d.ts.map +1 -1
  32. package/dist/utils/normalizePartStatus.js +15 -1
  33. package/dist/utils/normalizePartStatus.js.map +1 -1
  34. package/package.json +2 -2
  35. package/src/index.ts +6 -0
  36. package/src/internal.ts +1 -1
  37. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +49 -0
  38. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +11 -2
  39. package/src/react/runtimes/external-message-converter.test.ts +71 -0
  40. package/src/react/runtimes/external-message-converter.test.tsx +9 -0
  41. package/src/react/runtimes/external-message-converter.ts +35 -2
  42. package/src/runtime/api/message-runtime.test.ts +1 -1
  43. package/src/runtime/api/message-runtime.ts +2 -35
  44. package/src/store/clients/external-thread.ts +1152 -0
  45. package/src/store/clients/single-thread-list.ts +115 -0
  46. package/src/store/index.ts +6 -0
  47. package/src/tests/external-thread-attachments.test.tsx +370 -0
  48. package/src/tests/external-thread-branches.test.tsx +157 -0
  49. package/src/tests/external-thread-feedback.test.tsx +204 -0
  50. package/src/tests/external-thread-parity.test.tsx +494 -0
  51. package/src/tests/external-thread-speech.test.tsx +328 -0
  52. package/src/types/augmentations.ts +33 -0
  53. package/src/utils/normalizePartStatus.ts +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-thread.js","names":["useState","useMemo","useEffect","useCallback","useRef","resource","withKey","ClientElement","ClientOutput","useClientLookup","attachTransformScopes","useClientResource","Derived","AppendMessage","MessagePartStatus","ThreadAssistantMessagePart","ThreadUserMessagePart","ThreadMessage","ToolCallMessagePartStatus","Attachment","CreateAttachment","PendingAttachment","isCreateAttachment","AddToolResultOptions","RespondToToolApprovalOptions","ResumeToolCallOptions","SpeechState","ExternalThreadQueueAdapter","QueuePlacement","ExternalThreadBranchAdapter","AttachmentAdapter","FeedbackAdapter","SpeechSynthesisAdapter","ToolResponse","ReadonlyJSONValue","QueueItemState","ComposerSendOptions","fileMatchesAccept","getThreadMessageText","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","feedbackAdapter","speechAdapter","queue","branches","onRespondToToolApproval","MessageClientProps","index","submittedFeedback","onSubmitFeedback","feedback","speech","onSpeak","onStopSpeaking","useMessageClient","t0","$","_c","isCopied","setIsCopied","isHovering","setIsHovering","t1","content","map","idx","PartResource","messageId","partClients","t2","attachments","t3","_temp2","attachmentClients","t4","Error","handleBeginEdit","t5","msg","sourceId","handleSendEdit","t6","ComposerClientResource","canCancel","onBeginEdit","onSend","composerClient","branchIds","t7","getBranches","indexOf","branchIndex","branchNumber","branchCount","length","t8","role","metadata","messageWithFeedback","t9","t10","isLast","parts","composer","t11","t12","methods","t13","t14","t15","position","branchId","target","undefined","switchToBranch","t16","selector","get","findIndex","p","toolCallId","t17","selector_0","key","t18","getState","delete","_temp3","reload","speak","stopSpeaking","submitFeedback","getCopyText","attachment","MessageClient","PartResourceProps","usePartResource","result","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","Symbol","asyncIterator","useLiveState","initial","setState","ref","for","next","current","prev","T","set","const","useComposerClientResource","isEditing","setIsEditing","isEditingRef","text","setText","textRef","setRole","roleRef","runConfig","setRunConfig","runConfigRef","setAttachments","attachmentsRef","quote","setQuote","quoteRef","messageText","filter","_temp4","_temp5","join","updateFromMessage","a","removed","all","_temp6","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","opts","currentQuote","currentText","currentAttachments","isEmpty_0","dispatch","sendAttachments","composedMessage","createdAt","Date","startRun","custom","enqueue","attachment_1","send","then","error","prev_3","prev_4","prev_5","console","t19","t20","t21","addAttachment","clearAttachments","reset","cancel","beginEdit","startDictation","_temp7","stopDictation","_temp8","queueItem","createSpeechController","notify","session","clear","adapter","utterance","unsub","subscribe","stop","stopMessage","dispose","dedupeMessagesById","seenIds","Set","deduped","i","has","warn","push","reverse","useExternalThread","messagesProp","threadState","setSubmittedFeedback","entry","external","feedbackFor","live","entries","entry_0","msg_0","find","m","keys","fromEntries","submit","handleSubmitFeedback","speechState","setSpeech","speechController","hasSpeechAdapter","message_0","handleSpeak","messageIndex","m_0","handleReload","msg_1","props","messageClients","handleCancelRun","message_1","at","handleSendNew","headId","message_2","message_3","composerQueue","t22","hasQueue","hasBranches","hasEdit","hasReload","hasAttachments","hasFeedback","hasSpeech","t23","_temp9","messageStates","t24","t25","edit","refetchThread","voice","switchBranchDuringRun","unstable_copy","t26","t27","t28","isDisabled","capabilities","suggestions","t29","t30","t31","message_4","appendMessage","t32","t33","t34","state_0","t35","t36","append","deleteMessage","_temp0","resumeRun","cancelRun","importExternalState","getModelContext","_temp1","export","_temp10","import","_temp11","_temp12","connectVoice","_temp13","disconnectVoice","_temp14","getVoiceVolume","_temp15","subscribeVoiceVolume","_temp17","muteVoice","_temp18","unmuteVoice","_temp19","ExternalThread","scopes","parent","threads","source","threadElement","thread","query","aui","threadListItem","modelContext","tools","dataRenderers","_temp","part_0","a_0","s","arr","config","_temp16"],"sources":["../../../src/store/clients/external-thread.ts"],"sourcesContent":["import { useState, useMemo, useEffect, useCallback, useRef } from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport type { ClientElement, ClientOutput } from \"@assistant-ui/store\";\nimport {\n useClientLookup,\n attachTransformScopes,\n useClientResource,\n Derived,\n} from \"@assistant-ui/store/client\";\n\nimport type {\n AppendMessage,\n MessagePartStatus,\n ThreadAssistantMessagePart,\n ThreadUserMessagePart,\n ThreadMessage,\n ToolCallMessagePartStatus,\n} from \"../../types/message\";\nimport type {\n Attachment,\n CreateAttachment,\n PendingAttachment,\n} from \"../../types/attachment\";\nimport { isCreateAttachment } from \"../../types/attachment\";\nimport type {\n AddToolResultOptions,\n RespondToToolApprovalOptions,\n ResumeToolCallOptions,\n SpeechState,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport type {\n ExternalThreadQueueAdapter,\n QueuePlacement,\n} from \"../../runtime/queue/external-thread-queue-adapter\";\nimport type { ExternalThreadBranchAdapter } from \"../../runtime/branch/external-thread-branch-adapter\";\nimport type { AttachmentAdapter } from \"../../adapters/attachment\";\nimport type { FeedbackAdapter } from \"../../adapters/feedback\";\nimport type { SpeechSynthesisAdapter } from \"../../adapters/speech\";\nimport { ToolResponse } from \"assistant-stream\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\nimport type { QueueItemState } from \"../scopes/queue-item\";\nimport type { ComposerSendOptions } from \"../scopes/composer\";\nimport { fileMatchesAccept } from \"../../adapters/attachment\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { resolveToolApprovalResponse } from \"../../runtime/utils/resolveToolApprovalResponse\";\nimport { toMessagePartStatus } from \"../../utils/normalizePartStatus\";\nimport { ModelContext } from \"./model-context-client\";\nimport { Suggestions } from \"./suggestions\";\nimport { Tools } from \"../../react/client/Tools\";\nimport { DataRenderers } from \"../../react/client/DataRenderers\";\nimport { SingleThreadList } from \"./single-thread-list\";\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 feedbackAdapter?: FeedbackAdapter | undefined;\n speechAdapter?: SpeechSynthesisAdapter | 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 submittedFeedback: \"positive\" | \"negative\" | undefined;\n onSubmitFeedback: (feedback: { type: \"positive\" | \"negative\" }) => void;\n speech: SpeechState | undefined;\n onSpeak: () => void;\n onStopSpeaking: () => void;\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 submittedFeedback,\n onSubmitFeedback,\n speech,\n onSpeak,\n onStopSpeaking,\n}: MessageClientProps): ClientOutput<\"message\"> => {\n const [isCopied, setIsCopied] = useState(false);\n const [isHovering, setIsHovering] = 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 if (!onEdit) throw new Error(\"Runtime does not support editing.\");\n };\n\n const handleSendEdit = (msg: AppendMessage) => {\n if (!onEdit) throw new Error(\"Runtime does not support editing.\");\n onEdit({\n ...msg,\n parentId,\n sourceId: message.id,\n });\n };\n\n const composerClient = useClientResource(\n ComposerClientResource({\n type: \"edit\",\n canCancel: true,\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 const messageWithFeedback: ExternalThreadMessage =\n submittedFeedback && message.role === \"assistant\"\n ? {\n ...message,\n metadata: {\n ...message.metadata,\n submittedFeedback: { type: submittedFeedback },\n },\n }\n : message;\n return {\n ...messageWithFeedback,\n attachments: message.attachments ?? [],\n parentId,\n isLast: false, // Will be set by thread\n branchNumber,\n branchCount,\n speech,\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 submittedFeedback,\n speech,\n ]);\n\n return {\n getState: () => state,\n composer: () => composerClient.methods,\n delete: () => {},\n reload: () => {\n onReload?.();\n },\n speak: onSpeak,\n stopSpeaking: onStopSpeaking,\n submitFeedback: onSubmitFeedback,\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 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 canCancel,\n isSendDisabled = false,\n onCancel,\n onBeginEdit,\n onSend,\n message,\n queue,\n attachmentAdapter,\n}: ComposerClientResourceProps): ClientOutput<\"composer\"> => {\n const [isEditing, setIsEditing, isEditingRef] = useLiveState(\n type === \"thread\",\n );\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 const updateFromMessage = () => {\n if (!message) return;\n const messageText = message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\\n\");\n setText(messageText);\n setRole(message.role);\n setAttachments(message.attachments ?? []);\n };\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 (!isEditingRef.current) throw new Error(\"Composer is not available\");\n if (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 if (type === \"edit\") setIsEditing(false);\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: () => {\n onCancel?.();\n if (type === \"edit\") setIsEditing(false);\n },\n beginEdit: () => {\n onBeginEdit?.();\n if (type === \"thread\") return;\n if (isEditingRef.current) throw new Error(\"Edit already in progress\");\n setIsEditing(true);\n updateFromMessage();\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 createSpeechController = (\n notify: (speech: SpeechState | undefined) => void,\n) => {\n let session: { messageId: string; cancel: () => void } | undefined;\n\n const clear = () => {\n if (!session) return;\n session.cancel();\n session = undefined;\n notify(undefined);\n };\n\n return {\n speak: (\n adapter: SpeechSynthesisAdapter,\n message: ExternalThreadMessage,\n ) => {\n clear();\n\n const utterance = adapter.speak(getThreadMessageText(message));\n let unsub: (() => void) | undefined;\n unsub = utterance.subscribe(() => {\n if (utterance.status.type === \"ended\") {\n unsub?.();\n session = undefined;\n notify(undefined);\n } else {\n notify({ messageId: message.id, status: utterance.status });\n }\n });\n\n if (utterance.status.type === \"ended\") {\n unsub();\n notify(undefined);\n return;\n }\n\n session = {\n messageId: message.id,\n cancel: () => {\n unsub!();\n utterance.cancel();\n },\n };\n notify({ messageId: message.id, status: utterance.status });\n },\n stop: () => {\n if (!session) throw new Error(\"No message is being spoken\");\n clear();\n },\n stopMessage: (messageId: string) => {\n if (session?.messageId !== messageId)\n throw new Error(\"Message is not being spoken\");\n clear();\n },\n dispose: clear,\n };\n};\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 feedbackAdapter,\n speechAdapter,\n queue,\n branches,\n onRespondToToolApproval,\n}: ExternalThreadProps): ClientOutput<\"thread\"> => {\n const messages = useMemo(\n () => dedupeMessagesById(messagesProp),\n [messagesProp],\n );\n\n // Local entries are optimistic: they apply only while the message's\n // external submittedFeedback still equals the value seen at click time.\n const [submittedFeedback, setSubmittedFeedback] = useState<\n Record<\n string,\n {\n type: \"positive\" | \"negative\";\n external: \"positive\" | \"negative\" | undefined;\n }\n >\n >({});\n\n const feedbackFor = (msg: ExternalThreadMessage) => {\n const entry = submittedFeedback[msg.id];\n return entry && msg.metadata.submittedFeedback?.type === entry.external\n ? entry.type\n : undefined;\n };\n\n useEffect(() => {\n setSubmittedFeedback((prev) => {\n const live = Object.entries(prev).filter(([id, entry]) => {\n const msg = messages.find((m) => m.id === id);\n return !!msg && msg.metadata.submittedFeedback?.type === entry.external;\n });\n return live.length === Object.keys(prev).length\n ? prev\n : Object.fromEntries(live);\n });\n }, [messages]);\n\n const handleSubmitFeedback = (\n message: ExternalThreadMessage,\n { type }: { type: \"positive\" | \"negative\" },\n ) => {\n if (!feedbackAdapter) throw new Error(\"Feedback adapter not configured\");\n feedbackAdapter.submit({ message, type });\n\n if (message.role === \"assistant\") {\n setSubmittedFeedback((prev) => ({\n ...prev,\n [message.id]: {\n type,\n external: message.metadata.submittedFeedback?.type,\n },\n }));\n }\n };\n\n const [speechState, setSpeech] = useState<SpeechState | undefined>(undefined);\n const [speechController] = useState(() => createSpeechController(setSpeech));\n\n const hasSpeechAdapter = !!speechAdapter;\n const speech = hasSpeechAdapter ? speechState : undefined;\n useEffect(() => {\n if (!hasSpeechAdapter) speechController.dispose();\n }, [hasSpeechAdapter, speechController]);\n\n useEffect(() => () => speechController.dispose(), [speechController]);\n\n const handleSpeak = (message: ExternalThreadMessage) => {\n if (!speechAdapter) throw new Error(\"Speech adapter not configured\");\n speechController.speak(speechAdapter, message);\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 submittedFeedback: feedbackFor(msg),\n onSubmitFeedback: (feedback) => handleSubmitFeedback(msg, feedback),\n speech: speech?.messageId === msg.id ? speech : undefined,\n onSpeak: () => handleSpeak(msg),\n onStopSpeaking: () => speechController.stopMessage(msg.id),\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 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 hasFeedback = !!feedbackAdapter;\n const hasSpeech = !!speechAdapter;\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: hasSpeech,\n attachments: hasAttachments,\n feedback: hasFeedback,\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,\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 hasFeedback,\n hasSpeech,\n speech,\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: speechController.stop,\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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"}
@@ -0,0 +1,9 @@
1
+ import { ClientElement, ClientOutput } from "@assistant-ui/store";
2
+ //#region src/store/clients/single-thread-list.d.ts
3
+ type SingleThreadListProps = {
4
+ thread: ClientElement<"thread">;
5
+ };
6
+ declare const SingleThreadList: import("@assistant-ui/tap").Resource<ClientOutput<"threads">, [SingleThreadListProps]>;
7
+ //#endregion
8
+ export { SingleThreadList };
9
+ //# sourceMappingURL=single-thread-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-thread-list.d.ts","names":[],"sources":["../../../src/store/clients/single-thread-list.ts"],"mappings":";;KAuCK;EACH,QAAQ;;cA0EG,8CAAgB,SAAA,0BAAA"}
@@ -0,0 +1,171 @@
1
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
+ import { useState } from "@assistant-ui/tap/react-shim";
3
+ import { resource } from "@assistant-ui/tap";
4
+ import { useClientResource } from "@assistant-ui/store/client";
5
+ //#region src/store/clients/single-thread-list.ts
6
+ const RESOLVED_PROMISE = Promise.resolve();
7
+ const THREAD_ID = "default";
8
+ const useSingleThreadListItem = (t0) => {
9
+ const $ = c(3);
10
+ const { isRunning } = t0;
11
+ const [custom, setCustom] = useState();
12
+ let t1;
13
+ if ($[0] !== custom || $[1] !== isRunning) {
14
+ t1 = {
15
+ getState: () => ({
16
+ id: THREAD_ID,
17
+ remoteId: void 0,
18
+ externalId: void 0,
19
+ title: void 0,
20
+ status: "regular",
21
+ custom,
22
+ isRunning
23
+ }),
24
+ switchTo: _temp,
25
+ rename: _temp2,
26
+ updateCustom: setCustom,
27
+ archive: _temp3,
28
+ unarchive: _temp4,
29
+ delete: _temp5,
30
+ generateTitle: _temp6,
31
+ initialize: _temp7,
32
+ detach: _temp8
33
+ };
34
+ $[0] = custom;
35
+ $[1] = isRunning;
36
+ $[2] = t1;
37
+ } else t1 = $[2];
38
+ return t1;
39
+ };
40
+ const SingleThreadListItem = resource(useSingleThreadListItem);
41
+ /**
42
+ * A minimal threads scope that wraps a single thread.
43
+ * Automatically provided by ExternalThread when no threads scope exists.
44
+ * Mounts the provided thread resource element.
45
+ */
46
+ const useSingleThreadList = (t0) => {
47
+ const $ = c(19);
48
+ const { thread } = t0;
49
+ const threadClient = useClientResource(thread);
50
+ let t1;
51
+ if ($[0] !== threadClient.state.isRunning) {
52
+ t1 = SingleThreadListItem({ isRunning: threadClient.state.isRunning });
53
+ $[0] = threadClient.state.isRunning;
54
+ $[1] = t1;
55
+ } else t1 = $[1];
56
+ const itemClient = useClientResource(t1);
57
+ let t2;
58
+ let t3;
59
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
60
+ t2 = [THREAD_ID];
61
+ t3 = [];
62
+ $[2] = t2;
63
+ $[3] = t3;
64
+ } else {
65
+ t2 = $[2];
66
+ t3 = $[3];
67
+ }
68
+ let t4;
69
+ if ($[4] !== itemClient.state) {
70
+ t4 = [itemClient.state];
71
+ $[4] = itemClient.state;
72
+ $[5] = t4;
73
+ } else t4 = $[5];
74
+ let t5;
75
+ if ($[6] !== t4 || $[7] !== threadClient.state) {
76
+ t5 = {
77
+ mainThreadId: THREAD_ID,
78
+ newThreadId: null,
79
+ isLoading: false,
80
+ isLoadingMore: false,
81
+ hasMore: false,
82
+ threadIds: t2,
83
+ archivedThreadIds: t3,
84
+ threadItems: t4,
85
+ main: threadClient.state
86
+ };
87
+ $[6] = t4;
88
+ $[7] = threadClient.state;
89
+ $[8] = t5;
90
+ } else t5 = $[8];
91
+ const state = t5;
92
+ let t6;
93
+ if ($[9] !== state) {
94
+ t6 = () => state;
95
+ $[9] = state;
96
+ $[10] = t6;
97
+ } else t6 = $[10];
98
+ let t7;
99
+ if ($[11] !== itemClient.methods) {
100
+ t7 = (selector) => {
101
+ if (selector !== "main" && !(typeof selector === "object" && "id" in selector && selector.id === THREAD_ID) && !(typeof selector === "object" && "index" in selector && selector.index === 0)) throw new Error(`SingleThreadList: unknown item selector ${JSON.stringify(selector)}`);
102
+ return itemClient.methods;
103
+ };
104
+ $[11] = itemClient.methods;
105
+ $[12] = t7;
106
+ } else t7 = $[12];
107
+ let t8;
108
+ if ($[13] !== threadClient.methods) {
109
+ t8 = (selector_0) => {
110
+ if (selector_0 !== "main" && selector_0 !== THREAD_ID) throw new Error(`SingleThreadList: unknown thread selector ${JSON.stringify(selector_0)}`);
111
+ return threadClient.methods;
112
+ };
113
+ $[13] = threadClient.methods;
114
+ $[14] = t8;
115
+ } else t8 = $[14];
116
+ let t9;
117
+ if ($[15] !== t6 || $[16] !== t7 || $[17] !== t8) {
118
+ t9 = {
119
+ getState: t6,
120
+ switchToThread: _temp9,
121
+ switchToNewThread: _temp0,
122
+ getLoadThreadsPromise: _temp1,
123
+ reload: _temp10,
124
+ reloadMainThread: _temp11,
125
+ loadMore: _temp12,
126
+ item: t7,
127
+ thread: t8
128
+ };
129
+ $[15] = t6;
130
+ $[16] = t7;
131
+ $[17] = t8;
132
+ $[18] = t9;
133
+ } else t9 = $[18];
134
+ return t9;
135
+ };
136
+ const SingleThreadList = resource(useSingleThreadList);
137
+ function _temp() {}
138
+ function _temp2() {}
139
+ function _temp3() {}
140
+ function _temp4() {}
141
+ function _temp5() {}
142
+ function _temp6() {}
143
+ async function _temp7() {
144
+ return {
145
+ remoteId: THREAD_ID,
146
+ externalId: void 0
147
+ };
148
+ }
149
+ function _temp8() {}
150
+ function _temp9() {
151
+ throw new Error("SingleThreadList does not support switchToThread");
152
+ }
153
+ function _temp0() {
154
+ throw new Error("SingleThreadList does not support switchToNewThread");
155
+ }
156
+ function _temp1() {
157
+ return RESOLVED_PROMISE;
158
+ }
159
+ function _temp10() {
160
+ return RESOLVED_PROMISE;
161
+ }
162
+ function _temp11() {
163
+ return RESOLVED_PROMISE;
164
+ }
165
+ function _temp12() {
166
+ return RESOLVED_PROMISE;
167
+ }
168
+ //#endregion
169
+ export { SingleThreadList };
170
+
171
+ //# sourceMappingURL=single-thread-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single-thread-list.js","names":["useMemo","useState","resource","ClientElement","ClientOutput","useClientResource","RESOLVED_PROMISE","Promise","resolve","THREAD_ID","useSingleThreadListItem","t0","$","_c","isRunning","custom","setCustom","t1","getState","id","remoteId","undefined","externalId","title","status","switchTo","_temp","rename","_temp2","updateCustom","archive","_temp3","unarchive","_temp4","delete","_temp5","generateTitle","_temp6","initialize","_temp7","detach","_temp8","SingleThreadListItem","SingleThreadListProps","thread","useSingleThreadList","threadClient","state","itemClient","t2","t3","Symbol","for","t4","t5","mainThreadId","newThreadId","isLoading","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t6","t7","methods","selector","index","Error","JSON","stringify","t8","selector_0","t9","switchToThread","_temp9","switchToNewThread","_temp0","getLoadThreadsPromise","_temp1","reload","_temp10","reloadMainThread","_temp11","loadMore","_temp12","item","SingleThreadList"],"sources":["../../../src/store/clients/single-thread-list.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientElement, ClientOutput } from \"@assistant-ui/store\";\nimport { useClientResource } from \"@assistant-ui/store/client\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\nconst THREAD_ID = \"default\";\n\nconst useSingleThreadListItem = ({\n isRunning,\n}: {\n isRunning: boolean;\n}): ClientOutput<\"threadListItem\"> => {\n const [custom, setCustom] = useState<Record<string, unknown> | undefined>();\n\n return {\n getState: () => ({\n id: THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n status: \"regular\",\n custom,\n isRunning,\n }),\n switchTo: () => {},\n rename: () => {},\n updateCustom: setCustom,\n archive: () => {},\n unarchive: () => {},\n delete: () => {},\n generateTitle: () => {},\n initialize: async () => ({ remoteId: THREAD_ID, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst SingleThreadListItem = resource(useSingleThreadListItem);\n\ntype SingleThreadListProps = {\n thread: ClientElement<\"thread\">;\n};\n\n/**\n * A minimal threads scope that wraps a single thread.\n * Automatically provided by ExternalThread when no threads scope exists.\n * Mounts the provided thread resource element.\n */\nconst useSingleThreadList = ({\n thread,\n}: SingleThreadListProps): ClientOutput<\"threads\"> => {\n const threadClient = useClientResource(thread);\n const itemClient = useClientResource(\n SingleThreadListItem({ isRunning: threadClient.state.isRunning }),\n );\n\n const state = useMemo(\n () => ({\n mainThreadId: THREAD_ID,\n newThreadId: null,\n isLoading: false,\n isLoadingMore: false,\n hasMore: false,\n threadIds: [THREAD_ID],\n archivedThreadIds: [],\n threadItems: [itemClient.state],\n main: threadClient.state,\n }),\n [itemClient.state, threadClient.state],\n );\n\n return {\n getState: () => state,\n switchToThread: () => {\n throw new Error(\"SingleThreadList does not support switchToThread\");\n },\n switchToNewThread: () => {\n throw new Error(\"SingleThreadList does not support switchToNewThread\");\n },\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n reloadMainThread: () => RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (\n selector !== \"main\" &&\n !(\n typeof selector === \"object\" &&\n \"id\" in selector &&\n selector.id === THREAD_ID\n ) &&\n !(\n typeof selector === \"object\" &&\n \"index\" in selector &&\n selector.index === 0\n )\n ) {\n throw new Error(\n `SingleThreadList: unknown item selector ${JSON.stringify(selector)}`,\n );\n }\n return itemClient.methods;\n },\n thread: (selector) => {\n if (selector !== \"main\" && selector !== THREAD_ID) {\n throw new Error(\n `SingleThreadList: unknown thread selector ${JSON.stringify(selector)}`,\n );\n }\n return threadClient.methods;\n },\n };\n};\n\nexport const SingleThreadList = resource(useSingleThreadList);\n"],"mappings":"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"}
@@ -20,9 +20,11 @@ import { RuntimeExtrasBrand, createRuntimeExtrasBrand } from "../runtime/utils/r
20
20
  import { Toolkit, ToolkitDefinition, ToolkitDefinitionEntry } from "../react/model-context/toolbox.js";
21
21
  import { defineToolkit } from "../react/model-context/define-toolkit.js";
22
22
  import { McpToolkitDefinition, McpToolkitEntry, McpToolkitToolConfig, defineMcpToolkit } from "../react/model-context/define-mcp-toolkit.js";
23
+ import { ExternalThread, ExternalThreadMessage, ExternalThreadProps } from "./clients/external-thread.js";
24
+ import { SingleThreadList } from "./clients/single-thread-list.js";
23
25
  import { NoOpComposerClient } from "./clients/no-op-composer-client.js";
24
26
  import { SuggestionConfig, Suggestions } from "./clients/suggestions.js";
25
27
  import { ChainOfThoughtClient } from "./clients/chain-of-thought-client.js";
26
28
  import { ThreadMessageClient, ThreadMessageClientProps } from "./clients/thread-message-client.js";
27
29
  import { ModelContext } from "./clients/model-context-client.js";
28
- export { type AttachmentClientSchema, type AttachmentMeta, type AttachmentMethods, type AttachmentState, ChainOfThoughtClient, type ChainOfThoughtClientSchema, type ChainOfThoughtMeta, type ChainOfThoughtMethods, type ChainOfThoughtPart, type ChainOfThoughtState, type ComposerClientSchema, type ComposerEvents, type ComposerMeta, type ComposerMethods, type ComposerSendOptions, type ComposerState, type JoinStrategy, type McpToolkitDefinition, type McpToolkitEntry, type McpToolkitToolConfig, type MessageClientSchema, type MessageMeta, type MessageMethods, type MessageState, ModelContext, type ModelContextClientSchema, type ModelContextMethods, type ModelContextState, NoOpComposerClient, type PartClientSchema, type PartMeta, type PartMethods, type PartState, type QueueItemClientSchema, type QueueItemMeta, type QueueItemMethods, type QueueItemState, RuntimeAdapter, type RuntimeExtrasBrand, type StreamingTimingAccessors, type StreamingTimingOptions, type StreamingTimingState, type Suggestion, type SuggestionClientSchema, type SuggestionConfig, type SuggestionMeta, type SuggestionMethods, type SuggestionState, Suggestions, type SuggestionsClientSchema, type SuggestionsMethods, type SuggestionsState, type ThreadClientSchema, type ThreadEvents, type ThreadListItemClientSchema, type ThreadListItemEvents, type ThreadListItemMeta, type ThreadListItemMethods, type ThreadListItemState, ThreadMessageClient, type ThreadMessageClientProps, type ThreadMeta, type ThreadMethods, type ThreadState, type ThreadsClientSchema, type ThreadsMethods, type ThreadsState, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, convertExternalMessages, createRuntimeExtrasBrand, defineMcpToolkit, defineToolkit, useExternalMessageConverter, useStreamingTiming };
30
+ export { type AttachmentClientSchema, type AttachmentMeta, type AttachmentMethods, type AttachmentState, ChainOfThoughtClient, type ChainOfThoughtClientSchema, type ChainOfThoughtMeta, type ChainOfThoughtMethods, type ChainOfThoughtPart, type ChainOfThoughtState, type ComposerClientSchema, type ComposerEvents, type ComposerMeta, type ComposerMethods, type ComposerSendOptions, type ComposerState, ExternalThread, type ExternalThreadMessage, type ExternalThreadProps, type JoinStrategy, type McpToolkitDefinition, type McpToolkitEntry, type McpToolkitToolConfig, type MessageClientSchema, type MessageMeta, type MessageMethods, type MessageState, ModelContext, type ModelContextClientSchema, type ModelContextMethods, type ModelContextState, NoOpComposerClient, type PartClientSchema, type PartMeta, type PartMethods, type PartState, type QueueItemClientSchema, type QueueItemMeta, type QueueItemMethods, type QueueItemState, RuntimeAdapter, type RuntimeExtrasBrand, SingleThreadList, type StreamingTimingAccessors, type StreamingTimingOptions, type StreamingTimingState, type Suggestion, type SuggestionClientSchema, type SuggestionConfig, type SuggestionMeta, type SuggestionMethods, type SuggestionState, Suggestions, type SuggestionsClientSchema, type SuggestionsMethods, type SuggestionsState, type ThreadClientSchema, type ThreadEvents, type ThreadListItemClientSchema, type ThreadListItemEvents, type ThreadListItemMeta, type ThreadListItemMethods, type ThreadListItemState, ThreadMessageClient, type ThreadMessageClientProps, type ThreadMeta, type ThreadMethods, type ThreadState, type ThreadsClientSchema, type ThreadsMethods, type ThreadsState, type Toolkit, type ToolkitDefinition, type ToolkitDefinitionEntry, convertExternalMessages, createRuntimeExtrasBrand, defineMcpToolkit, defineToolkit, useExternalMessageConverter, useStreamingTiming };
@@ -6,7 +6,9 @@ import { defineMcpToolkit } from "../react/model-context/define-mcp-toolkit.js";
6
6
  import { convertExternalMessages, useExternalMessageConverter } from "../react/runtimes/external-message-converter.js";
7
7
  import { useStreamingTiming } from "../react/runtimes/useStreamingTiming.js";
8
8
  import { createRuntimeExtrasBrand } from "../runtime/utils/runtime-extras-brand.js";
9
+ import { SingleThreadList } from "./clients/single-thread-list.js";
10
+ import { ExternalThread } from "./clients/external-thread.js";
9
11
  import { NoOpComposerClient } from "./clients/no-op-composer-client.js";
10
12
  import { ChainOfThoughtClient } from "./clients/chain-of-thought-client.js";
11
13
  import { ThreadMessageClient } from "./clients/thread-message-client.js";
12
- export { ChainOfThoughtClient, ModelContext, NoOpComposerClient, RuntimeAdapter, Suggestions, ThreadMessageClient, convertExternalMessages, createRuntimeExtrasBrand, defineMcpToolkit, defineToolkit, useExternalMessageConverter, useStreamingTiming };
14
+ export { ChainOfThoughtClient, ExternalThread, ModelContext, NoOpComposerClient, RuntimeAdapter, SingleThreadList, Suggestions, ThreadMessageClient, convertExternalMessages, createRuntimeExtrasBrand, defineMcpToolkit, defineToolkit, useExternalMessageConverter, useStreamingTiming };
@@ -0,0 +1,33 @@
1
+ //#region src/types/augmentations.d.ts
2
+ /**
3
+ * Module augmentation namespace for assistant-ui type extensions.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * declare module "@assistant-ui/core" {
8
+ * namespace Assistant {
9
+ * interface Commands {
10
+ * myCustomCommand: {
11
+ * type: "my-custom-command";
12
+ * data: string;
13
+ * };
14
+ * }
15
+ *
16
+ * interface ExternalState {
17
+ * myCustomState: {
18
+ * foo: string;
19
+ * };
20
+ * }
21
+ * }
22
+ * }
23
+ * ```
24
+ */
25
+ declare namespace Assistant {
26
+ interface Commands {}
27
+ interface ExternalState {}
28
+ }
29
+ type UserCommands = Assistant.Commands[keyof Assistant.Commands];
30
+ type UserExternalState = keyof Assistant.ExternalState extends never ? Record<string, unknown> : Assistant.ExternalState[keyof Assistant.ExternalState];
31
+ //#endregion
32
+ export { Assistant, UserCommands, UserExternalState };
33
+ //# sourceMappingURL=augmentations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augmentations.d.ts","names":[],"sources":["../../src/types/augmentations.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;kBAuBiB;YACE;YAEA;;KAGP,eAAe,UAAU,eAAe,UAAU;KAClD,0BAA0B,UAAU,8BAC5C,0BACA,UAAU,oBAAoB,UAAU"}
File without changes
@@ -1,8 +1,9 @@
1
- import { MessagePartStatus, ThreadAssistantMessagePart, ThreadUserMessagePart } from "../types/message.js";
1
+ import { MessagePartStatus, ThreadAssistantMessagePart, ThreadMessage, ThreadUserMessagePart, ToolCallMessagePartStatus } from "../types/message.js";
2
2
  //#region src/utils/normalizePartStatus.d.ts
3
3
  declare const COMPLETE_STATUS: MessagePartStatus;
4
4
  declare const RUNNING_STATUS: MessagePartStatus;
5
5
  declare const normalizePartStatus: (part: ThreadUserMessagePart | ThreadAssistantMessagePart) => MessagePartStatus | undefined;
6
+ declare const toMessagePartStatus: (message: ThreadMessage, partIndex: number, part: ThreadUserMessagePart | ThreadAssistantMessagePart) => ToolCallMessagePartStatus;
6
7
  //#endregion
7
- export { COMPLETE_STATUS, RUNNING_STATUS, normalizePartStatus };
8
+ export { COMPLETE_STATUS, RUNNING_STATUS, normalizePartStatus, toMessagePartStatus };
8
9
  //# sourceMappingURL=normalizePartStatus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizePartStatus.d.ts","names":[],"sources":["../../src/utils/normalizePartStatus.ts"],"mappings":";;cAOa,iBAAiB;cAGjB,gBAAgB;cAoBhB,sBACX,MAAM,wBAAwB,+BAC7B"}
1
+ {"version":3,"file":"normalizePartStatus.d.ts","names":[],"sources":["../../src/utils/normalizePartStatus.ts"],"mappings":";;cASa,iBAAiB;cAGjB,gBAAgB;cAoBhB,sBACX,MAAM,wBAAwB,+BAC7B;cAwBU,sBACX,SAAS,eACT,mBACA,MAAM,wBAAwB,+BAC7B"}
@@ -33,7 +33,21 @@ const normalizePartStatus = (part) => {
33
33
  const { reason } = status;
34
34
  return INCOMPLETE_STATUSES[reason === "cancelled" || reason === "length" || reason === "content-filter" || reason === "other" || reason === "error" ? reason : "other"];
35
35
  };
36
+ const toMessagePartStatus = (message, partIndex, part) => {
37
+ if (message.role !== "assistant") return COMPLETE_STATUS;
38
+ if (part.type === "tool-call") {
39
+ if (part.result === void 0) return message.status;
40
+ else return COMPLETE_STATUS;
41
+ }
42
+ if (message.status.type === "running") {
43
+ const status = normalizePartStatus(part);
44
+ if (status) return status;
45
+ }
46
+ const isLastPart = partIndex === Math.max(0, message.content.length - 1);
47
+ if (message.status.type === "requires-action") return COMPLETE_STATUS;
48
+ return isLastPart ? message.status : COMPLETE_STATUS;
49
+ };
36
50
  //#endregion
37
- export { COMPLETE_STATUS, RUNNING_STATUS, normalizePartStatus };
51
+ export { COMPLETE_STATUS, RUNNING_STATUS, normalizePartStatus, toMessagePartStatus };
38
52
 
39
53
  //# sourceMappingURL=normalizePartStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizePartStatus.js","names":["MessagePartStatus","MessagePartStreamStatus","ThreadAssistantMessagePart","ThreadUserMessagePart","COMPLETE_STATUS","Object","freeze","type","RUNNING_STATUS","IncompleteMessagePartStatus","Extract","INCOMPLETE_STATUSES","Readonly","Record","cancelled","reason","length","other","error","normalizePartStatus","part","status","undefined","normalizedReason"],"sources":["../../src/utils/normalizePartStatus.ts"],"sourcesContent":["import type {\n MessagePartStatus,\n MessagePartStreamStatus,\n ThreadAssistantMessagePart,\n ThreadUserMessagePart,\n} from \"../types/message\";\n\nexport const COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\nexport const RUNNING_STATUS: MessagePartStatus = Object.freeze({\n type: \"running\",\n});\ntype IncompleteMessagePartStatus = Extract<\n MessagePartStreamStatus,\n { readonly type: \"incomplete\" }\n>;\nconst INCOMPLETE_STATUSES: Readonly<\n Record<IncompleteMessagePartStatus[\"reason\"], IncompleteMessagePartStatus>\n> = Object.freeze({\n cancelled: Object.freeze({ type: \"incomplete\", reason: \"cancelled\" }),\n length: Object.freeze({ type: \"incomplete\", reason: \"length\" }),\n \"content-filter\": Object.freeze({\n type: \"incomplete\",\n reason: \"content-filter\",\n }),\n other: Object.freeze({ type: \"incomplete\", reason: \"other\" }),\n error: Object.freeze({ type: \"incomplete\", reason: \"error\" }),\n});\n\nexport const normalizePartStatus = (\n part: ThreadUserMessagePart | ThreadAssistantMessagePart,\n): MessagePartStatus | undefined => {\n const status = (part as { readonly status?: unknown }).status;\n if (!status || typeof status !== \"object\") return undefined;\n\n const { type } = status as { readonly type?: unknown };\n if (type === \"running\") return RUNNING_STATUS;\n if (type === \"complete\") return COMPLETE_STATUS;\n if (type !== \"incomplete\") return undefined;\n\n const { reason } = status as {\n readonly reason?: unknown;\n };\n const normalizedReason: IncompleteMessagePartStatus[\"reason\"] =\n reason === \"cancelled\" ||\n reason === \"length\" ||\n reason === \"content-filter\" ||\n reason === \"other\" ||\n reason === \"error\"\n ? reason\n : \"other\";\n\n return INCOMPLETE_STATUSES[normalizedReason];\n};\n"],"mappings":";AAOA,MAAaI,kBAAqCC,OAAOC,OAAO,EAC9DC,MAAM,WACR,CAAC;AACD,MAAaC,iBAAoCH,OAAOC,OAAO,EAC7DC,MAAM,UACR,CAAC;AAKD,MAAMI,sBAEFN,OAAOC,OAAO;CAChBQ,WAAWT,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAY,CAAC;CACpEC,QAAQX,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAS,CAAC;CAC9D,kBAAkBV,OAAOC,OAAO;EAC9BC,MAAM;EACNQ,QAAQ;CACV,CAAC;CACDE,OAAOZ,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAQ,CAAC;CAC5DG,OAAOb,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAQ,CAAC;AAC9D,CAAC;AAED,MAAaI,uBACXC,SACkC;CAClC,MAAMC,SAAUD,KAAuCC;CACvD,IAAI,CAACA,UAAU,OAAOA,WAAW,UAAU,OAAOC,KAAAA;CAElD,MAAM,EAAEf,SAASc;CACjB,IAAId,SAAS,WAAW,OAAOC;CAC/B,IAAID,SAAS,YAAY,OAAOH;CAChC,IAAIG,SAAS,cAAc,OAAOe,KAAAA;CAElC,MAAM,EAAEP,WAAWM;CAYnB,OAAOV,oBARLI,WAAW,eACXA,WAAW,YACXA,WAAW,oBACXA,WAAW,WACXA,WAAW,UACPA,SACA;AAGR"}
1
+ {"version":3,"file":"normalizePartStatus.js","names":["MessagePartStatus","MessagePartStreamStatus","ThreadAssistantMessagePart","ThreadMessage","ThreadUserMessagePart","ToolCallMessagePartStatus","COMPLETE_STATUS","Object","freeze","type","RUNNING_STATUS","IncompleteMessagePartStatus","Extract","INCOMPLETE_STATUSES","Readonly","Record","cancelled","reason","length","other","error","normalizePartStatus","part","status","undefined","normalizedReason","toMessagePartStatus","message","partIndex","role","result","isLastPart","Math","max","content"],"sources":["../../src/utils/normalizePartStatus.ts"],"sourcesContent":["import type {\n MessagePartStatus,\n MessagePartStreamStatus,\n ThreadAssistantMessagePart,\n ThreadMessage,\n ThreadUserMessagePart,\n ToolCallMessagePartStatus,\n} from \"../types/message\";\n\nexport const COMPLETE_STATUS: MessagePartStatus = Object.freeze({\n type: \"complete\",\n});\nexport const RUNNING_STATUS: MessagePartStatus = Object.freeze({\n type: \"running\",\n});\ntype IncompleteMessagePartStatus = Extract<\n MessagePartStreamStatus,\n { readonly type: \"incomplete\" }\n>;\nconst INCOMPLETE_STATUSES: Readonly<\n Record<IncompleteMessagePartStatus[\"reason\"], IncompleteMessagePartStatus>\n> = Object.freeze({\n cancelled: Object.freeze({ type: \"incomplete\", reason: \"cancelled\" }),\n length: Object.freeze({ type: \"incomplete\", reason: \"length\" }),\n \"content-filter\": Object.freeze({\n type: \"incomplete\",\n reason: \"content-filter\",\n }),\n other: Object.freeze({ type: \"incomplete\", reason: \"other\" }),\n error: Object.freeze({ type: \"incomplete\", reason: \"error\" }),\n});\n\nexport const normalizePartStatus = (\n part: ThreadUserMessagePart | ThreadAssistantMessagePart,\n): MessagePartStatus | undefined => {\n const status = (part as { readonly status?: unknown }).status;\n if (!status || typeof status !== \"object\") return undefined;\n\n const { type } = status as { readonly type?: unknown };\n if (type === \"running\") return RUNNING_STATUS;\n if (type === \"complete\") return COMPLETE_STATUS;\n if (type !== \"incomplete\") return undefined;\n\n const { reason } = status as {\n readonly reason?: unknown;\n };\n const normalizedReason: IncompleteMessagePartStatus[\"reason\"] =\n reason === \"cancelled\" ||\n reason === \"length\" ||\n reason === \"content-filter\" ||\n reason === \"other\" ||\n reason === \"error\"\n ? reason\n : \"other\";\n\n return INCOMPLETE_STATUSES[normalizedReason];\n};\n\nexport const toMessagePartStatus = (\n message: ThreadMessage,\n partIndex: number,\n part: ThreadUserMessagePart | ThreadAssistantMessagePart,\n): ToolCallMessagePartStatus => {\n if (message.role !== \"assistant\") return COMPLETE_STATUS;\n\n if (part.type === \"tool-call\") {\n if (part.result === undefined) {\n return message.status as ToolCallMessagePartStatus;\n } else {\n return COMPLETE_STATUS;\n }\n }\n\n if (message.status.type === \"running\") {\n const status = normalizePartStatus(part);\n if (status) return status;\n }\n\n const isLastPart = partIndex === Math.max(0, message.content.length - 1);\n if (message.status.type === \"requires-action\") return COMPLETE_STATUS;\n return isLastPart ? (message.status as MessagePartStatus) : COMPLETE_STATUS;\n};\n"],"mappings":";AASA,MAAaM,kBAAqCC,OAAOC,OAAO,EAC9DC,MAAM,WACR,CAAC;AACD,MAAaC,iBAAoCH,OAAOC,OAAO,EAC7DC,MAAM,UACR,CAAC;AAKD,MAAMI,sBAEFN,OAAOC,OAAO;CAChBQ,WAAWT,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAY,CAAC;CACpEC,QAAQX,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAS,CAAC;CAC9D,kBAAkBV,OAAOC,OAAO;EAC9BC,MAAM;EACNQ,QAAQ;CACV,CAAC;CACDE,OAAOZ,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAQ,CAAC;CAC5DG,OAAOb,OAAOC,OAAO;EAAEC,MAAM;EAAcQ,QAAQ;CAAQ,CAAC;AAC9D,CAAC;AAED,MAAaI,uBACXC,SACkC;CAClC,MAAMC,SAAUD,KAAuCC;CACvD,IAAI,CAACA,UAAU,OAAOA,WAAW,UAAU,OAAOC,KAAAA;CAElD,MAAM,EAAEf,SAASc;CACjB,IAAId,SAAS,WAAW,OAAOC;CAC/B,IAAID,SAAS,YAAY,OAAOH;CAChC,IAAIG,SAAS,cAAc,OAAOe,KAAAA;CAElC,MAAM,EAAEP,WAAWM;CAYnB,OAAOV,oBARLI,WAAW,eACXA,WAAW,YACXA,WAAW,oBACXA,WAAW,WACXA,WAAW,UACPA,SACA;AAGR;AAEA,MAAaS,uBACXC,SACAC,WACAN,SAC8B;CAC9B,IAAIK,QAAQE,SAAS,aAAa,OAAOvB;CAEzC,IAAIgB,KAAKb,SAAS,aAAa;EAC7B,IAAIa,KAAKQ,WAAWN,KAAAA,GAClB,OAAOG,QAAQJ;OAEf,OAAOjB;CAEX;CAEA,IAAIqB,QAAQJ,OAAOd,SAAS,WAAW;EACrC,MAAMc,SAASF,oBAAoBC,IAAI;EACvC,IAAIC,QAAQ,OAAOA;CACrB;CAEA,MAAMQ,aAAaH,cAAcI,KAAKC,IAAI,GAAGN,QAAQO,QAAQhB,SAAS,CAAC;CACvE,IAAIS,QAAQJ,OAAOd,SAAS,mBAAmB,OAAOH;CACtD,OAAOyB,aAAcJ,QAAQJ,SAA+BjB;AAC9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/core",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "description": "Framework-agnostic core runtime for assistant-ui",
5
5
  "keywords": [
6
6
  "assistant",
@@ -59,7 +59,7 @@
59
59
  ],
60
60
  "sideEffects": false,
61
61
  "dependencies": {
62
- "assistant-stream": "^0.3.36",
62
+ "assistant-stream": "^0.3.37",
63
63
  "nanoid": "^6.0.1"
64
64
  },
65
65
  "optionalDevDependencies": {
package/src/index.ts CHANGED
@@ -64,6 +64,12 @@ export type {
64
64
 
65
65
  export type { Unsubscribe } from "./types/unsubscribe";
66
66
 
67
+ export type {
68
+ Assistant,
69
+ UserCommands,
70
+ UserExternalState,
71
+ } from "./types/augmentations";
72
+
67
73
  export type { QuoteInfo } from "./types/quote";
68
74
 
69
75
  export type {
package/src/internal.ts CHANGED
@@ -32,7 +32,7 @@ export {
32
32
 
33
33
  // Message utilities
34
34
  export { getThreadMessageText } from "./utils/text";
35
- export { toMessagePartStatus } from "./runtime/api/message-runtime";
35
+ export { toMessagePartStatus } from "./utils/normalizePartStatus";
36
36
  export { resolveToolApprovalResponse } from "./runtime/utils/resolveToolApprovalResponse";
37
37
  export { consumeSuggestionResult } from "./adapters/suggestion";
38
38
 
@@ -0,0 +1,49 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { renderHook } from "@testing-library/react";
4
+ import type { AssistantCloud } from "assistant-cloud";
5
+ import { describe, expect, it, vi } from "vitest";
6
+ import { useCloudThreadListAdapter } from "./useCloudThreadListAdapter";
7
+
8
+ const makeThread = (id: string) => ({
9
+ id,
10
+ title: id,
11
+ is_archived: false,
12
+ external_id: null,
13
+ metadata: null,
14
+ last_message_at: new Date(0),
15
+ created_at: new Date(0),
16
+ updated_at: new Date(0),
17
+ project_id: "project-1",
18
+ workspace_id: "workspace-1",
19
+ });
20
+
21
+ describe("useCloudThreadListAdapter", () => {
22
+ it("exposes full Cloud pages through the remote thread cursor", async () => {
23
+ const firstPage = Array.from({ length: 20 }, (_, index) =>
24
+ makeThread(`thread-${index + 1}`),
25
+ );
26
+ const secondPage = [makeThread("thread-21")];
27
+ const list = vi
28
+ .fn()
29
+ .mockResolvedValueOnce({ threads: firstPage })
30
+ .mockResolvedValueOnce({ threads: secondPage });
31
+ const cloud = { threads: { list } } as unknown as AssistantCloud;
32
+ const { result } = renderHook(() => useCloudThreadListAdapter({ cloud }));
33
+
34
+ const first = await result.current.list();
35
+ expect(list).toHaveBeenNthCalledWith(1, { limit: 20 });
36
+ expect(first.threads).toHaveLength(20);
37
+ expect(first.nextCursor).toBe("thread-20");
38
+
39
+ const second = await result.current.list({ after: first.nextCursor });
40
+ expect(list).toHaveBeenNthCalledWith(2, {
41
+ limit: 20,
42
+ after: "thread-20",
43
+ });
44
+ expect(second.threads.map((thread) => thread.remoteId)).toEqual([
45
+ "thread-21",
46
+ ]);
47
+ expect(second.nextCursor).toBeUndefined();
48
+ });
49
+ });