@assistant-ui/core 0.3.19 → 0.3.20

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 (664) hide show
  1. package/dist/adapters/attachment.d.ts +9 -10
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +2 -1
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/directive-formatter.d.ts +1 -2
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -1
  7. package/dist/adapters/feedback.d.ts +2 -2
  8. package/dist/adapters/feedback.d.ts.map +1 -1
  9. package/dist/adapters/speech.d.ts +6 -7
  10. package/dist/adapters/speech.d.ts.map +1 -1
  11. package/dist/adapters/suggestion.d.ts +5 -6
  12. package/dist/adapters/suggestion.d.ts.map +1 -1
  13. package/dist/adapters/thread-history.d.ts +6 -7
  14. package/dist/adapters/thread-history.d.ts.map +1 -1
  15. package/dist/adapters/trigger.d.ts +1 -2
  16. package/dist/adapters/trigger.d.ts.map +1 -1
  17. package/dist/adapters/voice.d.ts +5 -6
  18. package/dist/adapters/voice.d.ts.map +1 -1
  19. package/dist/internal/duplicate-detection.d.ts +1 -2
  20. package/dist/internal/duplicate-detection.d.ts.map +1 -1
  21. package/dist/model-context/frame/host.d.ts +1 -2
  22. package/dist/model-context/frame/host.d.ts.map +1 -1
  23. package/dist/model-context/frame/provider.d.ts +1 -2
  24. package/dist/model-context/frame/provider.d.ts.map +1 -1
  25. package/dist/model-context/frame/types.d.ts +5 -6
  26. package/dist/model-context/frame/types.d.ts.map +1 -1
  27. package/dist/model-context/interactable-composer-metadata.d.ts +9 -10
  28. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  29. package/dist/model-context/registry-handles.d.ts +3 -4
  30. package/dist/model-context/registry-handles.d.ts.map +1 -1
  31. package/dist/model-context/registry.d.ts +1 -2
  32. package/dist/model-context/registry.d.ts.map +1 -1
  33. package/dist/model-context/tool-call-text.d.ts +2 -3
  34. package/dist/model-context/tool-call-text.d.ts.map +1 -1
  35. package/dist/model-context/tool.d.ts +2 -3
  36. package/dist/model-context/tool.d.ts.map +1 -1
  37. package/dist/model-context/types.d.ts +8 -9
  38. package/dist/model-context/types.d.ts.map +1 -1
  39. package/dist/react/AssistantProvider.d.ts +3 -4
  40. package/dist/react/AssistantProvider.d.ts.map +1 -1
  41. package/dist/react/AssistantRuntimeProvider.d.ts +1 -2
  42. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  43. package/dist/react/RuntimeAdapter.d.ts +2 -3
  44. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  45. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +4 -5
  46. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  47. package/dist/react/adapters/LocalStorageThreadListAdapter.js +20 -34
  48. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  49. package/dist/react/adapters/TitleGenerationAdapter.d.ts +2 -3
  50. package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
  51. package/dist/react/client/AdaptedRemoteThread.d.ts +1 -2
  52. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -1
  53. package/dist/react/client/DataRenderers.d.ts +1 -2
  54. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  55. package/dist/react/client/InMemoryThreadList.d.ts +3 -4
  56. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  57. package/dist/react/client/Interactables.d.ts +1 -2
  58. package/dist/react/client/Interactables.d.ts.map +1 -1
  59. package/dist/react/client/RemoteThreadList.d.ts +2 -3
  60. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  61. package/dist/react/client/Tools.d.ts +2 -2
  62. package/dist/react/client/Tools.d.ts.map +1 -1
  63. package/dist/react/client/interactable-model-context.d.ts +2 -3
  64. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  65. package/dist/react/interactables-legacy/Interactables.d.ts +1 -2
  66. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  67. package/dist/react/interactables-legacy/interactable-model-context.d.ts +2 -3
  68. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
  69. package/dist/react/interactables-legacy/scopes.d.ts +9 -10
  70. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
  71. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +2 -3
  72. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  73. package/dist/react/interactables-legacy/useInteractableState.d.ts +1 -2
  74. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
  75. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +1 -2
  76. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  77. package/dist/react/model-context/define-mcp-toolkit.d.ts +4 -5
  78. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
  79. package/dist/react/model-context/define-toolkit.d.ts +2 -3
  80. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  81. package/dist/react/model-context/external-tool.d.ts +1 -2
  82. package/dist/react/model-context/external-tool.d.ts.map +1 -1
  83. package/dist/react/model-context/human-tool.d.ts +3 -4
  84. package/dist/react/model-context/human-tool.d.ts.map +1 -1
  85. package/dist/react/model-context/interactableTool.d.ts +3 -4
  86. package/dist/react/model-context/interactableTool.d.ts.map +1 -1
  87. package/dist/react/model-context/makeAssistantDataUI.d.ts +2 -3
  88. package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
  89. package/dist/react/model-context/makeAssistantTool.d.ts +2 -3
  90. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  91. package/dist/react/model-context/makeAssistantToolUI.d.ts +2 -3
  92. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  93. package/dist/react/model-context/provider-tool.d.ts +2 -3
  94. package/dist/react/model-context/provider-tool.d.ts.map +1 -1
  95. package/dist/react/model-context/stub-tool.d.ts +1 -2
  96. package/dist/react/model-context/stub-tool.d.ts.map +1 -1
  97. package/dist/react/model-context/toolbox.d.ts +9 -10
  98. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  99. package/dist/react/model-context/useAssistantContext.d.ts +2 -2
  100. package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
  101. package/dist/react/model-context/useAssistantDataUI.d.ts +2 -3
  102. package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
  103. package/dist/react/model-context/useAssistantInstructions.d.ts +2 -2
  104. package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
  105. package/dist/react/model-context/useAssistantTool.d.ts +2 -3
  106. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  107. package/dist/react/model-context/useAssistantToolUI.d.ts +2 -3
  108. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  109. package/dist/react/model-context/useAuiToolOverrides.d.ts +1 -2
  110. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
  111. package/dist/react/model-context/useInlineRender.d.ts +1 -2
  112. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  113. package/dist/react/model-context/useInteractable.d.ts +4 -5
  114. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  115. package/dist/react/model-context/useInteractableState.d.ts +1 -2
  116. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  117. package/dist/react/model-context/useInteractableVersions.d.ts +1 -2
  118. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
  119. package/dist/react/model-context/useToolArgsStatus.d.ts +2 -3
  120. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  121. package/dist/react/primitive-hooks/useActionBarCopy.d.ts +2 -3
  122. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  123. package/dist/react/primitive-hooks/useActionBarEdit.d.ts +1 -2
  124. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  125. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts +2 -3
  126. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
  127. package/dist/react/primitive-hooks/useActionBarReload.d.ts +1 -2
  128. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  129. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts +1 -2
  130. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
  131. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts +1 -2
  132. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
  133. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts +1 -2
  134. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  135. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts +1 -2
  136. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  137. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +1 -2
  138. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  139. package/dist/react/primitive-hooks/useComposerCancel.d.ts +1 -2
  140. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  141. package/dist/react/primitive-hooks/useComposerDictate.d.ts +1 -2
  142. package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
  143. package/dist/react/primitive-hooks/useComposerSend.d.ts +1 -2
  144. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  145. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts +1 -2
  146. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
  147. package/dist/react/primitive-hooks/useEditComposerSend.d.ts +1 -2
  148. package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
  149. package/dist/react/primitive-hooks/useMessageBranching.d.ts +1 -2
  150. package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
  151. package/dist/react/primitive-hooks/useMessageError.d.ts +1 -2
  152. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  153. package/dist/react/primitive-hooks/useMessageReload.d.ts +1 -2
  154. package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
  155. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +2 -3
  156. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  157. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +1 -2
  158. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  159. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +1 -2
  160. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  161. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts +1 -2
  162. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
  163. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts +1 -2
  164. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
  165. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts +1 -2
  166. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
  167. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts +1 -2
  168. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
  169. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts +1 -2
  170. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  171. package/dist/react/primitive-hooks/useThreadListNew.d.ts +1 -2
  172. package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
  173. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +1 -2
  174. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
  175. package/dist/react/primitive-hooks/useThreadMessages.d.ts +1 -2
  176. package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
  177. package/dist/react/primitive-hooks/useVoice.d.ts +3 -4
  178. package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
  179. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +2 -3
  180. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  181. package/dist/react/primitives/composer/ComposerAttachments.d.ts +4 -5
  182. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  183. package/dist/react/primitives/composer/ComposerIf.d.ts +4 -5
  184. package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
  185. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -3
  186. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  187. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +4 -5
  188. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  189. package/dist/react/primitives/generativeUI/GenerativeUI.js +27 -28
  190. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  191. package/dist/react/primitives/message/MessageAttachments.d.ts +4 -5
  192. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  193. package/dist/react/primitives/message/MessageGroupedParts.d.ts +2 -3
  194. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  195. package/dist/react/primitives/message/MessageParts.d.ts +10 -10
  196. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  197. package/dist/react/primitives/message/MessageQuote.d.ts +2 -3
  198. package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
  199. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +2 -3
  200. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  201. package/dist/react/primitives/part/PartMessages.d.ts +3 -4
  202. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  203. package/dist/react/primitives/thread/ThreadMessages.d.ts +7 -8
  204. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  205. package/dist/react/primitives/thread/ThreadSuggestions.d.ts +5 -6
  206. package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
  207. package/dist/react/primitives/threadList/ThreadListItems.d.ts +4 -5
  208. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  209. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +2 -3
  210. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
  211. package/dist/react/providers/AttachmentByIndexProvider.d.ts +2 -3
  212. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  213. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +1 -2
  214. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  215. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +1 -2
  216. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  217. package/dist/react/providers/MessageByIdProvider.d.ts +1 -2
  218. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
  219. package/dist/react/providers/MessageByIndexProvider.d.ts +1 -2
  220. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  221. package/dist/react/providers/PartByIndexProvider.d.ts +1 -2
  222. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  223. package/dist/react/providers/QueueItemByIndexProvider.d.ts +2 -3
  224. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  225. package/dist/react/providers/ReadonlyThreadProvider.d.ts +2 -3
  226. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  227. package/dist/react/providers/SuggestionByIndexProvider.d.ts +2 -3
  228. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  229. package/dist/react/providers/TextMessagePartProvider.d.ts +1 -2
  230. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  231. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +1 -2
  232. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  233. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -2
  234. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  235. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +3 -2
  236. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  237. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +17 -7
  238. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  239. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -2
  240. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  241. package/dist/react/runtimes/RemoteThreadResource.d.ts +4 -5
  242. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  243. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -3
  244. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  245. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +2 -3
  246. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -1
  247. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +3 -4
  248. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  249. package/dist/react/runtimes/assistant-transport/runManager.d.ts +2 -3
  250. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  251. package/dist/react/runtimes/assistant-transport/types.d.ts +17 -18
  252. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -1
  253. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +4 -5
  254. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  255. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +1 -2
  256. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -1
  257. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +1 -2
  258. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -1
  259. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +2 -3
  260. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  261. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +17 -4
  262. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  263. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -2
  264. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  265. package/dist/react/runtimes/cloud/auiV0.d.ts +11 -3
  266. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  267. package/dist/react/runtimes/cloud/auiV0.js +63 -2
  268. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  269. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +4 -5
  270. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  271. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +1 -2
  272. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -1
  273. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +1 -2
  274. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -1
  275. package/dist/react/runtimes/cloud/sdkIdentity.js +1 -1
  276. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -2
  277. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  278. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +1 -2
  279. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  280. package/dist/react/runtimes/createMessageConverter.d.ts +1 -2
  281. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  282. package/dist/react/runtimes/createRuntimeExtras.d.ts +3 -4
  283. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
  284. package/dist/react/runtimes/external-message-converter.d.ts +6 -6
  285. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  286. package/dist/react/runtimes/useExternalStoreRuntime.d.ts +1 -2
  287. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  288. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +1 -2
  289. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
  290. package/dist/react/runtimes/useLocalRuntime.d.ts +3 -4
  291. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  292. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +1 -2
  293. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  294. package/dist/react/runtimes/useRemoteThreadListRuntime.js +2 -2
  295. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  296. package/dist/react/runtimes/useRuntimeAdapters.d.ts +4 -4
  297. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -1
  298. package/dist/react/runtimes/useStreamingTiming.d.ts +2 -2
  299. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
  300. package/dist/react/types/MessagePartComponentTypes.d.ts +26 -27
  301. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  302. package/dist/react/types/scopes/dataRenderers.d.ts +3 -4
  303. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  304. package/dist/react/types/scopes/interactables.d.ts +10 -11
  305. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  306. package/dist/react/types/scopes/tools.d.ts +4 -5
  307. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  308. package/dist/react/utils/getMessageQuote.d.ts +1 -2
  309. package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
  310. package/dist/react/utils/groupParts.d.ts +7 -8
  311. package/dist/react/utils/groupParts.d.ts.map +1 -1
  312. package/dist/react/utils/useJSONEqual.d.ts +2 -3
  313. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  314. package/dist/react/utils/useJSONSchemaDependency.d.ts +1 -2
  315. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -1
  316. package/dist/runtime/api/assistant-runtime.d.ts +2 -3
  317. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  318. package/dist/runtime/api/attachment-runtime.d.ts +6 -7
  319. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  320. package/dist/runtime/api/bindings.d.ts +5 -6
  321. package/dist/runtime/api/bindings.d.ts.map +1 -1
  322. package/dist/runtime/api/composer-runtime.d.ts +10 -10
  323. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  324. package/dist/runtime/api/message-part-runtime.d.ts +3 -4
  325. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  326. package/dist/runtime/api/message-part-runtime.js +3 -2
  327. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  328. package/dist/runtime/api/message-runtime.d.ts +8 -6
  329. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  330. package/dist/runtime/api/message-runtime.js +3 -2
  331. package/dist/runtime/api/message-runtime.js.map +1 -1
  332. package/dist/runtime/api/paths.d.ts +6 -7
  333. package/dist/runtime/api/paths.d.ts.map +1 -1
  334. package/dist/runtime/api/thread-list-item-runtime.d.ts +8 -8
  335. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  336. package/dist/runtime/api/thread-list-runtime.d.ts +4 -5
  337. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  338. package/dist/runtime/api/thread-runtime.d.ts +10 -11
  339. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  340. package/dist/runtime/base/base-assistant-runtime-core.d.ts +1 -2
  341. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
  342. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -2
  343. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  344. package/dist/runtime/base/base-thread-runtime-core.d.ts +8 -3
  345. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  346. package/dist/runtime/base/base-thread-runtime-core.js +71 -27
  347. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  348. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +1 -2
  349. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  350. package/dist/runtime/base/default-edit-composer-runtime-core.js +12 -2
  351. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  352. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -2
  353. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  354. package/dist/runtime/base/default-thread-composer-runtime-core.js +7 -1
  355. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  356. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +1 -2
  357. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
  358. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +1 -2
  359. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
  360. package/dist/runtime/interfaces/composer-runtime-core.d.ts +10 -11
  361. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  362. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -5
  363. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  364. package/dist/runtime/interfaces/thread-runtime-core.d.ts +17 -16
  365. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  366. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +2 -3
  367. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  368. package/dist/runtime/queue/message-queue.d.ts +5 -4
  369. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  370. package/dist/runtime/queue/message-queue.js +9 -1
  371. package/dist/runtime/queue/message-queue.js.map +1 -1
  372. package/dist/runtime/queue/queue-item.d.ts +2 -3
  373. package/dist/runtime/queue/queue-item.d.ts.map +1 -1
  374. package/dist/runtime/utils/abortable-thread-load.d.ts +2 -3
  375. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -1
  376. package/dist/runtime/utils/attachment-add-operations.d.ts +3 -4
  377. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -1
  378. package/dist/runtime/utils/auto-status.d.ts +7 -8
  379. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  380. package/dist/runtime/utils/chat-model-adapter.d.ts +5 -6
  381. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  382. package/dist/runtime/utils/external-message-conversion.d.ts +15 -16
  383. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  384. package/dist/runtime/utils/external-message-conversion.js +3 -2
  385. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  386. package/dist/runtime/utils/external-store-message.d.ts +4 -5
  387. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  388. package/dist/runtime/utils/message-repository-session.d.ts +3 -4
  389. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -1
  390. package/dist/runtime/utils/message-repository.d.ts +4 -5
  391. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  392. package/dist/runtime/utils/pending-tool-calls.d.ts +2 -3
  393. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -1
  394. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +1 -2
  395. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  396. package/dist/runtime/utils/runtime-extras-brand.d.ts +2 -3
  397. package/dist/runtime/utils/runtime-extras-brand.d.ts.map +1 -1
  398. package/dist/runtime/utils/stored-message-parts.d.ts +21 -0
  399. package/dist/runtime/utils/stored-message-parts.d.ts.map +1 -0
  400. package/dist/runtime/utils/stored-message-parts.js +83 -0
  401. package/dist/runtime/utils/stored-message-parts.js.map +1 -0
  402. package/dist/runtime/utils/streaming-timing.d.ts +4 -5
  403. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
  404. package/dist/runtime/utils/thread-message-like.d.ts +5 -5
  405. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  406. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  407. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +3 -4
  408. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -1
  409. package/dist/runtime/utils/tool-call-tree.d.ts +4 -5
  410. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -1
  411. package/dist/runtimes/assistant-transport/utils.d.ts +1 -2
  412. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  413. package/dist/runtimes/external-store/external-store-adapter.d.ts +9 -6
  414. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  415. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +1 -2
  416. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  417. package/dist/runtimes/external-store/external-store-shared-options.d.ts +2 -3
  418. package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
  419. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -3
  420. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  421. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -3
  422. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  423. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +29 -6
  424. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  425. package/dist/runtimes/external-store/thread-message-converter.d.ts +2 -3
  426. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
  427. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +2 -3
  428. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  429. package/dist/runtimes/local/local-runtime-core.d.ts +1 -2
  430. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  431. package/dist/runtimes/local/local-runtime-options.d.ts +1 -2
  432. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  433. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +2 -3
  434. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  435. package/dist/runtimes/local/local-thread-runtime-core.d.ts +9 -4
  436. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  437. package/dist/runtimes/local/local-thread-runtime-core.js +53 -9
  438. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  439. package/dist/runtimes/local/should-continue.d.ts +1 -2
  440. package/dist/runtimes/local/should-continue.d.ts.map +1 -1
  441. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -2
  442. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  443. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -2
  444. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  445. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +1 -2
  446. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -1
  447. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +1 -2
  448. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  449. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +1 -2
  450. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  451. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +16 -17
  452. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  453. package/dist/runtimes/remote-thread-list/title-generation.d.ts +7 -8
  454. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -1
  455. package/dist/runtimes/remote-thread-list/title.d.ts +2 -3
  456. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  457. package/dist/runtimes/remote-thread-list/types.d.ts +8 -9
  458. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  459. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +4 -5
  460. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  461. package/dist/store/clients/chain-of-thought-client.d.ts +1 -2
  462. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  463. package/dist/store/clients/external-thread.d.ts +3 -4
  464. package/dist/store/clients/external-thread.d.ts.map +1 -1
  465. package/dist/store/clients/external-thread.js +15 -11
  466. package/dist/store/clients/external-thread.js.map +1 -1
  467. package/dist/store/clients/model-context-client.d.ts +1 -2
  468. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  469. package/dist/store/clients/no-op-composer-client.d.ts +1 -2
  470. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  471. package/dist/store/clients/runtime-adapter.d.ts +1 -2
  472. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  473. package/dist/store/clients/single-thread-list.d.ts +1 -2
  474. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  475. package/dist/store/clients/suggestions.d.ts +3 -4
  476. package/dist/store/clients/suggestions.d.ts.map +1 -1
  477. package/dist/store/clients/thread-message-client.d.ts +2 -3
  478. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  479. package/dist/store/clients/thread-selection-events.d.ts +1 -2
  480. package/dist/store/clients/thread-selection-events.d.ts.map +1 -1
  481. package/dist/store/clients/thread-tasks.d.ts +3 -4
  482. package/dist/store/clients/thread-tasks.d.ts.map +1 -1
  483. package/dist/store/env.d.ts +1 -2
  484. package/dist/store/env.d.ts.map +1 -1
  485. package/dist/store/primitive-predicates.d.ts +11 -12
  486. package/dist/store/primitive-predicates.d.ts.map +1 -1
  487. package/dist/store/primitive-predicates.js +2 -2
  488. package/dist/store/primitive-predicates.js.map +1 -1
  489. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +1 -2
  490. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  491. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -2
  492. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  493. package/dist/store/runtime-clients/handle-runtime-action.d.ts +1 -2
  494. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  495. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +1 -2
  496. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -1
  497. package/dist/store/runtime-clients/liveRef.d.ts +1 -2
  498. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
  499. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +1 -2
  500. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  501. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -2
  502. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  503. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +1 -2
  504. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  505. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +1 -2
  506. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  507. package/dist/store/runtime-clients/thread-runtime-client.d.ts +1 -2
  508. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  509. package/dist/store/runtime-clients/useSubscribable.d.ts +1 -2
  510. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  511. package/dist/store/scopes/attachment.d.ts +4 -5
  512. package/dist/store/scopes/attachment.d.ts.map +1 -1
  513. package/dist/store/scopes/chain-of-thought.d.ts +5 -6
  514. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
  515. package/dist/store/scopes/composer.d.ts +6 -7
  516. package/dist/store/scopes/composer.d.ts.map +1 -1
  517. package/dist/store/scopes/message.d.ts +6 -6
  518. package/dist/store/scopes/message.d.ts.map +1 -1
  519. package/dist/store/scopes/model-context.d.ts +3 -4
  520. package/dist/store/scopes/model-context.d.ts.map +1 -1
  521. package/dist/store/scopes/part.d.ts +4 -5
  522. package/dist/store/scopes/part.d.ts.map +1 -1
  523. package/dist/store/scopes/queue-item.d.ts +4 -4
  524. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  525. package/dist/store/scopes/suggestion.d.ts +4 -5
  526. package/dist/store/scopes/suggestion.d.ts.map +1 -1
  527. package/dist/store/scopes/suggestions.d.ts +5 -6
  528. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  529. package/dist/store/scopes/task.d.ts +4 -5
  530. package/dist/store/scopes/task.d.ts.map +1 -1
  531. package/dist/store/scopes/thread-list-item.d.ts +5 -6
  532. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  533. package/dist/store/scopes/thread.d.ts +5 -6
  534. package/dist/store/scopes/thread.d.ts.map +1 -1
  535. package/dist/store/scopes/threads.d.ts +4 -5
  536. package/dist/store/scopes/threads.d.ts.map +1 -1
  537. package/dist/subscribable/subscribable.d.ts +15 -16
  538. package/dist/subscribable/subscribable.d.ts.map +1 -1
  539. package/dist/tests/remote-thread-list-test-helpers.d.ts +5 -6
  540. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  541. package/dist/types/attachment.d.ts +9 -10
  542. package/dist/types/attachment.d.ts.map +1 -1
  543. package/dist/types/augmentations.d.ts +3 -4
  544. package/dist/types/augmentations.d.ts.map +1 -1
  545. package/dist/types/directive.d.ts +2 -3
  546. package/dist/types/directive.d.ts.map +1 -1
  547. package/dist/types/error.d.ts +8 -9
  548. package/dist/types/error.d.ts.map +1 -1
  549. package/dist/types/message.d.ts +48 -46
  550. package/dist/types/message.d.ts.map +1 -1
  551. package/dist/types/message.js.map +1 -1
  552. package/dist/types/quote.d.ts +1 -2
  553. package/dist/types/quote.d.ts.map +1 -1
  554. package/dist/types/trigger.d.ts +2 -3
  555. package/dist/types/trigger.d.ts.map +1 -1
  556. package/dist/types/unsubscribe.d.ts +1 -2
  557. package/dist/types/unsubscribe.d.ts.map +1 -1
  558. package/dist/utils/abortable-iterable.d.ts +2 -3
  559. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  560. package/dist/utils/composite-context-provider.d.ts +1 -2
  561. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  562. package/dist/utils/data-url.d.ts +6 -7
  563. package/dist/utils/data-url.d.ts.map +1 -1
  564. package/dist/utils/getGroupStatus.d.ts +2 -3
  565. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  566. package/dist/utils/id.d.ts +3 -4
  567. package/dist/utils/id.d.ts.map +1 -1
  568. package/dist/utils/image-media-type.d.ts +1 -2
  569. package/dist/utils/image-media-type.d.ts.map +1 -1
  570. package/dist/utils/invoke-user-callback.d.ts +1 -2
  571. package/dist/utils/invoke-user-callback.d.ts.map +1 -1
  572. package/dist/utils/json/is-json-equal.d.ts +1 -2
  573. package/dist/utils/json/is-json-equal.d.ts.map +1 -1
  574. package/dist/utils/json/is-json.d.ts +4 -5
  575. package/dist/utils/json/is-json.d.ts.map +1 -1
  576. package/dist/utils/json/stable-stringify-tool-args.d.ts +2 -3
  577. package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -1
  578. package/dist/utils/normalizePartStatus.d.ts +4 -5
  579. package/dist/utils/normalizePartStatus.d.ts.map +1 -1
  580. package/dist/utils/notify-event-listeners.d.ts +1 -2
  581. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  582. package/dist/utils/record.d.ts +1 -2
  583. package/dist/utils/record.d.ts.map +1 -1
  584. package/dist/utils/silent-runtime-action.d.ts +2 -3
  585. package/dist/utils/silent-runtime-action.d.ts.map +1 -1
  586. package/dist/utils/text.d.ts +1 -2
  587. package/dist/utils/text.d.ts.map +1 -1
  588. package/dist/utils/wire-media.d.ts +3 -4
  589. package/dist/utils/wire-media.d.ts.map +1 -1
  590. package/package.json +14 -13
  591. package/src/adapters/attachment.ts +8 -1
  592. package/src/adapters/feedback.ts +1 -0
  593. package/src/model-context/frame/provider.test.ts +45 -20
  594. package/src/react/RuntimeAdapter.test.ts +4 -1
  595. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +117 -0
  596. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +27 -74
  597. package/src/react/client/Interactables.test.ts +12 -7
  598. package/src/react/client/RemoteThreadList.concurrent.test.tsx +9 -3
  599. package/src/react/client/RemoteThreadList.test.ts +5 -6
  600. package/src/react/interactables-legacy/Interactables.test.ts +9 -3
  601. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +40 -22
  602. package/src/react/model-context/useInteractable.test.tsx +56 -29
  603. package/src/react/primitive-hooks/useActionBarCopy.test.ts +5 -5
  604. package/src/react/primitives/generativeUI/GenerativeUI.test.tsx +54 -0
  605. package/src/react/primitives/generativeUI/GenerativeUI.tsx +13 -18
  606. package/src/react/primitives/message/MessageGroupedParts.test.tsx +4 -1
  607. package/src/react/primitives/thread/ThreadMessages.test.tsx +25 -7
  608. package/src/react/runtimes/RemoteThreadListHookInstanceManager.layout.test.tsx +62 -0
  609. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +2 -2
  610. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +23 -20
  611. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +24 -17
  612. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +39 -24
  613. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +73 -46
  614. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +66 -1
  615. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +102 -0
  616. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +24 -11
  617. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +8 -4
  618. package/src/react/runtimes/cloud/auiV0.ts +121 -1
  619. package/src/react/runtimes/cloud/auiV0DecodeSafely.test.ts +522 -0
  620. package/src/react/runtimes/external-message-converter.test.ts +7 -3
  621. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +2 -1
  622. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +8 -2
  623. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +6 -2
  624. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +84 -4
  625. package/src/react/runtimes/useRemoteThreadListRuntime.ts +5 -1
  626. package/src/runtime/api/message-part-runtime.ts +4 -1
  627. package/src/runtime/api/message-runtime.ts +15 -2
  628. package/src/runtime/base/base-thread-runtime-core.test.ts +761 -18
  629. package/src/runtime/base/base-thread-runtime-core.ts +89 -26
  630. package/src/runtime/base/default-edit-composer-runtime-core.ts +12 -2
  631. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -1
  632. package/src/runtime/interfaces/thread-runtime-core.ts +2 -0
  633. package/src/runtime/queue/message-queue.ts +11 -1
  634. package/src/runtime/utils/external-message-conversion.test.ts +43 -0
  635. package/src/runtime/utils/external-message-conversion.ts +6 -2
  636. package/src/runtime/utils/stored-message-parts.ts +174 -0
  637. package/src/runtime/utils/thread-message-like.ts +7 -2
  638. package/src/runtimes/external-store/external-store-adapter.ts +4 -0
  639. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +44 -9
  640. package/src/runtimes/local/local-thread-runtime-core.test.ts +168 -12
  641. package/src/runtimes/local/local-thread-runtime-core.ts +80 -9
  642. package/src/store/clients/external-thread.ts +34 -13
  643. package/src/store/primitive-predicates.test.ts +16 -0
  644. package/src/store/primitive-predicates.ts +4 -1
  645. package/src/store/runtime-clients/thread-runtime-client.test.tsx +110 -0
  646. package/src/store/scopes/message.ts +4 -1
  647. package/src/subscribable/subscribable.test.ts +7 -2
  648. package/src/tests/attachment-adapters.test.ts +16 -1
  649. package/src/tests/auiV0Encode.test.ts +4 -0
  650. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +6 -6
  651. package/src/tests/base-composer-runtime-core.test.ts +16 -5
  652. package/src/tests/composer-can-cancel.test.ts +35 -6
  653. package/src/tests/composer-can-send.test.ts +22 -0
  654. package/src/tests/default-edit-composer-runtime-core.test.ts +47 -0
  655. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +229 -27
  656. package/src/tests/external-store-thread-runtime-core.test.ts +31 -0
  657. package/src/tests/external-thread-attachments.test.tsx +22 -23
  658. package/src/tests/external-thread-feedback.test.tsx +20 -7
  659. package/src/tests/external-thread-parity.test.tsx +1 -1
  660. package/src/tests/message-queue.test.ts +45 -10
  661. package/src/tests/thread-switch-events.test.tsx +11 -7
  662. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +2 -1
  663. package/src/types/message.test.ts +19 -0
  664. package/src/types/message.ts +16 -8
