@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
@@ -6,8 +6,8 @@ import { getContentAutoStatus, isAutoStatus } from "../../runtime/utils/auto-sta
6
6
  import { ExportedMessageRepository, MessageRepository } from "../../runtime/utils/message-repository.js";
7
7
  import { EMPTY_QUEUE_ITEMS } from "../../runtime/queue/queue-item.js";
8
8
  import { walkToolCallTree } from "../../runtime/utils/tool-call-tree.js";
9
+ import { captureThreadRuntimeGeneration } from "../../runtime/utils/thread-runtime-lifecycle.js";
9
10
  import { BaseThreadRuntimeCore } from "../../runtime/base/base-thread-runtime-core.js";
10
- import { captureThreadRuntimeGeneration, isThreadRuntimeGenerationCurrent } from "../../runtime/utils/thread-runtime-lifecycle.js";
11
11
  import { ThreadMessageConverter } from "./thread-message-converter.js";
12
12
  import { shallowArrayEqual } from "../../runtime/utils/external-message-conversion.js";
13
13
  import { ToolInvocationTracker } from "../tool-invocations/ToolInvocationTracker.js";
@@ -68,7 +68,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
68
68
  suggestions = [];
69
69
  extras = void 0;
70
70
  _converter = new ThreadMessageConverter();
71
- _pendingDeleteEvictions = /* @__PURE__ */ new Set();
71
+ _pendingDeleteEvictions = /* @__PURE__ */ new Map();
72
72
  _optimistic = null;
73
73
  _store;
74
74
  _getInitializePromise;
@@ -242,9 +242,12 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
242
242
  }
243
243
  if (this._pendingDeleteEvictions.size > 0) {
244
244
  const incomingIds = new Set(messages.map((m) => m.id));
245
- for (const id of this._pendingDeleteEvictions) {
245
+ for (const [id, calls] of this._pendingDeleteEvictions) {
246
+ if (incomingIds.has(id)) {
247
+ if (calls.size === 0) this._pendingDeleteEvictions.delete(id);
248
+ continue;
249
+ }
246
250
  this._pendingDeleteEvictions.delete(id);
247
- if (incomingIds.has(id)) continue;
248
251
  try {
249
252
  this.repository.getMessage(id);
250
253
  } catch {
@@ -278,6 +281,14 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
278
281
  this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);
279
282
  const messagesSnapshot = this.repository.getMessages();
280
283
  if (!this._messages || !shallowArrayEqual(this._messages, messagesSnapshot)) this._messages = messagesSnapshot;
284
+ if (this._voiceMessages.length > 0) {
285
+ const hostIds = new Set(this._messages.map((message) => message.id));
286
+ const remaining = this._voiceMessages.filter((message) => !hostIds.has(message.id));
287
+ if (remaining.length !== this._voiceMessages.length) {
288
+ this._voiceMessages = remaining;
289
+ this._markVoiceMessagesDirty();
290
+ }
291
+ }
281
292
  if (repositoryChanged) this._runTrackerUpdate(() => this._toolInvocations?.reset());
282
293
  this._runTrackerUpdate(() => this._driveToolInvocations());
283
294
  this._notifySubscribers();
@@ -382,36 +393,65 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
382
393
  });
383
394
  }
384
395
  async append(rawMessage) {
385
- if (this._isVoiceMessage(rawMessage.sourceId)) throw new Error("Voice transcript messages cannot be edited");
386
- const isEdit = rawMessage.sourceId != null || rawMessage.parentId !== (this.messages.at(-1)?.id ?? null);
387
- const message = !isEdit && this._store.queue && this._store.queue === this._transformedQueue ? rawMessage : this.enrichAppendMetadata(rawMessage);
396
+ let message = {
397
+ ...rawMessage,
398
+ parentId: this._resolveAppendParent(rawMessage.parentId)
399
+ };
400
+ if (this.voice) return this._appendToVoiceSession(message);
401
+ if (this._isVoiceMessage(message.sourceId)) throw new Error("Voice transcript messages cannot be edited");
402
+ const isEdit = message.sourceId != null || message.parentId !== (this._getBaseMessages().at(-1)?.id ?? null);
403
+ message = !isEdit && this._store.queue && this._store.queue === this._transformedQueue ? message : this.enrichAppendMetadata(message);
388
404
  const generation = captureThreadRuntimeGeneration(this);
389
405
  this.ensureInitialized();
390
406
  const initPromise = this._getInitializePromise?.();
391
407
  if (!isEdit && this._store.queue) {
392
408
  if (initPromise) await initPromise;
393
- if (!isThreadRuntimeGenerationCurrent(this, generation)) return;
409
+ if (generation.aborted) return;
394
410
  if (message.steer ?? this._getEffectiveIsRunning(this._store)) this._store.queue.steer(message);
395
411
  else this._store.queue.enqueue(message);
396
412
  return;
397
413
  }
398
414
  initPromise?.catch(() => {});
399
415
  if (message.startRun ?? message.role === "user") await this._toolInvocations?.abort({ discardPending: true });
400
- if (!isThreadRuntimeGenerationCurrent(this, generation)) return;
416
+ if (generation.aborted) return;
401
417
  if (isEdit) {
402
418
  if (!this._store.onEdit) throw new Error("Runtime does not support editing messages.");
403
419
  this._pendingDeleteEvictions.clear();
404
420
  await this._store.onEdit(message);
405
421
  } else await this._store.onNew(message);
406
422
  }
423
+ _commitVoiceMessage(message) {
424
+ const generation = captureThreadRuntimeGeneration(this);
425
+ if (generation.aborted) {
426
+ this._dropVoiceMessage(message.id, false);
427
+ return;
428
+ }
429
+ const barrier = this._getVoiceCommitBarrier();
430
+ if (!barrier) {
431
+ this._store.onVoiceTranscript?.(message);
432
+ return;
433
+ }
434
+ const repository = this.repository;
435
+ return barrier.then(() => {
436
+ if (generation.aborted || this.repository !== repository) {
437
+ this._dropVoiceMessage(message.id, true);
438
+ return;
439
+ }
440
+ this._store.onVoiceTranscript?.(message);
441
+ });
442
+ }
407
443
  async deleteMessage(messageId) {
408
444
  if (this._store.onDelete) {
409
- if (this.repository.getMessages().some((m) => m.id === messageId)) this._pendingDeleteEvictions.add(messageId);
445
+ const wasVisible = this.repository.getMessages().some((m) => m.id === messageId);
446
+ const call = Symbol();
447
+ if (wasVisible) {
448
+ const calls = this._pendingDeleteEvictions.get(messageId) ?? /* @__PURE__ */ new Set();
449
+ this._pendingDeleteEvictions.set(messageId, calls.add(call));
450
+ }
410
451
  try {
411
452
  await this._store.onDelete(messageId);
412
- } catch (error) {
413
- this._pendingDeleteEvictions.delete(messageId);
414
- throw error;
453
+ } finally {
454
+ this._pendingDeleteEvictions.get(messageId)?.delete(call);
415
455
  }
416
456
  return;
417
457
  }
@@ -431,7 +471,11 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
431
471
  return;
432
472
  }
433
473
  this.repository.deleteMessage(messageId);
434
- this._messages = this.repository.getMessages();
474
+ this._publishRepositoryMessages();
475
+ }
476
+ _publishRepositoryMessages() {
477
+ const messages = this.repository.getMessages();
478
+ if (!shallowArrayEqual(this._messages, messages)) this._messages = messages;
435
479
  this._notifySubscribers();
436
480
  }
437
481
  getQueueItems() {
@@ -448,13 +492,17 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
448
492
  }
449
493
  async startRun(config) {
450
494
  if (!this._store.onReload) throw new Error("Runtime does not support reloading messages.");
495
+ if (this.voice) throw new Error("Cannot start a run while a voice session is connected");
451
496
  if (this._isVoiceMessage(config.sourceId)) throw new Error("Voice transcript messages cannot be reloaded");
452
- this._pendingDeleteEvictions.clear();
497
+ const visible = this.repository.getMessages();
498
+ const kept = new Set(visible.slice(0, visible.findIndex((m) => m.id === config.parentId) + 1).map((m) => m.id));
499
+ for (const id of this._pendingDeleteEvictions.keys()) if (!kept.has(id)) this._pendingDeleteEvictions.delete(id);
453
500
  await this._toolInvocations?.abort({ discardPending: true });
454
501
  await this._store.onReload(config.parentId, config);
455
502
  }
