@assistant-ui/core 0.3.19 → 0.3.21

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 (934) hide show
  1. package/dist/adapters/attachment.d.ts +50 -43
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +52 -21
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/directive-formatter.d.ts +2 -5
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -1
  7. package/dist/adapters/feedback.d.ts +7 -8
  8. package/dist/adapters/feedback.d.ts.map +1 -1
  9. package/dist/adapters/index.d.ts +14 -9
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +1 -1
  12. package/dist/adapters/speech.d.ts +63 -65
  13. package/dist/adapters/speech.d.ts.map +1 -1
  14. package/dist/adapters/speech.js +16 -2
  15. package/dist/adapters/speech.js.map +1 -1
  16. package/dist/adapters/suggestion.d.ts +19 -22
  17. package/dist/adapters/suggestion.d.ts.map +1 -1
  18. package/dist/adapters/thread-history.d.ts +60 -58
  19. package/dist/adapters/thread-history.d.ts.map +1 -1
  20. package/dist/adapters/trigger.d.ts +8 -11
  21. package/dist/adapters/trigger.d.ts.map +1 -1
  22. package/dist/adapters/voice.d.ts +50 -45
  23. package/dist/adapters/voice.d.ts.map +1 -1
  24. package/dist/adapters/voice.js +17 -3
  25. package/dist/adapters/voice.js.map +1 -1
  26. package/dist/index.d.ts +70 -56
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +6 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/internal/duplicate-detection.d.ts +1 -4
  31. package/dist/internal/duplicate-detection.d.ts.map +1 -1
  32. package/dist/internal.d.ts +27 -58
  33. package/dist/internal.d.ts.map +1 -0
  34. package/dist/internal.js +8 -6
  35. package/dist/model-context/frame/host.d.ts +20 -23
  36. package/dist/model-context/frame/host.d.ts.map +1 -1
  37. package/dist/model-context/frame/host.js +3 -1
  38. package/dist/model-context/frame/host.js.map +1 -1
  39. package/dist/model-context/frame/provider.d.ts +28 -30
  40. package/dist/model-context/frame/provider.d.ts.map +1 -1
  41. package/dist/model-context/frame/provider.js +6 -0
  42. package/dist/model-context/frame/provider.js.map +1 -1
  43. package/dist/model-context/frame/types.d.ts +24 -27
  44. package/dist/model-context/frame/types.d.ts.map +1 -1
  45. package/dist/model-context/frame/validate.d.ts +3 -0
  46. package/dist/model-context/frame/validate.d.ts.map +1 -0
  47. package/dist/model-context/frame/validate.js +26 -0
  48. package/dist/model-context/frame/validate.js.map +1 -0
  49. package/dist/model-context/interactable-composer-metadata.d.ts +51 -39
  50. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  51. package/dist/model-context/interactable-composer-metadata.js +30 -6
  52. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  53. package/dist/model-context/registry-handles.d.ts +9 -12
  54. package/dist/model-context/registry-handles.d.ts.map +1 -1
  55. package/dist/model-context/registry.d.ts +15 -18
  56. package/dist/model-context/registry.d.ts.map +1 -1
  57. package/dist/model-context/tool-call-text.d.ts +15 -17
  58. package/dist/model-context/tool-call-text.d.ts.map +1 -1
  59. package/dist/model-context/tool.d.ts +12 -14
  60. package/dist/model-context/tool.d.ts.map +1 -1
  61. package/dist/model-context/types.d.ts +40 -43
  62. package/dist/model-context/types.d.ts.map +1 -1
  63. package/dist/react/AssistantProvider.d.ts +9 -12
  64. package/dist/react/AssistantProvider.d.ts.map +1 -1
  65. package/dist/react/AssistantRuntimeProvider.d.ts +23 -26
  66. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  67. package/dist/react/RuntimeAdapter.d.ts +4 -8
  68. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  69. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +28 -23
  70. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  71. package/dist/react/adapters/LocalStorageThreadListAdapter.js +77 -58
  72. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  73. package/dist/react/adapters/TitleGenerationAdapter.d.ts +4 -7
  74. package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
  75. package/dist/react/client/AdaptedRemoteThread.d.ts +6 -9
  76. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -1
  77. package/dist/react/client/DataRenderers.d.ts +2 -5
  78. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  79. package/dist/react/client/InMemoryThreadList.d.ts +9 -12
  80. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  81. package/dist/react/client/Interactables.d.ts +3 -6
  82. package/dist/react/client/Interactables.d.ts.map +1 -1
  83. package/dist/react/client/Interactables.js +306 -101
  84. package/dist/react/client/Interactables.js.map +1 -1
  85. package/dist/react/client/RemoteThreadList.d.ts +34 -37
  86. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  87. package/dist/react/client/RemoteThreadList.js +2 -1
  88. package/dist/react/client/RemoteThreadList.js.map +1 -1
  89. package/dist/react/client/Tools.d.ts +10 -12
  90. package/dist/react/client/Tools.d.ts.map +1 -1
  91. package/dist/react/client/Tools.js +4 -8
  92. package/dist/react/client/Tools.js.map +1 -1
  93. package/dist/react/client/interactable-model-context.d.ts +9 -11
  94. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  95. package/dist/react/client/interactable-model-context.js +32 -22
  96. package/dist/react/client/interactable-model-context.js.map +1 -1
  97. package/dist/react/index.d.ts +160 -122
  98. package/dist/react/index.d.ts.map +1 -0
  99. package/dist/react/index.js +5 -5
  100. package/dist/react/interactables-legacy/Interactables.d.ts +2 -5
  101. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  102. package/dist/react/interactables-legacy/Interactables.js +15 -8
  103. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  104. package/dist/react/interactables-legacy/interactable-model-context.d.ts +6 -9
  105. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
  106. package/dist/react/interactables-legacy/interactable-model-context.js +13 -14
  107. package/dist/react/interactables-legacy/interactable-model-context.js.map +1 -1
  108. package/dist/react/interactables-legacy/scopes.d.ts +42 -46
  109. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
  110. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +8 -11
  111. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  112. package/dist/react/interactables-legacy/useInteractableState.d.ts +7 -9
  113. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
  114. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +23 -14
  115. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  116. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +54 -25
  117. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  118. package/dist/react/model-context/define-mcp-toolkit.d.ts +15 -18
  119. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
  120. package/dist/react/model-context/define-toolkit.d.ts +13 -6
  121. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  122. package/dist/react/model-context/external-tool.d.ts +1 -4
  123. package/dist/react/model-context/external-tool.d.ts.map +1 -1
  124. package/dist/react/model-context/human-tool.d.ts +3 -6
  125. package/dist/react/model-context/human-tool.d.ts.map +1 -1
  126. package/dist/react/model-context/interactableTool.d.ts +26 -29
  127. package/dist/react/model-context/interactableTool.d.ts.map +1 -1
  128. package/dist/react/model-context/makeAssistantDataUI.d.ts +6 -9
  129. package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
  130. package/dist/react/model-context/makeAssistantTool.d.ts +6 -9
  131. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  132. package/dist/react/model-context/makeAssistantToolUI.d.ts +6 -9
  133. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  134. package/dist/react/model-context/provider-tool.d.ts +5 -7
  135. package/dist/react/model-context/provider-tool.d.ts.map +1 -1
  136. package/dist/react/model-context/stub-tool.d.ts +1 -4
  137. package/dist/react/model-context/stub-tool.d.ts.map +1 -1
  138. package/dist/react/model-context/toolbox.d.ts +44 -32
  139. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  140. package/dist/react/model-context/useAssistantContext.d.ts +3 -6
  141. package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
  142. package/dist/react/model-context/useAssistantDataUI.d.ts +7 -10
  143. package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
  144. package/dist/react/model-context/useAssistantInstructions.d.ts +3 -6
  145. package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
  146. package/dist/react/model-context/useAssistantTool.d.ts +9 -13
  147. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  148. package/dist/react/model-context/useAssistantToolUI.d.ts +13 -16
  149. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  150. package/dist/react/model-context/useAuiToolOverrides.d.ts +3 -5
  151. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
  152. package/dist/react/model-context/useInlineRender.d.ts +3 -6
  153. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  154. package/dist/react/model-context/useInteractable.d.ts +40 -40
  155. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  156. package/dist/react/model-context/useInteractableState.d.ts +10 -9
  157. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  158. package/dist/react/model-context/useInteractableVersions.d.ts +4 -7
  159. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
  160. package/dist/react/model-context/useToolArgsStatus.d.ts +7 -9
  161. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  162. package/dist/react/primitive-hooks/useActionBarCopy.d.ts +7 -10
  163. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  164. package/dist/react/primitive-hooks/useActionBarEdit.d.ts +3 -6
  165. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  166. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts +6 -9
  167. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
  168. package/dist/react/primitive-hooks/useActionBarReload.d.ts +3 -6
  169. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  170. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts +3 -6
  171. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
  172. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts +3 -6
  173. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
  174. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts +3 -6
  175. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  176. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts +3 -6
  177. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  178. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +4 -7
  179. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  180. package/dist/react/primitive-hooks/useComposerCancel.d.ts +3 -6
  181. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  182. package/dist/react/primitive-hooks/useComposerDictate.d.ts +3 -6
  183. package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
  184. package/dist/react/primitive-hooks/useComposerSend.d.ts +4 -7
  185. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  186. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts +2 -5
  187. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
  188. package/dist/react/primitive-hooks/useEditComposerSend.d.ts +3 -6
  189. package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
  190. package/dist/react/primitive-hooks/useMessageBranching.d.ts +5 -8
  191. package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
  192. package/dist/react/primitive-hooks/useMessageError.d.ts +1 -4
  193. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  194. package/dist/react/primitive-hooks/useMessageReload.d.ts +3 -6
  195. package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
  196. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +7 -10
  197. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  198. package/dist/react/primitive-hooks/useSuggestionTrigger.js +4 -4
  199. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  200. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +1 -4
  201. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  202. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +1 -4
  203. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  204. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts +2 -5
  205. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
  206. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts +2 -5
  207. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
  208. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts +2 -5
  209. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
  210. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts +2 -5
  211. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
  212. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts +3 -6
  213. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  214. package/dist/react/primitive-hooks/useThreadListNew.d.ts +2 -5
  215. package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
  216. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts +1 -4
  217. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
  218. package/dist/react/primitive-hooks/useThreadMessages.d.ts +2 -5
  219. package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
  220. package/dist/react/primitive-hooks/useVoice.d.ts +8 -11
  221. package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
  222. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +27 -29
  223. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  224. package/dist/react/primitives/composer/ComposerAttachments.d.ts +26 -28
  225. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  226. package/dist/react/primitives/composer/ComposerIf.d.ts +13 -13
  227. package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
  228. package/dist/react/primitives/composer/ComposerQueue.d.ts +13 -17
  229. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  230. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +30 -33
  231. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  232. package/dist/react/primitives/generativeUI/GenerativeUI.js +42 -33
  233. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  234. package/dist/react/primitives/message/MessageAttachments.d.ts +30 -28
  235. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  236. package/dist/react/primitives/message/MessageAttachments.js +14 -15
  237. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  238. package/dist/react/primitives/message/MessageGroupedParts.d.ts +122 -120
  239. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  240. package/dist/react/primitives/message/MessageGroupedParts.js +3 -3
  241. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  242. package/dist/react/primitives/message/MessageParts.d.ts +208 -194
  243. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  244. package/dist/react/primitives/message/MessageParts.js +124 -82
  245. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  246. package/dist/react/primitives/message/MessageQuote.d.ts +8 -11
  247. package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
  248. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +4 -7
  249. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  250. package/dist/react/primitives/part/PartMessages.d.ts +16 -19
  251. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  252. package/dist/react/primitives/thread/ThreadMessages.d.ts +61 -64
  253. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  254. package/dist/react/primitives/thread/ThreadSuggestions.d.ts +25 -27
  255. package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
  256. package/dist/react/primitives/thread/ThreadSuggestions.js +24 -5
  257. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  258. package/dist/react/primitives/threadList/ThreadListItems.d.ts +26 -28
  259. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  260. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +6 -9
  261. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
  262. package/dist/react/providers/AttachmentByIndexProvider.d.ts +5 -8
  263. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  264. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +4 -7
  265. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  266. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +3 -6
  267. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  268. package/dist/react/providers/MessageByIdProvider.d.ts +3 -6
  269. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
  270. package/dist/react/providers/MessageByIndexProvider.d.ts +3 -6
  271. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  272. package/dist/react/providers/PartByIndexProvider.d.ts +3 -6
  273. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  274. package/dist/react/providers/QueueItemByIndexProvider.d.ts +4 -7
  275. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  276. package/dist/react/providers/ReadonlyThreadProvider.d.ts +7 -10
  277. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  278. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  279. package/dist/react/providers/SuggestionByIndexProvider.d.ts +4 -7
  280. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  281. package/dist/react/providers/TextMessagePartProvider.d.ts +4 -7
  282. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  283. package/dist/react/providers/TextMessagePartProvider.js +5 -1
  284. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  285. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +4 -7
  286. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  287. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +4 -8
  288. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  289. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +210 -219
  290. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  291. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +70 -46
  292. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  293. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +186 -198
  294. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  295. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +13 -4
  296. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  297. package/dist/react/runtimes/RemoteThreadResource.d.ts +17 -23
  298. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  299. package/dist/react/runtimes/RemoteThreadResource.js +3 -1
  300. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  301. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +10 -11
  302. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  303. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +11 -14
  304. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -1
  305. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +6 -8
  306. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -1
  307. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +9 -2
  308. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -1
  309. package/dist/react/runtimes/assistant-transport/runManager.d.ts +9 -12
  310. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  311. package/dist/react/runtimes/assistant-transport/runManager.js +4 -1
  312. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  313. package/dist/react/runtimes/assistant-transport/types.d.ts +123 -118
  314. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -1
  315. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +7 -10
  316. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  317. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +17 -6
  318. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  319. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +3 -6
  320. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -1
  321. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +2 -5
  322. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -1
  323. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +7 -10
  324. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  325. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +426 -216
  326. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  327. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +15 -18
  328. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  329. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +8 -4
  330. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  331. package/dist/react/runtimes/cloud/auiV0.d.ts +146 -125
  332. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  333. package/dist/react/runtimes/cloud/auiV0.js +120 -8
  334. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  335. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +13 -15
  336. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  337. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +5 -7
  338. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -1
  339. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +2 -5
  340. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -1
  341. package/dist/react/runtimes/cloud/sdkIdentity.js +1 -1
  342. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +3 -6
  343. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  344. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +9 -11
  345. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  346. package/dist/react/runtimes/createMessageConverter.d.ts +15 -19
  347. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  348. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  349. package/dist/react/runtimes/createRuntimeExtras.d.ts +14 -17
  350. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
  351. package/dist/react/runtimes/external-message-converter.d.ts +17 -21
  352. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  353. package/dist/react/runtimes/external-store-history-copy.d.ts +25 -0
  354. package/dist/react/runtimes/external-store-history-copy.d.ts.map +1 -0
  355. package/dist/react/runtimes/external-store-history-copy.js +148 -0
  356. package/dist/react/runtimes/external-store-history-copy.js.map +1 -0
  357. package/dist/react/runtimes/useExternalStoreRuntime.d.ts +3 -6
  358. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  359. package/dist/react/runtimes/useExternalStoreRuntime.js +72 -35
  360. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  361. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +2 -5
  362. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
  363. package/dist/react/runtimes/useLocalRuntime.d.ts +29 -41
  364. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  365. package/dist/react/runtimes/useLocalRuntime.js +142 -34
  366. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  367. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +3 -6
  368. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  369. package/dist/react/runtimes/useRemoteThreadListRuntime.js +2 -2
  370. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  371. package/dist/react/runtimes/useRuntimeAdapters.d.ts +5 -7
  372. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -1
  373. package/dist/react/runtimes/useStreamingTiming.d.ts +4 -6
  374. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
  375. package/dist/react/types/MessagePartComponentTypes.d.ts +72 -70
  376. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  377. package/dist/react/types/scopes/dataRenderers.d.ts +11 -15
  378. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  379. package/dist/react/types/scopes/interactables.d.ts +60 -60
  380. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  381. package/dist/react/types/scopes/tools.d.ts +21 -24
  382. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  383. package/dist/react/types/store-augmentation.d.ts +10 -11
  384. package/dist/react/types/store-augmentation.d.ts.map +1 -1
  385. package/dist/react/utils/getMessageQuote.d.ts +6 -8
  386. package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
  387. package/dist/react/utils/groupParts.d.ts +35 -37
  388. package/dist/react/utils/groupParts.d.ts.map +1 -1
  389. package/dist/react/utils/useJSONEqual.d.ts +3 -6
  390. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  391. package/dist/react/utils/useJSONSchemaDependency.d.ts +3 -6
  392. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -1
  393. package/dist/runtime/api/assistant-runtime.d.ts +28 -31
  394. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  395. package/dist/runtime/api/attachment-runtime.d.ts +51 -49
  396. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  397. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  398. package/dist/runtime/api/bindings.d.ts +35 -35
  399. package/dist/runtime/api/bindings.d.ts.map +1 -1
  400. package/dist/runtime/api/composer-runtime.d.ts +215 -201
  401. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  402. package/dist/runtime/api/composer-runtime.js +4 -0
  403. package/dist/runtime/api/composer-runtime.js.map +1 -1
  404. package/dist/runtime/api/message-part-runtime.d.ts +31 -30
  405. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  406. package/dist/runtime/api/message-part-runtime.js +25 -2
  407. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  408. package/dist/runtime/api/message-runtime.d.ts +87 -82
  409. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  410. package/dist/runtime/api/message-runtime.js +4 -3
  411. package/dist/runtime/api/message-runtime.js.map +1 -1
  412. package/dist/runtime/api/paths.d.ts +54 -57
  413. package/dist/runtime/api/paths.d.ts.map +1 -1
  414. package/dist/runtime/api/thread-list-item-runtime.d.ts +70 -72
  415. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  416. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  417. package/dist/runtime/api/thread-list-runtime.d.ts +77 -81
  418. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  419. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  420. package/dist/runtime/api/thread-runtime.d.ts +306 -308
  421. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  422. package/dist/runtime/api/thread-runtime.js +2 -1
  423. package/dist/runtime/api/thread-runtime.js.map +1 -1
  424. package/dist/runtime/base/base-assistant-runtime-core.d.ts +9 -12
  425. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
  426. package/dist/runtime/base/base-composer-runtime-core.d.ts +150 -101
  427. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  428. package/dist/runtime/base/base-composer-runtime-core.js +400 -122
  429. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  430. package/dist/runtime/base/base-thread-runtime-core.d.ts +121 -104
  431. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  432. package/dist/runtime/base/base-thread-runtime-core.js +174 -62
  433. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  434. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +30 -31
  435. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  436. package/dist/runtime/base/default-edit-composer-runtime-core.js +21 -2
  437. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  438. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +28 -31
  439. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  440. package/dist/runtime/base/default-thread-composer-runtime-core.js +23 -2
  441. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  442. package/dist/runtime/branch/external-thread-branch-adapter.d.ts +15 -18
  443. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
  444. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +8 -11
  445. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
  446. package/dist/runtime/interfaces/composer-runtime-core.d.ts +98 -83
  447. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  448. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +67 -70
  449. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  450. package/dist/runtime/interfaces/thread-runtime-core.d.ts +225 -211
  451. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  452. package/dist/runtime/internal.d.ts +25 -20
  453. package/dist/runtime/internal.d.ts.map +1 -0
  454. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +37 -40
  455. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  456. package/dist/runtime/queue/message-queue.d.ts +32 -33
  457. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  458. package/dist/runtime/queue/message-queue.js +10 -2
  459. package/dist/runtime/queue/message-queue.js.map +1 -1
  460. package/dist/runtime/queue/queue-item.d.ts +7 -10
  461. package/dist/runtime/queue/queue-item.d.ts.map +1 -1
  462. package/dist/runtime/utils/abortable-thread-load.d.ts +9 -11
  463. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -1
  464. package/dist/runtime/utils/attachment-add-operations.d.ts +16 -15
  465. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -1
  466. package/dist/runtime/utils/attachment-add-operations.js +24 -2
  467. package/dist/runtime/utils/attachment-add-operations.js.map +1 -1
  468. package/dist/runtime/utils/attachment-send-operations.d.ts +12 -0
  469. package/dist/runtime/utils/attachment-send-operations.d.ts.map +1 -0
  470. package/dist/runtime/utils/attachment-send-operations.js +34 -0
  471. package/dist/runtime/utils/attachment-send-operations.js.map +1 -0
  472. package/dist/runtime/utils/auto-status.d.ts +11 -13
  473. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  474. package/dist/runtime/utils/auto-status.js +3 -5
  475. package/dist/runtime/utils/auto-status.js.map +1 -1
  476. package/dist/runtime/utils/chat-model-adapter.d.ts +31 -33
  477. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  478. package/dist/runtime/utils/external-message-conversion.d.ts +47 -48
  479. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  480. package/dist/runtime/utils/external-message-conversion.js +6 -5
  481. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  482. package/dist/runtime/utils/external-store-message.d.ts +6 -9
  483. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  484. package/dist/runtime/utils/message-repository-session.d.ts +24 -27
  485. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -1
  486. package/dist/runtime/utils/message-repository.d.ts +52 -54
  487. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  488. package/dist/runtime/utils/message-repository.js +8 -7
  489. package/dist/runtime/utils/message-repository.js.map +1 -1
  490. package/dist/runtime/utils/pending-tool-calls.d.ts +12 -14
  491. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -1
  492. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +7 -10
  493. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  494. package/dist/runtime/utils/runtime-extras-brand.d.ts +6 -9
  495. package/dist/runtime/utils/runtime-extras-brand.d.ts.map +1 -1
  496. package/dist/runtime/utils/stored-message-parts.d.ts +21 -0
  497. package/dist/runtime/utils/stored-message-parts.d.ts.map +1 -0
  498. package/dist/runtime/utils/stored-message-parts.js +103 -0
  499. package/dist/runtime/utils/stored-message-parts.js.map +1 -0
  500. package/dist/runtime/utils/streaming-timing.d.ts +23 -26
  501. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
  502. package/dist/runtime/utils/thread-message-like.d.ts +38 -34
  503. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  504. package/dist/runtime/utils/thread-message-like.js +16 -6
  505. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  506. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +5 -7
  507. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -1
  508. package/dist/runtime/utils/thread-runtime-lifecycle.js +31 -4
  509. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -1
  510. package/dist/runtime/utils/tool-call-tree.d.ts +10 -13
  511. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -1
  512. package/dist/runtime/utils/tool-interactions.d.ts +10 -0
  513. package/dist/runtime/utils/tool-interactions.d.ts.map +1 -0
  514. package/dist/runtime/utils/tool-interactions.js +92 -0
  515. package/dist/runtime/utils/tool-interactions.js.map +1 -0
  516. package/dist/runtimes/assistant-transport/utils.d.ts +1 -4
  517. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  518. package/dist/runtimes/external-store/external-store-adapter.d.ts +220 -200
  519. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  520. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +6 -8
  521. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  522. package/dist/runtimes/external-store/external-store-runtime-core.js +4 -1
  523. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  524. package/dist/runtimes/external-store/external-store-shared-options.d.ts +3 -6
  525. package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
  526. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +40 -43
  527. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  528. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +2 -2
  529. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  530. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +119 -125
  531. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  532. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +71 -18
  533. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  534. package/dist/runtimes/external-store/thread-message-converter.d.ts +5 -8
  535. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
  536. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +96 -98
  537. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  538. package/dist/runtimes/inert/InertThreadRuntimeCore.js +3 -0
  539. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  540. package/dist/runtimes/internal.d.ts +20 -16
  541. package/dist/runtimes/internal.d.ts.map +1 -0
  542. package/dist/runtimes/local/local-runtime-core.d.ts +7 -10
  543. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  544. package/dist/runtimes/local/local-runtime-options.d.ts +41 -44
  545. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  546. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +42 -45
  547. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  548. package/dist/runtimes/local/local-thread-runtime-core.d.ts +94 -93
  549. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  550. package/dist/runtimes/local/local-thread-runtime-core.js +220 -29
  551. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  552. package/dist/runtimes/local/should-continue.d.ts +2 -5
  553. package/dist/runtimes/local/should-continue.d.ts.map +1 -1
  554. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +77 -55
  555. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  556. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +28 -1
  557. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  558. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +12 -15
  559. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  560. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +3 -6
  561. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -1
  562. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +2 -5
  563. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  564. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +34 -31
  565. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  566. package/dist/runtimes/remote-thread-list/optimistic-state.js +8 -3
  567. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  568. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +60 -63
  569. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  570. package/dist/runtimes/remote-thread-list/remote-thread-state.js +1 -1
  571. package/dist/runtimes/remote-thread-list/title-generation.d.ts +31 -33
  572. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -1
  573. package/dist/runtimes/remote-thread-list/title.d.ts +5 -8
  574. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  575. package/dist/runtimes/remote-thread-list/types.d.ts +119 -121
  576. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  577. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +147 -149
  578. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  579. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +22 -7
  580. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  581. package/dist/store/clients/chain-of-thought-client.d.ts +8 -11
  582. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  583. package/dist/store/clients/external-thread.d.ts +56 -58
  584. package/dist/store/clients/external-thread.d.ts.map +1 -1
  585. package/dist/store/clients/external-thread.js +1270 -741
  586. package/dist/store/clients/external-thread.js.map +1 -1
  587. package/dist/store/clients/model-context-client.d.ts +2 -5
  588. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  589. package/dist/store/clients/no-op-composer-client.d.ts +3 -6
  590. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  591. package/dist/store/clients/no-op-composer-client.js +3 -1
  592. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  593. package/dist/store/clients/runtime-adapter.d.ts +2 -5
  594. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  595. package/dist/store/clients/single-thread-list.d.ts +4 -6
  596. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  597. package/dist/store/clients/submission-message.d.ts +8 -0
  598. package/dist/store/clients/submission-message.d.ts.map +1 -0
  599. package/dist/store/clients/submission-message.js +22 -0
  600. package/dist/store/clients/submission-message.js.map +1 -0
  601. package/dist/store/clients/suggestions.d.ts +8 -11
  602. package/dist/store/clients/suggestions.d.ts.map +1 -1
  603. package/dist/store/clients/thread-message-client.d.ts +12 -12
  604. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  605. package/dist/store/clients/thread-message-client.js +81 -82
  606. package/dist/store/clients/thread-message-client.js.map +1 -1
  607. package/dist/store/clients/thread-selection-events.d.ts +1 -4
  608. package/dist/store/clients/thread-selection-events.d.ts.map +1 -1
  609. package/dist/store/clients/thread-tasks.d.ts +7 -10
  610. package/dist/store/clients/thread-tasks.d.ts.map +1 -1
  611. package/dist/store/env.d.ts +1 -4
  612. package/dist/store/env.d.ts.map +1 -1
  613. package/dist/store/index.d.ts +33 -36
  614. package/dist/store/index.d.ts.map +1 -0
  615. package/dist/store/index.js +5 -5
  616. package/dist/store/internal.d.ts +12 -12
  617. package/dist/store/internal.d.ts.map +1 -0
  618. package/dist/store/internal.js +2 -2
  619. package/dist/store/primitive-predicates.d.ts +14 -16
  620. package/dist/store/primitive-predicates.d.ts.map +1 -1
  621. package/dist/store/primitive-predicates.js +10 -5
  622. package/dist/store/primitive-predicates.js.map +1 -1
  623. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +4 -7
  624. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  625. package/dist/store/runtime-clients/composer-runtime-client.d.ts +11 -14
  626. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  627. package/dist/store/runtime-clients/composer-runtime-client.js +65 -62
  628. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  629. package/dist/store/runtime-clients/handle-runtime-action.d.ts +1 -4
  630. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  631. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +1 -4
  632. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -1
  633. package/dist/store/runtime-clients/liveRef.d.ts +2 -5
  634. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
  635. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +4 -7
  636. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  637. package/dist/store/runtime-clients/message-part-runtime-client.js +26 -16
  638. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  639. package/dist/store/runtime-clients/message-runtime-client.d.ts +10 -11
  640. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  641. package/dist/store/runtime-clients/message-runtime-client.js +121 -113
  642. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  643. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +5 -8
  644. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  645. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +6 -9
  646. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  647. package/dist/store/runtime-clients/thread-runtime-client.d.ts +4 -7
  648. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  649. package/dist/store/runtime-clients/thread-runtime-client.js +221 -158
  650. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  651. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -6
  652. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  653. package/dist/store/scope-registration.d.ts +28 -29
  654. package/dist/store/scope-registration.d.ts.map +1 -1
  655. package/dist/store/scopes/attachment.d.ts +19 -22
  656. package/dist/store/scopes/attachment.d.ts.map +1 -1
  657. package/dist/store/scopes/chain-of-thought.d.ts +33 -35
  658. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
  659. package/dist/store/scopes/composer.d.ts +147 -135
  660. package/dist/store/scopes/composer.d.ts.map +1 -1
  661. package/dist/store/scopes/message.d.ts +119 -112
  662. package/dist/store/scopes/message.d.ts.map +1 -1
  663. package/dist/store/scopes/model-context.d.ts +10 -13
  664. package/dist/store/scopes/model-context.d.ts.map +1 -1
  665. package/dist/store/scopes/part.d.ts +53 -50
  666. package/dist/store/scopes/part.d.ts.map +1 -1
  667. package/dist/store/scopes/queue-item.d.ts +21 -23
  668. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  669. package/dist/store/scopes/suggestion.d.ts +14 -17
  670. package/dist/store/scopes/suggestion.d.ts.map +1 -1
  671. package/dist/store/scopes/suggestions.d.ts +18 -21
  672. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  673. package/dist/store/scopes/task.d.ts +27 -30
  674. package/dist/store/scopes/task.d.ts.map +1 -1
  675. package/dist/store/scopes/thread-list-item.d.ts +68 -71
  676. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  677. package/dist/store/scopes/thread.d.ts +197 -200
  678. package/dist/store/scopes/thread.d.ts.map +1 -1
  679. package/dist/store/scopes/threads.d.ts +49 -52
  680. package/dist/store/scopes/threads.d.ts.map +1 -1
  681. package/dist/subscribable/subscribable.d.ts +73 -69
  682. package/dist/subscribable/subscribable.d.ts.map +1 -1
  683. package/dist/subscribable/subscribable.js +35 -7
  684. package/dist/subscribable/subscribable.js.map +1 -1
  685. package/dist/types/attachment.d.ts +35 -37
  686. package/dist/types/attachment.d.ts.map +1 -1
  687. package/dist/types/augmentations.d.ts +7 -8
  688. package/dist/types/augmentations.d.ts.map +1 -1
  689. package/dist/types/directive.d.ts +13 -16
  690. package/dist/types/directive.d.ts.map +1 -1
  691. package/dist/types/error.d.ts +15 -17
  692. package/dist/types/error.d.ts.map +1 -1
  693. package/dist/types/index.d.ts +7 -7
  694. package/dist/types/index.d.ts.map +1 -0
  695. package/dist/types/message.d.ts +358 -318
  696. package/dist/types/message.d.ts.map +1 -1
  697. package/dist/types/message.js.map +1 -1
  698. package/dist/types/quote.d.ts +3 -6
  699. package/dist/types/quote.d.ts.map +1 -1
  700. package/dist/types/trigger.d.ts +10 -13
  701. package/dist/types/trigger.d.ts.map +1 -1
  702. package/dist/types/unsubscribe.d.ts +1 -4
  703. package/dist/types/unsubscribe.d.ts.map +1 -1
  704. package/dist/utils/abortable-iterable.d.ts +2 -5
  705. package/dist/utils/abortable-iterable.d.ts.map +1 -1
  706. package/dist/utils/composite-context-provider.d.ts +9 -13
  707. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  708. package/dist/utils/data-url.d.ts +16 -19
  709. package/dist/utils/data-url.d.ts.map +1 -1
  710. package/dist/utils/getGroupStatus.d.ts +19 -21
  711. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  712. package/dist/utils/id.d.ts +3 -6
  713. package/dist/utils/id.d.ts.map +1 -1
  714. package/dist/utils/image-media-type.d.ts +1 -4
  715. package/dist/utils/image-media-type.d.ts.map +1 -1
  716. package/dist/utils/invoke-user-callback.d.ts +1 -4
  717. package/dist/utils/invoke-user-callback.d.ts.map +1 -1
  718. package/dist/utils/json/is-json-equal.d.ts +1 -4
  719. package/dist/utils/json/is-json-equal.d.ts.map +1 -1
  720. package/dist/utils/json/is-json.d.ts +5 -8
  721. package/dist/utils/json/is-json.d.ts.map +1 -1
  722. package/dist/utils/json/stable-stringify-tool-args.d.ts +3 -6
  723. package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -1
  724. package/dist/utils/normalizePartStatus.d.ts +6 -8
  725. package/dist/utils/normalizePartStatus.d.ts.map +1 -1
  726. package/dist/utils/normalizePartStatus.js +3 -2
  727. package/dist/utils/normalizePartStatus.js.map +1 -1
  728. package/dist/utils/notify-event-listeners.d.ts +2 -4
  729. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  730. package/dist/utils/record.d.ts +1 -4
  731. package/dist/utils/record.d.ts.map +1 -1
  732. package/dist/utils/silent-runtime-action.d.ts +2 -5
  733. package/dist/utils/silent-runtime-action.d.ts.map +1 -1
  734. package/dist/utils/text.d.ts +2 -5
  735. package/dist/utils/text.d.ts.map +1 -1
  736. package/dist/utils/wire-media.d.ts +3 -6
  737. package/dist/utils/wire-media.d.ts.map +1 -1
  738. package/package.json +15 -13
  739. package/src/adapters/attachment.test.ts +98 -1
  740. package/src/adapters/attachment.ts +77 -20
  741. package/src/adapters/feedback.ts +1 -0
  742. package/src/adapters/speech.test.ts +94 -0
  743. package/src/adapters/speech.ts +16 -2
  744. package/src/adapters/thread-history.ts +16 -5
  745. package/src/adapters/voice.test.ts +169 -0
  746. package/src/adapters/voice.ts +25 -4
  747. package/src/index.ts +14 -2
  748. package/src/internal.ts +7 -0
  749. package/src/model-context/frame/host.test.ts +51 -1
  750. package/src/model-context/frame/host.ts +3 -1
  751. package/src/model-context/frame/provider.test.ts +106 -20
  752. package/src/model-context/frame/provider.ts +8 -1
  753. package/src/model-context/frame/validate.ts +57 -0
  754. package/src/model-context/interactable-composer-metadata.test.ts +82 -0
  755. package/src/model-context/interactable-composer-metadata.ts +45 -2
  756. package/src/react/RuntimeAdapter.test.ts +4 -1
  757. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +711 -0
  758. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +125 -109
  759. package/src/react/client/Interactables.test.ts +865 -8
  760. package/src/react/client/Interactables.ts +325 -45
  761. package/src/react/client/RemoteThreadList.concurrent.test.tsx +9 -3
  762. package/src/react/client/RemoteThreadList.initialize-failure.test.ts +124 -0
  763. package/src/react/client/RemoteThreadList.test.ts +5 -6
  764. package/src/react/client/RemoteThreadList.ts +6 -0
  765. package/src/react/client/Tools.ts +2 -3
  766. package/src/react/client/interactable-model-context.test.ts +56 -13
  767. package/src/react/client/interactable-model-context.ts +48 -23
  768. package/src/react/index.ts +2 -2
  769. package/src/react/interactables-legacy/Interactables.test.ts +221 -4
  770. package/src/react/interactables-legacy/Interactables.ts +25 -14
  771. package/src/react/interactables-legacy/interactable-model-context.ts +26 -24
  772. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +40 -22
  773. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +22 -2
  774. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +63 -11
  775. package/src/react/model-context/useInteractable.test.tsx +56 -29
  776. package/src/react/primitive-hooks/useActionBarCopy.test.ts +5 -5
  777. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +33 -0
  778. package/src/react/primitive-hooks/useSuggestionTrigger.ts +7 -4
  779. package/src/react/primitives/generativeUI/GenerativeUI.test.tsx +170 -0
  780. package/src/react/primitives/generativeUI/GenerativeUI.tsx +43 -28
  781. package/src/react/primitives/message/MessageAttachments.test.tsx +2 -6
  782. package/src/react/primitives/message/MessageAttachments.tsx +14 -8
  783. package/src/react/primitives/message/MessageGroupedParts.test.tsx +155 -8
  784. package/src/react/primitives/message/MessageGroupedParts.tsx +19 -6
  785. package/src/react/primitives/message/MessageParts.test.tsx +84 -0
  786. package/src/react/primitives/message/MessageParts.tool-interaction.test.tsx +69 -0
  787. package/src/react/primitives/message/MessageParts.tsx +29 -8
  788. package/src/react/primitives/thread/ThreadMessages.test.tsx +25 -7
  789. package/src/react/primitives/thread/ThreadSuggestions.test.tsx +97 -0
  790. package/src/react/primitives/thread/ThreadSuggestions.tsx +29 -6
  791. package/src/react/providers/ReadonlyThreadProvider.tsx +2 -2
  792. package/src/react/providers/TextMessagePartProvider.tsx +3 -0
  793. package/src/react/runtimes/RemoteThreadListHookInstanceManager.layout.test.tsx +62 -0
  794. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +2 -2
  795. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +93 -0
  796. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +181 -21
  797. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +62 -17
  798. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +112 -77
  799. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +19 -3
  800. package/src/react/runtimes/RemoteThreadResource.ts +5 -2
  801. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +3 -1
  802. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +10 -2
  803. package/src/react/runtimes/assistant-transport/runManager.ts +3 -0
  804. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +57 -0
  805. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +73 -46
  806. package/src/react/runtimes/assistant-transport/transport-thread-id.test.tsx +571 -0
  807. package/src/react/runtimes/assistant-transport/types.ts +9 -1
  808. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +10 -0
  809. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +108 -1
  810. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +33 -9
  811. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.copy.integration.test.tsx +289 -0
  812. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.copy.test.tsx +471 -0
  813. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.engagement.test.tsx +330 -0
  814. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +78 -2
  815. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +463 -2
  816. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +595 -227
  817. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +33 -4
  818. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +7 -3
  819. package/src/react/runtimes/cloud/auiV0.ts +275 -6
  820. package/src/react/runtimes/cloud/auiV0DecodeSafely.test.ts +873 -0
  821. package/src/react/runtimes/createMessageConverter.ts +9 -3
  822. package/src/react/runtimes/external-message-converter.test.ts +7 -3
  823. package/src/react/runtimes/external-store-history-copy.ts +223 -0
  824. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +2 -1
  825. package/src/react/runtimes/useExternalStoreRuntime.history-copy.test.tsx +483 -0
  826. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +84 -3
  827. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +6 -2
  828. package/src/react/runtimes/useExternalStoreRuntime.ts +25 -5
  829. package/src/react/runtimes/useLocalRuntime.test.tsx +145 -1
  830. package/src/react/runtimes/useLocalRuntime.ts +8 -5
  831. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +84 -4
  832. package/src/react/runtimes/useRemoteThreadListRuntime.ts +5 -1
  833. package/src/react/types/MessagePartComponentTypes.ts +10 -0
  834. package/src/react/types/scopes/interactables.ts +3 -0
  835. package/src/runtime/api/attachment-runtime.ts +10 -5
  836. package/src/runtime/api/bindings.ts +6 -1
  837. package/src/runtime/api/composer-runtime.ts +29 -6
  838. package/src/runtime/api/message-part-runtime.test.ts +215 -0
  839. package/src/runtime/api/message-part-runtime.ts +44 -1
  840. package/src/runtime/api/message-runtime.test.ts +112 -2
  841. package/src/runtime/api/message-runtime.ts +25 -7
  842. package/src/runtime/api/thread-list-item-runtime.ts +5 -5
  843. package/src/runtime/api/thread-list-runtime.ts +3 -3
  844. package/src/runtime/api/thread-runtime.test.ts +59 -0
  845. package/src/runtime/api/thread-runtime.ts +21 -11
  846. package/src/runtime/base/base-composer-runtime-core.ts +548 -153
  847. package/src/runtime/base/base-thread-runtime-core.test.ts +1614 -136
  848. package/src/runtime/base/base-thread-runtime-core.ts +236 -46
  849. package/src/runtime/base/default-edit-composer-runtime-core.ts +24 -2
  850. package/src/runtime/base/default-thread-composer-runtime-core.ts +33 -3
  851. package/src/runtime/interfaces/composer-runtime-core.ts +19 -0
  852. package/src/runtime/interfaces/thread-runtime-core.ts +24 -1
  853. package/src/runtime/queue/message-queue.ts +11 -1
  854. package/src/runtime/utils/attachment-add-operations.ts +45 -2
  855. package/src/runtime/utils/attachment-send-operations.ts +54 -0
  856. package/src/runtime/utils/auto-status.test.ts +54 -0
  857. package/src/runtime/utils/auto-status.ts +3 -10
  858. package/src/runtime/utils/external-message-conversion.test.ts +91 -0
  859. package/src/runtime/utils/external-message-conversion.ts +9 -6
  860. package/src/runtime/utils/message-repository.test.ts +69 -1
  861. package/src/runtime/utils/message-repository.ts +14 -7
  862. package/src/runtime/utils/stored-message-parts.ts +216 -0
  863. package/src/runtime/utils/thread-message-like.test.ts +58 -0
  864. package/src/runtime/utils/thread-message-like.ts +79 -48
  865. package/src/runtime/utils/thread-runtime-lifecycle.test.ts +67 -0
  866. package/src/runtime/utils/thread-runtime-lifecycle.ts +42 -8
  867. package/src/runtime/utils/tool-interactions.test.ts +193 -0
  868. package/src/runtime/utils/tool-interactions.ts +147 -0
  869. package/src/runtimes/external-store/external-store-adapter.ts +25 -0
  870. package/src/runtimes/external-store/external-store-runtime-core.ts +10 -2
  871. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +2 -2
  872. package/src/runtimes/external-store/external-store-thread-runtime-core.test.ts +49 -0
  873. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +114 -32
  874. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +127 -56
  875. package/src/runtimes/inert/InertThreadRuntimeCore.ts +10 -1
  876. package/src/runtimes/local/local-thread-runtime-core.edit-cancellation.test.ts +70 -0
  877. package/src/runtimes/local/local-thread-runtime-core.test.ts +1866 -169
  878. package/src/runtimes/local/local-thread-runtime-core.ts +365 -40
  879. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +53 -1
  880. package/src/runtimes/remote-thread-list/optimistic-state.ts +8 -3
  881. package/src/runtimes/tool-invocations/EDGE_CASES.md +19 -4
  882. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +392 -39
  883. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +31 -8
  884. package/src/store/clients/external-thread.test.ts +145 -0
  885. package/src/store/clients/external-thread.ts +669 -144
  886. package/src/store/clients/model-context-client.test.ts +8 -8
  887. package/src/store/clients/no-op-composer-client.ts +2 -0
  888. package/src/store/clients/submission-message.ts +27 -0
  889. package/src/store/clients/thread-message-client.test.ts +39 -0
  890. package/src/store/clients/thread-message-client.ts +13 -6
  891. package/src/store/index.ts +2 -2
  892. package/src/store/internal.ts +1 -0
  893. package/src/store/primitive-predicates.test.ts +119 -0
  894. package/src/store/primitive-predicates.ts +19 -4
  895. package/src/store/runtime-clients/composer-runtime-client.ts +4 -3
  896. package/src/store/runtime-clients/message-part-runtime-client.test.ts +42 -0
  897. package/src/store/runtime-clients/message-part-runtime-client.ts +4 -0
  898. package/src/store/runtime-clients/message-runtime-client.ts +5 -0
  899. package/src/store/runtime-clients/thread-runtime-client.test.tsx +243 -0
  900. package/src/store/runtime-clients/thread-runtime-client.ts +46 -9
  901. package/src/store/scopes/composer.ts +22 -4
  902. package/src/store/scopes/message.ts +12 -1
  903. package/src/store/scopes/part.ts +8 -0
  904. package/src/subscribable/subscribable.test.ts +205 -3
  905. package/src/subscribable/subscribable.ts +49 -7
  906. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +95 -1
  907. package/src/tests/attachment-adapters.test.ts +16 -1
  908. package/src/tests/auiV0Encode.test.ts +412 -1
  909. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +6 -6
  910. package/src/tests/base-composer-runtime-core-send.test.ts +722 -29
  911. package/src/tests/base-composer-runtime-core.test.ts +212 -5
  912. package/src/tests/composer-can-cancel.test.ts +35 -6
  913. package/src/tests/composer-can-send.test.ts +120 -1
  914. package/src/tests/composer-submission.test.tsx +796 -0
  915. package/src/tests/default-edit-composer-runtime-core.test.ts +149 -2
  916. package/src/tests/external-store-thread-list-runtime-core.test.ts +111 -0
  917. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +810 -28
  918. package/src/tests/external-store-thread-runtime-core.test.ts +217 -0
  919. package/src/tests/external-thread-attachments.test.tsx +763 -26
  920. package/src/tests/external-thread-feedback.test.tsx +20 -7
  921. package/src/tests/external-thread-isLast.test.tsx +69 -0
  922. package/src/tests/external-thread-parity.test.tsx +1 -1
  923. package/src/tests/get-thread-state-isRunning.test.ts +2 -2
  924. package/src/tests/message-queue.test.ts +45 -10
  925. package/src/tests/remote-thread-list-adapter-switch.test.ts +45 -1
  926. package/src/tests/thread-switch-events.test.tsx +11 -7
  927. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +2 -1
  928. package/src/types/message.test.ts +19 -0
  929. package/src/types/message.ts +65 -10
  930. package/src/utils/normalizePartStatus.ts +14 -1
  931. package/dist/tests/remote-thread-list-test-helpers.d.ts +0 -16
  932. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +0 -1
  933. package/dist/tests/remote-thread-list-test-helpers.js +0 -59
  934. package/dist/tests/remote-thread-list-test-helpers.js.map +0 -1