@@ -10,7 +10,7 @@ import {
10
10
  type ComponentType,
11
11
  Fragment,
12
12
  } from "react";
13
- import { useResources, withKey } from "@assistant-ui/tap";
13
+ import { useResources, useTapHost, withKey } from "@assistant-ui/tap";
14
14
  import type { AssistantClient } from "@assistant-ui/store";
15
15
  import { ThreadListItemRuntimeProvider } from "../providers/ThreadListItemRuntimeProvider";
16
16
  import type {
@@ -329,30 +329,37 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
329
329
  });
330
330
  }
331
331
 
332
+ private _threadElements(
333
+ parentClient: AssistantClient,
334
+ { threads, hookEpoch }: HostSnapshot,
335
+ adapters: AdapterSnapshot,
336
+ ) {
337
+ const runtimeHook = this.runtimeHook;
338
+ return threads.map(({ id, generation, destroySignal }) => {
339
+ const threadAdapters = this.pendingThreadAdapters.has(id)
340
+ ? this.pendingThreadAdapters.get(id)!
341
+ : (adapters.threadAdapters.get(id) ?? adapters.defaultAdapters);
342
+ return withKey(
343
+ `${id}:${generation}:${hookEpoch}`,
344
+ RemoteThreadResource({
345
+ threadId: id,
346
+ generation,
347
+ parentList: this.parent,
348
+ runtimeHook,
349
+ parentClient,
350
+ adapters: threadAdapters,
351
+ publish: this._publish,
352
+ destroySignal,
353
+ }),
354
+ );
355
+ });
356
+ }
357
+
358
+ /** @deprecated Commits the hosted threads after descendant layout effects; render `__internal_Host` instead. */
332
359
  public __internal_useHost(parentClient: AssistantClient) {
333
- const { threads, hookEpoch } = useSubscribable(this.hostStore);
360
+ const host = useSubscribable(this.hostStore);
334
361
  const adapters = useSubscribable(this.adapterStore);
335
- const runtimeHook = this.runtimeHook;
336
- return useResources(
337
- threads.map(({ id, generation, destroySignal }) => {
338
- const threadAdapters = this.pendingThreadAdapters.has(id)
339
- ? this.pendingThreadAdapters.get(id)!
340
- : (adapters.threadAdapters.get(id) ?? adapters.defaultAdapters);
341
- return withKey(
342
- `${id}:${generation}:${hookEpoch}`,
343
- RemoteThreadResource({
344
- threadId: id,
345
- generation,
346
- parentList: this.parent,
347
- runtimeHook,
348
- parentClient,
349
- adapters: threadAdapters,
350
- publish: this._publish,
351
- destroySignal,
352
- }),
353
- );
354
- }),
355
- );
362
+ return useResources(this._threadElements(parentClient, host, adapters));
356
363
  }
