@assistant-ui/core 0.2.21 → 0.2.23

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 (345) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/speech.d.ts.map +1 -1
  3. package/dist/adapters/speech.js +9 -2
  4. package/dist/adapters/speech.js.map +1 -1
  5. package/dist/adapters/thread-history.d.ts +8 -0
  6. package/dist/adapters/thread-history.d.ts.map +1 -1
  7. package/dist/adapters/voice.d.ts.map +1 -1
  8. package/dist/adapters/voice.js +13 -5
  9. package/dist/adapters/voice.js.map +1 -1
  10. package/dist/internal.d.ts +5 -2
  11. package/dist/internal.js +5 -2
  12. package/dist/model-context/frame/host.d.ts +1 -0
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +41 -21
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/frame/provider.d.ts.map +1 -1
  17. package/dist/model-context/frame/provider.js +1 -0
  18. package/dist/model-context/frame/provider.js.map +1 -1
  19. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  20. package/dist/model-context/types.d.ts.map +1 -1
  21. package/dist/model-context/types.js +13 -4
  22. package/dist/model-context/types.js.map +1 -1
  23. package/dist/react/AssistantProvider.js.map +1 -1
  24. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  25. package/dist/react/adapters/LocalStorageThreadListAdapter.js +78 -50
  26. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  27. package/dist/react/client/Interactables.js.map +1 -1
  28. package/dist/react/client/Tools.d.ts.map +1 -1
  29. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  30. package/dist/react/client/interactable-model-context.js +1 -0
  31. package/dist/react/client/interactable-model-context.js.map +1 -1
  32. package/dist/react/interactables-legacy/useInteractableState.js +1 -0
  33. package/dist/react/interactables-legacy/useInteractableState.js.map +1 -1
  34. package/dist/react/model-context/useInteractable.js.map +1 -1
  35. package/dist/react/model-context/useInteractableState.js +1 -0
  36. package/dist/react/model-context/useInteractableState.js.map +1 -1
  37. package/dist/react/model-context/useInteractableVersions.js +1 -0
  38. package/dist/react/model-context/useInteractableVersions.js.map +1 -1
  39. package/dist/react/model-context/useToolArgsStatus.js +1 -0
  40. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  41. package/dist/react/primitive-hooks/useActionBarCopy.js +14 -13
  42. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  43. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -0
  44. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  45. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -0
  46. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  47. package/dist/react/primitive-hooks/useActionBarReload.js +1 -0
  48. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  49. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -0
  50. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  51. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -0
  52. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  53. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -0
  54. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  55. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -0
  56. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  57. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  58. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -0
  59. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  60. package/dist/react/primitive-hooks/useComposerCancel.js +1 -0
  61. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  62. package/dist/react/primitive-hooks/useComposerDictate.js +1 -0
  63. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  64. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  65. package/dist/react/primitive-hooks/useComposerSend.js +1 -0
  66. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  67. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -0
  68. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  69. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -0
  70. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  71. package/dist/react/primitive-hooks/useMessageBranching.js +1 -0
  72. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  73. package/dist/react/primitive-hooks/useMessageReload.js +1 -0
  74. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  75. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -0
  76. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  77. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -0
  78. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  79. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -0
  80. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  81. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -0
  82. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  83. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -0
  84. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  85. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -0
  86. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  87. package/dist/react/primitive-hooks/useThreadListNew.js +1 -0
  88. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  89. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  90. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  91. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  92. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  93. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  94. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  95. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  96. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  97. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  98. package/dist/react/primitives/message/MessageParts.d.ts +2 -1
  99. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  100. package/dist/react/primitives/message/MessageParts.js +46 -36
  101. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  102. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  103. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  104. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  105. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  106. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  107. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +18 -30
  108. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  109. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  110. package/dist/react/providers/PartByIndexProvider.js +18 -30
  111. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  112. package/dist/react/providers/TextMessagePartProvider.js +1 -0
  113. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  114. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  115. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -0
  116. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  117. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +9 -2
  118. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  119. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +55 -12
  120. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  121. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +31 -1
  122. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +12 -2
  124. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  125. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -1
  126. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  127. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -2
  128. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  129. package/dist/react/runtimes/cloud/auiV0.d.ts +12 -1
  130. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  131. package/dist/react/runtimes/cloud/auiV0.js +2 -1
  132. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  133. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +75 -73
  134. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  135. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  136. package/dist/react/runtimes/external-message-converter.js +2 -2
  137. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  138. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -0
  139. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  140. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  141. package/dist/react/runtimes/useLocalRuntime.js +9 -1
  142. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  143. package/dist/runtime/api/assistant-runtime.d.ts +1 -1
  144. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  145. package/dist/runtime/api/assistant-runtime.js +1 -1
  146. package/dist/runtime/api/assistant-runtime.js.map +1 -1
  147. package/dist/runtime/api/attachment-runtime.d.ts +1 -1
  148. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  149. package/dist/runtime/api/attachment-runtime.js +1 -1
  150. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  151. package/dist/runtime/api/composer-runtime.d.ts +2 -2
  152. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  153. package/dist/runtime/api/composer-runtime.js +2 -2
  154. package/dist/runtime/api/composer-runtime.js.map +1 -1
  155. package/dist/runtime/api/message-part-runtime.d.ts +4 -4
  156. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  157. package/dist/runtime/api/message-part-runtime.js +3 -3
  158. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  159. package/dist/runtime/api/message-runtime.d.ts +1 -1
  160. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  161. package/dist/runtime/api/message-runtime.js +6 -6
  162. package/dist/runtime/api/message-runtime.js.map +1 -1
  163. package/dist/runtime/api/thread-list-item-runtime.d.ts +1 -1
  164. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  165. package/dist/runtime/api/thread-list-item-runtime.js +4 -3
  166. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  167. package/dist/runtime/api/thread-list-runtime.d.ts +1 -1
  168. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  169. package/dist/runtime/api/thread-list-runtime.js +1 -1
  170. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  171. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  172. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -1
  173. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  174. package/dist/runtime/base/base-composer-runtime-core.js +41 -14
  175. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  176. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -1
  177. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  178. package/dist/runtime/base/base-thread-runtime-core.js +3 -2
  179. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  180. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +2 -2
  181. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  182. package/dist/runtime/base/default-edit-composer-runtime-core.js +6 -4
  183. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  184. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  185. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  186. package/dist/runtime/base/default-thread-composer-runtime-core.js +3 -3
  187. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  188. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  189. package/dist/runtime/utils/message-repository.js +4 -2
  190. package/dist/runtime/utils/message-repository.js.map +1 -1
  191. package/dist/runtime/utils/thread-message-like.js +4 -1
  192. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  193. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  194. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -1
  195. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +1 -1
  197. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  198. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  199. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +12 -0
  200. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  201. package/dist/runtimes/internal.d.ts +2 -1
  202. package/dist/runtimes/internal.js +2 -1
  203. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  204. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  206. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  207. package/dist/runtimes/local/local-thread-runtime-core.js +49 -15
  208. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  209. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  210. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +4 -4
  211. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  212. package/dist/runtimes/remote-thread-list/optimistic-state.js +22 -9
  213. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  214. package/dist/runtimes/remote-thread-list/types.d.ts +1 -1
  215. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +32 -27
  216. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  217. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +3 -2
  218. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  219. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  220. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  221. package/dist/store/clients/no-op-composer-client.js +1 -0
  222. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  223. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  224. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  225. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  226. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  227. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  228. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  229. package/dist/store/runtime-clients/thread-list-runtime-client.js +1 -0
  230. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  231. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  232. package/dist/store/runtime-clients/thread-runtime-client.js +17 -15
  233. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  234. package/dist/store/scopes/thread.d.ts +1 -0
  235. package/dist/store/scopes/thread.d.ts.map +1 -1
  236. package/dist/subscribable/subscribable.d.ts +4 -4
  237. package/dist/subscribable/subscribable.d.ts.map +1 -1
  238. package/dist/subscribable/subscribable.js +14 -6
  239. package/dist/subscribable/subscribable.js.map +1 -1
  240. package/dist/tests/remote-thread-list-test-helpers.d.ts +2 -1
  241. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  242. package/dist/tests/remote-thread-list-test-helpers.js +5 -2
  243. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  244. package/dist/types/attachment.d.ts +2 -1
  245. package/dist/types/attachment.d.ts.map +1 -1
  246. package/dist/types/attachment.js +6 -0
  247. package/dist/types/attachment.js.map +1 -0
  248. package/dist/types/message.d.ts +1 -0
  249. package/dist/types/message.d.ts.map +1 -1
  250. package/dist/types/message.js.map +1 -1
  251. package/dist/utils/data-url.d.ts +9 -0
  252. package/dist/utils/data-url.d.ts.map +1 -0
  253. package/dist/utils/data-url.js +14 -0
  254. package/dist/utils/data-url.js.map +1 -0
  255. package/dist/utils/notify-event-listeners.d.ts +6 -0
  256. package/dist/utils/notify-event-listeners.d.ts.map +1 -0
  257. package/dist/utils/notify-event-listeners.js +16 -0
  258. package/dist/utils/notify-event-listeners.js.map +1 -0
  259. package/package.json +10 -9
  260. package/src/adapters/speech.test.ts +88 -0
  261. package/src/adapters/speech.ts +17 -2
  262. package/src/adapters/thread-history.ts +8 -0
  263. package/src/adapters/voice.test.ts +130 -0
  264. package/src/adapters/voice.ts +26 -6
  265. package/src/internal.ts +6 -1
  266. package/src/model-context/frame/host.test.ts +147 -0
  267. package/src/model-context/frame/host.ts +56 -19
  268. package/src/model-context/frame/provider.test.ts +83 -0
  269. package/src/model-context/frame/provider.ts +1 -0
  270. package/src/model-context/types.ts +16 -6
  271. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +82 -0
  272. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +108 -58
  273. package/src/react/primitive-hooks/useActionBarCopy.test.ts +79 -0
  274. package/src/react/primitive-hooks/useActionBarCopy.ts +4 -3
  275. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -3
  276. package/src/react/primitives/message/MessageParts.tsx +48 -35
  277. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +19 -2
  278. package/src/react/providers/PartByIndexProvider.tsx +16 -2
  279. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +18 -0
  280. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +1 -0
  281. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +68 -13
  282. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +34 -0
  283. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +69 -0
  284. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +27 -6
  285. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +16 -0
  286. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +7 -2
  287. package/src/react/runtimes/cloud/auiV0.ts +14 -0
  288. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +90 -88
  289. package/src/react/runtimes/external-message-converter.test.ts +346 -0
  290. package/src/react/runtimes/external-message-converter.test.tsx +21 -0
  291. package/src/react/runtimes/external-message-converter.ts +2 -2
  292. package/src/react/runtimes/useLocalRuntime.test.tsx +99 -0
  293. package/src/react/runtimes/useLocalRuntime.ts +13 -1
  294. package/src/runtime/api/assistant-runtime.ts +4 -1
  295. package/src/runtime/api/attachment-runtime.ts +8 -2
  296. package/src/runtime/api/composer-runtime.ts +9 -5
  297. package/src/runtime/api/message-part-runtime.ts +10 -3
  298. package/src/runtime/api/message-runtime.test.ts +81 -0
  299. package/src/runtime/api/message-runtime.ts +11 -8
  300. package/src/runtime/api/thread-list-item-runtime.ts +13 -3
  301. package/src/runtime/api/thread-list-runtime.ts +10 -2
  302. package/src/runtime/base/base-composer-runtime-core.ts +77 -31
  303. package/src/runtime/base/base-thread-runtime-core.ts +7 -2
  304. package/src/runtime/base/default-edit-composer-runtime-core.ts +18 -4
  305. package/src/runtime/base/default-thread-composer-runtime-core.ts +13 -3
  306. package/src/runtime/utils/message-repository.ts +19 -13
  307. package/src/runtime/utils/thread-message-like.ts +1 -0
  308. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  309. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +15 -0
  310. package/src/runtimes/internal.ts +3 -0
  311. package/src/runtimes/local/local-thread-runtime-core.test.ts +746 -1
  312. package/src/runtimes/local/local-thread-runtime-core.ts +89 -23
  313. package/src/runtimes/local/should-continue.test.ts +122 -0
  314. package/src/runtimes/remote-thread-list/optimistic-state.test.ts +63 -0
  315. package/src/runtimes/remote-thread-list/optimistic-state.ts +49 -17
  316. package/src/runtimes/remote-thread-list/types.ts +1 -1
  317. package/src/runtimes/tool-invocations/EDGE_CASES.md +13 -19
  318. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +128 -8
  319. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +42 -34
  320. package/src/store/clients/model-context-client.test.ts +21 -1
  321. package/src/store/runtime-clients/thread-runtime-client.ts +2 -1
  322. package/src/store/scopes/thread.ts +1 -0
  323. package/src/subscribable/subscribable.test.ts +58 -0
  324. package/src/subscribable/subscribable.ts +29 -11
  325. package/src/tests/MessageRepository.test.ts +12 -0
  326. package/src/tests/OptimisticState-list-race.test.ts +33 -0
  327. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-order.test.ts +223 -0
  328. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-position.test.ts +121 -0
  329. package/src/tests/auiV0Encode.test.ts +74 -0
  330. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +44 -0
  331. package/src/tests/base-composer-runtime-core-send.test.ts +433 -5
  332. package/src/tests/base-composer-runtime-core.test.ts +422 -0
  333. package/src/tests/default-edit-composer-runtime-core.test.ts +43 -5
  334. package/src/tests/event-subscription-listener-errors.test.ts +205 -0
  335. package/src/tests/external-store-thread-list-runtime-core.test.ts +6 -6
  336. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +575 -0
  337. package/src/tests/external-store-thread-runtime-core.test.ts +55 -1
  338. package/src/tests/remote-thread-list-test-helpers.ts +14 -7
  339. package/src/tests/thread-message-like.test.ts +57 -0
  340. package/src/types/attachment.ts +5 -0
  341. package/src/types/message.ts +1 -0
  342. package/src/utils/data-url.test.ts +50 -0
  343. package/src/utils/data-url.ts +9 -0
  344. package/src/utils/notify-event-listeners.ts +30 -0
  345. package/src/tests/OptimisticState-delete-crash.test.ts +0 -208
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadSuggestions.js","names":["ComponentType","FC","ReactNode","memo","useMemo","RenderChildrenWithAccessor","useAuiState","SuggestionState","SuggestionByIndexProvider","SuggestionsComponentConfig","Suggestion","ThreadPrimitiveSuggestions","Props","components","children","value","suggestion","SuggestionComponentProps","SuggestionComponent","t0","$","_c","Component","t1","ThreadPrimitiveSuggestionByIndex","index","t2","prev","next","displayName","ThreadPrimitiveSuggestionsInner","suggestionsLength","s","suggestions","length","Array","from","_","aui","getState","getItem","ThreadPrimitiveSuggestionsImpl"],"sources":["../../../../src/react/primitives/thread/ThreadSuggestions.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ReactNode,\n memo,\n useMemo,\n} from \"react\";\nimport { RenderChildrenWithAccessor, useAuiState } from \"@assistant-ui/store\";\nimport type { SuggestionState } from \"../../../store/scopes/suggestion\";\nimport { SuggestionByIndexProvider } from \"../../providers/SuggestionByIndexProvider\";\n\ntype SuggestionsComponentConfig = {\n /** Component used to render each suggestion */\n Suggestion: ComponentType;\n};\n\nexport namespace ThreadPrimitiveSuggestions {\n export type Props =\n | {\n /** @deprecated Use the children render function instead. */\n components: SuggestionsComponentConfig;\n children?: never;\n }\n | {\n /** Render function called for each suggestion. Receives the suggestion. */\n children: (value: { suggestion: SuggestionState }) => ReactNode;\n components?: never;\n };\n}\n\ntype SuggestionComponentProps = {\n components: SuggestionsComponentConfig;\n};\n\nconst SuggestionComponent: FC<SuggestionComponentProps> = ({ components }) => {\n const Component = components.Suggestion;\n return <Component />;\n};\n\nexport namespace ThreadPrimitiveSuggestionByIndex {\n export type Props = {\n index: number;\n components: SuggestionsComponentConfig;\n };\n}\n\n/**\n * Renders a single suggestion at the specified index.\n */\nexport const ThreadPrimitiveSuggestionByIndex: FC<ThreadPrimitiveSuggestionByIndex.Props> =\n memo(\n ({ index, components }) => {\n return (\n <SuggestionByIndexProvider index={index}>\n <SuggestionComponent components={components} />\n </SuggestionByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index &&\n prev.components.Suggestion === next.components.Suggestion,\n );\n\nThreadPrimitiveSuggestionByIndex.displayName =\n \"ThreadPrimitive.SuggestionByIndex\";\n\nconst ThreadPrimitiveSuggestionsInner: FC<{\n children: (value: { suggestion: SuggestionState }) => ReactNode;\n}> = ({ children }) => {\n const suggestionsLength = useAuiState(\n (s) => s.suggestions.suggestions.length,\n );\n\n return useMemo(() => {\n if (suggestionsLength === 0) return null;\n return Array.from({ length: suggestionsLength }, (_, index) => (\n <SuggestionByIndexProvider key={index} index={index}>\n <RenderChildrenWithAccessor\n getItemState={(aui) =>\n aui.suggestions().suggestion({ index }).getState()\n }\n >\n {(getItem) =>\n children({\n get suggestion() {\n return getItem();\n },\n })\n }\n </RenderChildrenWithAccessor>\n </SuggestionByIndexProvider>\n ));\n }, [suggestionsLength, children]);\n};\n\n/**\n * Renders all suggestions.\n */\nexport const ThreadPrimitiveSuggestionsImpl: FC<\n ThreadPrimitiveSuggestions.Props\n> = ({ components, children }) => {\n if (components) {\n return (\n <ThreadPrimitiveSuggestionsInner>\n {() => <SuggestionComponent components={components} />}\n </ThreadPrimitiveSuggestionsInner>\n );\n }\n return (\n <ThreadPrimitiveSuggestionsInner>\n {children}\n </ThreadPrimitiveSuggestionsInner>\n );\n};\n\nThreadPrimitiveSuggestionsImpl.displayName = \"ThreadPrimitive.Suggestions\";\n\nexport const ThreadPrimitiveSuggestions = memo(\n ThreadPrimitiveSuggestionsImpl,\n (prev, next) => {\n if (prev.children || next.children) {\n return prev.children === next.children;\n }\n return prev.components!.Suggestion === next.components!.Suggestion;\n },\n);\n"],"mappings":";;;;;;AAkCA,MAAMkB,uBAAoDC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAR,eAAAM;CACzD,MAAAG,YAAkBT,WAAUH;CAAY,IAAAa;CAAA,IAAAH,EAAA,OAAAE,WAAA;EACjCC,KAAA,oBAAC,WAAD,CAAU,CAAA;EAAGH,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAAbG;AAAa;;;;AAatB,MAAaC,mCACXrB,MACEgB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAI,OAAAZ,eAAAM;CAAqB,IAAAI;CAAA,IAAAH,EAAA,OAAAP,YAAA;EAGhBU,KAAA,oBAAC,qBAAD,EAAiCV,WAAU,CAAA;EAAIO,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAK,SAAAL,EAAA,OAAAG,IAAA;EADjDG,KAAA,oBAAC,2BAAD;GAAkCD;aAChCF;EADwB,CAAA;EAEEH,EAAA,KAAAK;EAAAL,EAAA,KAAAG;EAAAH,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OAF5BM;AAE4B,IAG/BC,MAAMC,SACLD,KAAKF,UAAUG,KAAKH,SACpBE,KAAKd,WAAWH,eAAekB,KAAKf,WAAWH,UACnD;AAEFc,iCAAiCK,cAC/B;AAEF,MAAMC,mCAEA,EAAEhB,eAAe;CACrB,MAAMiB,oBAAoBzB,aACvB0B,MAAMA,EAAEC,YAAYA,YAAYC,MACnC;CAEA,OAAO9B,cAAc;EACnB,IAAI2B,sBAAsB,GAAG,OAAO;EACpC,OAAOI,MAAMC,KAAK,EAAEF,QAAQH,kBAAkB,IAAIM,GAAGZ,UACnD,oBAAC,2BAAD;GAA8CA;aAC5C,oBAAC,4BAAD;IACE,eAAea,QACbA,IAAIL,YAAY,CAAC,CAACjB,WAAW,EAAES,MAAM,CAAC,CAAC,CAACc,SAAS;eAGjDC,YACA1B,SAAS,EACP,IAAIE,aAAa;KACf,OAAOwB,QAAQ;IACjB,EACF,CAAC;GAEuB,CAAA;EACH,GAdKf,KAcL,CAC5B;CACH,GAAG,CAACM,mBAAmBjB,QAAQ,CAAC;AAClC;;;;AAKA,MAAa2B,kCAETtB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAR,YAAAC,aAAAK;CACH,IAAIN,YAAU;EAAA,IAAAU;EAAA,IAAAH,EAAA,OAAAP,YAAA;GAEVU,KAAA,oBAAC,iCAAD,EAAA,gBACS,oBAAC,qBAAD,EAAiCV,WAAU,CAAA,EADpB,CAAA;GAEEO,EAAA,KAAAP;GAAAO,EAAA,KAAAG;EAAA,OAAAA,KAAAH,EAAA;EAAA,OAFlCG;CAEkC;CAErC,IAAAA;CAAA,IAAAH,EAAA,OAAAN,UAAA;EAECS,KAAA,oBAAC,iCAAD,EACGT,SAD6B,CAAA;EAEEM,EAAA,KAAAN;EAAAM,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAFlCG;AAEkC;AAItCkB,+BAA+BZ,cAAc;AAE7C,MAAalB,6BAA6BR,KACxCsC,iCACCd,MAAMC,SAAS;CACd,IAAID,KAAKb,YAAYc,KAAKd,UACxB,OAAOa,KAAKb,aAAac,KAAKd;CAEhC,OAAOa,KAAKd,WAAYH,eAAekB,KAAKf,WAAYH;AAC1D,CACF"}
1
+ {"version":3,"file":"ThreadSuggestions.js","names":["ComponentType","FC","ReactNode","memo","useMemo","RenderChildrenWithAccessor","useAuiState","SuggestionState","SuggestionByIndexProvider","SuggestionsComponentConfig","Suggestion","ThreadPrimitiveSuggestions","Props","components","children","value","suggestion","SuggestionComponentProps","SuggestionComponent","t0","$","_c","Component","t1","ThreadPrimitiveSuggestionByIndex","index","t2","prev","next","displayName","ThreadPrimitiveSuggestionsInner","suggestionsLength","s","suggestions","length","Array","from","_","aui","getState","getItem","ThreadPrimitiveSuggestionsImpl"],"sources":["../../../../src/react/primitives/thread/ThreadSuggestions.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ReactNode,\n memo,\n useMemo,\n} from \"react\";\nimport { RenderChildrenWithAccessor, useAuiState } from \"@assistant-ui/store\";\nimport type { SuggestionState } from \"../../../store/scopes/suggestion\";\nimport { SuggestionByIndexProvider } from \"../../providers/SuggestionByIndexProvider\";\n\ntype SuggestionsComponentConfig = {\n /** Component used to render each suggestion */\n Suggestion: ComponentType;\n};\n\nexport namespace ThreadPrimitiveSuggestions {\n export type Props =\n | {\n /** @deprecated Use the children render function instead. */\n components: SuggestionsComponentConfig;\n children?: never;\n }\n | {\n /** Render function called for each suggestion. Receives the suggestion. */\n children: (value: { suggestion: SuggestionState }) => ReactNode;\n components?: never;\n };\n}\n\ntype SuggestionComponentProps = {\n components: SuggestionsComponentConfig;\n};\n\nconst SuggestionComponent: FC<SuggestionComponentProps> = ({ components }) => {\n const Component = components.Suggestion;\n return <Component />;\n};\n\nexport namespace ThreadPrimitiveSuggestionByIndex {\n export type Props = {\n index: number;\n components: SuggestionsComponentConfig;\n };\n}\n\n/**\n * Renders a single suggestion at the specified index.\n */\nexport const ThreadPrimitiveSuggestionByIndex: FC<ThreadPrimitiveSuggestionByIndex.Props> =\n memo(\n ({ index, components }) => {\n return (\n <SuggestionByIndexProvider index={index}>\n <SuggestionComponent components={components} />\n </SuggestionByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index &&\n prev.components.Suggestion === next.components.Suggestion,\n );\n\nThreadPrimitiveSuggestionByIndex.displayName =\n \"ThreadPrimitive.SuggestionByIndex\";\n\nconst ThreadPrimitiveSuggestionsInner: FC<{\n children: (value: { suggestion: SuggestionState }) => ReactNode;\n}> = ({ children }) => {\n const suggestionsLength = useAuiState(\n (s) => s.suggestions.suggestions.length,\n );\n\n return useMemo(() => {\n if (suggestionsLength === 0) return null;\n return Array.from({ length: suggestionsLength }, (_, index) => (\n <SuggestionByIndexProvider key={index} index={index}>\n <RenderChildrenWithAccessor\n getItemState={(aui) =>\n aui.suggestions().suggestion({ index }).getState()\n }\n >\n {(getItem) =>\n children({\n get suggestion() {\n return getItem();\n },\n })\n }\n </RenderChildrenWithAccessor>\n </SuggestionByIndexProvider>\n ));\n }, [suggestionsLength, children]);\n};\n\n/**\n * Renders all suggestions.\n */\nexport const ThreadPrimitiveSuggestionsImpl: FC<\n ThreadPrimitiveSuggestions.Props\n> = ({ components, children }) => {\n if (components) {\n return (\n <ThreadPrimitiveSuggestionsInner>\n {() => <SuggestionComponent components={components} />}\n </ThreadPrimitiveSuggestionsInner>\n );\n }\n return (\n <ThreadPrimitiveSuggestionsInner>\n {children}\n </ThreadPrimitiveSuggestionsInner>\n );\n};\n\nThreadPrimitiveSuggestionsImpl.displayName = \"ThreadPrimitive.Suggestions\";\n\nexport const ThreadPrimitiveSuggestions = memo(\n ThreadPrimitiveSuggestionsImpl,\n (prev, next) => {\n if (prev.children || next.children) {\n return prev.children === next.children;\n }\n return prev.components!.Suggestion === next.components!.Suggestion;\n },\n);\n"],"mappings":";;;;;;AAkCA,MAAMkB,uBAAoDC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAR,eAAAM;CACzD,MAAAG,YAAkBT,WAAUH;CAAY,IAAAa;CAAA,IAAAH,EAAA,OAAAE,WAAA;EACjCC,KAAA,oBAAC,WAAD,CAAU,CAAA;EAAGH,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAAbG;AAAa;;;;AAatB,MAAaC,mCACXrB,MACEgB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAI,OAAAZ,eAAAM;CAAqB,IAAAI;CAAA,IAAAH,EAAA,OAAAP,YAAA;EAGhBU,KAAA,oBAAC,qBAAD,EAAiCV,WAAU,CAAA;EAAIO,EAAA,KAAAP;EAAAO,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAK,SAAAL,EAAA,OAAAG,IAAA;EADjDG,KAAA,oBAAC,2BAAD;GAAkCD;GAChCF,UAAAA;EADwB,CAAA;EAEEH,EAAA,KAAAK;EAAAL,EAAA,KAAAG;EAAAH,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OAF5BM;AAE4B,IAG/BC,MAAMC,SACLD,KAAKF,UAAUG,KAAKH,SACpBE,KAAKd,WAAWH,eAAekB,KAAKf,WAAWH,UACnD;AAEFc,iCAAiCK,cAC/B;AAEF,MAAMC,mCAEA,EAAEhB,eAAe;CACrB,MAAMiB,oBAAoBzB,aACvB0B,MAAMA,EAAEC,YAAYA,YAAYC,MACnC;CAEA,OAAO9B,cAAc;EACnB,IAAI2B,sBAAsB,GAAG,OAAO;EACpC,OAAOI,MAAMC,KAAK,EAAEF,QAAQH,kBAAkB,IAAIM,GAAGZ,UACnD,oBAAC,2BAAD;GAA8CA;GAC5C,UAAA,oBAAC,4BAAD;IACE,eAAea,QACbA,IAAIL,YAAY,CAAC,CAACjB,WAAW,EAAES,MAAM,CAAC,CAAC,CAACc,SAAS;IAGjDC,WAAAA,YACA1B,SAAS,EACP,IAAIE,aAAa;KACf,OAAOwB,QAAQ;IACjB,EACF,CAAC;GAEuB,CAAA;EACH,GAdKf,KAcL,CAC5B;CACH,GAAG,CAACM,mBAAmBjB,QAAQ,CAAC;AAClC;;;;AAKA,MAAa2B,kCAETtB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAR,YAAAC,aAAAK;CACH,IAAIN,YAAU;EAAA,IAAAU;EAAA,IAAAH,EAAA,OAAAP,YAAA;GAEVU,KAAA,oBAAC,iCAAD,EAAA,gBACS,oBAAC,qBAAD,EAAiCV,WAAU,CAAA,EADpB,CAAA;GAEEO,EAAA,KAAAP;GAAAO,EAAA,KAAAG;EAAA,OAAAA,KAAAH,EAAA;EAAA,OAFlCG;CAEkC;CAErC,IAAAA;CAAA,IAAAH,EAAA,OAAAN,UAAA;EAECS,KAAA,oBAAC,iCAAD,EACGT,SAD6B,CAAA;EAEEM,EAAA,KAAAN;EAAAM,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OAFlCG;AAEkC;AAItCkB,+BAA+BZ,cAAc;AAE7C,MAAalB,6BAA6BR,KACxCsC,iCACCd,MAAMC,SAAS;CACd,IAAID,KAAKb,YAAYc,KAAKd,UACxB,OAAOa,KAAKb,aAAac,KAAKd;CAEhC,OAAOa,KAAKd,WAAYH,eAAekB,KAAKf,WAAYH;AAC1D,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadListItems.js","names":["ComponentType","FC","ReactNode","memo","useMemo","RenderChildrenWithAccessor","useAuiState","ThreadListItemState","ThreadListItemByIndexProvider","ThreadListItemsComponentConfig","ThreadListItem","ThreadListPrimitiveItems","Props","archived","components","children","value","threadListItem","ThreadListPrimitiveItemByIndex","index","t0","$","_c","t1","undefined","ThreadListItemComponent","t2","t3","prev","next","displayName","ThreadListPrimitiveItemsInner","contentLength","s","threads","archivedThreadIds","length","threadIds","Array","from","_","aui","item","getState","getItem"],"sources":["../../../../src/react/primitives/threadList/ThreadListItems.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ReactNode,\n memo,\n useMemo,\n} from \"react\";\nimport { RenderChildrenWithAccessor, useAuiState } from \"@assistant-ui/store\";\nimport type { ThreadListItemState } from \"../../../store/scopes/thread-list-item\";\nimport { ThreadListItemByIndexProvider } from \"../../providers/ThreadListItemByIndexProvider\";\n\ntype ThreadListItemsComponentConfig = {\n ThreadListItem: ComponentType;\n};\n\nexport namespace ThreadListPrimitiveItems {\n export type Props = {\n archived?: boolean | undefined;\n } & (\n | {\n /** @deprecated Use the children render function instead. */\n components: ThreadListItemsComponentConfig;\n children?: never;\n }\n | {\n /** Render function called for each thread list item. Receives the item. */\n children: (value: { threadListItem: ThreadListItemState }) => ReactNode;\n components?: never;\n }\n );\n}\n\nexport namespace ThreadListPrimitiveItemByIndex {\n export type Props = {\n index: number;\n archived?: boolean | undefined;\n components: ThreadListItemsComponentConfig;\n };\n}\n\n/**\n * Renders a single thread list item at the specified index.\n */\nexport const ThreadListPrimitiveItemByIndex: FC<ThreadListPrimitiveItemByIndex.Props> =\n memo(\n ({ index, archived = false, components }) => {\n const ThreadListItemComponent = components.ThreadListItem;\n\n return (\n <ThreadListItemByIndexProvider index={index} archived={archived}>\n <ThreadListItemComponent />\n </ThreadListItemByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index &&\n prev.archived === next.archived &&\n prev.components.ThreadListItem === next.components.ThreadListItem,\n );\n\nThreadListPrimitiveItemByIndex.displayName = \"ThreadListPrimitive.ItemByIndex\";\n\nconst ThreadListPrimitiveItemsInner: FC<{\n archived: boolean;\n children: (value: { threadListItem: ThreadListItemState }) => ReactNode;\n}> = ({ archived, children }) => {\n const contentLength = useAuiState((s) =>\n archived ? s.threads.archivedThreadIds.length : s.threads.threadIds.length,\n );\n\n return useMemo(\n () =>\n Array.from({ length: contentLength }, (_, index) => (\n <ThreadListItemByIndexProvider\n key={index}\n index={index}\n archived={archived}\n >\n <RenderChildrenWithAccessor\n getItemState={(aui) =>\n aui.threads().item({ index, archived }).getState()\n }\n >\n {(getItem) =>\n children({\n get threadListItem() {\n return getItem();\n },\n })\n }\n </RenderChildrenWithAccessor>\n </ThreadListItemByIndexProvider>\n )),\n [contentLength, archived, children],\n );\n};\n\nexport const ThreadListPrimitiveItems: FC<ThreadListPrimitiveItems.Props> = ({\n archived = false,\n components,\n children,\n}) => {\n if (components) {\n const ThreadListItemComponent = components.ThreadListItem;\n return (\n <ThreadListPrimitiveItemsInner archived={archived}>\n {() => <ThreadListItemComponent />}\n </ThreadListPrimitiveItemsInner>\n );\n }\n return (\n <ThreadListPrimitiveItemsInner archived={archived}>\n {children}\n </ThreadListPrimitiveItemsInner>\n );\n};\n\nThreadListPrimitiveItems.displayName = \"ThreadListPrimitive.Items\";\n"],"mappings":";;;;;;;;;AA2CA,MAAakB,iCACXf,MACEiB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAH,OAAAN,UAAAU,IAAAT,eAAAM;CAAS,MAAAP,WAAAU,OAAAC,KAAAA,IAAA,QAAAD;CACR,MAAAE,0BAAgCX,WAAUJ;CAAgB,IAAAgB;CAAA,IAAAL,EAAA,OAAAI,yBAAA;EAItDC,KAAA,oBAAC,yBAAD,CAAwB,CAAA;EAAGL,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAR,YAAAQ,EAAA,OAAAF,SAAAE,EAAA,OAAAK,IAAA;EAD7BC,KAAA,oBAAC,+BAAD;GAAsCR;GAAiBN;aACrDa;EAD4B,CAAA;EAEEL,EAAA,KAAAR;EAAAQ,EAAA,KAAAF;EAAAE,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OAFhCM;AAEgC,IAGnCC,MAAMC,SACLD,KAAKT,UAAUU,KAAKV,SACpBS,KAAKf,aAAagB,KAAKhB,YACvBe,KAAKd,WAAWJ,mBAAmBmB,KAAKf,WAAWJ,cACvD;AAEFQ,+BAA+BY,cAAc;AAE7C,MAAMC,iCAGA,EAAElB,UAAUE,eAAe;CAC/B,MAAMiB,gBAAgB1B,aAAa2B,MACjCpB,WAAWoB,EAAEC,QAAQC,kBAAkBC,SAASH,EAAEC,QAAQG,UAAUD,MACtE;CAEA,OAAOhC,cAEHkC,MAAMC,KAAK,EAAEH,QAAQJ,cAAc,IAAIQ,GAAGrB,UACxC,oBAAC,+BAAD;EAESA;EACGN;YAEV,oBAAC,4BAAD;GACE,eAAe4B,QACbA,IAAIP,QAAQ,CAAC,CAACQ,KAAK;IAAEvB;IAAON;GAAS,CAAC,CAAC,CAAC8B,SAAS;cAGjDC,YACA7B,SAAS,EACP,IAAIE,iBAAiB;IACnB,OAAO2B,QAAQ;GACjB,EACF,CAAC;EAEuB,CAAA;CACC,GAjBxBzB,KAiBwB,CAChC,GACH;EAACa;EAAenB;EAAUE;CAAQ,CACpC;AACF;AAEA,MAAaJ,4BAA+DS,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAT,UAAAU,IAAAT,YAAAC,aAAAK;CAC3E,MAAAP,WAAAU,OAAAC,KAAAA,IAAA,QAAAD;CAIA,IAAIT,YAAU;EACZ,MAAAW,0BAAgCX,WAAUJ;EAAgB,IAAAgB;EAAA,IAAAL,EAAA,OAAAI,yBAAA;GAGrDC,WAAM,oBAAC,yBAAD,CAAwB,CAAA;GAAGL,EAAA,KAAAI;GAAAJ,EAAA,KAAAK;EAAA,OAAAA,KAAAL,EAAA;EAAA,IAAAM;EAAA,IAAAN,EAAA,OAAAR,YAAAQ,EAAA,OAAAK,IAAA;GADpCC,KAAA,oBAAC,+BAAD;IAAyCd;cACtCa;GAD2B,CAAA;GAEEL,EAAA,KAAAR;GAAAQ,EAAA,KAAAK;GAAAL,EAAA,KAAAM;EAAA,OAAAA,KAAAN,EAAA;EAAA,OAFhCM;CAEgC;CAEnC,IAAAD;CAAA,IAAAL,EAAA,OAAAR,YAAAQ,EAAA,OAAAN,UAAA;EAECW,KAAA,oBAAC,+BAAD;GAAyCb;GACtCE;EAD2B,CAAA;EAEEM,EAAA,KAAAR;EAAAQ,EAAA,KAAAN;EAAAM,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFhCK;AAEgC;AAIpCf,yBAAyBmB,cAAc"}
1
+ {"version":3,"file":"ThreadListItems.js","names":["ComponentType","FC","ReactNode","memo","useMemo","RenderChildrenWithAccessor","useAuiState","ThreadListItemState","ThreadListItemByIndexProvider","ThreadListItemsComponentConfig","ThreadListItem","ThreadListPrimitiveItems","Props","archived","components","children","value","threadListItem","ThreadListPrimitiveItemByIndex","index","t0","$","_c","t1","undefined","ThreadListItemComponent","t2","t3","prev","next","displayName","ThreadListPrimitiveItemsInner","contentLength","s","threads","archivedThreadIds","length","threadIds","Array","from","_","aui","item","getState","getItem"],"sources":["../../../../src/react/primitives/threadList/ThreadListItems.tsx"],"sourcesContent":["import {\n type ComponentType,\n type FC,\n type ReactNode,\n memo,\n useMemo,\n} from \"react\";\nimport { RenderChildrenWithAccessor, useAuiState } from \"@assistant-ui/store\";\nimport type { ThreadListItemState } from \"../../../store/scopes/thread-list-item\";\nimport { ThreadListItemByIndexProvider } from \"../../providers/ThreadListItemByIndexProvider\";\n\ntype ThreadListItemsComponentConfig = {\n ThreadListItem: ComponentType;\n};\n\nexport namespace ThreadListPrimitiveItems {\n export type Props = {\n archived?: boolean | undefined;\n } & (\n | {\n /** @deprecated Use the children render function instead. */\n components: ThreadListItemsComponentConfig;\n children?: never;\n }\n | {\n /** Render function called for each thread list item. Receives the item. */\n children: (value: { threadListItem: ThreadListItemState }) => ReactNode;\n components?: never;\n }\n );\n}\n\nexport namespace ThreadListPrimitiveItemByIndex {\n export type Props = {\n index: number;\n archived?: boolean | undefined;\n components: ThreadListItemsComponentConfig;\n };\n}\n\n/**\n * Renders a single thread list item at the specified index.\n */\nexport const ThreadListPrimitiveItemByIndex: FC<ThreadListPrimitiveItemByIndex.Props> =\n memo(\n ({ index, archived = false, components }) => {\n const ThreadListItemComponent = components.ThreadListItem;\n\n return (\n <ThreadListItemByIndexProvider index={index} archived={archived}>\n <ThreadListItemComponent />\n </ThreadListItemByIndexProvider>\n );\n },\n (prev, next) =>\n prev.index === next.index &&\n prev.archived === next.archived &&\n prev.components.ThreadListItem === next.components.ThreadListItem,\n );\n\nThreadListPrimitiveItemByIndex.displayName = \"ThreadListPrimitive.ItemByIndex\";\n\nconst ThreadListPrimitiveItemsInner: FC<{\n archived: boolean;\n children: (value: { threadListItem: ThreadListItemState }) => ReactNode;\n}> = ({ archived, children }) => {\n const contentLength = useAuiState((s) =>\n archived ? s.threads.archivedThreadIds.length : s.threads.threadIds.length,\n );\n\n return useMemo(\n () =>\n Array.from({ length: contentLength }, (_, index) => (\n <ThreadListItemByIndexProvider\n key={index}\n index={index}\n archived={archived}\n >\n <RenderChildrenWithAccessor\n getItemState={(aui) =>\n aui.threads().item({ index, archived }).getState()\n }\n >\n {(getItem) =>\n children({\n get threadListItem() {\n return getItem();\n },\n })\n }\n </RenderChildrenWithAccessor>\n </ThreadListItemByIndexProvider>\n )),\n [contentLength, archived, children],\n );\n};\n\nexport const ThreadListPrimitiveItems: FC<ThreadListPrimitiveItems.Props> = ({\n archived = false,\n components,\n children,\n}) => {\n if (components) {\n const ThreadListItemComponent = components.ThreadListItem;\n return (\n <ThreadListPrimitiveItemsInner archived={archived}>\n {() => <ThreadListItemComponent />}\n </ThreadListPrimitiveItemsInner>\n );\n }\n return (\n <ThreadListPrimitiveItemsInner archived={archived}>\n {children}\n </ThreadListPrimitiveItemsInner>\n );\n};\n\nThreadListPrimitiveItems.displayName = \"ThreadListPrimitive.Items\";\n"],"mappings":";;;;;;;;;AA2CA,MAAakB,iCACXf,MACEiB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAH,OAAAN,UAAAU,IAAAT,eAAAM;CAAS,MAAAP,WAAAU,OAAAC,KAAAA,IAAA,QAAAD;CACR,MAAAE,0BAAgCX,WAAUJ;CAAgB,IAAAgB;CAAA,IAAAL,EAAA,OAAAI,yBAAA;EAItDC,KAAA,oBAAC,yBAAD,CAAwB,CAAA;EAAGL,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAR,YAAAQ,EAAA,OAAAF,SAAAE,EAAA,OAAAK,IAAA;EAD7BC,KAAA,oBAAC,+BAAD;GAAsCR;GAAiBN;GACrDa,UAAAA;EAD4B,CAAA;EAEEL,EAAA,KAAAR;EAAAQ,EAAA,KAAAF;EAAAE,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OAFhCM;AAEgC,IAGnCC,MAAMC,SACLD,KAAKT,UAAUU,KAAKV,SACpBS,KAAKf,aAAagB,KAAKhB,YACvBe,KAAKd,WAAWJ,mBAAmBmB,KAAKf,WAAWJ,cACvD;AAEFQ,+BAA+BY,cAAc;AAE7C,MAAMC,iCAGA,EAAElB,UAAUE,eAAe;CAC/B,MAAMiB,gBAAgB1B,aAAa2B,MACjCpB,WAAWoB,EAAEC,QAAQC,kBAAkBC,SAASH,EAAEC,QAAQG,UAAUD,MACtE;CAEA,OAAOhC,cAEHkC,MAAMC,KAAK,EAAEH,QAAQJ,cAAc,IAAIQ,GAAGrB,UACxC,oBAAC,+BAAD;EAESA;EACGN;EAEV,UAAA,oBAAC,4BAAD;GACE,eAAe4B,QACbA,IAAIP,QAAQ,CAAC,CAACQ,KAAK;IAAEvB;IAAON;GAAS,CAAC,CAAC,CAAC8B,SAAS;GAGjDC,WAAAA,YACA7B,SAAS,EACP,IAAIE,iBAAiB;IACnB,OAAO2B,QAAQ;GACjB,EACF,CAAC;EAEuB,CAAA;CACC,GAjBxBzB,KAiBwB,CAChC,GACH;EAACa;EAAenB;EAAUE;CAAQ,CACpC;AACF;AAEA,MAAaJ,4BAA+DS,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAT,UAAAU,IAAAT,YAAAC,aAAAK;CAC3E,MAAAP,WAAAU,OAAAC,KAAAA,IAAA,QAAAD;CAIA,IAAIT,YAAU;EACZ,MAAAW,0BAAgCX,WAAUJ;EAAgB,IAAAgB;EAAA,IAAAL,EAAA,OAAAI,yBAAA;GAGrDC,WAAM,oBAAC,yBAAD,CAAwB,CAAA;GAAGL,EAAA,KAAAI;GAAAJ,EAAA,KAAAK;EAAA,OAAAA,KAAAL,EAAA;EAAA,IAAAM;EAAA,IAAAN,EAAA,OAAAR,YAAAQ,EAAA,OAAAK,IAAA;GADpCC,KAAA,oBAAC,+BAAD;IAAyCd;IACtCa,UAAAA;GAD2B,CAAA;GAEEL,EAAA,KAAAR;GAAAQ,EAAA,KAAAK;GAAAL,EAAA,KAAAM;EAAA,OAAAA,KAAAN,EAAA;EAAA,OAFhCM;CAEgC;CAEnC,IAAAD;CAAA,IAAAL,EAAA,OAAAR,YAAAQ,EAAA,OAAAN,UAAA;EAECW,KAAA,oBAAC,+BAAD;GAAyCb;GACtCE;EAD2B,CAAA;EAEEM,EAAA,KAAAR;EAAAQ,EAAA,KAAAN;EAAAM,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFhCK;AAEgC;AAIpCf,yBAAyBmB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChainOfThoughtPartByIndexProvider.d.ts","names":[],"sources":["../../../src/react/providers/ChainOfThoughtPartByIndexProvider.tsx"],"mappings":";;cAGa,mCAAmC,GAC9C;EACE"}
1
+ {"version":3,"file":"ChainOfThoughtPartByIndexProvider.d.ts","names":[],"sources":["../../../src/react/providers/ChainOfThoughtPartByIndexProvider.tsx"],"mappings":";;cAIa,mCAAmC,GAC9C;EACE"}
@@ -1,41 +1,29 @@
1
1
  import { AuiProvider, Derived, useAui } from "@assistant-ui/store";