456
503
  async resumeRun(config) {
457
504
  if (!this._store.onResume) throw new Error("Runtime does not support resuming runs.");
505
+ if (this.voice) throw new Error("Cannot start a run while a voice session is connected");
458
506
  if (this._isVoiceMessage(config.sourceId)) throw new Error("Voice transcript messages cannot be reloaded");
459
507
  await this._store.onResume(config);
460
508
  }
@@ -501,16 +549,17 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
501
549
  };
502
550
  }
503
551
  }
504
- if (!movedLeaf) this._notifySubscribers();
552
+ this._publishRepositoryMessages();
505
553
  setTimeout(() => {
506
- if (!isThreadRuntimeGenerationCurrent(this, generation)) return;
554
+ if (generation.aborted) return;
507
555
  this.dropEmptyOptimisticHead();
508
556
  if (movedLeaf) {
509
557
  const current = this.repository.getMessages();
510
558
  if (current.at(-1)?.id === movedLeaf.id) this.repository.deleteMessage(movedLeaf.id);
511
559
  else if (current.some((m) => m.id === movedLeaf.id)) this.composer.retractDraft(movedLeaf.draft);
512
560
  }
513
- this.updateMessages(this.repository.getMessages());
561
+ this._publishRepositoryMessages();
562
+ this.updateMessages(this._messages);
514
563
  }, 0);
515
564
  }
516
565
  dropEmptyOptimisticHead() {
@@ -541,6 +590,10 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
541
590
  return Promise.reject(error);
542
591
  }
543
592
  }