357
364
 
358
365
  public __internal_RenderThreadRuntimes: FC<{
@@ -374,7 +381,15 @@ export class RemoteThreadListHookInstanceManager extends BaseSubscribable {
374
381
  public __internal_Host: FC<{ parentClient: AssistantClient }> = ({
375
382
  parentClient,
376
383
  }) => {
377
- this.__internal_useHost(parentClient);
384
+ const host = useSubscribable(this.hostStore);
385
+ const adapters = useSubscribable(this.adapterStore);
386
+ const elements = this._threadElements(parentClient, host, adapters);
387
+ const { effects } = useTapHost(function RemoteThreadResources() {
388
+ return useResources(elements);
389
+ });
390
+ // Descendant layout effects may already dispatch to the thread resources,
391
+ // and tap commits a hosted resource only when its host effects run.
392
+ useLayoutEffect(effects);
378
393
  return null;
379
394
  };
380
395
 
@@ -1,8 +1,15 @@
1
1
  // @vitest-environment jsdom
2
2
 
3
- import { act, render, renderHook, waitFor } from "@testing-library/react";
3
+ import { act, renderHook, waitFor } from "@testing-library/react";
4
4
  import { describe, expect, it, vi } from "vitest";
5
- import { createElement, StrictMode, useLayoutEffect, useRef } from "react";
5
+ import {
6
+ createElement,
7
+ StrictMode,
8
+ useEffect,
9
+ useLayoutEffect,
10
+ useRef,
11
+ } from "react";
12
+ import { createRoot } from "react-dom/client";
6
13
  import { useCommandQueue } from "./commandQueue";
7
14
  import { useRunManager } from "./runManager";
8
15
  import type { AssistantTransportCommand } from "./types";
@@ -85,52 +92,70 @@ const useTransportSchedulingHarness = (
85
92
  };
86
93
 
87
94
  describe("assistant transport scheduling contracts", () => {
88
- it("uses current callbacks when scheduled by a descendant layout effect", async () => {
89
- const onRunA = vi.fn(async () => {});
90
- const onRunB = vi.fn(async () => {});
91
- // act flushes passive effects before real microtasks, so preserve the
92
- // browser's microtask-before-passive-effect ordering at the layout boundary.
93
- const queueMicrotaskSpy = vi
94
- .spyOn(globalThis, "queueMicrotask")
95
- .mockImplementation((callback) => callback());
96
-
97
- const Scheduler = ({
98
- schedule,
99
- enabled,
100
- }: {
101
- schedule: () => void;
102
- enabled: boolean;
103
- }) => {
104
- useLayoutEffect(() => {
105
- if (enabled) schedule();
106
- }, [enabled, schedule]);
107
- return null;
108
- };
109
- const Probe = ({
110
- enabled,
111
- onRun,
112
- }: {
113
- enabled: boolean;
114
- onRun: (signal: AbortSignal) => Promise<void>;
115
- }) => {
116
- const runManager = useRunManager({ onRun });
117
- return createElement(Scheduler, {
118
- enabled,
119
- schedule: runManager.schedule,
120
- });
121
- };
122
-
95
+ it("reads the committed callbacks when a run settles inside a yielded commit", async () => {
96
+ // A render past the scheduler's 5 ms frame budget yields before passive
97
+ // effects, and act would drain them first, so this renders outside act.
98
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", false);
123
99
  try {
124
- const view = render(
125
- createElement(Probe, { enabled: false, onRun: onRunA }),
100
+ const events: string[] = [];
101
+ const pendingRuns: (() => void)[] = [];
102
+ let schedule!: () => void;
103
+ const settleRun = () => {
104
+ pendingRuns.shift()?.();
105
+ schedule();
106
+ };
107
+
108
+ const Settle = ({ onLayout }: { onLayout: (() => void) | undefined }) => {
109
+ useLayoutEffect(() => {
110
+ onLayout?.();
111
+ }, [onLayout]);
112
+ return null;
113
+ };
114
+ const Probe = ({
115
+ label,
116
+ renderMs,
117
+ onLayout,
118
+ }: {
119
+ label: string;
120
+ renderMs: number;
121
+ onLayout?: () => void;
122
+ }) => {
123
+ const runManager = useRunManager({
124
+ onRun: () => {
125
+ events.push(`run:${label}`);
126
+ return new Promise<void>((resolve) => pendingRuns.push(resolve));
127
+ },
128
+ onFinish: () => events.push(`finish:${label}`),
129
+ });
130
+ schedule = runManager.schedule;
131
+ useEffect(() => {
132
+ events.push(`passive:${label}`);
133
+ }, [label]);
134
+ const renderEnd = performance.now() + renderMs;
135
+ while (performance.now() < renderEnd) {}
136
+ return createElement(Settle, { onLayout });
137
+ };
138
+
139
+ const root = createRoot(document.createElement("div"));
140
+ root.render(createElement(Probe, { label: "A", renderMs: 0 }));
141
+ await vi.waitFor(() => expect(events).toEqual(["passive:A"]));
142
+ schedule();
143
+ await vi.waitFor(() => expect(events).toEqual(["passive:A", "run:A"]));
144
+ root.render(
145
+ createElement(Probe, { label: "B", renderMs: 30, onLayout: settleRun }),
126
146
  );
127
- view.rerender(createElement(Probe, { enabled: true, onRun: onRunB }));
128
- await act(async () => {});
129
-
130
- expect(onRunB).toHaveBeenCalledTimes(1);
131
- expect(onRunA).not.toHaveBeenCalled();
147
+ await vi.waitFor(() => expect(events).toContain("passive:B"));
148
+ root.unmount();
149
+
150
+ expect(events).toEqual([
151
+ "passive:A",
152
+ "run:A",
153
+ "finish:B",
154
+ "run:B",
155
+ "passive:B",
156
+ ]);
132
157
  } finally {
133
- queueMicrotaskSpy.mockRestore();
158
+ vi.unstubAllGlobals();
134
159
  }
135
160
  });
136
161
 
@@ -196,7 +221,9 @@ describe("assistant transport scheduling contracts", () => {
196
221
  onRun: () => {
197
222
  throw new Error("network error");
198
223
  },
199
- onError: (commands) => seen.push(commands),
224
+ onError: (commands) => {
225
+ seen.push(commands);
226
+ },
200
227
  }),
201
228
  );
202
229
 
@@ -167,7 +167,13 @@ describe("useAssistantTransportRuntime", () => {
167
167
  ],
168
168
  createdAt: new Date(0),
169
169
  status: { type: "requires-action", reason: "tool-calls" },
170
- metadata: { custom: {} },
170
+ metadata: {
171
+ unstable_state: {},
172
+ unstable_annotations: [],
173
+ unstable_data: [],
174
+ steps: [],
175
+ custom: {},
176
+ },
171
177
  },
172
178
  ],
173
179
  isRunning: meta.isSending,
@@ -203,6 +209,65 @@ describe("useAssistantTransportRuntime", () => {
203
209
  },
204
210
  );
205
211
 
212
+ it("forwards a tool response's modelContent to the outbound command", async () => {
213
+ const fetchMock = installFetch();
214
+ const { aui } = mountRuntime({
215
+ converter: (_state, meta) => ({
216
+ messages: [
217
+ {
218
+ id: "a1",
219
+ role: "assistant",
220
+ content: [
221
+ {
222
+ type: "tool-call",
223
+ toolCallId: "tc1",
224
+ toolName: "probe",
225
+ args: {},
226
+ argsText: "{}",
227
+ },
228
+ ],
229
+ createdAt: new Date(0),
230
+ status: { type: "requires-action", reason: "tool-calls" },
231
+ metadata: {
232
+ unstable_state: {},
233
+ unstable_annotations: [],
234
+ unstable_data: [],
235
+ steps: [],
236
+ custom: {},
237
+ },
238
+ },
239
+ ],
240
+ isRunning: meta.isSending,
241
+ }),
242
+ });
243
+
244
+ await waitFor(() =>
245
+ expect(
246
+ aui()
247
+ .thread.message({ id: "a1" })
248
+ .part({ toolCallId: "tc1" })
249
+ .getState().type,
250
+ ).toBe("tool-call"),
251
+ );
252
+
253
+ const modelContent = [{ type: "text" as const, text: "done" }];
254
+ act(() => {
255
+ aui()
256
+ .thread.message({ id: "a1" })
257
+ .part({ toolCallId: "tc1" })
258
+ .addToolResult(new ToolResponse({ result: "ok", modelContent }));
259
+ });
260
+
261
+ await waitFor(() => expect(fetchMock.requests).toHaveLength(1));
262
+ expect(fetchMock.requests[0]!.body["commands"][0]).toHaveProperty(
263
+ "modelContent",
264
+ modelContent,
265
+ );
266
+
267
+ act(() => fetchMock.servers[0]!.close());
268
+ await waitFor(() => expect(aui().thread.getState().isRunning).toBe(false));
269
+ });
270
+
206
271
  it.each(["throws", "rejects"] as const)(
207
272
  "cancels the response body when onResponse %s",
208
273
  async (failureMode) => {
@@ -404,6 +404,31 @@ describe("useAssistantCloudThreadHistoryAdapter", () => {
404
404
  });
405
405
  });
406
406
 
407
+ it("forwards a feedback comment to the cloud", async () => {
408
+ mocks.aui = mocks.makeClient("thread-1");
409
+ const cloud = makeCloud();
410
+ const cloudRef = { current: cloud };
411
+ const { result } = renderHook(() =>
412
+ useAssistantCloudThreadHistoryAdapter(cloudRef),
413
+ );
414
+ const message = makeAssistantMessage("local-message-1");
415
+
416
+ await result.current.append({ parentId: null, message });
417
+ result.current.feedback.submit({
418
+ message,
419
+ type: "negative",
420
+ comment: "Quoted the wrong date",
421
+ });
422
+
423
+ await waitFor(() => {
424
+ expect(cloud.threads.messages.feedback).toHaveBeenCalledWith(
425
+ "thread-1",
426
+ "remote-message-1",
427
+ { type: "negative", comment: "Quoted the wrong date" },
428
+ );
429
+ });
430
+ });
431
+
407
432
  it("warns and skips feedback before the thread has a remote ID", async () => {
408
433
  mocks.aui = mocks.makeClient(undefined, "local-thread", "thread-1");
409
434
  const cloud = makeCloud();
@@ -1070,3 +1095,80 @@ describe("useAssistantCloudThreadHistoryAdapter", () => {
1070
1095
  );
1071
1096
  });
1072
1097
  });
1098
+
1099
+ describe("useAssistantCloudThreadHistoryAdapter load recovery", () => {
1100
+ const userRow = (id: string, parentId: string | null, text: string) => ({
1101
+ id,
1102
+ thread_id: "thread-1",
1103
+ format: "aui/v0" as const,
1104
+ parent_id: parentId,
1105
+ created_at: new Date(0),
1106
+ content: {
1107
+ role: "user",
1108
+ content: [{ type: "text", text }],
1109
+ metadata: { custom: {} },
1110
+ },
1111
+ });
1112
+
1113
+ const loadHistory = async (messages: unknown[]) => {
1114
+ mocks.aui = mocks.makeClient("thread-1");
1115
+ const cloud = makeCloud();
1116
+ cloud.threads.messages.list = vi.fn().mockResolvedValue({ messages });
1117
+ const cloudRef = { current: cloud };
1118
+ const { result } = renderHook(() =>
1119
+ useAssistantCloudThreadHistoryAdapter(cloudRef),
1120
+ );
1121
+ return (await result.current.load()).messages;
1122
+ };
1123
+
1124
+ it("keeps a row whose stored part is malformed, and the thread below it", async () => {
1125
+ // The cloud lists rows newest first.
1126
+ const messages = await loadHistory([
1127
+ userRow("msg-3", "msg-2", "after"),
1128
+ {
1129
+ ...userRow("msg-2", "msg-1", "ignored"),
1130
+ content: { role: "assistant", content: [null] },
1131
+ },
1132
+ userRow("msg-1", null, "hello"),
1133
+ ]);
1134
+
1135
+ expect(messages.map((item) => item.message.id)).toEqual([
1136
+ "msg-1",
1137
+ "msg-2",
1138
+ "msg-3",
1139
+ ]);
1140
+ expect(messages[1]?.message.content).toEqual([]);
1141
+ });
1142
+
1143
+ it("keeps a row whose stored attachment is malformed", async () => {
1144
+ const messages = await loadHistory([
1145
+ {
1146
+ ...userRow("msg-1", null, "look"),
1147
+ content: {
1148
+ role: "user",
1149
+ content: [{ type: "text", text: "look" }],
1150
+ attachments: [null],
1151
+ metadata: { custom: {} },
1152
+ },
1153
+ },
1154
+ ]);
1155
+
1156
+ expect(messages).toHaveLength(1);
1157
+ expect(messages[0]?.message.content).toEqual([
1158
+ { type: "text", text: "look" },
1159
+ ]);
1160
+ });
1161
+
1162
+ it("drops an unreadable row together with the subtree below it", async () => {
1163
+ const messages = await loadHistory([
1164
+ userRow("msg-3", "msg-2", "orphaned"),
1165
+ {
1166
+ ...userRow("msg-2", "msg-1", "ignored"),
1167
+ content: { role: "assistant", content: null },
1168
+ },
1169
+ userRow("msg-1", null, "hello"),
1170
+ ]);
1171
+
1172
+ expect(messages.map((item) => item.message.id)).toEqual(["msg-1"]);
1173
+ });
1174
+ });
@@ -30,7 +30,7 @@ import {
30
30
  extractAISDKRunTelemetry,
31
31
  type AISDKMessageLike,
32
32
  } from "assistant-cloud/ai-sdk";
33
- import { auiV0Decode, auiV0Encode } from "./auiV0";
33
+ import { auiV0DecodeSafely, auiV0Encode } from "./auiV0";
34
34
  import { type AssistantClient, getClientId, useAui } from "@assistant-ui/store";
35
35
  import type { ThreadListItemMethods } from "../../../store/scopes/thread-list-item";
36
36
  import type { FeedbackAdapter } from "../../../adapters/feedback";
@@ -117,7 +117,7 @@ class AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {
117
117
  }
118
118
 
119
119
  public readonly feedback: FeedbackAdapter = {
120
- submit: ({ message, type }) => {
120
+ submit: ({ message, type, comment }) => {
121
121
  void (async () => {
122
122
  const threadListItem = this.tryGetKeyedThreadListItem();
123
123
  const remoteThreadId = threadListItem?.getState().remoteId;
@@ -141,7 +141,7 @@ class AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {
141
141
  await this.cloudRef.current.threads.messages.feedback(
142
142
  remoteThreadId,
143
143
  cloudMessageId,
144
- { type },
144
+ { type, ...(comment ? { comment } : undefined) },
145
145
  );
146
146
  })().catch((error: unknown) => {
147
147
  console.error(
@@ -311,14 +311,27 @@ class AssistantCloudThreadHistoryAdapter implements ThreadHistoryAdapter {
311
311
  const remoteId = this.aui.threadListItem.getState().remoteId;
312
312
  if (!remoteId) return { messages: [] };
313
313
  const messages = await this._persistence.load(remoteId, "aui/v0");
314
- return {
315
- messages: messages
316
- .filter(
317
- (m): m is typeof m & { format: "aui/v0" } => m.format === "aui/v0",
318
- )
319
- .map(auiV0Decode)
320
- .reverse(),
321
- };
314
+ // The cloud lists rows newest first, so walking them oldest first puts a
315
+ // parent ahead of its children and a row orphaned by an unreadable parent
316
+ // can be dropped in the same pass; MessageRepository.import throws on a
317
+ // message whose parent is missing.
318
+ const rows = messages
319
+ .filter(
320
+ (m): m is typeof m & { format: "aui/v0" } => m.format === "aui/v0",
321
+ )
322
+ .reverse();
323
+
324
+ const loaded: ExportedMessageRepositoryItem[] = [];
325
+ const loadedIds = new Set<string>();
326
+ for (const row of rows) {
327
+ const item = auiV0DecodeSafely(row);
328
+ if (!item) continue;
329
+ if (item.parentId && !loadedIds.has(item.parentId)) continue;
330
+ loadedIds.add(item.message.id);
331
+ loaded.push(item);
332
+ }
333
+
334
+ return { messages: loaded };
322
335
  }
323
336
 
324
337
  private _reportRunTelemetry<T>(
@@ -134,10 +134,12 @@ describe("CloudFileAttachmentAdapter", () => {
134
134
  });
135
135
 
136
136
  it("does not finish an upload removed while requesting its URL", async () => {
137
- const presigned = deferred<{
138
- signedUrl: string;
139
- publicUrl: string;
140
- }>();
137
+ const presigned =
138
+ deferred<
139
+ Awaited<
140
+ ReturnType<AssistantCloud["files"]["generatePresignedUploadUrl"]>
141
+ >
142
+ >();
141
143
  const cloud = makeCloud();
142
144
  vi.mocked(cloud.files.generatePresignedUploadUrl).mockReturnValue(
143
145
  presigned.promise,
@@ -155,7 +157,9 @@ describe("CloudFileAttachmentAdapter", () => {
155
157
 
156
158
  await adapter.remove(running.value!);
157
159
  presigned.resolve({
160
+ success: true,
158
161
  signedUrl: "https://storage.example/upload",
162
+ expiresAt: "2026-09-16T00:00:00.000Z",
159
163
  publicUrl: "https://cdn.example/file.png",
160
164
  });
161
165
 
@@ -14,7 +14,14 @@ import {
14
14
  type ThreadMessageLike,
15
15
  } from "../../../runtime/utils/thread-message-like";
16
16
  import type { CloudMessage } from "assistant-cloud";
17
- import { isJSONValue } from "../../../utils/json/is-json";
17
+ import { isJSONValue, isRecord } from "../../../utils/json/is-json";
18
+ import {
19
+ MAX_STORED_MESSAGE_DEPTH,
20
+ isStoredAuiV0RolePart,
21
+ isStoredMessageRole,
22
+ parseStoredAttachment,
23
+ parseStoredDate,
24
+ } from "../../../runtime/utils/stored-message-parts";
18
25
  import type {
19
26
  ReadonlyJSONObject,
20
27
  ReadonlyJSONValue,
@@ -427,6 +434,119 @@ export function auiV0Encode(message: ThreadMessage): AuiV0Message {
427
434
  };
428
435
  }
429
436
 
437
+ const readableAuiV0Parts = (
438
+ role: AuiV0Message["role"],
439
+ content: readonly unknown[],
440
+ depth: number,
441
+ ): AuiV0MessagePart[] =>
442
+ content.flatMap((part) => {
443
+ if (!isStoredAuiV0RolePart(role, part)) return [];
444
+ if (part.type !== "tool-call" || part.messages === undefined)
445
+ return [part as unknown as AuiV0MessagePart];
446
+
447
+ const { messages, ...toolCall } = part;
448
+ if (!Array.isArray(messages) || depth >= MAX_STORED_MESSAGE_DEPTH)
449
+ return [toolCall as unknown as AuiV0MessagePart];
450
+ return [
451
+ {
452
+ ...toolCall,
453
+ messages: messages.flatMap((message) => {
454
+ const nested = readableAuiV0Message(message, depth + 1);
455
+ return nested ? [nested] : [];
456
+ }),
457
+ } as unknown as AuiV0MessagePart,
458
+ ];
459
+ });
460
+
461
+ const readableAuiV0Attachments = (
462
+ attachments: readonly unknown[],
463
+ ): AuiV0Attachment[] =>
464
+ attachments.flatMap((attachment) => {
465
+ const parsed = parseStoredAttachment(attachment, (value) =>
466
+ isStoredAuiV0RolePart("user", value),
467
+ );
468
+ return parsed ? [parsed as unknown as AuiV0Attachment] : [];
469
+ });
470
+
471
+ const readableAuiV0Message = (
472
+ value: unknown,
473
+ depth: number,
474
+ ): AuiV0Message | null => {
475
+ if (
476
+ !isRecord(value) ||
477
+ !isStoredMessageRole(value.role) ||
478
+ !Array.isArray(value.content)
479
+ ) {
480
+ return null;
481
+ }
482
+
483
+ const { role } = value;
484
+ const content = readableAuiV0Parts(role, value.content, depth);
485
+ // fromThreadMessageLike takes a system row only with exactly one text part,
486
+ // so one that no longer matches after filtering is dropped here rather than
487
+ // costing the row or the tool call that carries it.
488
+ if (role === "system" && content.length !== 1) return null;
489
+
490
+ const { attachments, createdAt, status, metadata, ...rest } = value;
491
+ // decodeAuiV0Message turns a nested createdAt into a Date without checking
492
+ // it, and encodeNestedMessage later calls toISOString on the result, so an
493
+ // unparseable one would reject the next write to the message that holds it.
494
+ // Dropping the field falls back to the parent's timestamp.
495
+ const storedCreatedAt = parseStoredDate(createdAt);
496
+ const readableMetadata =
497
+ role === "assistant" || !isRecord(metadata)
498
+ ? metadata
499
+ : { ...metadata, steps: undefined };
500
+
501
+ return {
502
+ ...rest,
503
+ ...(storedCreatedAt ? { createdAt } : undefined),
504
+ // fromThreadMessageLike throws on a status, a metadata.steps or an
505
+ // attachments list carried by a row whose role cannot hold one, and
506
+ // auiV0Encode only ever writes each onto the role that can, so dropping a
507
+ // misplaced field costs no valid data and saves the row.
508
+ ...(role === "assistant" && status !== undefined ? { status } : undefined),
509
+ ...(metadata !== undefined ? { metadata: readableMetadata } : undefined),
510
+ content,
511
+ ...(role === "user" && Array.isArray(attachments)
512
+ ? { attachments: readableAuiV0Attachments(attachments) }
513
+ : undefined),
514
+ } as unknown as AuiV0Message;
515
+ };
516
+
517
+ /**
518
+ * Decodes a stored row, dropping the parts, attachments and nested messages
519
+ * that cannot be read back instead of rejecting the row, and returning null
520
+ * when the row itself is unreadable. Loading a thread must not fail because a
521
+ * single stored row is malformed.
522
+ */
523
+ export function auiV0DecodeSafely(
524
+ cloudMessage: CloudMessage & { format: "aui/v0" },
525
+ ): ExportedMessageRepositoryItem | null {
526
+ try {
527
+ const payload = readableAuiV0Message(cloudMessage.content, 0);
528
+ if (!payload) throw new Error("stored row is not an aui/v0 message");
529
+
530
+ return {
531
+ parentId: cloudMessage.parent_id,
532
+ message: decodeAuiV0Message(
533
+ {
534
+ ...payload,
535
+ id: cloudMessage.id,
536
+ createdAt: cloudMessage.created_at,
537
+ },
538
+ cloudMessage.id,
539
+ ),
540
+ };
541
+ } catch (error) {
542
+ console.warn(
543
+ `aui/v0: dropping unreadable message ${cloudMessage.id}`,
544
+ error,
545
+ );
546
+ return null;
547
+ }
548
+ }
549
+
430
550
  export function auiV0Decode(
431
551
  cloudMessage: CloudMessage & { format: "aui/v0" },
432
552
  ): ExportedMessageRepositoryItem {