2
- import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
+ import { useMemo } from "@assistant-ui/tap/react-shim";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/react/providers/ChainOfThoughtPartByIndexProvider.tsx
5
- const ChainOfThoughtPartByIndexProvider = (t0) => {
6
- const $ = c(7);
7
- const { index, children } = t0;
8
- let t1;
9
- if ($[0] !== index) {
10
- t1 = Derived({
5
+ const ChainOfThoughtPartByIndexProvider = ({ index, children }) => {
6
+ const lastPartRef = useMemo(() => ({
7
+ index,
8
+ current: null
9
+ }), [index]);
10
+ return /* @__PURE__ */ jsx(AuiProvider, {
11
+ value: useAui({ part: Derived({
11
12
  source: "chainOfThought",
12
13
  query: {
13
14
  type: "index",
14
15
  index
15
16
  },
16
- get: (aui) => aui.chainOfThought().part({ index })
17
- });
18
- $[0] = index;
19
- $[1] = t1;
20
- } else t1 = $[1];
21
- let t2;
22
- if ($[2] !== t1) {
23
- t2 = { part: t1 };
24
- $[2] = t1;
25
- $[3] = t2;
26
- } else t2 = $[3];
27
- const aui_0 = useAui(t2);
28
- let t3;
29
- if ($[4] !== aui_0 || $[5] !== children) {
30
- t3 = /* @__PURE__ */ jsx(AuiProvider, {
31
- value: aui_0,
32
- children
33
- });
34
- $[4] = aui_0;
35
- $[5] = children;
36
- $[6] = t3;
37
- } else t3 = $[6];
38
- return t3;
17
+ get: (aui) => {
18
+ const chainOfThought = aui.chainOfThought();
19
+ if (index >= chainOfThought.getState().parts.length && lastPartRef.current) return lastPartRef.current;
20
+ const part = chainOfThought.part({ index });
21
+ lastPartRef.current = part;
22
+ return part;
23
+ }
24
+ }) }),
25
+ children
26
+ });
39
27
  };
40
28
  //#endregion
41
29
  export { ChainOfThoughtPartByIndexProvider };
@@ -1 +1 @@
1
- {"version":3,"file":"ChainOfThoughtPartByIndexProvider.js","names":["FC","PropsWithChildren","useAui","AuiProvider","Derived","ChainOfThoughtPartByIndexProvider","index","t0","$","_c","children","t1","source","query","type","get","aui","chainOfThought","part","t2","aui_0","t3"],"sources":["../../../src/react/providers/ChainOfThoughtPartByIndexProvider.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from \"react\";\nimport { useAui, AuiProvider, Derived } from \"@assistant-ui/store\";\n\nexport const ChainOfThoughtPartByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const aui = useAui({\n part: Derived({\n source: \"chainOfThought\",\n query: { type: \"index\", index },\n get: (aui) => aui.chainOfThought().part({ index }),\n }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;AAGA,MAAaK,qCAITE,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAH,OAAAI,aAAAH;CAAmB,IAAAI;CAAA,IAAAH,EAAA,OAAAF,OAAA;EAEdK,KAAAP,QAAQ;GAAAQ,QACJ;GAAgBC,OACjB;IAAAC,MAAQ;IAAOR;GAAQ;GAACS,MAC1BC,QAASA,IAAGC,eAAgB,CAAC,CAAAC,KAAM,EAAAZ,MAAQ,CAAC;EACnD,CAAC;EAACE,EAAA,KAAAF;EAAAE,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAG,IAAA;EALeQ,KAAA,EAAAD,MACXP,GAKR;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAND,MAAAY,QAAYlB,OAAOiB,EAMlB;CAAE,IAAAE;CAAA,IAAAb,EAAA,OAAAY,SAAAZ,EAAA,OAAAE,UAAA;EAEIW,KAAA,oBAAC,aAAD;GAAoBL,OAAAA;GAAMN;EAAd,CAAA;EAAqCF,EAAA,KAAAY;EAAAZ,EAAA,KAAAE;EAAAF,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,OAAjDa;AAAiD"}
1
+ {"version":3,"file":"ChainOfThoughtPartByIndexProvider.js","names":["useMemo","FC","PropsWithChildren","useAui","AuiProvider","Derived","PartMethods","ChainOfThoughtPartByIndexProvider","index","children","lastPartRef","current","aui","part","source","query","type","get","chainOfThought","getState","parts","length"],"sources":["../../../src/react/providers/ChainOfThoughtPartByIndexProvider.tsx"],"sourcesContent":["import { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport { useAui, AuiProvider, Derived } from \"@assistant-ui/store\";\nimport type { PartMethods } from \"../../store/scopes/part\";\n\nexport const ChainOfThoughtPartByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const lastPartRef = useMemo(\n () => ({ index, current: null as PartMethods | null }),\n [index],\n );\n const aui = useAui({\n part: Derived({\n source: \"chainOfThought\",\n query: { type: \"index\", index },\n get: (aui) => {\n const chainOfThought = aui.chainOfThought();\n if (\n index >= chainOfThought.getState().parts.length &&\n lastPartRef.current\n ) {\n return lastPartRef.current;\n }\n\n const part = chainOfThought.part({ index });\n lastPartRef.current = part;\n return part;\n },\n }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;AAIA,MAAaO,qCAIR,EAAEC,OAAOC,eAAe;CAC3B,MAAMC,cAAcV,eACX;EAAEQ;EAAOG,SAAS;CAA2B,IACpD,CAACH,KAAK,CACR;CAqBA,OAAO,oBAAC,aAAD;EAAa,OApBRL,OAAO,EACjBU,MAAMR,QAAQ;GACZS,QAAQ;GACRC,OAAO;IAAEC,MAAM;IAASR;GAAM;GAC9BS,MAAML,QAAQ;IACZ,MAAMM,iBAAiBN,IAAIM,eAAe;IAC1C,IACEV,SAASU,eAAeC,SAAS,CAAC,CAACC,MAAMC,UACzCX,YAAYC,SAEZ,OAAOD,YAAYC;IAGrB,MAAME,OAAOK,eAAeL,KAAK,EAAEL,MAAM,CAAC;IAC1CE,YAAYC,UAAUE;IACtB,OAAOA;GACT;EACF,CAAC,EACH,CAE2BD;EAAMH;CAAsB,CAAA;AACzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"PartByIndexProvider.d.ts","names":[],"sources":["../../../src/react/providers/PartByIndexProvider.tsx"],"mappings":";;cAGa,qBAAqB,GAChC;EACE"}
1
+ {"version":3,"file":"PartByIndexProvider.d.ts","names":[],"sources":["../../../src/react/providers/PartByIndexProvider.tsx"],"mappings":";;cAIa,qBAAqB,GAChC;EACE"}
@@ -1,41 +1,29 @@
1
1
  import { AuiProvider, Derived, useAui } from "@assistant-ui/store";
2
- import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
+ import { useMemo } from "@assistant-ui/tap/react-shim";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region src/react/providers/PartByIndexProvider.tsx
5
- const PartByIndexProvider = (t0) => {
6
- const $ = c(7);
7
- const { index, children } = t0;
8
- let t1;
9
- if ($[0] !== index) {
10
- t1 = Derived({
5
+ const PartByIndexProvider = ({ index, children }) => {
6
+ const lastPartRef = useMemo(() => ({
7
+ index,
8
+ current: null
9
+ }), [index]);
10
+ return /* @__PURE__ */ jsx(AuiProvider, {
11
+ value: useAui({ part: Derived({
11
12
  source: "message",
12
13
  query: {
13
14
  type: "index",
14
15
  index
15
16
  },
16
- get: (aui) => aui.message().part({ index })
17
- });
18
- $[0] = index;
19
- $[1] = t1;
20
- } else t1 = $[1];
21
- let t2;
22
- if ($[2] !== t1) {
23
- t2 = { part: t1 };
24
- $[2] = t1;
25
- $[3] = t2;
26
- } else t2 = $[3];
27
- const aui_0 = useAui(t2);
28
- let t3;
29
- if ($[4] !== aui_0 || $[5] !== children) {
30
- t3 = /* @__PURE__ */ jsx(AuiProvider, {
31
- value: aui_0,
32
- children
33
- });
34
- $[4] = aui_0;
35
- $[5] = children;
36
- $[6] = t3;
37
- } else t3 = $[6];
38
- return t3;
17
+ get: (aui) => {
18
+ const message = aui.message();
19
+ if (index >= message.getState().parts.length && lastPartRef.current) return lastPartRef.current;
20
+ const part = message.part({ index });
21
+ lastPartRef.current = part;
22
+ return part;
23
+ }
24
+ }) }),
25
+ children
26
+ });
39
27
  };
40
28
  //#endregion
41
29
  export { PartByIndexProvider };
@@ -1 +1 @@
1
- {"version":3,"file":"PartByIndexProvider.js","names":["FC","PropsWithChildren","useAui","AuiProvider","Derived","PartByIndexProvider","index","t0","$","_c","children","t1","source","query","type","get","aui","message","part","t2","aui_0","t3"],"sources":["../../../src/react/providers/PartByIndexProvider.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from \"react\";\nimport { useAui, AuiProvider, Derived } from \"@assistant-ui/store\";\n\nexport const PartByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const aui = useAui({\n part: Derived({\n source: \"message\",\n query: { type: \"index\", index },\n get: (aui) => aui.message().part({ index }),\n }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;AAGA,MAAaK,uBAITE,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAH,OAAAI,aAAAH;CAAmB,IAAAI;CAAA,IAAAH,EAAA,OAAAF,OAAA;EAEdK,KAAAP,QAAQ;GAAAQ,QACJ;GAASC,OACV;IAAAC,MAAQ;IAAOR;GAAQ;GAACS,MAC1BC,QAASA,IAAGC,QAAS,CAAC,CAAAC,KAAM,EAAAZ,MAAQ,CAAC;EAC5C,CAAC;EAACE,EAAA,KAAAF;EAAAE,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAG,IAAA;EALeQ,KAAA,EAAAD,MACXP,GAKR;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAND,MAAAY,QAAYlB,OAAOiB,EAMlB;CAAE,IAAAE;CAAA,IAAAb,EAAA,OAAAY,SAAAZ,EAAA,OAAAE,UAAA;EAEIW,KAAA,oBAAC,aAAD;GAAoBL,OAAAA;GAAMN;EAAd,CAAA;EAAqCF,EAAA,KAAAY;EAAAZ,EAAA,KAAAE;EAAAF,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,OAAjDa;AAAiD"}
1
+ {"version":3,"file":"PartByIndexProvider.js","names":["useMemo","FC","PropsWithChildren","useAui","AuiProvider","Derived","PartMethods","PartByIndexProvider","index","children","lastPartRef","current","aui","part","source","query","type","get","message","getState","parts","length"],"sources":["../../../src/react/providers/PartByIndexProvider.tsx"],"sourcesContent":["import { useMemo, type FC, type PropsWithChildren } from \"react\";\nimport { useAui, AuiProvider, Derived } from \"@assistant-ui/store\";\nimport type { PartMethods } from \"../../store/scopes/part\";\n\nexport const PartByIndexProvider: FC<\n PropsWithChildren<{\n index: number;\n }>\n> = ({ index, children }) => {\n const lastPartRef = useMemo(\n () => ({ index, current: null as PartMethods | null }),\n [index],\n );\n const aui = useAui({\n part: Derived({\n source: \"message\",\n query: { type: \"index\", index },\n get: (aui) => {\n const message = aui.message();\n if (index >= message.getState().parts.length && lastPartRef.current) {\n return lastPartRef.current;\n }\n\n const part = message.part({ index });\n lastPartRef.current = part;\n return part;\n },\n }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;AAIA,MAAaO,uBAIR,EAAEC,OAAOC,eAAe;CAC3B,MAAMC,cAAcV,eACX;EAAEQ;EAAOG,SAAS;CAA2B,IACpD,CAACH,KAAK,CACR;CAkBA,OAAO,oBAAC,aAAD;EAAa,OAjBRL,OAAO,EACjBU,MAAMR,QAAQ;GACZS,QAAQ;GACRC,OAAO;IAAEC,MAAM;IAASR;GAAM;GAC9BS,MAAML,QAAQ;IACZ,MAAMM,UAAUN,IAAIM,QAAQ;IAC5B,IAAIV,SAASU,QAAQC,SAAS,CAAC,CAACC,MAAMC,UAAUX,YAAYC,SAC1D,OAAOD,YAAYC;IAGrB,MAAME,OAAOK,QAAQL,KAAK,EAAEL,MAAM,CAAC;IACnCE,YAAYC,UAAUE;IACtB,OAAOA;GACT;EACF,CAAC,EACH,CAE2BD;EAAMH;CAAsB,CAAA;AACzD"}
@@ -1,4 +1,5 @@
1
1
  import { AuiProvider, useAui } from "@assistant-ui/store";
2
+ import "@assistant-ui/tap/react-shim";
2
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
3
4
  import { resource } from "@assistant-ui/tap";
4
5
  import { jsx } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"TextMessagePartProvider.js","names":["FC","PropsWithChildren","useMemo","useAui","AuiProvider","ClientOutput","PartState","resource","useTextMessagePartClient","t0","$","_c","text","isRunning","t1","type","t2","status","state","t3","getState","addToolResult","_temp","resumeToolCall","_temp2","respondToToolApproval","_temp3","TextMessagePartClient","TextMessagePartProvider","children","undefined","part","aui","t4","Error"],"sources":["../../../src/react/providers/TextMessagePartProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui, AuiProvider, type ClientOutput } from \"@assistant-ui/store\";\nimport type { PartState } from \"../../store/scopes/part\";\n\nimport { resource } from \"@assistant-ui/tap\";\n\nconst useTextMessagePartClient = ({\n text,\n isRunning,\n}: {\n text: string;\n isRunning: boolean;\n}): ClientOutput<\"part\"> => {\n const state = useMemo<PartState>(\n () => ({\n type: \"text\",\n text,\n status: isRunning ? { type: \"running\" } : { type: \"complete\" },\n }),\n [text, isRunning],\n );\n\n return {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n resumeToolCall: () => {\n throw new Error(\"Not supported\");\n },\n respondToToolApproval: () => {\n throw new Error(\"Not supported\");\n },\n };\n};\n\nconst TextMessagePartClient = resource(useTextMessagePartClient);\n\nexport const TextMessagePartProvider: FC<\n PropsWithChildren<{\n text: string;\n isRunning?: boolean;\n }>\n> = ({ text, isRunning = false, children }) => {\n const aui = useAui({\n part: TextMessagePartClient({ text, isRunning }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;;AAMA,MAAMQ,4BAA2BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,MAAAC,cAAAJ;CAMjC,IAAAK;CAAA,IAAAJ,EAAA,OAAAG,WAAA;EAKaC,KAAAD,YAAA,EAAAE,MAAoB,UAAiC,IAArD,EAAAA,MAA0C,WAAW;EAACL,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAI,MAAAJ,EAAA,OAAAE,MAAA;EAHzDI,KAAA;GAAAD,MACC;GAAMH;GAAAK,QAEJH;EACV;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CALH,MAAAQ,QACSF;CAMP,IAAAG;CAAA,IAAAT,EAAA,OAAAQ,OAAA;EAEKC,KAAA;GAAAC,gBACWF;GAAKG,eACNC;GAEdC,gBACeC;GAEfC,uBACsBC;EAGzB;EAAChB,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAXMS;AAWN;AAGH,MAAMQ,wBAAwBpB,SAASC,wBAAwB;AAE/D,MAAaoB,2BAKTnB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,MAAAC,WAAAC,IAAAe,aAAApB;CAAQ,MAAAI,YAAAC,OAAAgB,KAAAA,IAAA,QAAAhB;CAAiB,IAAAE;CAAA,IAAAN,EAAA,OAAAG,aAAAH,EAAA,OAAAE,MAAA;EAEpBI,KAAAW,sBAAsB;GAAAf;GAAAC;EAAkB,CAAC;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAM,IAAA;EAD/BG,KAAA,EAAAY,MACXf,GACR;EAACN,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAFD,MAAAsB,MAAY7B,OAAOgB,EAElB;CAAE,IAAAc;CAAA,IAAAvB,EAAA,OAAAsB,OAAAtB,EAAA,OAAAmB,UAAA;EAEII,KAAA,oBAAC,aAAD;GAAoBD,OAAAA;GAAMH;EAAd,CAAA;EAAqCnB,EAAA,KAAAsB;EAAAtB,EAAA,KAAAmB;EAAAnB,EAAA,KAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,OAAjDuB;AAAiD;AA1CzB,SAAAX,QAAA;CAmB3B,MAAM,IAAIY,MAAM,eAAe;AAAE;AAnBN,SAAAV,SAAA;CAsB3B,MAAM,IAAIU,MAAM,eAAe;AAAE;AAtBN,SAAAR,SAAA;CAyB3B,MAAM,IAAIQ,MAAM,eAAe;AAAE"}
1
+ {"version":3,"file":"TextMessagePartProvider.js","names":["FC","PropsWithChildren","useMemo","useAui","AuiProvider","ClientOutput","PartState","resource","useTextMessagePartClient","t0","$","_c","text","isRunning","t1","type","t2","status","state","t3","getState","addToolResult","_temp","resumeToolCall","_temp2","respondToToolApproval","_temp3","TextMessagePartClient","TextMessagePartProvider","children","undefined","part","aui","t4","Error"],"sources":["../../../src/react/providers/TextMessagePartProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, useMemo } from \"react\";\nimport { useAui, AuiProvider, type ClientOutput } from \"@assistant-ui/store\";\nimport type { PartState } from \"../../store/scopes/part\";\n\nimport { resource } from \"@assistant-ui/tap\";\n\nconst useTextMessagePartClient = ({\n text,\n isRunning,\n}: {\n text: string;\n isRunning: boolean;\n}): ClientOutput<\"part\"> => {\n const state = useMemo<PartState>(\n () => ({\n type: \"text\",\n text,\n status: isRunning ? { type: \"running\" } : { type: \"complete\" },\n }),\n [text, isRunning],\n );\n\n return {\n getState: () => state,\n addToolResult: () => {\n throw new Error(\"Not supported\");\n },\n resumeToolCall: () => {\n throw new Error(\"Not supported\");\n },\n respondToToolApproval: () => {\n throw new Error(\"Not supported\");\n },\n };\n};\n\nconst TextMessagePartClient = resource(useTextMessagePartClient);\n\nexport const TextMessagePartProvider: FC<\n PropsWithChildren<{\n text: string;\n isRunning?: boolean;\n }>\n> = ({ text, isRunning = false, children }) => {\n const aui = useAui({\n part: TextMessagePartClient({ text, isRunning }),\n });\n\n return <AuiProvider value={aui}>{children}</AuiProvider>;\n};\n"],"mappings":";;;;;;AAMA,MAAMQ,4BAA2BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,MAAAC,cAAAJ;CAMjC,IAAAK;CAAA,IAAAJ,EAAA,OAAAG,WAAA;EAKaC,KAAAD,YAAA,EAAAE,MAAoB,UAAiC,IAArD,EAAAA,MAA0C,WAAW;EAACL,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAI,MAAAJ,EAAA,OAAAE,MAAA;EAHzDI,KAAA;GAAAD,MACC;GAAMH;GAAAK,QAEJH;EACV;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CALH,MAAAQ,QACSF;CAMP,IAAAG;CAAA,IAAAT,EAAA,OAAAQ,OAAA;EAEKC,KAAA;GAAAC,gBACWF;GAAKG,eACNC;GAEdC,gBACeC;GAEfC,uBACsBC;EAGzB;EAAChB,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAXMS;AAWN;AAGH,MAAMQ,wBAAwBpB,SAASC,wBAAwB;AAE/D,MAAaoB,2BAKTnB,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAC,MAAA,EAAAC,MAAAC,WAAAC,IAAAe,aAAApB;CAAQ,MAAAI,YAAAC,OAAAgB,KAAAA,IAAA,QAAAhB;CAAiB,IAAAE;CAAA,IAAAN,EAAA,OAAAG,aAAAH,EAAA,OAAAE,MAAA;EAEpBI,KAAAW,sBAAsB;GAAAf;GAAAC;EAAkB,CAAC;EAACH,EAAA,KAAAG;EAAAH,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAM,IAAA;EAD/BG,KAAA,EAAAY,MACXf,GACR;EAACN,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAFD,MAAAsB,MAAY7B,OAAOgB,EAElB;CAAE,IAAAc;CAAA,IAAAvB,EAAA,OAAAsB,OAAAtB,EAAA,OAAAmB,UAAA;EAEII,KAAA,oBAAC,aAAD;GAAoBD,OAAAA;GAAMH;EAAd,CAAA;EAAqCnB,EAAA,KAAAsB;EAAAtB,EAAA,KAAAmB;EAAAnB,EAAA,KAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,OAAjDuB;AAAiD;AA1CzB,SAAAX,QAAA;CAmB3B,MAAM,IAAIY,MAAM,eAAe;AAAE;AAnBN,SAAAV,SAAA;CAsB3B,MAAM,IAAIU,MAAM,eAAe;AAAE;AAtBN,SAAAR,SAAA;CAyB3B,MAAM,IAAIQ,MAAM,eAAe;AAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListHookInstanceManager.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"mappings":";;;;;;;;;;;;;;;KAuBK,6BAA6B;cAcrB,4CAA4C;UAC/C;UAGA;UACA;UACA;cAGN,aAAa,sBACb,QAAQ;EAOH,mBAAmB,mBAAgB,QAAA;;;eAPhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BH,qBAAqB,mBAAgB;;;eAxBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BnC,kBAAkB;EAKlB,eAAe,gBAAgB;UAS9B;UAkEA;EAqCD,iCAAiC;IACtC,UAAU,cAAc"}
1
+ {"version":3,"file":"RemoteThreadListHookInstanceManager.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"mappings":";;;;;;;;;;;;;;;KAuBK,6BAA6B;cAcrB,4CAA4C;UAC/C;UAGA;UACA;UACA;EAGN,YAAA,aAAa,sBACb,QAAQ;EAOH,mBAAmB,mBAAgB,QAAA;;;eAPhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BH,qBAAqB,mBAAgB;;;eAxBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BnC,kBAAkB;EAMlB,eAAe,gBAAgB;UAS9B;UAkEA;EAqCD,iCAAiC;IACtC,UAAU,cAAc"}
@@ -66,6 +66,7 @@ var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
66
66
  stopThreadRuntime(threadId) {
67
67
  this.instances.delete(threadId);
68
68
  this.useAliveThreadsKeysChanged.setState({}, true);
69
+ this._notifySubscribers();
69
70
  }
70
71
  setRuntimeHook(newRuntimeHook) {
71
72
  if (this.useRuntimeHook.getState().useRuntime !== newRuntimeHook) this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListHookInstanceManager.js","names":["FC","RefObject","useCallback","useRef","useEffect","useLayoutEffect","memo","PropsWithChildren","ComponentType","useMemo","Fragment","UseBoundStore","StoreApi","create","useAui","ThreadListItemRuntimeProvider","ThreadRuntimeCore","ThreadListRuntimeCore","AssistantRuntime","BaseSubscribable","ThreadRuntimeImpl","ThreadListRuntimeImpl","RemoteThreadListHook","RemoteThreadListHookInstance","runtime","ProviderRenderDetector","detectorRef","t0","$","_c","t1","t2","current","RemoteThreadListHookInstanceManager","useRuntimeHook","useRuntime","instances","Map","useAliveThreadsKeysChanged","parent","constructor","runtimeHook","startThreadRuntime","threadId","has","set","setState","Promise","resolve","reject","callback","instance","get","dispose","Error","subscribe","getThreadRuntimeCore","undefined","stopThreadRuntime","delete","setRuntimeHook","newRuntimeHook","prevRuntimeHook","getState","_RuntimeBinder","children","threadBinding","thread","__internal_threadBinding","updateRuntime","aliveThread","_notifySubscribers","isMounted","outerSubscribe","aui","initPromiseRef","hasInitializedRef","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","state","threadListItem","status","initialize","generateTitle","_OuterActiveThreadProvider","provider","Provider","getItemById","process","env","NODE_ENV","id","setTimeout","console","warn","clearTimeout","__internal_RenderThreadRuntimes","Array","from","keys","map"],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"sourcesContent":["import {\n type FC,\n type RefObject,\n useCallback,\n useRef,\n useEffect,\n useLayoutEffect,\n memo,\n type PropsWithChildren,\n type ComponentType,\n useMemo,\n Fragment,\n} from \"react\";\nimport { type UseBoundStore, type StoreApi, create } from \"zustand\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { ThreadListItemRuntimeProvider } from \"../providers/ThreadListItemRuntimeProvider\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport { ThreadListRuntimeImpl } from \"../../runtime/api/thread-list-runtime\";\n\ntype RemoteThreadListHook = () => AssistantRuntime;\n\ntype RemoteThreadListHookInstance = {\n runtime?: ThreadRuntimeCore;\n};\n\nconst ProviderRenderDetector: FC<{\n detectorRef: RefObject<boolean>;\n}> = ({ detectorRef }) => {\n useLayoutEffect(() => {\n detectorRef.current = true;\n }, [detectorRef]);\n return null;\n};\nexport class RemoteThreadListHookInstanceManager extends BaseSubscribable {\n private useRuntimeHook: UseBoundStore<\n StoreApi<{ useRuntime: RemoteThreadListHook }>\n >;\n private instances = new Map<string, RemoteThreadListHookInstance>();\n private useAliveThreadsKeysChanged = create(() => ({}));\n private parent: ThreadListRuntimeCore;\n\n constructor(\n runtimeHook: RemoteThreadListHook,\n parent: ThreadListRuntimeCore,\n ) {\n super();\n this.parent = parent;\n this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));\n }\n\n public startThreadRuntime(threadId: string) {\n if (!this.instances.has(threadId)) {\n this.instances.set(threadId, {});\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n return new Promise<ThreadRuntimeCore>((resolve, reject) => {\n const callback = () => {\n const instance = this.instances.get(threadId);\n if (!instance) {\n dispose();\n reject(new Error(\"Thread was deleted before runtime was started\"));\n } else if (!instance.runtime) {\n return; // misc update\n } else {\n dispose();\n resolve(instance.runtime);\n }\n };\n const dispose = this.subscribe(callback);\n callback();\n });\n }\n\n public getThreadRuntimeCore(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return undefined;\n return instance.runtime;\n }\n\n public stopThreadRuntime(threadId: string) {\n this.instances.delete(threadId);\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n public setRuntimeHook(newRuntimeHook: RemoteThreadListHook) {\n const prevRuntimeHook = this.useRuntimeHook.getState().useRuntime;\n if (prevRuntimeHook !== newRuntimeHook) {\n this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);\n }\n }\n\n // Rendered as a child of the user's Provider so the runtime hook can\n // read context the Provider injects (e.g. RuntimeAdapterProvider).\n private _RuntimeBinder: FC<PropsWithChildren<{ threadId: string }>> = ({\n threadId,\n children,\n }) => {\n const { useRuntime } = this.useRuntimeHook();\n const runtime = useRuntime();\n\n const threadBinding = (runtime.thread as ThreadRuntimeImpl)\n .__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n const aliveThread = this.instances.get(threadId);\n if (!aliveThread)\n throw new Error(\n `Thread \"${threadId}\" runtime binding not found. This is a bug in assistant-ui.`,\n );\n\n aliveThread.runtime = threadBinding.getState();\n this._notifySubscribers();\n }, [threadId, threadBinding]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const aui = useAui();\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n\n useEffect(() => {\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);\n }\n }, [threadBinding]);\n\n useEffect(() => {\n hasInitializedRef.current = false;\n return runtime.threads.main.unstable_on(\"initialize\", () => {\n if (hasInitializedRef.current) return;\n\n const state = aui.threadListItem().getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n initPromiseRef.current = aui.threadListItem().initialize();\n\n const dispose = runtime.thread.unstable_on(\"runEnd\", () => {\n dispose();\n aui.threadListItem().generateTitle();\n });\n });\n }, [runtime, aui]);\n\n return <>{children}</>;\n };\n\n private _OuterActiveThreadProvider: FC<{\n threadId: string;\n provider: ComponentType<PropsWithChildren>;\n }> = memo(({ threadId, provider: Provider }) => {\n const runtime = useMemo(\n () => new ThreadListRuntimeImpl(this.parent).getItemById(threadId),\n [threadId],\n );\n\n const detectorRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && Provider !== Fragment) {\n const id = setTimeout(() => {\n if (!detectorRef.current) {\n console.warn(\n \"RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. \" +\n \"Render `children` on first commit; deferring them behind a loading state, Suspense boundary, \" +\n \"or `useEffect` gate strands the runtime binder and leaves the thread without context.\",\n );\n }\n }, 100);\n return () => clearTimeout(id);\n }\n return undefined;\n }, [Provider]);\n\n return (\n <ThreadListItemRuntimeProvider runtime={runtime}>\n <Provider>\n <this._RuntimeBinder threadId={threadId}>\n <ProviderRenderDetector detectorRef={detectorRef} />\n </this._RuntimeBinder>\n </Provider>\n </ThreadListItemRuntimeProvider>\n );\n });\n\n public __internal_RenderThreadRuntimes: FC<{\n provider: ComponentType<PropsWithChildren>;\n }> = ({ provider }) => {\n this.useAliveThreadsKeysChanged(); // trigger re-render on alive threads change\n\n return Array.from(this.instances.keys()).map((threadId) => (\n <this._OuterActiveThreadProvider\n key={threadId}\n threadId={threadId}\n provider={provider}\n />\n ));\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListHookInstanceManager.js","names":["FC","RefObject","useCallback","useRef","useEffect","useLayoutEffect","memo","PropsWithChildren","ComponentType","useMemo","Fragment","UseBoundStore","StoreApi","create","useAui","ThreadListItemRuntimeProvider","ThreadRuntimeCore","ThreadListRuntimeCore","AssistantRuntime","BaseSubscribable","ThreadRuntimeImpl","ThreadListRuntimeImpl","RemoteThreadListHook","RemoteThreadListHookInstance","runtime","ProviderRenderDetector","detectorRef","t0","$","_c","t1","t2","current","RemoteThreadListHookInstanceManager","useRuntimeHook","useRuntime","instances","Map","useAliveThreadsKeysChanged","parent","constructor","runtimeHook","startThreadRuntime","threadId","has","set","setState","Promise","resolve","reject","callback","instance","get","dispose","Error","subscribe","getThreadRuntimeCore","undefined","stopThreadRuntime","delete","_notifySubscribers","setRuntimeHook","newRuntimeHook","prevRuntimeHook","getState","_RuntimeBinder","children","threadBinding","thread","__internal_threadBinding","updateRuntime","aliveThread","isMounted","outerSubscribe","aui","initPromiseRef","hasInitializedRef","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","threads","main","unstable_on","state","threadListItem","status","initialize","generateTitle","_OuterActiveThreadProvider","provider","Provider","getItemById","process","env","NODE_ENV","id","setTimeout","console","warn","clearTimeout","__internal_RenderThreadRuntimes","Array","from","keys","map"],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"sourcesContent":["import {\n type FC,\n type RefObject,\n useCallback,\n useRef,\n useEffect,\n useLayoutEffect,\n memo,\n type PropsWithChildren,\n type ComponentType,\n useMemo,\n Fragment,\n} from \"react\";\nimport { type UseBoundStore, type StoreApi, create } from \"zustand\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { ThreadListItemRuntimeProvider } from \"../providers/ThreadListItemRuntimeProvider\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport { ThreadListRuntimeImpl } from \"../../runtime/api/thread-list-runtime\";\n\ntype RemoteThreadListHook = () => AssistantRuntime;\n\ntype RemoteThreadListHookInstance = {\n runtime?: ThreadRuntimeCore;\n};\n\nconst ProviderRenderDetector: FC<{\n detectorRef: RefObject<boolean>;\n}> = ({ detectorRef }) => {\n useLayoutEffect(() => {\n detectorRef.current = true;\n }, [detectorRef]);\n return null;\n};\nexport class RemoteThreadListHookInstanceManager extends BaseSubscribable {\n private useRuntimeHook: UseBoundStore<\n StoreApi<{ useRuntime: RemoteThreadListHook }>\n >;\n private instances = new Map<string, RemoteThreadListHookInstance>();\n private useAliveThreadsKeysChanged = create(() => ({}));\n private parent: ThreadListRuntimeCore;\n\n constructor(\n runtimeHook: RemoteThreadListHook,\n parent: ThreadListRuntimeCore,\n ) {\n super();\n this.parent = parent;\n this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));\n }\n\n public startThreadRuntime(threadId: string) {\n if (!this.instances.has(threadId)) {\n this.instances.set(threadId, {});\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n return new Promise<ThreadRuntimeCore>((resolve, reject) => {\n const callback = () => {\n const instance = this.instances.get(threadId);\n if (!instance) {\n dispose();\n reject(new Error(\"Thread was deleted before runtime was started\"));\n } else if (!instance.runtime) {\n return; // misc update\n } else {\n dispose();\n resolve(instance.runtime);\n }\n };\n const dispose = this.subscribe(callback);\n callback();\n });\n }\n\n public getThreadRuntimeCore(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return undefined;\n return instance.runtime;\n }\n\n public stopThreadRuntime(threadId: string) {\n this.instances.delete(threadId);\n this.useAliveThreadsKeysChanged.setState({}, true);\n this._notifySubscribers();\n }\n\n public setRuntimeHook(newRuntimeHook: RemoteThreadListHook) {\n const prevRuntimeHook = this.useRuntimeHook.getState().useRuntime;\n if (prevRuntimeHook !== newRuntimeHook) {\n this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);\n }\n }\n\n // Rendered as a child of the user's Provider so the runtime hook can\n // read context the Provider injects (e.g. RuntimeAdapterProvider).\n private _RuntimeBinder: FC<PropsWithChildren<{ threadId: string }>> = ({\n threadId,\n children,\n }) => {\n const { useRuntime } = this.useRuntimeHook();\n const runtime = useRuntime();\n\n const threadBinding = (runtime.thread as ThreadRuntimeImpl)\n .__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n const aliveThread = this.instances.get(threadId);\n if (!aliveThread)\n throw new Error(\n `Thread \"${threadId}\" runtime binding not found. This is a bug in assistant-ui.`,\n );\n\n aliveThread.runtime = threadBinding.getState();\n this._notifySubscribers();\n }, [threadId, threadBinding]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const aui = useAui();\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n\n useEffect(() => {\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);\n }\n }, [threadBinding]);\n\n useEffect(() => {\n hasInitializedRef.current = false;\n return runtime.threads.main.unstable_on(\"initialize\", () => {\n if (hasInitializedRef.current) return;\n\n const state = aui.threadListItem().getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n initPromiseRef.current = aui.threadListItem().initialize();\n\n const dispose = runtime.thread.unstable_on(\"runEnd\", () => {\n dispose();\n aui.threadListItem().generateTitle();\n });\n });\n }, [runtime, aui]);\n\n return <>{children}</>;\n };\n\n private _OuterActiveThreadProvider: FC<{\n threadId: string;\n provider: ComponentType<PropsWithChildren>;\n }> = memo(({ threadId, provider: Provider }) => {\n const runtime = useMemo(\n () => new ThreadListRuntimeImpl(this.parent).getItemById(threadId),\n [threadId],\n );\n\n const detectorRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && Provider !== Fragment) {\n const id = setTimeout(() => {\n if (!detectorRef.current) {\n console.warn(\n \"RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. \" +\n \"Render `children` on first commit; deferring them behind a loading state, Suspense boundary, \" +\n \"or `useEffect` gate strands the runtime binder and leaves the thread without context.\",\n );\n }\n }, 100);\n return () => clearTimeout(id);\n }\n return undefined;\n }, [Provider]);\n\n return (\n <ThreadListItemRuntimeProvider runtime={runtime}>\n <Provider>\n <this._RuntimeBinder threadId={threadId}>\n <ProviderRenderDetector detectorRef={detectorRef} />\n </this._RuntimeBinder>\n </Provider>\n </ThreadListItemRuntimeProvider>\n );\n });\n\n public __internal_RenderThreadRuntimes: FC<{\n provider: ComponentType<PropsWithChildren>;\n }> = ({ provider }) => {\n this.useAliveThreadsKeysChanged(); // trigger re-render on alive threads change\n\n return Array.from(this.instances.keys()).map((threadId) => (\n <this._OuterActiveThreadProvider\n key={threadId}\n threadId={threadId}\n provider={provider}\n />\n ));\n };\n}\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { AddToolResultOptions, RespondToToolApprovalOptions, ResumeRunConfig, Re
9
9
  import { ThreadListRuntimeCore } from "../../runtime/interfaces/thread-list-runtime-core.js";
10
10
  import { BaseSubscribable } from "../../subscribable/subscribable.js";
11
11
  import "../../store/index.js";
12
- import { RemoteThreadInitializeResponse, RemoteThreadListOptions } from "../../runtimes/remote-thread-list/types.js";
12
+ import { RemoteThreadListOptions } from "../../runtimes/remote-thread-list/types.js";
13
13
  import { RemoteThreadData, THREAD_MAPPING_ID } from "../../runtimes/remote-thread-list/remote-thread-state.js";
14
14
  import "../../internal.js";
15
15
  import "../../index.js";
@@ -21,6 +21,8 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
21
21
  private _loadThreadsPromise;
22
22
  private _loadMorePromise;
23
23
  private _loadGeneration;
24
+ private _switchGeneration;
25
+ private _switchTask;
24
26
  private _mainThreadId;
25
27
  private readonly _state;
26
28
  get threadItems(): Readonly<Record<THREAD_MAPPING_ID, RemoteThreadData>>;
@@ -149,8 +151,13 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
149
151
  switchToThread(threadIdOrRemoteId: string, options?: {
150
152
  unarchive?: boolean;
151
153
  }): Promise<void>;
154
+ private _switchToThread;
152
155
  switchToNewThread(): Promise<void>;
153
- initialize: (threadId: string) => Promise<RemoteThreadInitializeResponse>;
156
+ private _switchToNewThread;
157
+ initialize: (threadId: string) => Promise<{
158
+ remoteId: string;
159
+ externalId: string | undefined;
160
+ }>;
154
161
  generateTitle: (threadId: string) => Promise<void>;
155
162
  rename(threadIdOrRemoteId: string, newTitle: string): Promise<void>;
156
163
  updateCustom(threadIdOrRemoteId: string, custom: Record<string, unknown> | undefined): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"mappings":";;;;;;;;;;;;;;;;;cAoCa,8CACH,4BACG;UAEH;mBACS;UAET;UACA;UACA;UAEA;mBACS;MAWN,eAAW,SAAA,OAvBX,mBAuBW;EAIf,yBAAqB;EAsDrB,YAAY;mBAmDF;cAGf,SAAS,yBACT,iBAAiB;UAoBX;UACA;EAED,sBAAsB,SAAS;EA0B/B;EAUA,UAAM;MAWF;MAIA;MAIA;MAIA;MAIA;MAIA;MAIA;cAMC;UAKJ;UAEA;EAOD,4BAAwB;;;eAvDlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DN,qBAAqB,6BAA0B;;;eANvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBxB,YAAY,6BAA0B;EAIhC,eACX,4BACA;IAAY;MACX;EA+EU,qBAAqB;EAyC3B,aAAoB,qBAAgB,QAzCT;EA+F3B,gBAAuB,qBAAgB;EAmCvC,OAAO,4BAA4B,mBAAmB;EA6BtD,aACL,4BACA,QAAQ,sCACP;UAiDW;EASD,QAAQ,6BAA0B;EAmBxC,UAAU,6BAA6B;EAsBjC,OAAO,6BAA0B;EAoBjC,OAAO,6BAA6B;UAUzC;EAED,4BAA4B"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"mappings":";;;;;;;;;;;;;;;;;cAoCa,8CACH,4BACG;UAEH;mBACS;UAET;UACA;UACA;UACA;UACA;UAEA;mBACS;MAWN,eAAW,SAAA,OAzBX,mBAyBW;EAIf,yBAAqB;EAsDrB,YAAY;mBAmDF;EAGf,YAAA,SAAS,yBACT,iBAAiB;UAoBX;UACA;EAED,sBAAsB,SAAS;EA0B/B;EAUA,UAAM;MAWF;MAIA;MAIA;MAIA;MAIA;MAIA;MAIA;cAMC;UAKJ;UAEA;EAOD,4BAAwB;;;eAvDlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DN,qBAAqB,6BAA0B;;;eANvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBxB,YAAY,6BAA0B;EAItC,eACL,4BACA;IAAY;MACX;UAOW;EAsGP,qBAAqB;UAOd;EA0CP,aAAoB,qBAAgB;;;;EAwDpC,gBAAuB,qBAAgB;EAmCvC,OAAO,4BAA4B,mBAAmB;EA6BtD,aACL,4BACA,QAAQ,sCACP;UAiDW;EAsBD,QAAQ,6BAA0B;EAmBxC,UAAU,6BAA6B;EAsBjC,OAAO,6BAA0B;EAoBjC,OAAO,6BAA6B;UAUzC;EAED,4BAA4B"}
@@ -18,6 +18,8 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
18
18
  _loadThreadsPromise;
19
19
  _loadMorePromise;
20
20
  _loadGeneration = 0;
21
+ _switchGeneration = 0;
22
+ _switchTask;
21
23
  _mainThreadId;
22
24
  _state = new OptimisticState({
23
25
  isLoading: true,
@@ -216,10 +218,17 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
216
218
  getItemById(threadIdOrRemoteId) {
217
219
  return getThreadData(this._state.value, threadIdOrRemoteId);
218
220
  }
219
- async switchToThread(threadIdOrRemoteId, options) {
221
+ switchToThread(threadIdOrRemoteId, options) {
222
+ const generation = ++this._switchGeneration;
223
+ const task = this._switchToThread(threadIdOrRemoteId, options, generation);
224
+ this._switchTask = task;
225
+ return task;
226
+ }
227
+ async _switchToThread(threadIdOrRemoteId, options, generation) {
220
228
  let data = this.getItemById(threadIdOrRemoteId);
221
229
  if (!data) {
222
230
  const remoteMetadata = await this._options.adapter.fetch(threadIdOrRemoteId);
231
+ if (generation !== this._switchGeneration) return;
223
232
  const state = this._state.value;
224
233
  const mappingId = createThreadMappingId(remoteMetadata.remoteId);
225
234
  const newThreadData = {
@@ -242,10 +251,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
242
251
  ...state.threadIdMap,
243
252
  [remoteMetadata.remoteId]: mappingId
244
253
  };
245
- const threadIdsWithoutRemote = state.threadIds.filter((id) => id !== remoteMetadata.remoteId);
246
- const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter((id) => id !== remoteMetadata.remoteId);
247
- const newThreadIds = remoteMetadata.status === "regular" ? [...threadIdsWithoutRemote, remoteMetadata.remoteId] : threadIdsWithoutRemote;
248
- const newArchivedThreadIds = remoteMetadata.status === "archived" ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId] : archivedThreadIdsWithoutRemote;
254
+ const remoteId = remoteMetadata.remoteId;
255
+ const wasInTarget = remoteMetadata.status === "regular" ? state.threadIds.includes(remoteId) : state.archivedThreadIds.includes(remoteId);
256
+ const threadIdsWithoutRemote = state.threadIds.filter((id) => id !== remoteId);
257
+ const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter((id) => id !== remoteId);
258
+ const newThreadIds = remoteMetadata.status === "regular" ? wasInTarget ? state.threadIds : [...threadIdsWithoutRemote, remoteId] : threadIdsWithoutRemote;
259
+ const newArchivedThreadIds = remoteMetadata.status === "archived" ? wasInTarget ? state.archivedThreadIds : [...archivedThreadIdsWithoutRemote, remoteId] : archivedThreadIdsWithoutRemote;
249
260
  this._state.update({
250
261
  ...state,
251
262
  threadIds: newThreadIds,
@@ -260,13 +271,26 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
260
271
  const task = this._hookManager.startThreadRuntime(data.id);
261
272
  if (this.mainThreadId !== void 0) await task;
262
273
  else task.then(() => this._notifySubscribers());
263
- if (data.status === "archived" && options?.unarchive !== false) await this.unarchive(data.id);
274
+ if (generation !== this._switchGeneration) return;
275
+ if (data.status === "archived" && options?.unarchive !== false) {
276
+ await this.unarchive(data.id);
277
+ if (generation !== this._switchGeneration) return;
278
+ }
264
279
  this._mainThreadId = data.id;
265
280
  this._notifySubscribers();
266
281
  this._notifyThreadIdChange();
267
282
  }
268
- async switchToNewThread() {
269
- while (this._state.baseValue.newThreadId !== void 0 && this._state.value.newThreadId === void 0) await this._state.waitForUpdate();
283
+ switchToNewThread() {
284
+ const generation = ++this._switchGeneration;
285
+ const task = this._switchToNewThread(generation);
286
+ this._switchTask = task;
287
+ return task;
288
+ }
289
+ async _switchToNewThread(generation) {
290
+ while (this._state.baseValue.newThreadId !== void 0 && this._state.value.newThreadId === void 0) {
291
+ await this._state.waitForUpdate();
292
+ if (generation !== this._switchGeneration) return;
293
+ }
270
294
  const state = this._state.value;
271
295
  let id = this._state.value.newThreadId;
272
296
  if (id === void 0) {
@@ -294,16 +318,20 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
294
318
  }
295
319
  });
296
320
  }
297
- return this.switchToThread(id);
321
+ return this._switchToThread(id, void 0, generation);
298
322
  }
299
323
  initialize = async (threadId) => {
300
324
  if (this._state.value.newThreadId !== threadId) {
301
325
  const data = this.getItemById(threadId);
302
326
  if (!data) throw threadNotFoundError(threadId, "initializing it");
303
327
  if (data.status === "new") throw threadStatusError(threadId, data.status, "be initialized here");
304
- return data.initializeTask;
328
+ const { remoteId, externalId } = await data.initializeTask;
329
+ return {
330
+ remoteId,
331
+ externalId
332
+ };
305
333
  }
306
- return this._state.optimisticUpdate({
334
+ const { remoteId, externalId } = await this._state.optimisticUpdate({
307
335
  execute: () => {
308
336
  return this._options.adapter.initialize(threadId);
309
337
  },
@@ -348,6 +376,10 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
348
376
  };
349
377
  }
350
378
  });
379
+ return {
380
+ remoteId,
381
+ externalId
382
+ };
351
383
  };
352
384
  generateTitle = async (threadId) => {
353
385
  const data = this.getItemById(threadId);
@@ -431,7 +463,18 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
431
463
  }
432
464
  async _ensureThreadIsNotMain(threadId) {
433
465
  if (threadId === this.newThreadId) throw new Error("Cannot ensure new thread is not main");
434
- if (threadId === this._mainThreadId) await this.switchToNewThread();
466
+ let lastAwaitedTask;
467
+ while (threadId === this._mainThreadId) {
468
+ let switchTask = this._switchTask;
469
+ const startedFallback = !switchTask || switchTask === lastAwaitedTask;
470
+ if (startedFallback) switchTask = this.switchToNewThread();
471
+ lastAwaitedTask = switchTask;
472
+ try {
473
+ await switchTask;
474
+ } catch (error) {
475
+ if (startedFallback && this._switchTask === switchTask) throw error;
476
+ }
477
+ }
435
478
  }
436
479
  async archive(threadIdOrRemoteId) {
437
480
  const data = this.getItemById(threadIdOrRemoteId);