@@ -1,5 +1,8 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { useState } from "react";
2
3
  import { createTapRoot, flushTapSync, useResource } from "@assistant-ui/tap";
4
+ import { parsePartialJsonObject } from "assistant-stream/utils";
5
+ import { z } from "zod";
3
6
  import type {
4
7
  Unstable_InteractablePersistedState,
5
8
  Unstable_InteractablePersistenceAdapter,
@@ -140,6 +143,36 @@ const mount = (config?: {
140
143
  return root;
141
144
  };
142
145
 
146
+ const mountOnSubscribe = () => {
147
+ clientHolder.client = makeClient();
148
+ return createTapRoot(
149
+ function InteractablesRoot() {
150
+ return useResource(Interactables());
151
+ },
152
+ { mountOnSubscribe: true },
153
+ );
154
+ };
155
+
156
+ const mountWithMutablePersistence = (
157
+ initial: Unstable_InteractablePersistenceAdapter | undefined,
158
+ ) => {
159
+ clientHolder.client = makeClient();
160
+ let updatePersistence!: (
161
+ next: Unstable_InteractablePersistenceAdapter | undefined,
162
+ ) => void;
163
+ const root = createTapRoot(function InteractablesRoot() {
164
+ const [persistence, setPersistence] = useState(initial);
165
+ updatePersistence = setPersistence;
166
+ return useResource(Interactables(persistence ? { persistence } : {}));
167
+ });
168
+ return {
169
+ root,
170
+ setPersistence(next: Unstable_InteractablePersistenceAdapter | undefined) {
171
+ flushTapSync(() => updatePersistence(next));
172
+ },
173
+ };
174
+ };
175
+
143
176
  const reg = (
144
177
  id: string,
145
178
  overrides: Partial<Unstable_InteractableRegistration> = {},
@@ -147,7 +180,10 @@ const reg = (
147
180
  id,
148
181
  name: "note",
149
182
  description: "a note",
150
- stateSchema: { type: "object", properties: {} } as never,
183
+ stateSchema: {
184
+ type: "object",
185
+ properties: {},
186
+ } satisfies Unstable_InteractableRegistration["stateSchema"],
151
187
  initialState: { v: 0 },
152
188
  ...overrides,
153
189
  });
@@ -326,15 +362,157 @@ describe("Interactables registration", () => {
326
362
  expect(stateOf(root, "n1")).toBeUndefined();
327
363
  });
328
364
 
365
+ it("relaxes only the root requirement of the update tool", async () => {
366
+ const stateSchema = z.object({
367
+ title: z.string(),
368
+ settings: z.object({ name: z.string(), size: z.number() }),
369
+ nullable: z.object({ label: z.string(), count: z.number() }).nullable(),
370
+ union: z.discriminatedUnion("kind", [
371
+ z.object({ kind: z.literal("a"), value: z.string() }),
372
+ z.object({ kind: z.literal("b"), amount: z.number() }),
373
+ ]),
374
+ });
375
+ root = mount();
376
+ root.getValue().register(
377
+ reg("n1", {
378
+ stateSchema,
379
+ initialState: {
380
+ title: "old",
381
+ settings: { name: "n", size: 1 },
382
+ nullable: null,
383
+ union: { kind: "a", value: "old" },
384
+ },
385
+ }),
386
+ );
387
+ await flushMicrotasks();
388
+
389
+ const tool = registeredModelContextProvider?.getModelContext?.().tools
390
+ ?.update_note as
391
+ | {
392
+ parameters: {
393
+ required?: string[];
394
+ properties: {
395
+ settings: { required?: string[] };
396
+ nullable: { anyOf: Array<{ required?: string[] }> };
397
+ union: { oneOf: Array<{ required?: string[] }> };
398
+ };
399
+ };
400
+ execute(
401
+ args: Record<string, unknown>,
402
+ context: { toolCallId: string },
403
+ ): Promise<unknown>;
404
+ }
405
+ | undefined;
406
+ expect(tool).toBeDefined();
407
+ const { parameters } = tool!;
408
+ expect("~standard" in parameters).toBe(false);
409
+ expect(parameters.required).toEqual(["id"]);
410
+ expect(parameters.properties.settings.required).toEqual(["name", "size"]);
411
+ expect(parameters.properties.nullable.anyOf[0]?.required).toEqual([
412
+ "label",
413
+ "count",
414
+ ]);
415
+ expect(
416
+ parameters.properties.union.oneOf.map((branch) => branch.required),
417
+ ).toEqual([
418
+ ["kind", "value"],
419
+ ["kind", "amount"],
420
+ ]);
421
+
422
+ await tool!.execute(
423
+ { id: "n1", settings: { name: "new", size: 2 } },
424
+ { toolCallId: "call-1" },
425
+ );
426
+ await tool!.execute(
427
+ { id: "n1", union: { kind: "b", amount: 3 } },
428
+ { toolCallId: "call-2" },
429
+ );
430
+ expect(stateSchema.parse(stateOf(root, "n1"))).toEqual({
431
+ title: "old",
432
+ settings: { name: "new", size: 2 },
433
+ nullable: null,
434
+ union: { kind: "b", amount: 3 },
435
+ });
436
+ });
437
+
438
+ it("keeps a streaming nested object parseable at every token", async () => {
439
+ const stateSchema = z.object({
440
+ title: z.string(),
441
+ settings: z.object({ name: z.string(), size: z.number() }),
442
+ });
443
+ root = mount();
444
+ root.getValue().register(
445
+ reg("n1", {
446
+ stateSchema,
447
+ initialState: { title: "old", settings: { name: "n", size: 1 } },
448
+ }),
449
+ );
450
+ await flushMicrotasks();
451
+
452
+ const tool = registeredModelContextProvider?.getModelContext?.().tools
453
+ ?.update_note as
454
+ | {
455
+ streamCall(
456
+ reader: { args: { streamValues(): AsyncIterable<unknown> } },
457
+ context: { toolCallId: string },
458
+ ): Promise<unknown>;
459
+ execute(
460
+ args: Record<string, unknown>,
461
+ context: { toolCallId: string },
462
+ ): Promise<unknown>;
463
+ }
464
+ | undefined;
465
+ expect(tool).toBeDefined();
466
+
467
+ const text = '{"id":"n1","settings":{"name":"medium","size":2}}';
468
+ const ticks: { prefix: string; state: unknown }[] = [];
469
+ await tool!.streamCall(
470
+ {
471
+ args: {
472
+ async *streamValues() {
473
+ for (let end = 1; end <= text.length; end++) {
474
+ const parsed = parsePartialJsonObject(text.slice(0, end));
475
+ if (!parsed) continue;
476
+ yield parsed;
477
+ ticks.push({
478
+ prefix: text.slice(0, end),
479
+ state: stateOf(root!, "n1"),
480
+ });
481
+ }
482
+ },
483
+ },
484
+ },
485
+ { toolCallId: "call-1" },
486
+ );
487
+ for (const { prefix, state } of ticks) {
488
+ expect(stateSchema.safeParse(state).success, prefix).toBe(true);
489
+ }
490
+ const distinct = ticks
491
+ .map(({ state }) => JSON.stringify(state))
492
+ .filter((state, index, all) => state !== all[index - 1])
493
+ .map((state) => JSON.parse(state));
494
+ expect(distinct).toEqual(
495
+ ["n", "", "m", "me", "med", "medi", "mediu", "medium"]
496
+ .map((name) => ({ title: "old", settings: { name, size: 1 } }))
497
+ .concat({ title: "old", settings: { name: "medium", size: 2 } }),
498
+ );
499
+
500
+ await tool!.execute(JSON.parse(text), { toolCallId: "call-1" });
501
+ expect(stateSchema.parse(stateOf(root, "n1"))).toEqual({
502
+ title: "old",
503
+ settings: { name: "medium", size: 2 },
504
+ });
505
+ });
506
+
329
507
  it("refreshes cached tool parameters while another anchor remains", async () => {
330
508
  const schemaA = {
331
- type: "object" as const,
509
+ type: "object",
332
510
  properties: { first: { type: "string" } },
333
- };
511
+ } satisfies Unstable_InteractableRegistration["stateSchema"];
334
512
  const schemaB = {
335
- type: "object" as const,
513
+ type: "object",
336
514
  properties: { second: { type: "number" } },
337
- };
515
+ } satisfies Unstable_InteractableRegistration["stateSchema"];
338
516
  root = mount({ threadMessages: [createCall("n1")] });
339
517
  const first = root.getValue().register(reg("n1", { stateSchema: schemaA }));
340
518
  const second = root
@@ -516,7 +694,9 @@ describe("Interactables persistence save", () => {
516
694
 
517
695
  it("keeps edits queued during an in-flight flush with the outgoing adapter", async () => {
518
696
  const saveResolvers: Array<() => void> = [];
519
- const firstSave = vi.fn(
697
+ const firstSave = vi.fn<
698
+ (state: Unstable_InteractablePersistedState) => Promise<void>
699
+ >(
520
700
  () =>
521
701
  new Promise<void>((resolve) => {
522
702
  saveResolvers.push(resolve);
@@ -547,7 +727,7 @@ describe("Interactables persistence save", () => {
547
727
  await flushMicrotasks();
548
728
  expect(flushed).toBe(false);
549
729
  expect(firstSave).toHaveBeenCalledTimes(2);
550
- expect(firstSave.mock.calls[1]![0]).toEqual({
730
+ expect(firstSave.mock.calls[1]?.[0]).toEqual({
551
731
  n1: { name: "note", state: { v: 2 } },
552
732
  });
553
733
  expect(secondSave).not.toHaveBeenCalled();
@@ -643,7 +823,7 @@ describe("Interactables persistence save", () => {
643
823
  root.getValue().setPersistenceAdapter({ save: vi.fn() });
644
824
  await flushMicrotasks();
645
825
 
646
- expect(root.getValue().getState().persistence["n1"]?.isPending).toBe(true);
826
+ expect(root.getValue().getState().persistence["n1"]).toBeUndefined();
647
827
  expect(root.getValue().getState().persistence["n2"]).toBeUndefined();
648
828
 
649
829
  resolveFirstSave();
@@ -651,6 +831,89 @@ describe("Interactables persistence save", () => {
651
831
  expect(root.getValue().getState().persistence["n1"]).toBeUndefined();
652
832
  });
653
833
 
834
+ it("does not publish an outgoing adapter failure into the replacement scope", async () => {
835
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
836
+ let rejectSave!: (error: Error) => void;
837
+ const firstSave = vi.fn(
838
+ () =>
839
+ new Promise<void>((_resolve, reject) => {
840
+ rejectSave = reject;
841
+ }),
842
+ );
843
+ const firstAdapter = { save: firstSave };
844
+ root = mount({ persistence: firstAdapter });
845
+ await flushMicrotasks();
846
+ root.getValue().register(reg("n1"));
847
+ root.getValue().setState("n1", () => ({ v: 1 }));
848
+ await vi.advanceTimersByTimeAsync(500);
849
+
850
+ root.getValue().setPersistenceAdapter({ save: vi.fn() });
851
+ root.getValue().setPersistenceAdapter(firstAdapter);
852
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
853
+ rejectSave(new Error("outgoing adapter failed"));
854
+ await flushMicrotasks();
855
+
856
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
857
+ expect(warn).toHaveBeenCalledWith(
858
+ "[Interactables] Persistence save failed after the adapter changed.",
859
+ expect.any(Error),
860
+ );
861
+ });
862
+
863
+ it("keeps an in-flight save failure in the same scope while detached", async () => {
864
+ let rejectSave!: (error: Error) => void;
865
+ const saveError = new Error("save failed");
866
+ const adapter = {
867
+ save: vi.fn(
868
+ () =>
869
+ new Promise<void>((_resolve, reject) => {
870
+ rejectSave = reject;
871
+ }),
872
+ ),
873
+ };
874
+ root = mount({ persistence: adapter });
875
+ await flushMicrotasks();
876
+ root.getValue().register(reg("n1"));
877
+ root.getValue().setState("n1", () => ({ v: 1 }));
878
+ await vi.advanceTimersByTimeAsync(500);
879
+
880
+ root.getValue().setPersistenceAdapter(undefined);
881
+ rejectSave(saveError);
882
+ await flushMicrotasks();
883
+
884
+ expect(root.getValue().getState().persistence.n1).toEqual({
885
+ isPending: false,
886
+ error: saveError,
887
+ });
888
+
889
+ root.getValue().setPersistenceAdapter(adapter);
890
+ expect(root.getValue().getState().persistence.n1).toEqual({
891
+ isPending: false,
892
+ error: saveError,
893
+ });
894
+ });
895
+
896
+ it("keeps an imperative adapter attached across a soft unmount", async () => {
897
+ const save = vi.fn();
898
+ const softRoot = mountOnSubscribe();
899
+ const release = softRoot.subscribe(() => {});
900
+ softRoot.getValue().setPersistenceAdapter({ save });
901
+
902
+ release();
903
+ await flushMicrotasks();
904
+
905
+ const releaseAgain = softRoot.subscribe(() => {});
906
+ softRoot.getValue().register(reg("n1"));
907
+ softRoot.getValue().setState("n1", () => ({ v: 1 }));
908
+ await vi.advanceTimersByTimeAsync(500);
909
+
910
+ expect(save).toHaveBeenCalledWith({
911
+ n1: { name: "note", state: { v: 1 } },
912
+ });
913
+ releaseAgain();
914
+ await flushMicrotasks();
915
+ });
916
+
654
917
  it("keeps an interactable pending while its newer edit is queued", async () => {
655
918
  const saveResolvers: Array<() => void> = [];
656
919
  const firstSave = vi.fn(
@@ -741,6 +1004,71 @@ describe("Interactables persistence load", () => {
741
1004
  expect(stateOf(root, "t1")).toEqual({ v: 0 });
742
1005
  });
743
1006
 
1007
+ it("does not save loaded state that later registers as thread-scoped", async () => {
1008
+ const attached = adapter({
1009
+ t1: { name: "note", state: { v: 9 } },
1010
+ n2: { name: "note", state: { v: 2 } },
1011
+ });
1012
+ root = mount({
1013
+ persistence: attached,
1014
+ threadMessages: [createCall("t1")],
1015
+ });
1016
+ await flushMicrotasks();
1017
+ root.getValue().register(reg("t1"));
1018
+ root.getValue().register(reg("n1"));
1019
+
1020
+ root.getValue().setState("n1", () => ({ v: 1 }));
1021
+ await vi.advanceTimersByTimeAsync(500);
1022
+
1023
+ expect(attached.save).toHaveBeenCalledWith({
1024
+ n1: { name: "note", state: { v: 1 } },
1025
+ n2: { name: "note", state: { v: 2 } },
1026
+ });
1027
+ });
1028
+
1029
+ it("does not save loaded thread state before its tool UI registers", async () => {
1030
+ const attached = adapter({
1031
+ t1: { name: "note", state: { v: 9 } },
1032
+ n2: { name: "note", state: { v: 2 } },
1033
+ });
1034
+ root = mount({
1035
+ persistence: attached,
1036
+ threadMessages: [createCall("t1")],
1037
+ });
1038
+ await flushMicrotasks();
1039
+ root.getValue().register(reg("n1"));
1040
+
1041
+ root.getValue().setState("n1", () => ({ v: 1 }));
1042
+ await vi.advanceTimersByTimeAsync(500);
1043
+
1044
+ expect(attached.save).toHaveBeenCalledWith({
1045
+ n1: { name: "note", state: { v: 1 } },
1046
+ n2: { name: "note", state: { v: 2 } },
1047
+ });
1048
+ });
1049
+
1050
+ it("does not save loaded thread state with empty tool identifiers", async () => {
1051
+ const attached = adapter({
1052
+ "": { name: "note", state: { v: 9 } },
1053
+ t2: { name: "", state: { v: 8 } },
1054
+ n2: { name: "note", state: { v: 2 } },
1055
+ });
1056
+ root = mount({
1057
+ persistence: attached,
1058
+ threadMessages: [createCall(""), createCall("t2", {}, "")],
1059
+ });
1060
+ await flushMicrotasks();
1061
+ root.getValue().register(reg("n1"));
1062
+
1063
+ root.getValue().setState("n1", () => ({ v: 1 }));
1064
+ await vi.advanceTimersByTimeAsync(500);
1065
+
1066
+ expect(attached.save).toHaveBeenCalledWith({
1067
+ n1: { name: "note", state: { v: 1 } },
1068
+ n2: { name: "note", state: { v: 2 } },
1069
+ });
1070
+ });
1071
+
744
1072
  it("lets a local edit made while the load was in flight win over the loaded state", async () => {
745
1073
  root = mount({
746
1074
  persistence: adapter({ n1: { name: "note", state: { v: 3 } } }, 100),
@@ -751,4 +1079,533 @@ describe("Interactables persistence load", () => {
751
1079
  await vi.advanceTimersByTimeAsync(600);
752
1080
  expect(stateOf(root, "n1")).toEqual({ v: 99 });
753
1081
  });
1082
+
1083
+ it("preserves app state when declarative persistence attaches or detaches", async () => {
1084
+ const dynamic = mountWithMutablePersistence(undefined);
1085
+ root = dynamic.root;
1086
+ root.getValue().register(reg("n1"));
1087
+ root.getValue().setState("n1", () => ({ v: 99 }));
1088
+ const attached = adapter({});
1089
+
1090
+ dynamic.setPersistence(attached);
1091
+ await flushMicrotasks();
1092
+ expect(stateOf(root, "n1")).toEqual({ v: 99 });
1093
+
1094
+ dynamic.setPersistence(undefined);
1095
+ await flushMicrotasks();
1096
+ expect(stateOf(root, "n1")).toEqual({ v: 99 });
1097
+ });
1098
+
1099
+ it("saves local edits made before declarative persistence attaches", async () => {
1100
+ const dynamic = mountWithMutablePersistence(undefined);
1101
+ root = dynamic.root;
1102
+ root.getValue().register(reg("n1"));
1103
+ root.getValue().setState("n1", () => ({ v: 99 }));
1104
+ const attached = adapter({
1105
+ n1: { name: "note", state: { v: 1 } },
1106
+ n2: { name: "note", state: { v: 2 } },
1107
+ });
1108
+
1109
+ dynamic.setPersistence(attached);
1110
+ await flushMicrotasks();
1111
+
1112
+ expect(attached.save).toHaveBeenCalledWith({
1113
+ n1: { name: "note", state: { v: 99 } },
1114
+ n2: { name: "note", state: { v: 2 } },
1115
+ });
1116
+ });
1117
+
1118
+ it("waits for a slow initial load before saving local edits", async () => {
1119
+ const dynamic = mountWithMutablePersistence(undefined);
1120
+ root = dynamic.root;
1121
+ root.getValue().register(reg("n1"));
1122
+ root.getValue().setState("n1", () => ({ v: 99 }));
1123
+ const attached = adapter(
1124
+ {
1125
+ n1: { name: "note", state: { v: 1 } },
1126
+ n2: { name: "note", state: { v: 2 } },
1127
+ },
1128
+ 100,
1129
+ );
1130
+
1131
+ dynamic.setPersistence(attached);
1132
+ await vi.advanceTimersByTimeAsync(99);
1133
+ expect(attached.save).not.toHaveBeenCalled();
1134
+
1135
+ await vi.advanceTimersByTimeAsync(1);
1136
+ expect(attached.save).toHaveBeenCalledWith({
1137
+ n1: { name: "note", state: { v: 99 } },
1138
+ n2: { name: "note", state: { v: 2 } },
1139
+ });
1140
+ });
1141
+
1142
+ it("waits for an in-flight load before flush saves", async () => {
1143
+ const attached = adapter(
1144
+ {
1145
+ n1: { name: "note", state: { v: 1 } },
1146
+ n2: { name: "note", state: { v: 2 } },
1147
+ },
1148
+ 100,
1149
+ );
1150
+ root = mount({ persistence: attached });
1151
+ root.getValue().register(reg("n1"));
1152
+ root.getValue().setState("n1", () => ({ v: 99 }));
1153
+
1154
+ let resolved = false;
1155
+ const flushing = root
1156
+ .getValue()
1157
+ .flush()
1158
+ .then(() => {
1159
+ resolved = true;
1160
+ });
1161
+
1162
+ await vi.advanceTimersByTimeAsync(99);
1163
+ expect(resolved).toBe(false);
1164
+ expect(attached.save).not.toHaveBeenCalled();
1165
+
1166
+ await vi.advanceTimersByTimeAsync(1);
1167
+ await flushing;
1168
+
1169
+ expect(resolved).toBe(true);
1170
+ expect(attached.save).toHaveBeenCalledWith({
1171
+ n1: { name: "note", state: { v: 99 } },
1172
+ n2: { name: "note", state: { v: 2 } },
1173
+ });
1174
+ });
1175
+
1176
+ it("resolves flush without saving when the load never settles", async () => {
1177
+ const stalled = {
1178
+ save: vi.fn(),
1179
+ load: vi.fn(
1180
+ () => new Promise<Unstable_InteractablePersistedState>(() => {}),
1181
+ ),
1182
+ };
1183
+ root = mount({ persistence: stalled });
1184
+ root.getValue().register(reg("n1"));
1185
+ root.getValue().setState("n1", () => ({ v: 99 }));
1186
+
1187
+ let resolved = false;
1188
+ const flushing = root
1189
+ .getValue()
1190
+ .flush()
1191
+ .then(() => {
1192
+ resolved = true;
1193
+ });
1194
+
1195
+ await vi.advanceTimersByTimeAsync(4_999);
1196
+ expect(resolved).toBe(false);
1197
+
1198
+ await vi.advanceTimersByTimeAsync(1);
1199
+ await flushing;
1200
+
1201
+ expect(resolved).toBe(true);
1202
+ expect(stalled.save).not.toHaveBeenCalled();
1203
+ expect(stateOf(root, "n1")).toEqual({ v: 99 });
1204
+ });
1205
+
1206
+ it("retries a failed initial load before saving queued edits", async () => {
1207
+ const loadError = new Error("load failed");
1208
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1209
+ const dynamic = mountWithMutablePersistence(undefined);
1210
+ root = dynamic.root;
1211
+ root.getValue().register(reg("n1"));
1212
+ root.getValue().setState("n1", () => ({ v: 99 }));
1213
+ const attached = {
1214
+ save: vi.fn(),
1215
+ load: vi
1216
+ .fn()
1217
+ .mockRejectedValueOnce(loadError)
1218
+ .mockImplementationOnce(
1219
+ () =>
1220
+ new Promise<Unstable_InteractablePersistedState>((resolve) =>
1221
+ setTimeout(
1222
+ () =>
1223
+ resolve({
1224
+ n1: { name: "note", state: { v: 1 } },
1225
+ n2: { name: "note", state: { v: 2 } },
1226
+ }),
1227
+ 100,
1228
+ ),
1229
+ ),
1230
+ ),
1231
+ };
1232
+
1233
+ dynamic.setPersistence(attached);
1234
+ await flushMicrotasks();
1235
+
1236
+ expect(attached.save).not.toHaveBeenCalled();
1237
+ expect(root.getValue().getState().persistence.n1).toEqual({
1238
+ isPending: false,
1239
+ error: loadError,
1240
+ });
1241
+
1242
+ root.getValue().setState("n1", () => ({ v: 100 }));
1243
+ root.getValue().setState("n1", () => ({ v: 101 }));
1244
+ root.getValue().setState("n1", () => ({ v: 102 }));
1245
+ await vi.advanceTimersByTimeAsync(499);
1246
+ expect(attached.load).toHaveBeenCalledTimes(1);
1247
+
1248
+ await vi.advanceTimersByTimeAsync(1);
1249
+
1250
+ expect(attached.load).toHaveBeenCalledTimes(2);
1251
+ expect(attached.save).not.toHaveBeenCalled();
1252
+
1253
+ await vi.advanceTimersByTimeAsync(99);
1254
+ expect(attached.save).not.toHaveBeenCalled();
1255
+
1256
+ await vi.advanceTimersByTimeAsync(1);
1257
+ expect(attached.save).toHaveBeenCalledWith({
1258
+ n1: { name: "note", state: { v: 102 } },
1259
+ n2: { name: "note", state: { v: 2 } },
1260
+ });
1261
+ expect(warn).toHaveBeenCalledWith(
1262
+ "[Interactables] Persistence load failed.",
1263
+ loadError,
1264
+ );
1265
+ });
1266
+
1267
+ it("resolves flush without saving when the load retry fails", async () => {
1268
+ const loadError = new Error("load failed");
1269
+ vi.spyOn(console, "warn").mockImplementation(() => {});
1270
+ const dynamic = mountWithMutablePersistence(undefined);
1271
+ root = dynamic.root;
1272
+ root.getValue().register(reg("n1"));
1273
+ root.getValue().setState("n1", () => ({ v: 99 }));
1274
+ const attached = {
1275
+ save: vi.fn(),
1276
+ load: vi.fn().mockRejectedValue(loadError),
1277
+ };
1278
+
1279
+ dynamic.setPersistence(attached);
1280
+ await flushMicrotasks();
1281
+
1282
+ await expect(root.getValue().flush()).resolves.toBeUndefined();
1283
+
1284
+ expect(attached.load).toHaveBeenCalledTimes(2);
1285
+ expect(attached.save).not.toHaveBeenCalled();
1286
+ expect(root.getValue().getState().persistence.n1).toEqual({
1287
+ isPending: false,
1288
+ error: loadError,
1289
+ });
1290
+ });
1291
+
1292
+ it("clears load-pending status when the persistence scope changes", async () => {
1293
+ const first = adapter({}, 100);
1294
+ const second = adapter({});
1295
+ const dynamic = mountWithMutablePersistence(first);
1296
+ root = dynamic.root;
1297
+ root.getValue().register(reg("n1"));
1298
+ root.getValue().setState("n1", () => ({ v: 1 }));
1299
+
1300
+ expect(root.getValue().getState().persistence.n1).toEqual({
1301
+ isPending: true,
1302
+ error: undefined,
1303
+ });
1304
+
1305
+ dynamic.setPersistence(second);
1306
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
1307
+
1308
+ await vi.advanceTimersByTimeAsync(100);
1309
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
1310
+ });
1311
+
1312
+ it("clears load-pending status while the adapter is detached", () => {
1313
+ const dynamic = mountWithMutablePersistence(adapter({}, 100));
1314
+ root = dynamic.root;
1315
+ root.getValue().register(reg("n1"));
1316
+ root.getValue().setState("n1", () => ({ v: 1 }));
1317
+
1318
+ expect(root.getValue().getState().persistence.n1?.isPending).toBe(true);
1319
+
1320
+ dynamic.setPersistence(undefined);
1321
+
1322
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
1323
+ });
1324
+
1325
+ it("does not restore load status after an interactable unregisters", async () => {
1326
+ const loadError = new Error("load failed");
1327
+ vi.spyOn(console, "warn").mockImplementation(() => {});
1328
+ const attached = {
1329
+ save: vi.fn(),
1330
+ load: vi.fn(
1331
+ () =>
1332
+ new Promise<Unstable_InteractablePersistedState>((_, reject) =>
1333
+ setTimeout(() => reject(loadError), 100),
1334
+ ),
1335
+ ),
1336
+ };
1337
+ root = mount({ persistence: attached });
1338
+ const unregister = root.getValue().register(reg("n1"));
1339
+ root.getValue().setState("n1", () => ({ v: 1 }));
1340
+
1341
+ unregister();
1342
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
1343
+
1344
+ await vi.advanceTimersByTimeAsync(100);
1345
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
1346
+ });
1347
+
1348
+ it("keeps a loaded adapter ready when it is set again", async () => {
1349
+ const attached = adapter({});
1350
+ root = mount();
1351
+ root.getValue().setPersistenceAdapter(attached);
1352
+ await flushMicrotasks();
1353
+ expect(attached.load).toHaveBeenCalledTimes(1);
1354
+
1355
+ root.getValue().setPersistenceAdapter(attached);
1356
+ root.getValue().register(reg("n1"));
1357
+ root.getValue().setState("n1", () => ({ v: 1 }));
1358
+ await vi.advanceTimersByTimeAsync(500);
1359
+
1360
+ expect(attached.load).toHaveBeenCalledTimes(1);
1361
+ expect(attached.save).toHaveBeenCalledWith({
1362
+ n1: { name: "note", state: { v: 1 } },
1363
+ });
1364
+ });
1365
+
1366
+ it("saves queued edits when an adapter has no load method", async () => {
1367
+ const dynamic = mountWithMutablePersistence(undefined);
1368
+ root = dynamic.root;
1369
+ root.getValue().register(reg("n1"));
1370
+ root.getValue().setState("n1", () => ({ v: 99 }));
1371
+ const attached = { save: vi.fn() };
1372
+
1373
+ dynamic.setPersistence(attached);
1374
+ await flushMicrotasks();
1375
+
1376
+ expect(attached.save).toHaveBeenCalledWith({
1377
+ n1: { name: "note", state: { v: 99 } },
1378
+ });
1379
+ });
1380
+
1381
+ it("does not save detached edits into a replacement persistence scope", async () => {
1382
+ const firstAdapter = adapter({
1383
+ n1: { name: "note", state: { v: 1 } },
1384
+ });
1385
+ const secondAdapter = adapter({
1386
+ n1: { name: "note", state: { v: 2 } },
1387
+ });
1388
+ const dynamic = mountWithMutablePersistence(firstAdapter);
1389
+ root = dynamic.root;
1390
+ await flushMicrotasks();
1391
+ root.getValue().register(reg("n1"));
1392
+
1393
+ dynamic.setPersistence(undefined);
1394
+ root.getValue().setState("n1", () => ({ v: 99 }));
1395
+ dynamic.setPersistence(secondAdapter);
1396
+ await flushMicrotasks();
1397
+
1398
+ expect(stateOf(root, "n1")).toEqual({ v: 2 });
1399
+ expect(secondAdapter.save).not.toHaveBeenCalled();
1400
+ });
1401
+
1402
+ it("resets app state when the declarative adapter is replaced", async () => {
1403
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1404
+ const firstAdapter = adapter({
1405
+ n1: { name: "note", state: { v: 1 } },
1406
+ });
1407
+ const secondAdapter = adapter(
1408
+ { n1: { name: "note", state: { v: 2 } } },
1409
+ 100,
1410
+ );
1411
+ const thirdAdapter = adapter({
1412
+ n1: { name: "note", state: { v: 3 } },
1413
+ });
1414
+ const dynamic = mountWithMutablePersistence(firstAdapter);
1415
+ root = dynamic.root;
1416
+ await flushMicrotasks();
1417
+ root.getValue().register(reg("n1"));
1418
+ root.getValue().setState("n1", () => ({ v: 99 }));
1419
+
1420
+ dynamic.setPersistence(secondAdapter);
1421
+ expect(stateOf(root, "n1")).toEqual({ v: 0 });
1422
+
1423
+ await vi.advanceTimersByTimeAsync(100);
1424
+ expect(stateOf(root, "n1")).toEqual({ v: 2 });
1425
+
1426
+ dynamic.setPersistence(thirdAdapter);
1427
+ await flushMicrotasks();
1428
+ expect(stateOf(root, "n1")).toEqual({ v: 3 });
1429
+ expect(warn).toHaveBeenCalledTimes(2);
1430
+ expect(warn).toHaveBeenCalledWith(
1431
+ "[Interactables] The persistence adapter identity changed, so app-scoped state was reset for the new scope. Memoize the adapter unless this is an account or workspace switch.",
1432
+ );
1433
+ });
1434
+
1435
+ it("resets app state when a declarative adapter changes across a detach", async () => {
1436
+ const firstAdapter = adapter({
1437
+ n1: { name: "note", state: { v: 1 } },
1438
+ });
1439
+ const secondAdapter = adapter({
1440
+ n1: { name: "note", state: { v: 2 } },
1441
+ });
1442
+ const dynamic = mountWithMutablePersistence(firstAdapter);
1443
+ root = dynamic.root;
1444
+ await flushMicrotasks();
1445
+ const unregister = root.getValue().register(reg("n1"));
1446
+ root.getValue().setState("n1", () => ({ v: 99 }));
1447
+ unregister();
1448
+
1449
+ dynamic.setPersistence(undefined);
1450
+ dynamic.setPersistence(secondAdapter);
1451
+ await flushMicrotasks();
1452
+ root.getValue().register(reg("n1"));
1453
+
1454
+ expect(stateOf(root, "n1")).toEqual({ v: 2 });
1455
+ });
1456
+
1457
+ it("drops app-scoped streaming baselines when adapters are replaced", async () => {
1458
+ root = mount({ persistence: adapter({}) });
1459
+ const definition = reg("n1", {
1460
+ initialState: { items: [] },
1461
+ stateSchema: {
1462
+ type: "object",
1463
+ properties: {
1464
+ items: {
1465
+ type: "array",
1466
+ items: {
1467
+ type: "object",
1468
+ properties: {
1469
+ id: { type: "string" },
1470
+ text: { type: "string" },
1471
+ },
1472
+ },
1473
+ },
1474
+ },
1475
+ },
1476
+ });
1477
+ root.getValue().register(definition);
1478
+ root.getValue().setState("n1", () => ({
1479
+ items: [{ id: "old", text: "old scope" }],
1480
+ }));
1481
+
1482
+ let markFirstProcessed!: () => void;
1483
+ let releaseSecond!: () => void;
1484
+ const firstProcessed = new Promise<void>((resolve) => {
1485
+ markFirstProcessed = resolve;
1486
+ });
1487
+ const secondReleased = new Promise<void>((resolve) => {
1488
+ releaseSecond = resolve;
1489
+ });
1490
+ const tool = registeredModelContextProvider?.getModelContext?.().tools
1491
+ ?.update_note as
1492
+ | {
1493
+ streamCall(
1494
+ reader: {
1495
+ args: {
1496
+ streamValues(): AsyncIterable<Record<string, unknown>>;
1497
+ };
1498
+ },
1499
+ context: { toolCallId: string },
1500
+ ): Promise<unknown>;
1501
+ }
1502
+ | undefined;
1503
+ expect(tool).toBeDefined();
1504
+ const streaming = tool!.streamCall(
1505
+ {
1506
+ args: {
1507
+ async *streamValues() {
1508
+ yield { id: "n1", marker: true };
1509
+ markFirstProcessed();
1510
+ await secondReleased;
1511
+ yield { id: "n1", items: { add: [{ text: "new scope" }] } };
1512
+ },
1513
+ },
1514
+ },
1515
+ { toolCallId: "call-1" },
1516
+ );
1517
+ await firstProcessed;
1518
+
1519
+ root.getValue().setPersistenceAdapter(adapter({}));
1520
+ expect(stateOf(root, "n1")).toEqual({ items: [] });
1521
+ releaseSecond();
1522
+ await streaming;
1523
+
1524
+ expect(stateOf(root, "n1")).toMatchObject({
1525
+ items: [{ text: "new scope" }],
1526
+ });
1527
+ });
1528
+
1529
+ it("does not carry a settled save error into a replacement adapter", async () => {
1530
+ const firstAdapter = {
1531
+ save: vi.fn().mockRejectedValue(new Error("first adapter failed")),
1532
+ };
1533
+ root = mount({ persistence: firstAdapter });
1534
+ await flushMicrotasks();
1535
+ root.getValue().register(reg("n1"));
1536
+ root.getValue().setState("n1", () => ({ v: 1 }));
1537
+ await vi.advanceTimersByTimeAsync(500);
1538
+ expect(root.getValue().getState().persistence.n1?.error).toBeInstanceOf(
1539
+ Error,
1540
+ );
1541
+
1542
+ root.getValue().setPersistenceAdapter(adapter({}));
1543
+
1544
+ expect(root.getValue().getState().persistence.n1).toBeUndefined();
1545
+ });
1546
+
1547
+ it("resets app state before loading from a replacement adapter", async () => {
1548
+ const firstAdapter = adapter({
1549
+ n1: { name: "note", state: { v: 1 } },
1550
+ });
1551
+ const secondAdapter = adapter(
1552
+ { n1: { name: "note", state: { v: 2 } } },
1553
+ 100,
1554
+ );
1555
+ root = mount({ persistence: firstAdapter });
1556
+ await flushMicrotasks();
1557
+ root.getValue().register(reg("n1"));
1558
+ root.getValue().setState("n1", () => ({ v: 99 }));
1559
+
1560
+ root.getValue().setPersistenceAdapter(secondAdapter);
1561
+ expect(stateOf(root, "n1")).toEqual({ v: 0 });
1562
+
1563
+ await vi.advanceTimersByTimeAsync(100);
1564
+ expect(stateOf(root, "n1")).toEqual({ v: 2 });
1565
+
1566
+ root.getValue().setState("n1", () => ({ v: 3 }));
1567
+ await vi.advanceTimersByTimeAsync(500);
1568
+ expect(secondAdapter.save).toHaveBeenCalledWith({
1569
+ n1: { name: "note", state: { v: 3 } },
1570
+ });
1571
+ });
1572
+
1573
+ it("resets app state when an imperative adapter changes across a detach", async () => {
1574
+ const firstAdapter = adapter({
1575
+ n1: { name: "note", state: { v: 1 } },
1576
+ });
1577
+ const secondAdapter = adapter({
1578
+ n1: { name: "note", state: { v: 2 } },
1579
+ });
1580
+ root = mount({ persistence: firstAdapter });
1581
+ await flushMicrotasks();
1582
+ root.getValue().register(reg("n1"));
1583
+ root.getValue().setState("n1", () => ({ v: 99 }));
1584
+
1585
+ root.getValue().setPersistenceAdapter(undefined);
1586
+ root.getValue().setPersistenceAdapter(secondAdapter);
1587
+ await flushMicrotasks();
1588
+
1589
+ expect(stateOf(root, "n1")).toEqual({ v: 2 });
1590
+ });
1591
+
1592
+ it("does not restore detached app state from the previous adapter", async () => {
1593
+ const firstAdapter = adapter({
1594
+ n1: { name: "note", state: { v: 1 } },
1595
+ });
1596
+ const secondAdapter = adapter({
1597
+ n1: { name: "note", state: { v: 2 } },
1598
+ });
1599
+ root = mount({ persistence: firstAdapter });
1600
+ await flushMicrotasks();
1601
+ const unregister = root.getValue().register(reg("n1"));
1602
+ root.getValue().setState("n1", () => ({ v: 99 }));
1603
+ unregister();
1604
+
1605
+ root.getValue().setPersistenceAdapter(secondAdapter);
1606
+ await flushMicrotasks();
1607
+ root.getValue().register(reg("n1"));
1608
+
1609
+ expect(stateOf(root, "n1")).toEqual({ v: 2 });
1610
+ });
754
1611
  });