593
+ async unstable_recordToolInteraction(options) {
594
+ if (!this._store.unstable_onRecordToolInteraction) throw new Error("Runtime does not support recording tool interactions.");
595
+ await this._store.unstable_onRecordToolInteraction(options);
596
+ }
544
597
  reset(initialMessages) {
545
598
  const repo = new MessageRepository();
546
599
  repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-runtime-core.js","names":["shallowEqual","AppendMessage","ThreadMessage","Attachment","AddToolResultOptions","ResumeRunConfig","ResumeToolCallOptions","RespondToToolApprovalOptions","StartRunConfig","ThreadSuggestion","ExternalStoreAdapter","ExternalStoreBranchChange","getExternalStoreMessages","bindExternalStoreMessage","FALLBACK_ID_PREFIX","ThreadMessageConverter","getContentAutoStatus","isAutoStatus","fromThreadMessageLike","ThreadMessageLike","getThreadMessageText","shallowArrayEqual","RuntimeCapabilities","ThreadRuntimeCore","ExternalThreadQueueAdapter","QueuePlacement","BaseThreadRuntimeCore","ModelContextProvider","ExportedMessageRepository","MessageRepository","generateId","walkToolCallTree","ToolInvocationTracker","ToolExecutionStatus","EMPTY_QUEUE_ITEMS","QuoteInfo","captureThreadRuntimeGeneration","isThreadRuntimeGenerationCurrent","EMPTY_ARRAY","Object","freeze","observeAdapterCallback","name","result","Promise","resolve","catch","error","console","hasUpcomingMessage","isRunning","messages","length","role","ExternalStoreThreadRuntimeCore","_capabilities","switchToBranch","switchBranchDuringRun","edit","delete","reload","refetchThread","cancel","unstable_copy","speech","dictation","voice","attachments","feedback","queue","capabilities","_messages","isDisabled","isSendDisabled","isLoading","_store","_hasExecutingTools","_getBaseMessages","state","adapters","unstable_refetchThread","onRefetchThread","undefined","suggestions","extras","_converter","_pendingDeleteEvictions","Set","_optimistic","id","parentId","_getInitializePromise","__internal_setGetInitializePromise","getPromise","_transformedQueue","_toolInvocations","_toolStatuses","ReadonlyMap","Map","_effectiveIsRunning","_inTrackerUpdate","_pendingRunningRefresh","_runTrackerUpdate","fn","_refreshEffectiveIsRunning","_getEffectiveIsRunning","_notifyEventSubscribers","_notifySubscribers","store","unstable_enableToolInvocations","status","values","type","beginEdit","messageId","onEdit","Error","constructor","contextProvider","__internal_setAdapter","_updateStoreSnapshot","previousIsRunning","oldStore","repositoryInstance","unstable_messageRepositoryInstance","repositoryChanged","repository","clear","__internal_setDispatchTransform","message","at","enrichAppendMetadata","newSuggestions","newCapabilities","setMessages","onDelete","onReload","onCancel","unstable_capabilities","copy","messageRepository","incoming","headId","resetHead","getMessages","incomingIds","map","addOrUpdateMessage","export","has","deleteMessage","convertMessage","convertMessages","cache","m","idx","isLast","fallbackId","content","startsWith","updated","messageLike","newMessage","seenIds","deduped","i","warn","add","push","reverse","parent","size","getMessage","ensureInitialized","optimisticId","metadata","isOptimistic","messagesSnapshot","reset","_driveToolInvocations","setToolStatuses","getModelContext","tools","onResult","command","_findMessageIdForToolCall","toolCallId","onAddToolResult","toolName","isError","artifact","modelContent","err","onStatusesChange","statuses","hadExecutingTools","fromEntries","toolCall","unstable_isClientToolCall","setState","_toolCallToMessageId","_messagesForToolCallIndex","part","set","get","branchId","onBranchChange","unstable_onBranchChange","previousHeadId","canonicalHeadId","updateMessages","_notifyBranchChange","event","visibleMessageIds","append","rawMessage","_isVoiceMessage","sourceId","isEdit","generation","initPromise","steer","enqueue","startRun","abort","discardPending","onNew","wasVisible","some","messageIndex","findIndex","filter","_evictDeletedMessage","getQueueItems","items","getSteerQueueItems","steerItems","moveQueueItem","queueItemId","placement","move","removeQueueItem","remove","config","resumeRun","onResume","exportExternalState","onExportExternalState","importExternalState","onLoadExternalState","unstable_notifySessionReset","__internal_notifyCancelled","cancelRun","dropEmptyOptimisticHead","previousMessage","trailingUserLeaf","every","movedLeaf","draft","text","quote","custom","composer","restoreDraft","setTimeout","current","retractDraft","head","addToolResult","options","resumeToolCall","handled","resume","payload","onResumeToolCall","respondToToolApproval","onRespondToToolApproval","findLast","candidate","approval","approvalId","find","then","_notifyToolApprovalAnswered","approved","reject","initialMessages","repo","import","fromArray","data","onImport","hasConverter","flatMap"],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import { shallowEqual } from \"@assistant-ui/store/client\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Attachment } from \"../../types/attachment\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type {\n ExternalStoreAdapter,\n ExternalStoreBranchChange,\n} from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n FALLBACK_ID_PREFIX,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport {\n getContentAutoStatus,\n isAutoStatus,\n} from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { shallowArrayEqual } from \"../../runtime/utils/external-message-conversion\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport type {\n ExternalThreadQueueAdapter,\n QueuePlacement,\n} from \"../../runtime/queue/external-thread-queue-adapter\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { generateId } from \"../../utils/id\";\nimport { walkToolCallTree } from \"../../runtime/utils/tool-call-tree\";\nimport {\n ToolInvocationTracker,\n type ToolExecutionStatus,\n} from \"../tool-invocations/ToolInvocationTracker\";\nimport { EMPTY_QUEUE_ITEMS } from \"../../runtime/queue/queue-item\";\nimport type { QuoteInfo } from \"../../types/quote\";\nimport {\n captureThreadRuntimeGeneration,\n isThreadRuntimeGenerationCurrent,\n} from \"../../runtime/utils/thread-runtime-lifecycle\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst observeAdapterCallback = (\n name: \"onAddToolResult\" | \"onCancel\",\n result: Promise<void> | void,\n) => {\n void Promise.resolve(result).catch((error) => {\n console.error(\n `[ExternalStoreThreadRuntimeCore] ${name} callback rejected`,\n error,\n );\n });\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n delete: false,\n reload: false,\n refetchThread: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n if (this._hasExecutingTools(this._store)) return true;\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n // A getter, not a method, so its presence tracks the adapter.\n public get unstable_refetchThread(): (() => Promise<void>) | undefined {\n if (!this._store.onRefetchThread) return undefined;\n return () => this._store.onRefetchThread!();\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n // Ids the host was asked to delete via onDelete. The snapshot pass evicts\n // them from the repository once the host's array no longer carries them;\n // an id the host kept is dropped from the set without eviction.\n // Branch-changing mutations (edit, branch switch, reload) invalidate the\n // set, because after them the incoming array omits off-branch ids for\n // reasons unrelated to deletion. Plain tail sends do not clear: a tail\n // append cannot make a visible id absent, so id-absence stays unambiguous\n // and a delete whose confirmation races a send keeps its eviction.\n private _pendingDeleteEvictions = new Set<string>();\n\n // Placeholder id for the upcoming assistant message, reused across snapshot\n // passes while the same tail message awaits its response so the placeholder\n // keeps one identity per response.\n private _optimistic: { id: string; parentId: string | null } | null = null;\n\n private _store!: ExternalStoreAdapter<any>;\n\n private _getInitializePromise?: () => Promise<unknown> | undefined;\n\n public __internal_setGetInitializePromise(\n getPromise: () => Promise<unknown> | undefined,\n ) {\n this._getInitializePromise = getPromise;\n }\n\n private _transformedQueue: ExternalThreadQueueAdapter | undefined;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n private _toolStatuses: ReadonlyMap<string, ToolExecutionStatus> = new Map();\n private _effectiveIsRunning = false;\n private _inTrackerUpdate = false;\n private _pendingRunningRefresh = false;\n\n /**\n * Tracker mutations initiated by this class (setState, reset) can publish\n * status changes synchronously. Re-entering the snapshot pipeline from\n * inside them would feed the tracker a stale snapshot and consume the\n * restore arming a reset just installed, so the running refresh is\n * deferred until the mutation returns and stays off the tracker.\n */\n private _runTrackerUpdate(fn: () => void): void {\n this._inTrackerUpdate = true;\n try {\n fn();\n } finally {\n this._inTrackerUpdate = false;\n }\n if (this._pendingRunningRefresh) {\n this._pendingRunningRefresh = false;\n this._refreshEffectiveIsRunning();\n }\n }\n\n private _refreshEffectiveIsRunning(): void {\n const isRunning = this._getEffectiveIsRunning(this._store);\n if (this._effectiveIsRunning === isRunning) return;\n this._effectiveIsRunning = isRunning;\n this._notifyEventSubscribers(isRunning ? \"runStart\" : \"runEnd\", {});\n this._notifySubscribers();\n }\n\n private _hasExecutingTools(store: ExternalStoreAdapter<any>): boolean {\n if (store.unstable_enableToolInvocations !== true) return false;\n if (this._toolInvocations === null) return false;\n for (const status of this._toolStatuses.values()) {\n if (status.type === \"executing\") return true;\n }\n return false;\n }\n\n private _getEffectiveIsRunning(store: ExternalStoreAdapter<any>): boolean {\n return (store.isRunning ?? false) || this._hasExecutingTools(store);\n }\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n this._updateStoreSnapshot(store);\n }\n\n private _updateStoreSnapshot(store: ExternalStoreAdapter<any>) {\n const previousIsRunning = this._effectiveIsRunning;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n const isRunning = this._getEffectiveIsRunning(store);\n const repositoryInstance = store.unstable_messageRepositoryInstance;\n const repositoryChanged =\n repositoryInstance !== undefined &&\n repositoryInstance !== this.repository;\n if (repositoryChanged) {\n this.repository = repositoryInstance;\n this._pendingDeleteEvictions.clear();\n }\n if (oldStore?.queue !== store.queue) {\n this._transformedQueue = undefined;\n store.queue?.__internal_setDispatchTransform?.((message) => {\n // Re-point at the tail, as LocalThreadRuntimeCore's driver does, so\n // the prefix gated against is the one the message lands on whatever\n // the host routes by. Queuing only ever accepts a tail append, so a\n // later tail is the same intent.\n const parentId = this.messages.at(-1)?.id ?? null;\n return this.enrichAppendMetadata({ ...message, parentId }, parentId);\n });\n if (store.queue?.__internal_setDispatchTransform)\n this._transformedQueue = store.queue;\n }\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n delete:\n this._store.onDelete !== undefined ||\n this._store.setMessages !== undefined,\n reload: this._store.onReload !== undefined,\n refetchThread: this._store.onRefetchThread !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: this._store.queue !== undefined,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n !repositoryChanged &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository &&\n previousIsRunning === isRunning\n ) {\n this._notifySubscribers();\n return;\n }\n\n const incoming = store.messageRepository.messages;\n const headId =\n store.messageRepository.headId ?? incoming.at(-1)?.message.id ?? null;\n\n if (\n oldStore &&\n !repositoryChanged &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n } else {\n const incomingIds = new Set(incoming.map(({ message }) => message.id));\n for (const { message, parentId } of incoming) {\n this.repository.addOrUpdateMessage(parentId, message);\n }\n for (const { message } of this.repository.export().messages) {\n if (!incomingIds.has(message.id)) {\n this.repository.deleteMessage(message.id);\n }\n }\n this._pendingDeleteEvictions.clear();\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n }\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n !repositoryChanged &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages &&\n previousIsRunning === isRunning\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const fallbackId = `${FALLBACK_ID_PREFIX}${idx}`;\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status ===\n getContentAutoStatus(cache.content, isLast, isRunning))\n ) {\n if (\n cache.id.startsWith(FALLBACK_ID_PREFIX) &&\n cache.id !== fallbackId\n ) {\n const updated = { ...cache, id: fallbackId };\n bindExternalStoreMessage(updated, m);\n return updated;\n }\n return cache;\n }\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n fallbackId,\n getContentAutoStatus(messageLike.content, isLast, isRunning),\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n const seenIds = new Set<string>();\n const deduped: ThreadMessage[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (seenIds.has(message.id)) {\n console.warn(\n `ExternalStoreThreadRuntimeCore: duplicate message id \"${message.id}\" in the provided messages array; keeping the last occurrence.`,\n );\n continue;\n }\n seenIds.add(message.id);\n deduped.push(message);\n }\n if (deduped.length !== messages.length) messages = deduped.reverse();\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this._pendingDeleteEvictions.size > 0) {\n const incomingIds = new Set(messages.map((m) => m.id));\n for (const id of this._pendingDeleteEvictions) {\n this._pendingDeleteEvictions.delete(id);\n if (incomingIds.has(id)) continue;\n try {\n this.repository.getMessage(id);\n } catch {\n continue;\n }\n this.repository.deleteMessage(id);\n }\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n this._effectiveIsRunning = isRunning;\n if (previousIsRunning !== isRunning) {\n if (isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n // Append an optimistic placeholder while running but before a trailing\n // assistant message exists. resetHead evicts off-branch optimistic messages\n // (prior placeholders, mid-run id-swap siblings); export() never persists them.\n let optimisticId: string | null = null;\n if (hasUpcomingMessage(isRunning, messages)) {\n const parentId = messages.at(-1)?.id ?? null;\n if (this._optimistic?.parentId !== parentId) {\n this._optimistic = { id: generateId(), parentId };\n }\n optimisticId = this._optimistic.id;\n this.repository.addOrUpdateMessage(\n parentId,\n fromThreadMessageLike(\n { role: \"assistant\", content: [], metadata: { isOptimistic: true } },\n optimisticId,\n { type: \"running\" },\n ),\n );\n }\n\n if (optimisticId === null) this._optimistic = null;\n this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);\n\n const messagesSnapshot = this.repository.getMessages();\n if (\n !this._messages ||\n !shallowArrayEqual(this._messages, messagesSnapshot)\n ) {\n this._messages = messagesSnapshot;\n }\n\n if (repositoryChanged) {\n this._runTrackerUpdate(() => this._toolInvocations?.reset());\n }\n this._runTrackerUpdate(() => this._driveToolInvocations());\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._toolStatuses = new Map();\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n observeAdapterCallback(\n \"onAddToolResult\",\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n }),\n );\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n const hadExecutingTools = this._hasExecutingTools(this._store);\n this._toolStatuses = statuses;\n try {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n } finally {\n if (hadExecutingTools !== this._hasExecutingTools(this._store)) {\n if (this._inTrackerUpdate) {\n this._pendingRunningRefresh = true;\n } else {\n this._updateStoreSnapshot(this._store);\n }\n }\n }\n },\n },\n (toolCall) => this._store.unstable_isClientToolCall?.(toolCall),\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._getEffectiveIsRunning(this._store),\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n for (const { part, messageId } of walkToolCallTree(this._messages)) {\n this._toolCallToMessageId.set(part.toolCallId, messageId);\n }\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._getEffectiveIsRunning(this._store)) {\n return;\n }\n\n const onBranchChange = this._store.unstable_onBranchChange;\n const previousHeadId = onBranchChange\n ? this.repository.canonicalHeadId\n : null;\n\n this.repository.switchToBranch(branchId);\n this._pendingDeleteEvictions.clear();\n this.updateMessages(this.repository.getMessages());\n if (onBranchChange) {\n this._notifyBranchChange(previousHeadId, onBranchChange);\n }\n }\n\n /**\n * Emit `unstable_onBranchChange` for an explicit branch switch. Reads the\n * canonical head from the repository (which skips optimistic/transient\n * messages) and de-dupes switches that leave the canonical head unchanged.\n * Comparing against the head observed just before the switch — rather than the\n * last emitted head — keeps a switch firing after an adapter resync moved the\n * head elsewhere in the meantime.\n */\n private _notifyBranchChange(\n previousHeadId: string | null,\n onBranchChange: (event: ExternalStoreBranchChange) => void,\n ): void {\n const headId = this.repository.canonicalHeadId;\n if (headId === previousHeadId) return;\n\n onBranchChange({\n headId,\n visibleMessageIds: this.repository.getMessages().map((m) => m.id),\n });\n }\n\n public async append(rawMessage: AppendMessage): Promise<void> {\n if (this._isVoiceMessage(rawMessage.sourceId))\n throw new Error(\"Voice transcript messages cannot be edited\");\n // sourceId marks an edit send; the parent may coincide with the head\n // after a resync (e.g. cancelRun dropped the edited message).\n const isEdit =\n rawMessage.sourceId != null ||\n rawMessage.parentId !== (this.messages.at(-1)?.id ?? null);\n\n // A transformed-queue send is stamped at flush; any other queue's\n // transform would gate against its own thread's messages, so those stamp\n // at send.\n const message =\n !isEdit &&\n this._store.queue &&\n this._store.queue === this._transformedQueue\n ? rawMessage\n : this.enrichAppendMetadata(rawMessage);\n\n const generation = captureThreadRuntimeGeneration(this);\n this.ensureInitialized();\n\n // The getter call is what starts thread initialization.\n const initPromise = this._getInitializePromise?.();\n\n // The queue driver dispatches through the host adapter, outside this\n // core, so the initialization barrier must run before a message can\n // enter the queue.\n if (!isEdit && this._store.queue) {\n if (initPromise) {\n await initPromise;\n }\n if (!isThreadRuntimeGenerationCurrent(this, generation)) return;\n\n // Buffering does not start a run, so the tool-abort below must wait\n // until the queue flushes. By then the prior run (and its tools) has\n // settled.\n if (message.steer ?? this._getEffectiveIsRunning(this._store))\n this._store.queue.steer(message);\n else this._store.queue.enqueue(message);\n return;\n }\n\n // The optimistic insert lives inside the adapter's dispatch, so holding\n // `onNew` on initialization would keep the message off screen for the\n // whole roundtrip. Seams that need the remote identity await\n // `threadListItem.initialize()` themselves, and a rejection surfaces\n // there.\n void initPromise?.catch(() => {});\n\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort({ discardPending: true });\n }\n if (!isThreadRuntimeGenerationCurrent(this, generation)) return;\n\n if (isEdit) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n this._pendingDeleteEvictions.clear();\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public async deleteMessage(messageId: string): Promise<void> {\n if (this._store.onDelete) {\n // The host owns deletion here, and it may decline (fail a server call,\n // cancel a confirm dialog, ignore an off-branch id). The eviction is\n // therefore deferred to the snapshot pass, which evicts only once the\n // host's own array no longer carries the id. Registered before the\n // callback because an optimistic host publishes that snapshot while\n // the callback is still awaited.\n const wasVisible = this.repository\n .getMessages()\n .some((m) => m.id === messageId);\n if (wasVisible) this._pendingDeleteEvictions.add(messageId);\n try {\n await this._store.onDelete(messageId);\n } catch (error) {\n this._pendingDeleteEvictions.delete(messageId);\n throw error;\n }\n return;\n }\n\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support deleting messages.\");\n\n if (this._getEffectiveIsRunning(this._store)) {\n await this._toolInvocations?.abort();\n }\n\n const messages = this.repository.getMessages();\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) throw new Error(\"Message not found.\");\n\n this._pendingDeleteEvictions.clear();\n this.updateMessages(messages.filter((message) => message.id !== messageId));\n this._evictDeletedMessage(messageId);\n }\n\n // The snapshot pass only relinks incoming messages; it never evicts, so\n // without this the deleted message survives as a sibling branch that the\n // branch picker can resurrect into the host store. `_messages` is refreshed\n // before notifying so `messages` and the branch graph agree at notify time,\n // mirroring the end of the snapshot pass.\n private _evictDeletedMessage(messageId: string) {\n // Positional fallback ids are remapped in the snapshot pass; evicting\n // them first leaves the pre-renumber node as a sibling of the new head.\n if (messageId.startsWith(FALLBACK_ID_PREFIX)) return;\n // A synchronous host update (e.g. a setMessages that re-entered the\n // snapshot pass) may have evicted the message already; only that case is\n // skipped, so genuine repository errors still propagate.\n try {\n this.repository.getMessage(messageId);\n } catch {\n return;\n }\n\n this.repository.deleteMessage(messageId);\n this._messages = this.repository.getMessages();\n this._notifySubscribers();\n }\n\n public getQueueItems() {\n // The composer reads this during base-thread construction, before the\n // constructor assigns `_store`, so guard against the unset field.\n return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;\n }\n\n public getSteerQueueItems() {\n return this._store?.queue?.steerItems ?? EMPTY_QUEUE_ITEMS;\n }\n\n public moveQueueItem(queueItemId: string, placement: QueuePlacement) {\n this._store?.queue?.move(queueItemId, placement);\n }\n\n public removeQueueItem(queueItemId: string) {\n this._store?.queue?.remove(queueItemId);\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n if (this._isVoiceMessage(config.sourceId))\n throw new Error(\"Voice transcript messages cannot be reloaded\");\n\n this._pendingDeleteEvictions.clear();\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort({ discardPending: true });\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n if (this._isVoiceMessage(config.sourceId))\n throw new Error(\"Voice transcript messages cannot be reloaded\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. The tracker publishes the\n // cleared status map itself, so adapter-side statuses reset only when\n // the tracker is the source of truth.\n this._runTrackerUpdate(() => this._toolInvocations?.reset());\n\n this._store.onLoadExternalState(state);\n }\n\n /**\n * Adapter-facing notification that the backing session was discarded.\n * Clears session-scoped tool-invocation state and parks queued work,\n * without run-cancel semantics (`onCancel`, composer draft restoration).\n */\n public unstable_notifySessionReset(): void {\n this._runTrackerUpdate(() => this._toolInvocations?.reset());\n this._store.queue?.__internal_notifyCancelled?.();\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n const generation = captureThreadRuntimeGeneration(this);\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort({ discardPending: true });\n\n // Before the run is aborted, so the settle it produces keeps the pending\n // items instead of dispatching the next one at the moment the user\n // stopped.\n this._store.queue?.__internal_notifyCancelled?.();\n\n observeAdapterCallback(\"onCancel\", this._store.onCancel());\n\n this.dropEmptyOptimisticHead();\n\n const messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n const trailingUserLeaf =\n this._store.setMessages !== undefined &&\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id && // ensure the previous message is a leaf node\n previousMessage.content.every((part) => part.type === \"text\")\n ? previousMessage\n : undefined;\n\n // Handing the message to the composer and taking it out of the thread are\n // one move: the composer refuses while the user is writing, and removing\n // the message then would leave it nowhere. A message the composer cannot\n // hold whole, carrying content parts it has no home for, is not moved.\n let movedLeaf:\n | {\n id: string;\n draft: {\n text: string;\n attachments: readonly Attachment[];\n quote: QuoteInfo | undefined;\n };\n }\n | undefined;\n if (trailingUserLeaf) {\n const draft = {\n text: getThreadMessageText(trailingUserLeaf),\n attachments: trailingUserLeaf.attachments,\n quote: trailingUserLeaf.metadata.custom.quote as QuoteInfo | undefined,\n };\n if (this.composer.restoreDraft(draft)) {\n this.repository.deleteMessage(trailingUserLeaf.id);\n movedLeaf = { id: trailingUserLeaf.id, draft };\n }\n }\n if (!movedLeaf) this._notifySubscribers();\n\n // The resync commits what the cancel left (a kept optimistic message, the\n // restored branch) back to the store a macrotask later. The store may move\n // in that gap; a server settling the cancelled turn lands in the same\n // tick. Read the repository at flush time and re-apply the rollbacks to\n // it, instead of stamping a snapshot captured above over the newer state.\n setTimeout(() => {\n if (!isThreadRuntimeGenerationCurrent(this, generation)) return;\n\n this.dropEmptyOptimisticHead();\n if (movedLeaf) {\n const current = this.repository.getMessages();\n if (current.at(-1)?.id === movedLeaf.id) {\n // Unanswered tail: the removal has not reached the store yet.\n this.repository.deleteMessage(movedLeaf.id);\n } else if (current.some((m) => m.id === movedLeaf.id)) {\n // The store kept the turn in the thread; take the untouched draft\n // back so the same content does not sit in both places.\n this.composer.retractDraft(movedLeaf.draft);\n }\n }\n this.updateMessages(this.repository.getMessages());\n }, 0);\n }\n\n // Placeholder or pre-stream message; a partially-streamed one is kept and\n // committed to the store by the cancel resync.\n private dropEmptyOptimisticHead(): void {\n const head = this.repository.getMessages().at(-1);\n if (head && head.metadata.isOptimistic && head.content.length === 0) {\n this.repository.deleteMessage(head.id);\n }\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n observeAdapterCallback(\n \"onAddToolResult\",\n this._store.onAddToolResult(options),\n );\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): Promise<void> {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n const message = this.messages.findLast(\n (candidate) =>\n candidate.role === \"assistant\" &&\n candidate.content.some(\n (part) =>\n part.type === \"tool-call\" &&\n part.approval?.id === options.approvalId,\n ),\n );\n const toolCall = message?.content.find(\n (part) =>\n part.type === \"tool-call\" && part.approval?.id === options.approvalId,\n );\n try {\n return Promise.resolve(this._store.onRespondToToolApproval(options)).then(\n () => {\n if (message && toolCall?.type === \"tool-call\") {\n this._notifyToolApprovalAnswered(\n message.id,\n toolCall.toolCallId,\n toolCall.toolName,\n options.approved,\n );\n }\n },\n );\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"external-store-thread-runtime-core.js","names":["shallowEqual","AppendMessage","ThreadMessage","Attachment","AddToolResultOptions","ResumeRunConfig","ResumeToolCallOptions","RespondToToolApprovalOptions","StartRunConfig","ThreadSuggestion","Unstable_RecordToolInteractionOptions","ExternalStoreAdapter","ExternalStoreBranchChange","getExternalStoreMessages","bindExternalStoreMessage","FALLBACK_ID_PREFIX","ThreadMessageConverter","getContentAutoStatus","isAutoStatus","fromThreadMessageLike","ThreadMessageLike","getThreadMessageText","shallowArrayEqual","RuntimeCapabilities","ThreadRuntimeCore","ExternalThreadQueueAdapter","QueuePlacement","BaseThreadRuntimeCore","ModelContextProvider","ExportedMessageRepository","MessageRepository","generateId","walkToolCallTree","ToolInvocationTracker","ToolExecutionStatus","EMPTY_QUEUE_ITEMS","QuoteInfo","captureThreadRuntimeGeneration","EMPTY_ARRAY","Object","freeze","observeAdapterCallback","name","result","Promise","resolve","catch","error","console","hasUpcomingMessage","isRunning","messages","length","role","ExternalStoreThreadRuntimeCore","_capabilities","switchToBranch","switchBranchDuringRun","edit","delete","reload","refetchThread","cancel","unstable_copy","speech","dictation","voice","attachments","feedback","queue","capabilities","_messages","isDisabled","isSendDisabled","isLoading","_store","_hasExecutingTools","_getBaseMessages","state","adapters","unstable_refetchThread","onRefetchThread","undefined","suggestions","extras","_converter","_pendingDeleteEvictions","Map","Set","_optimistic","id","parentId","_getInitializePromise","__internal_setGetInitializePromise","getPromise","_transformedQueue","_toolInvocations","_toolStatuses","ReadonlyMap","_effectiveIsRunning","_inTrackerUpdate","_pendingRunningRefresh","_runTrackerUpdate","fn","_refreshEffectiveIsRunning","_getEffectiveIsRunning","_notifyEventSubscribers","_notifySubscribers","store","unstable_enableToolInvocations","status","values","type","beginEdit","messageId","onEdit","Error","constructor","contextProvider","__internal_setAdapter","_updateStoreSnapshot","previousIsRunning","oldStore","repositoryInstance","unstable_messageRepositoryInstance","repositoryChanged","repository","clear","__internal_setDispatchTransform","message","at","enrichAppendMetadata","newSuggestions","newCapabilities","setMessages","onDelete","onReload","onCancel","unstable_capabilities","copy","messageRepository","incoming","headId","resetHead","getMessages","incomingIds","map","addOrUpdateMessage","export","has","deleteMessage","convertMessage","convertMessages","cache","m","idx","isLast","fallbackId","content","startsWith","updated","messageLike","newMessage","seenIds","deduped","i","warn","add","push","reverse","parent","size","calls","getMessage","ensureInitialized","optimisticId","metadata","isOptimistic","messagesSnapshot","_voiceMessages","hostIds","remaining","filter","_markVoiceMessagesDirty","reset","_driveToolInvocations","setToolStatuses","getModelContext","tools","onResult","command","_findMessageIdForToolCall","toolCallId","onAddToolResult","toolName","isError","artifact","modelContent","err","onStatusesChange","statuses","hadExecutingTools","fromEntries","toolCall","unstable_isClientToolCall","setState","_toolCallToMessageId","_messagesForToolCallIndex","part","set","get","branchId","onBranchChange","unstable_onBranchChange","previousHeadId","canonicalHeadId","updateMessages","_notifyBranchChange","event","visibleMessageIds","append","rawMessage","_resolveAppendParent","_appendToVoiceSession","_isVoiceMessage","sourceId","isEdit","generation","initPromise","aborted","steer","enqueue","startRun","abort","discardPending","onNew","_commitVoiceMessage","_dropVoiceMessage","barrier","_getVoiceCommitBarrier","onVoiceTranscript","then","wasVisible","some","call","Symbol","messageIndex","findIndex","_evictDeletedMessage","_publishRepositoryMessages","getQueueItems","items","getSteerQueueItems","steerItems","moveQueueItem","queueItemId","placement","move","removeQueueItem","remove","config","visible","kept","slice","keys","resumeRun","onResume","exportExternalState","onExportExternalState","importExternalState","onLoadExternalState","unstable_notifySessionReset","__internal_notifyCancelled","cancelRun","dropEmptyOptimisticHead","previousMessage","trailingUserLeaf","every","movedLeaf","draft","text","quote","custom","composer","restoreDraft","setTimeout","current","retractDraft","head","addToolResult","options","resumeToolCall","handled","resume","payload","onResumeToolCall","respondToToolApproval","onRespondToToolApproval","findLast","candidate","approval","approvalId","find","_notifyToolApprovalAnswered","approved","reject","unstable_recordToolInteraction","unstable_onRecordToolInteraction","initialMessages","repo","import","fromArray","data","onImport","hasConverter","flatMap"],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import { shallowEqual } from \"@assistant-ui/store/client\";\nimport type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Attachment } from \"../../types/attachment\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n Unstable_RecordToolInteractionOptions,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type {\n ExternalStoreAdapter,\n ExternalStoreBranchChange,\n} from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n FALLBACK_ID_PREFIX,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport {\n getContentAutoStatus,\n isAutoStatus,\n} from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport { shallowArrayEqual } from \"../../runtime/utils/external-message-conversion\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport type {\n ExternalThreadQueueAdapter,\n QueuePlacement,\n} from \"../../runtime/queue/external-thread-queue-adapter\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { generateId } from \"../../utils/id\";\nimport { walkToolCallTree } from \"../../runtime/utils/tool-call-tree\";\nimport {\n ToolInvocationTracker,\n type ToolExecutionStatus,\n} from \"../tool-invocations/ToolInvocationTracker\";\nimport { EMPTY_QUEUE_ITEMS } from \"../../runtime/queue/queue-item\";\nimport type { QuoteInfo } from \"../../types/quote\";\nimport { captureThreadRuntimeGeneration } from \"../../runtime/utils/thread-runtime-lifecycle\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst observeAdapterCallback = (\n name: \"onAddToolResult\" | \"onCancel\",\n result: Promise<void> | void,\n) => {\n void Promise.resolve(result).catch((error) => {\n console.error(\n `[ExternalStoreThreadRuntimeCore] ${name} callback rejected`,\n error,\n );\n });\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n delete: false,\n reload: false,\n refetchThread: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n if (this._hasExecutingTools(this._store)) return true;\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n // A getter, not a method, so its presence tracks the adapter.\n public get unstable_refetchThread(): (() => Promise<void>) | undefined {\n if (!this._store.onRefetchThread) return undefined;\n return () => this._store.onRefetchThread!();\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n // Ids the host was asked to delete via onDelete, mapped to the onDelete\n // calls still pending for them. The snapshot pass evicts them from the\n // repository once the host's array no longer carries them; an id the host\n // still carries after every onDelete call for it settled, resolved or\n // rejected, is dropped from the map without eviction.\n // Branch-changing mutations (edit, branch switch) invalidate the map,\n // because after them the incoming array omits off-branch ids for reasons\n // unrelated to deletion. A reload invalidates only the ids after the parent\n // it regenerates from: the host keeps the prefix up to that parent, so an\n // id absent from it is still a deletion. Plain tail sends do not clear: a\n // tail append cannot make a visible id absent, so id-absence stays\n // unambiguous and a delete whose confirmation races a send keeps its\n // eviction.\n private _pendingDeleteEvictions = new Map<string, Set<symbol>>();\n\n // Placeholder id for the upcoming assistant message, reused across snapshot\n // passes while the same tail message awaits its response so the placeholder\n // keeps one identity per response.\n private _optimistic: { id: string; parentId: string | null } | null = null;\n\n private _store!: ExternalStoreAdapter<any>;\n\n private _getInitializePromise?: () => Promise<unknown> | undefined;\n\n public __internal_setGetInitializePromise(\n getPromise: () => Promise<unknown> | undefined,\n ) {\n this._getInitializePromise = getPromise;\n }\n\n private _transformedQueue: ExternalThreadQueueAdapter | undefined;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n private _toolStatuses: ReadonlyMap<string, ToolExecutionStatus> = new Map();\n private _effectiveIsRunning = false;\n private _inTrackerUpdate = false;\n private _pendingRunningRefresh = false;\n\n /**\n * Tracker mutations initiated by this class (setState, reset) can publish\n * status changes synchronously. Re-entering the snapshot pipeline from\n * inside them would feed the tracker a stale snapshot and consume the\n * restore arming a reset just installed, so the running refresh is\n * deferred until the mutation returns and stays off the tracker.\n */\n private _runTrackerUpdate(fn: () => void): void {\n this._inTrackerUpdate = true;\n try {\n fn();\n } finally {\n this._inTrackerUpdate = false;\n }\n if (this._pendingRunningRefresh) {\n this._pendingRunningRefresh = false;\n this._refreshEffectiveIsRunning();\n }\n }\n\n private _refreshEffectiveIsRunning(): void {\n const isRunning = this._getEffectiveIsRunning(this._store);\n if (this._effectiveIsRunning === isRunning) return;\n this._effectiveIsRunning = isRunning;\n this._notifyEventSubscribers(isRunning ? \"runStart\" : \"runEnd\", {});\n this._notifySubscribers();\n }\n\n private _hasExecutingTools(store: ExternalStoreAdapter<any>): boolean {\n if (store.unstable_enableToolInvocations !== true) return false;\n if (this._toolInvocations === null) return false;\n for (const status of this._toolStatuses.values()) {\n if (status.type === \"executing\") return true;\n }\n return false;\n }\n\n private _getEffectiveIsRunning(store: ExternalStoreAdapter<any>): boolean {\n return (store.isRunning ?? false) || this._hasExecutingTools(store);\n }\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n this._updateStoreSnapshot(store);\n }\n\n private _updateStoreSnapshot(store: ExternalStoreAdapter<any>) {\n const previousIsRunning = this._effectiveIsRunning;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n const isRunning = this._getEffectiveIsRunning(store);\n const repositoryInstance = store.unstable_messageRepositoryInstance;\n const repositoryChanged =\n repositoryInstance !== undefined &&\n repositoryInstance !== this.repository;\n if (repositoryChanged) {\n this.repository = repositoryInstance;\n this._pendingDeleteEvictions.clear();\n }\n if (oldStore?.queue !== store.queue) {\n this._transformedQueue = undefined;\n store.queue?.__internal_setDispatchTransform?.((message) => {\n // Re-point at the tail, as LocalThreadRuntimeCore's driver does, so\n // the prefix gated against is the one the message lands on whatever\n // the host routes by. Queuing only ever accepts a tail append, so a\n // later tail is the same intent.\n const parentId = this.messages.at(-1)?.id ?? null;\n return this.enrichAppendMetadata({ ...message, parentId }, parentId);\n });\n if (store.queue?.__internal_setDispatchTransform)\n this._transformedQueue = store.queue;\n }\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n delete:\n this._store.onDelete !== undefined ||\n this._store.setMessages !== undefined,\n reload: this._store.onReload !== undefined,\n refetchThread: this._store.onRefetchThread !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: this._store.queue !== undefined,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n !repositoryChanged &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository &&\n previousIsRunning === isRunning\n ) {\n this._notifySubscribers();\n return;\n }\n\n const incoming = store.messageRepository.messages;\n const headId =\n store.messageRepository.headId ?? incoming.at(-1)?.message.id ?? null;\n\n if (\n oldStore &&\n !repositoryChanged &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n } else {\n const incomingIds = new Set(incoming.map(({ message }) => message.id));\n for (const { message, parentId } of incoming) {\n this.repository.addOrUpdateMessage(parentId, message);\n }\n for (const { message } of this.repository.export().messages) {\n if (!incomingIds.has(message.id)) {\n this.repository.deleteMessage(message.id);\n }\n }\n this._pendingDeleteEvictions.clear();\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n }\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n !repositoryChanged &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages &&\n previousIsRunning === isRunning\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const fallbackId = `${FALLBACK_ID_PREFIX}${idx}`;\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status ===\n getContentAutoStatus(cache.content, isLast, isRunning))\n ) {\n if (\n cache.id.startsWith(FALLBACK_ID_PREFIX) &&\n cache.id !== fallbackId\n ) {\n const updated = { ...cache, id: fallbackId };\n bindExternalStoreMessage(updated, m);\n return updated;\n }\n return cache;\n }\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n fallbackId,\n getContentAutoStatus(messageLike.content, isLast, isRunning),\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n const seenIds = new Set<string>();\n const deduped: ThreadMessage[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (seenIds.has(message.id)) {\n console.warn(\n `ExternalStoreThreadRuntimeCore: duplicate message id \"${message.id}\" in the provided messages array; keeping the last occurrence.`,\n );\n continue;\n }\n seenIds.add(message.id);\n deduped.push(message);\n }\n if (deduped.length !== messages.length) messages = deduped.reverse();\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this._pendingDeleteEvictions.size > 0) {\n const incomingIds = new Set(messages.map((m) => m.id));\n for (const [id, calls] of this._pendingDeleteEvictions) {\n if (incomingIds.has(id)) {\n if (calls.size === 0) this._pendingDeleteEvictions.delete(id);\n continue;\n }\n this._pendingDeleteEvictions.delete(id);\n try {\n this.repository.getMessage(id);\n } catch {\n continue;\n }\n this.repository.deleteMessage(id);\n }\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n this._effectiveIsRunning = isRunning;\n if (previousIsRunning !== isRunning) {\n if (isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n // Append an optimistic placeholder while running but before a trailing\n // assistant message exists. resetHead evicts off-branch optimistic messages\n // (prior placeholders, mid-run id-swap siblings); export() never persists them.\n let optimisticId: string | null = null;\n if (hasUpcomingMessage(isRunning, messages)) {\n const parentId = messages.at(-1)?.id ?? null;\n if (this._optimistic?.parentId !== parentId) {\n this._optimistic = { id: generateId(), parentId };\n }\n optimisticId = this._optimistic.id;\n this.repository.addOrUpdateMessage(\n parentId,\n fromThreadMessageLike(\n { role: \"assistant\", content: [], metadata: { isOptimistic: true } },\n optimisticId,\n { type: \"running\" },\n ),\n );\n }\n\n if (optimisticId === null) this._optimistic = null;\n this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);\n\n const messagesSnapshot = this.repository.getMessages();\n if (\n !this._messages ||\n !shallowArrayEqual(this._messages, messagesSnapshot)\n ) {\n this._messages = messagesSnapshot;\n }\n\n if (this._voiceMessages.length > 0) {\n const hostIds = new Set(this._messages.map((message) => message.id));\n const remaining = this._voiceMessages.filter(\n (message) => !hostIds.has(message.id),\n );\n if (remaining.length !== this._voiceMessages.length) {\n this._voiceMessages = remaining;\n this._markVoiceMessagesDirty();\n }\n }\n\n if (repositoryChanged) {\n this._runTrackerUpdate(() => this._toolInvocations?.reset());\n }\n this._runTrackerUpdate(() => this._driveToolInvocations());\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._toolStatuses = new Map();\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n observeAdapterCallback(\n \"onAddToolResult\",\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n }),\n );\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n const hadExecutingTools = this._hasExecutingTools(this._store);\n this._toolStatuses = statuses;\n try {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n } finally {\n if (hadExecutingTools !== this._hasExecutingTools(this._store)) {\n if (this._inTrackerUpdate) {\n this._pendingRunningRefresh = true;\n } else {\n this._updateStoreSnapshot(this._store);\n }\n }\n }\n },\n },\n (toolCall) => this._store.unstable_isClientToolCall?.(toolCall),\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._getEffectiveIsRunning(this._store),\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n for (const { part, messageId } of walkToolCallTree(this._messages)) {\n this._toolCallToMessageId.set(part.toolCallId, messageId);\n }\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._getEffectiveIsRunning(this._store)) {\n return;\n }\n\n const onBranchChange = this._store.unstable_onBranchChange;\n const previousHeadId = onBranchChange\n ? this.repository.canonicalHeadId\n : null;\n\n this.repository.switchToBranch(branchId);\n this._pendingDeleteEvictions.clear();\n this.updateMessages(this.repository.getMessages());\n if (onBranchChange) {\n this._notifyBranchChange(previousHeadId, onBranchChange);\n }\n }\n\n /**\n * Emit `unstable_onBranchChange` for an explicit branch switch. Reads the\n * canonical head from the repository (which skips optimistic/transient\n * messages) and de-dupes switches that leave the canonical head unchanged.\n * Comparing against the head observed just before the switch — rather than the\n * last emitted head — keeps a switch firing after an adapter resync moved the\n * head elsewhere in the meantime.\n */\n private _notifyBranchChange(\n previousHeadId: string | null,\n onBranchChange: (event: ExternalStoreBranchChange) => void,\n ): void {\n const headId = this.repository.canonicalHeadId;\n if (headId === previousHeadId) return;\n\n onBranchChange({\n headId,\n visibleMessageIds: this.repository.getMessages().map((m) => m.id),\n });\n }\n\n public async append(rawMessage: AppendMessage): Promise<void> {\n let message = {\n ...rawMessage,\n parentId: this._resolveAppendParent(rawMessage.parentId),\n };\n if (this.voice) return this._appendToVoiceSession(message);\n if (this._isVoiceMessage(message.sourceId))\n throw new Error(\"Voice transcript messages cannot be edited\");\n // sourceId marks an edit send; the parent may coincide with the head\n // after a resync (e.g. cancelRun dropped the edited message).\n const isEdit =\n message.sourceId != null ||\n message.parentId !== (this._getBaseMessages().at(-1)?.id ?? null);\n\n // A transformed-queue send is stamped at flush; any other queue's\n // transform would gate against its own thread's messages, so those stamp\n // at send.\n message =\n !isEdit &&\n this._store.queue &&\n this._store.queue === this._transformedQueue\n ? message\n : this.enrichAppendMetadata(message);\n\n const generation = captureThreadRuntimeGeneration(this);\n this.ensureInitialized();\n\n // The getter call is what starts thread initialization.\n const initPromise = this._getInitializePromise?.();\n\n // The queue driver dispatches through the host adapter, outside this\n // core, so the initialization barrier must run before a message can\n // enter the queue.\n if (!isEdit && this._store.queue) {\n if (initPromise) {\n await initPromise;\n }\n if (generation.aborted) return;\n\n // Buffering does not start a run, so the tool-abort below must wait\n // until the queue flushes. By then the prior run (and its tools) has\n // settled.\n if (message.steer ?? this._getEffectiveIsRunning(this._store))\n this._store.queue.steer(message);\n else this._store.queue.enqueue(message);\n return;\n }\n\n // The optimistic insert lives inside the adapter's dispatch, so holding\n // `onNew` on initialization would keep the message off screen for the\n // whole roundtrip. Seams that need the remote identity await\n // `threadListItem.initialize()` themselves, and a rejection surfaces\n // there.\n void initPromise?.catch(() => {});\n\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort({ discardPending: true });\n }\n if (generation.aborted) return;\n\n if (isEdit) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n this._pendingDeleteEvictions.clear();\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n protected override _commitVoiceMessage(\n message: ThreadMessage,\n ): void | Promise<void> {\n const generation = captureThreadRuntimeGeneration(this);\n if (generation.aborted) {\n this._dropVoiceMessage(message.id, false);\n return;\n }\n const barrier = this._getVoiceCommitBarrier();\n if (!barrier) {\n this._store.onVoiceTranscript?.(message);\n return;\n }\n // A React host recreates its callbacks on the render that ends the load,\n // so the delivery reads the adapter current then rather than the callback\n // that produced the message. The repository is the one conversation\n // identity that survives those renders and moves when a host routes\n // another conversation through this runtime; a host that swaps only its\n // messages is indistinguishable from a load finishing.\n const repository = this.repository;\n return barrier.then(() => {\n if (generation.aborted || this.repository !== repository) {\n this._dropVoiceMessage(message.id, true);\n return;\n }\n this._store.onVoiceTranscript?.(message);\n });\n }\n\n public async deleteMessage(messageId: string): Promise<void> {\n if (this._store.onDelete) {\n // The host owns deletion here, and it may decline (fail a server call,\n // cancel a confirm dialog, ignore an off-branch id). The eviction is\n // therefore deferred to the snapshot pass, which evicts only once the\n // host's own array no longer carries the id. Registered before the\n // callback because an optimistic host publishes that snapshot while\n // the callback is still awaited.\n const wasVisible = this.repository\n .getMessages()\n .some((m) => m.id === messageId);\n const call = Symbol();\n if (wasVisible) {\n const calls = this._pendingDeleteEvictions.get(messageId) ?? new Set();\n this._pendingDeleteEvictions.set(messageId, calls.add(call));\n }\n try {\n await this._store.onDelete(messageId);\n } finally {\n this._pendingDeleteEvictions.get(messageId)?.delete(call);\n }\n return;\n }\n\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support deleting messages.\");\n\n if (this._getEffectiveIsRunning(this._store)) {\n await this._toolInvocations?.abort();\n }\n\n const messages = this.repository.getMessages();\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) throw new Error(\"Message not found.\");\n\n this._pendingDeleteEvictions.clear();\n this.updateMessages(messages.filter((message) => message.id !== messageId));\n this._evictDeletedMessage(messageId);\n }\n\n // The snapshot pass only relinks incoming messages; it never evicts, so\n // without this the deleted message survives as a sibling branch that the\n // branch picker can resurrect into the host store. `_messages` is refreshed\n // before notifying so `messages` and the branch graph agree at notify time,\n // mirroring the end of the snapshot pass.\n private _evictDeletedMessage(messageId: string) {\n // Positional fallback ids are remapped in the snapshot pass; evicting\n // them first leaves the pre-renumber node as a sibling of the new head.\n if (messageId.startsWith(FALLBACK_ID_PREFIX)) return;\n // A synchronous host update (e.g. a setMessages that re-entered the\n // snapshot pass) may have evicted the message already; only that case is\n // skipped, so genuine repository errors still propagate.\n try {\n this.repository.getMessage(messageId);\n } catch {\n return;\n }\n\n this.repository.deleteMessage(messageId);\n this._publishRepositoryMessages();\n }\n\n // Notifies even when the visible messages are unchanged: deleting an\n // off-branch message still changes the branch counts subscribers read.\n private _publishRepositoryMessages() {\n const messages = this.repository.getMessages();\n if (!shallowArrayEqual(this._messages, messages)) this._messages = messages;\n this._notifySubscribers();\n }\n\n public getQueueItems() {\n // The composer reads this during base-thread construction, before the\n // constructor assigns `_store`, so guard against the unset field.\n return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;\n }\n\n public getSteerQueueItems() {\n return this._store?.queue?.steerItems ?? EMPTY_QUEUE_ITEMS;\n }\n\n public moveQueueItem(queueItemId: string, placement: QueuePlacement) {\n this._store?.queue?.move(queueItemId, placement);\n }\n\n public removeQueueItem(queueItemId: string) {\n this._store?.queue?.remove(queueItemId);\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n if (this.voice)\n throw new Error(\"Cannot start a run while a voice session is connected\");\n if (this._isVoiceMessage(config.sourceId))\n throw new Error(\"Voice transcript messages cannot be reloaded\");\n\n const visible = this.repository.getMessages();\n const kept = new Set(\n visible\n .slice(0, visible.findIndex((m) => m.id === config.parentId) + 1)\n .map((m) => m.id),\n );\n for (const id of this._pendingDeleteEvictions.keys()) {\n if (!kept.has(id)) this._pendingDeleteEvictions.delete(id);\n }\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort({ discardPending: true });\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n if (this.voice)\n throw new Error(\"Cannot start a run while a voice session is connected\");\n if (this._isVoiceMessage(config.sourceId))\n throw new Error(\"Voice transcript messages cannot be reloaded\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. The tracker publishes the\n // cleared status map itself, so adapter-side statuses reset only when\n // the tracker is the source of truth.\n this._runTrackerUpdate(() => this._toolInvocations?.reset());\n\n this._store.onLoadExternalState(state);\n }\n\n /**\n * Adapter-facing notification that the backing session was discarded.\n * Clears session-scoped tool-invocation state and parks queued work,\n * without run-cancel semantics (`onCancel`, composer draft restoration).\n */\n public unstable_notifySessionReset(): void {\n this._runTrackerUpdate(() => this._toolInvocations?.reset());\n this._store.queue?.__internal_notifyCancelled?.();\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n const generation = captureThreadRuntimeGeneration(this);\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort({ discardPending: true });\n\n // Before the run is aborted, so the settle it produces keeps the pending\n // items instead of dispatching the next one at the moment the user\n // stopped.\n this._store.queue?.__internal_notifyCancelled?.();\n\n observeAdapterCallback(\"onCancel\", this._store.onCancel());\n\n this.dropEmptyOptimisticHead();\n\n const messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n const trailingUserLeaf =\n this._store.setMessages !== undefined &&\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id && // ensure the previous message is a leaf node\n previousMessage.content.every((part) => part.type === \"text\")\n ? previousMessage\n : undefined;\n\n // Handing the message to the composer and taking it out of the thread are\n // one move: the composer refuses while the user is writing, and removing\n // the message then would leave it nowhere. A message the composer cannot\n // hold whole, carrying content parts it has no home for, is not moved.\n let movedLeaf:\n | {\n id: string;\n draft: {\n text: string;\n attachments: readonly Attachment[];\n quote: QuoteInfo | undefined;\n };\n }\n | undefined;\n if (trailingUserLeaf) {\n const draft = {\n text: getThreadMessageText(trailingUserLeaf),\n attachments: trailingUserLeaf.attachments,\n quote: trailingUserLeaf.metadata.custom.quote as QuoteInfo | undefined,\n };\n if (this.composer.restoreDraft(draft)) {\n this.repository.deleteMessage(trailingUserLeaf.id);\n movedLeaf = { id: trailingUserLeaf.id, draft };\n }\n }\n this._publishRepositoryMessages();\n\n // The resync commits what the cancel left (a kept optimistic message, the\n // restored branch) back to the store a macrotask later. The store may move\n // in that gap; a server settling the cancelled turn lands in the same\n // tick. Read the repository at flush time and re-apply the rollbacks to\n // it, instead of stamping a snapshot captured above over the newer state.\n setTimeout(() => {\n if (generation.aborted) return;\n\n this.dropEmptyOptimisticHead();\n if (movedLeaf) {\n const current = this.repository.getMessages();\n if (current.at(-1)?.id === movedLeaf.id) {\n // Unanswered tail: the removal has not reached the store yet.\n this.repository.deleteMessage(movedLeaf.id);\n } else if (current.some((m) => m.id === movedLeaf.id)) {\n // The store kept the turn in the thread; take the untouched draft\n // back so the same content does not sit in both places.\n this.composer.retractDraft(movedLeaf.draft);\n }\n }\n this._publishRepositoryMessages();\n this.updateMessages(this._messages);\n }, 0);\n }\n\n // Placeholder or pre-stream message; a partially-streamed one is kept and\n // committed to the store by the cancel resync.\n private dropEmptyOptimisticHead(): void {\n const head = this.repository.getMessages().at(-1);\n if (head && head.metadata.isOptimistic && head.content.length === 0) {\n this.repository.deleteMessage(head.id);\n }\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n observeAdapterCallback(\n \"onAddToolResult\",\n this._store.onAddToolResult(options),\n );\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(\n options: RespondToToolApprovalOptions,\n ): Promise<void> {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n const message = this.messages.findLast(\n (candidate) =>\n candidate.role === \"assistant\" &&\n candidate.content.some(\n (part) =>\n part.type === \"tool-call\" &&\n part.approval?.id === options.approvalId,\n ),\n );\n const toolCall = message?.content.find(\n (part) =>\n part.type === \"tool-call\" && part.approval?.id === options.approvalId,\n );\n try {\n return Promise.resolve(this._store.onRespondToToolApproval(options)).then(\n () => {\n if (message && toolCall?.type === \"tool-call\") {\n this._notifyToolApprovalAnswered(\n message.id,\n toolCall.toolCallId,\n toolCall.toolName,\n options.approved,\n );\n }\n },\n );\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n public async unstable_recordToolInteraction(\n options: Unstable_RecordToolInteractionOptions,\n ): Promise<void> {\n if (!this._store.unstable_onRecordToolInteraction)\n throw new Error(\"Runtime does not support recording tool interactions.\");\n await this._store.unstable_onRecordToolInteraction(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
@@ -1,10 +1,7 @@
1
- import { ThreadMessage } from "../../types/message.js";
2
- //#region src/runtimes/external-store/thread-message-converter.d.ts
3
- type ConverterCallback<TIn> = (cache: ThreadMessage | undefined, message: TIn, idx: number) => ThreadMessage;
4
- declare class ThreadMessageConverter {
5
- private readonly cache;
6
- convertMessages<TIn extends WeakKey>(messages: readonly TIn[], converter: ConverterCallback<TIn>): ThreadMessage[];
1
+ import type { ThreadMessage } from "../../types/message.js";
2
+ export type ConverterCallback<TIn> = (cache: ThreadMessage | undefined, message: TIn, idx: number) => ThreadMessage;
3
+ export declare class ThreadMessageConverter {
4
+ private readonly cache;
5
+ convertMessages<TIn extends WeakKey>(messages: readonly TIn[], converter: ConverterCallback<TIn>): ThreadMessage[];
7
6
  }
8
- //#endregion
9
- export { ConverterCallback, ThreadMessageConverter };
10
7
  //# sourceMappingURL=thread-message-converter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"thread-message-converter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/thread-message-converter.ts"],"mappings":";;KAEY,kBAAkB,QAC5B,OAAO,2BACP,SAAS,KACT,gBACG;cAEQ;mBACM;EAEjB,gBAAgB,YAAY,SAC1B,mBAAmB,OACnB,WAAW,kBAAkB,OAC5B"}
1
+ {"version":3,"file":"thread-message-converter.d.ts","sourceRoot":"","sources":["../../../src/runtimes/external-store/thread-message-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA4B;AAEzD,MAAM,MAAM,iBAAiB,CAAC,GAAG,IAAI,CACnC,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,OAAO,EAAE,GAAG,EACZ,GAAG,EAAE,MAAM,KACR,aAAa,CAAC;AAEnB,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyC;IAE/D,eAAe,CAAC,GAAG,SAAS,OAAO,EACjC,QAAQ,EAAE,SAAS,GAAG,EAAE,EACxB,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAChC,aAAa,EAAE;CAQnB"}