@assistant-ui/core 0.3.17 → 0.3.19

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 (470) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +5 -4
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/speech.d.ts.map +1 -1
  5. package/dist/adapters/speech.js +13 -3
  6. package/dist/adapters/speech.js.map +1 -1
  7. package/dist/adapters/thread-history.d.ts +4 -0
  8. package/dist/adapters/thread-history.d.ts.map +1 -1
  9. package/dist/index.d.ts +3 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/internal.d.ts +4 -3
  12. package/dist/internal.js +3 -2
  13. package/dist/model-context/frame/host.d.ts.map +1 -1
  14. package/dist/model-context/frame/host.js +35 -14
  15. package/dist/model-context/frame/host.js.map +1 -1
  16. package/dist/model-context/frame/provider.d.ts +2 -0
  17. package/dist/model-context/frame/provider.d.ts.map +1 -1
  18. package/dist/model-context/frame/provider.js +30 -7
  19. package/dist/model-context/frame/provider.js.map +1 -1
  20. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  21. package/dist/model-context/interactable-composer-metadata.js +27 -18
  22. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  23. package/dist/model-context/registry.d.ts.map +1 -1
  24. package/dist/model-context/registry.js +3 -5
  25. package/dist/model-context/registry.js.map +1 -1
  26. package/dist/model-context/types.d.ts.map +1 -1
  27. package/dist/model-context/types.js +5 -4
  28. package/dist/model-context/types.js.map +1 -1
  29. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.js +45 -7
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  32. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  33. package/dist/react/client/DataRenderers.js +20 -15
  34. package/dist/react/client/DataRenderers.js.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  36. package/dist/react/client/InMemoryThreadList.js +62 -56
  37. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  38. package/dist/react/client/Interactables.d.ts.map +1 -1
  39. package/dist/react/client/Interactables.js +35 -32
  40. package/dist/react/client/Interactables.js.map +1 -1
  41. package/dist/react/client/RemoteThreadList.d.ts +1 -0
  42. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  43. package/dist/react/client/RemoteThreadList.js +154 -143
  44. package/dist/react/client/RemoteThreadList.js.map +1 -1
  45. package/dist/react/client/Tools.d.ts.map +1 -1
  46. package/dist/react/client/Tools.js +18 -16
  47. package/dist/react/client/Tools.js.map +1 -1
  48. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  49. package/dist/react/client/interactable-model-context.js +3 -2
  50. package/dist/react/client/interactable-model-context.js.map +1 -1
  51. package/dist/react/index.d.ts +2 -2
  52. package/dist/react/index.js +2 -2
  53. package/dist/react/interactables-legacy/Interactables.js +242 -121
  54. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  55. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  56. package/dist/react/interactables-legacy/useAssistantInteractable.js +3 -0
  57. package/dist/react/interactables-legacy/useAssistantInteractable.js.map +1 -1
  58. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  59. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  60. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  61. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  62. package/dist/react/model-context/makeAssistantTool.js +1 -1
  63. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  64. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  65. package/dist/react/model-context/useAssistantTool.js +1 -1
  66. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  67. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  68. package/dist/react/model-context/useInteractable.js +4 -1
  69. package/dist/react/model-context/useInteractable.js.map +1 -1
  70. package/dist/react/model-context/useInteractableVersions.js +1 -1
  71. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  72. package/dist/react/model-context/useToolArgsStatus.js +2 -1
  73. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  74. package/dist/react/primitives/message/MessageGroupedParts.d.ts +11 -2
  75. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  76. package/dist/react/primitives/message/MessageGroupedParts.js +3 -2
  77. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  78. package/dist/react/primitives/part/PartMessages.d.ts +1 -0
  79. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  80. package/dist/react/primitives/part/PartMessages.js +1 -0
  81. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  82. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  83. package/dist/react/primitives/thread/ThreadMessages.js +6 -5
  84. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  85. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  86. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +16 -8
  87. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  88. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
  89. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  90. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +105 -104
  91. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  92. package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -0
  93. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  94. package/dist/react/runtimes/RemoteThreadResource.js +13 -11
  95. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  96. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +5 -24
  97. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  98. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +354 -226
  99. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  100. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -0
  101. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  102. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +22 -2
  103. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  104. package/dist/react/runtimes/cloud/auiV0.d.ts +40 -15
  105. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  106. package/dist/react/runtimes/cloud/auiV0.js +62 -15
  107. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  108. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +2 -1
  109. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  110. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +6 -1
  111. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
  112. package/dist/react/runtimes/cloud/sdkIdentity.d.ts +6 -0
  113. package/dist/react/runtimes/cloud/sdkIdentity.d.ts.map +1 -0
  114. package/dist/react/runtimes/cloud/sdkIdentity.js +9 -0
  115. package/dist/react/runtimes/cloud/sdkIdentity.js.map +1 -0
  116. package/dist/react/runtimes/external-message-converter.d.ts +12 -2
  117. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  118. package/dist/react/runtimes/external-message-converter.js +26 -61
  119. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  120. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  121. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  122. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  123. package/dist/react/runtimes/useRemoteThreadListRuntime.js +64 -24
  124. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  125. package/dist/react/utils/groupParts.d.ts +6 -1
  126. package/dist/react/utils/groupParts.d.ts.map +1 -1
  127. package/dist/react/utils/groupParts.js +6 -0
  128. package/dist/react/utils/groupParts.js.map +1 -1
  129. package/dist/react/utils/useJSONEqual.d.ts +3 -1
  130. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  131. package/dist/react/utils/useJSONEqual.js +6 -1
  132. package/dist/react/utils/useJSONEqual.js.map +1 -1
  133. package/dist/react/utils/useJSONSchemaDependency.d.ts +7 -0
  134. package/dist/react/utils/useJSONSchemaDependency.d.ts.map +1 -0
  135. package/dist/react/utils/useJSONSchemaDependency.js +20 -0
  136. package/dist/react/utils/useJSONSchemaDependency.js.map +1 -0
  137. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  138. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  139. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  140. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  141. package/dist/runtime/api/thread-list-runtime.d.ts +3 -0
  142. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  143. package/dist/runtime/api/thread-list-runtime.js +18 -14
  144. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  145. package/dist/runtime/api/thread-runtime.d.ts +4 -0
  146. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  147. package/dist/runtime/api/thread-runtime.js +3 -6
  148. package/dist/runtime/api/thread-runtime.js.map +1 -1
  149. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -0
  150. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  151. package/dist/runtime/base/base-composer-runtime-core.js +62 -22
  152. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  153. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -0
  154. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.js +161 -69
  156. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  157. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  158. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  159. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -1
  160. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  162. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/queue/message-queue.d.ts +5 -0
  164. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  165. package/dist/runtime/queue/message-queue.js +61 -6
  166. package/dist/runtime/queue/message-queue.js.map +1 -1
  167. package/dist/runtime/utils/auto-status.d.ts +6 -2
  168. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  169. package/dist/runtime/utils/auto-status.js +12 -4
  170. package/dist/runtime/utils/auto-status.js.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.d.ts +16 -4
  172. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  173. package/dist/runtime/utils/external-message-conversion.js +49 -13
  174. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  175. package/dist/runtime/utils/message-repository.d.ts +1 -0
  176. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  177. package/dist/runtime/utils/message-repository.js +18 -9
  178. package/dist/runtime/utils/message-repository.js.map +1 -1
  179. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  180. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.js +5 -3
  182. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  183. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  184. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  185. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  186. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  187. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +8 -1
  188. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  189. package/dist/runtimes/internal.d.ts +3 -3
  190. package/dist/runtimes/internal.js +2 -2
  191. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  192. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  193. package/dist/runtimes/local/local-thread-runtime-core.js +4 -1
  194. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  195. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  196. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  197. package/dist/runtimes/remote-thread-list/remote-thread-state.js +130 -42
  198. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  199. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  200. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  201. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  202. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  203. package/dist/runtimes/remote-thread-list/title.d.ts +3 -1
  204. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  205. package/dist/runtimes/remote-thread-list/title.js +9 -1
  206. package/dist/runtimes/remote-thread-list/title.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/types.d.ts +10 -0
  208. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  209. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  210. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -1
  211. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  212. package/dist/store/clients/external-thread.d.ts.map +1 -1
  213. package/dist/store/clients/external-thread.js +260 -203
  214. package/dist/store/clients/external-thread.js.map +1 -1
  215. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  216. package/dist/store/clients/model-context-client.js +2 -1
  217. package/dist/store/clients/model-context-client.js.map +1 -1
  218. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  219. package/dist/store/clients/single-thread-list.js +1 -0
  220. package/dist/store/clients/single-thread-list.js.map +1 -1
  221. package/dist/store/clients/suggestions.d.ts.map +1 -1
  222. package/dist/store/clients/suggestions.js +5 -4
  223. package/dist/store/clients/suggestions.js.map +1 -1
  224. package/dist/store/clients/thread-tasks.d.ts +13 -0
  225. package/dist/store/clients/thread-tasks.d.ts.map +1 -0
  226. package/dist/store/clients/thread-tasks.js +69 -0
  227. package/dist/store/clients/thread-tasks.js.map +1 -0
  228. package/dist/store/index.d.ts +3 -2
  229. package/dist/store/index.js +3 -3
  230. package/dist/store/primitive-predicates.d.ts.map +1 -1
  231. package/dist/store/primitive-predicates.js +4 -4
  232. package/dist/store/primitive-predicates.js.map +1 -1
  233. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  234. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  235. package/dist/store/runtime-clients/composer-runtime-client.js +97 -61
  236. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  237. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  238. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  239. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  240. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  241. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  242. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
  243. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  244. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  245. package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -52
  246. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  247. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  248. package/dist/store/runtime-clients/thread-runtime-client.js +246 -126
  249. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  250. package/dist/store/scope-registration.d.ts +2 -0
  251. package/dist/store/scope-registration.d.ts.map +1 -1
  252. package/dist/store/scopes/composer.d.ts +10 -2
  253. package/dist/store/scopes/composer.d.ts.map +1 -1
  254. package/dist/store/scopes/message.d.ts +30 -1
  255. package/dist/store/scopes/message.d.ts.map +1 -1
  256. package/dist/store/scopes/task.d.ts +36 -0
  257. package/dist/store/scopes/task.d.ts.map +1 -0
  258. package/dist/store/scopes/task.js +0 -0
  259. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  260. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  261. package/dist/store/scopes/thread.d.ts +28 -0
  262. package/dist/store/scopes/thread.d.ts.map +1 -1
  263. package/dist/store/scopes/threads.d.ts +1 -0
  264. package/dist/store/scopes/threads.d.ts.map +1 -1
  265. package/dist/subscribable/subscribable.d.ts +2 -1
  266. package/dist/subscribable/subscribable.d.ts.map +1 -1
  267. package/dist/subscribable/subscribable.js +23 -15
  268. package/dist/subscribable/subscribable.js.map +1 -1
  269. package/dist/types/attachment.d.ts +2 -1
  270. package/dist/types/attachment.d.ts.map +1 -1
  271. package/dist/types/attachment.js +2 -1
  272. package/dist/types/attachment.js.map +1 -1
  273. package/dist/types/index.d.ts +2 -2
  274. package/dist/types/message.d.ts +8 -1
  275. package/dist/types/message.d.ts.map +1 -1
  276. package/dist/types/message.js.map +1 -1
  277. package/dist/utils/abortable-iterable.d.ts +19 -0
  278. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  279. package/dist/utils/abortable-iterable.js +88 -0
  280. package/dist/utils/abortable-iterable.js.map +1 -0
  281. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  282. package/dist/utils/composite-context-provider.js +20 -2
  283. package/dist/utils/composite-context-provider.js.map +1 -1
  284. package/dist/utils/getGroupStatus.d.ts +18 -2
  285. package/dist/utils/getGroupStatus.d.ts.map +1 -1
  286. package/dist/utils/getGroupStatus.js +32 -7
  287. package/dist/utils/getGroupStatus.js.map +1 -1
  288. package/dist/utils/record.d.ts +11 -0
  289. package/dist/utils/record.d.ts.map +1 -0
  290. package/dist/utils/record.js +12 -0
  291. package/dist/utils/record.js.map +1 -0
  292. package/dist/utils/wire-media.d.ts.map +1 -1
  293. package/dist/utils/wire-media.js +2 -2
  294. package/dist/utils/wire-media.js.map +1 -1
  295. package/package.json +11 -11
  296. package/src/adapters/attachment.test.ts +50 -1
  297. package/src/adapters/attachment.ts +7 -4
  298. package/src/adapters/speech.test.ts +236 -0
  299. package/src/adapters/speech.ts +17 -10
  300. package/src/adapters/thread-history.ts +3 -0
  301. package/src/index.ts +2 -0
  302. package/src/internal.ts +4 -0
  303. package/src/model-context/frame/host.test.ts +137 -1
  304. package/src/model-context/frame/host.ts +49 -16
  305. package/src/model-context/frame/provider.test.ts +71 -0
  306. package/src/model-context/frame/provider.ts +37 -7
  307. package/src/model-context/interactable-composer-metadata.test.ts +58 -0
  308. package/src/model-context/interactable-composer-metadata.ts +19 -13
  309. package/src/model-context/registry.test.ts +12 -0
  310. package/src/model-context/registry.ts +3 -2
  311. package/src/model-context/types.test.ts +25 -0
  312. package/src/model-context/types.ts +9 -4
  313. package/src/react/RuntimeAdapter.test.ts +34 -0
  314. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +244 -0
  315. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +104 -7
  316. package/src/react/client/DataRenderers.test.tsx +45 -0
  317. package/src/react/client/DataRenderers.ts +13 -9
  318. package/src/react/client/InMemoryThreadList.ts +1 -0
  319. package/src/react/client/Interactables.test.ts +72 -1
  320. package/src/react/client/Interactables.ts +22 -14
  321. package/src/react/client/RemoteThreadList.background.test.ts +148 -6
  322. package/src/react/client/RemoteThreadList.concurrent.test.tsx +42 -1
  323. package/src/react/client/RemoteThreadList.test.ts +386 -4
  324. package/src/react/client/RemoteThreadList.ts +181 -112
  325. package/src/react/client/Tools.ts +22 -11
  326. package/src/react/client/interactable-model-context.test.ts +44 -0
  327. package/src/react/client/interactable-model-context.ts +3 -2
  328. package/src/react/index.ts +5 -1
  329. package/src/react/interactables-legacy/Interactables.ts +16 -16
  330. package/src/react/interactables-legacy/useAssistantInteractable.test.tsx +132 -0
  331. package/src/react/interactables-legacy/useAssistantInteractable.ts +10 -1
  332. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  333. package/src/react/model-context/makeAssistantTool.ts +2 -2
  334. package/src/react/model-context/useAssistantTool.ts +2 -2
  335. package/src/react/model-context/useInteractable.test.tsx +177 -0
  336. package/src/react/model-context/useInteractable.ts +3 -0
  337. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  338. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  339. package/src/react/primitive-hooks/useActionBarCopy.test.ts +0 -1
  340. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +0 -1
  341. package/src/react/primitives/message/MessageGroupedParts.test.tsx +96 -0
  342. package/src/react/primitives/message/MessageGroupedParts.tsx +15 -4
  343. package/src/react/primitives/part/PartMessages.test.tsx +104 -1
  344. package/src/react/primitives/part/PartMessages.tsx +1 -0
  345. package/src/react/primitives/thread/ThreadMessages.test.tsx +142 -0
  346. package/src/react/primitives/thread/ThreadMessages.tsx +8 -5
  347. package/src/react/providers/ReadonlyThreadProvider.test.tsx +56 -0
  348. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  349. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +33 -0
  350. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  351. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +28 -5
  352. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  353. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +105 -0
  354. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +143 -112
  355. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  356. package/src/react/runtimes/RemoteThreadResource.ts +19 -12
  357. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +20 -14
  358. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +703 -6
  359. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +492 -402
  360. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +77 -0
  361. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +27 -1
  362. package/src/react/runtimes/cloud/auiV0.ts +160 -25
  363. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +36 -0
  364. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +8 -1
  365. package/src/react/runtimes/cloud/sdkIdentity.ts +9 -0
  366. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +18 -4
  367. package/src/react/runtimes/external-message-converter.test.ts +136 -1
  368. package/src/react/runtimes/external-message-converter.ts +39 -93
  369. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  370. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  371. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  372. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  373. package/src/react/runtimes/useRemoteThreadListRuntime.ts +34 -1
  374. package/src/react/utils/groupParts.ts +12 -1
  375. package/src/react/utils/useJSONEqual.ts +9 -0
  376. package/src/react/utils/useJSONSchemaDependency.ts +22 -0
  377. package/src/runtime/api/message-runtime.test.ts +75 -0
  378. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  379. package/src/runtime/api/thread-list-runtime.ts +21 -11
  380. package/src/runtime/api/thread-runtime.test.ts +136 -0
  381. package/src/runtime/api/thread-runtime.ts +10 -5
  382. package/src/runtime/base/base-composer-runtime-core.ts +105 -24
  383. package/src/runtime/base/base-thread-runtime-core.test.ts +1063 -2
  384. package/src/runtime/base/base-thread-runtime-core.ts +228 -87
  385. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  386. package/src/runtime/interfaces/thread-list-runtime-core.ts +5 -1
  387. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  388. package/src/runtime/queue/message-queue.ts +68 -6
  389. package/src/runtime/utils/auto-status.test.ts +112 -1
  390. package/src/runtime/utils/auto-status.ts +31 -5
  391. package/src/runtime/utils/external-message-conversion.test.ts +202 -0
  392. package/src/runtime/utils/external-message-conversion.ts +123 -32
  393. package/src/runtime/utils/message-repository.test.ts +49 -0
  394. package/src/runtime/utils/message-repository.ts +32 -20
  395. package/src/runtime/utils/thread-message-like.test.ts +52 -0
  396. package/src/runtime/utils/thread-message-like.ts +5 -1
  397. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  398. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -1
  399. package/src/runtimes/internal.ts +1 -0
  400. package/src/runtimes/local/local-thread-runtime-core.test.ts +21 -0
  401. package/src/runtimes/local/local-thread-runtime-core.ts +11 -1
  402. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +128 -2
  403. package/src/runtimes/remote-thread-list/remote-thread-state.ts +182 -42
  404. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  405. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  406. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  407. package/src/runtimes/remote-thread-list/title.ts +13 -0
  408. package/src/runtimes/remote-thread-list/types.ts +10 -0
  409. package/src/runtimes/tool-invocations/EDGE_CASES.md +2 -6
  410. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +133 -0
  411. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +10 -6
  412. package/src/store/clients/external-thread.ts +67 -4
  413. package/src/store/clients/model-context-client.ts +5 -1
  414. package/src/store/clients/single-thread-list.ts +1 -0
  415. package/src/store/clients/suggestions.test.ts +40 -0
  416. package/src/store/clients/suggestions.ts +13 -10
  417. package/src/store/clients/thread-tasks.test.ts +274 -0
  418. package/src/store/clients/thread-tasks.ts +138 -0
  419. package/src/store/index.ts +8 -0
  420. package/src/store/primitive-predicates.test.ts +48 -5
  421. package/src/store/primitive-predicates.ts +7 -2
  422. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  423. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  424. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  425. package/src/store/runtime-clients/thread-list-runtime-client.ts +1 -0
  426. package/src/store/runtime-clients/thread-runtime-client.ts +89 -11
  427. package/src/store/scope-registration.ts +2 -0
  428. package/src/store/scopes/composer.ts +16 -4
  429. package/src/store/scopes/message.ts +14 -0
  430. package/src/store/scopes/task.ts +34 -0
  431. package/src/store/scopes/thread-list-item.ts +5 -2
  432. package/src/store/scopes/thread.ts +20 -0
  433. package/src/store/scopes/threads.ts +1 -0
  434. package/src/store/thread-tasks.test.tsx +209 -0
  435. package/src/subscribable/subscribable.test.ts +156 -1
  436. package/src/subscribable/subscribable.ts +25 -15
  437. package/src/tests/MessageRepository.test.ts +117 -5
  438. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  439. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  440. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +47 -0
  441. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  442. package/src/tests/attachment-adapters.test.ts +14 -0
  443. package/src/tests/auiV0Encode.test.ts +300 -0
  444. package/src/tests/base-composer-runtime-core-send.test.ts +51 -0
  445. package/src/tests/base-composer-runtime-core.test.ts +353 -2
  446. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  447. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +178 -18
  448. package/src/tests/external-thread-attachments.test.tsx +208 -0
  449. package/src/tests/external-thread-parity.test.tsx +57 -0
  450. package/src/tests/groupParts.test.ts +71 -0
  451. package/src/tests/message-queue.test.ts +253 -0
  452. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  453. package/src/tests/remote-thread-list-reactive-threadId.test.ts +51 -0
  454. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  455. package/src/tests/thread-switch-events.test.tsx +78 -0
  456. package/src/tests/tools-scope-migration.test.tsx +28 -0
  457. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +43 -0
  458. package/src/types/attachment.ts +4 -0
  459. package/src/types/index.ts +1 -0
  460. package/src/types/message.ts +8 -0
  461. package/src/utils/abortable-iterable.test.ts +328 -0
  462. package/src/utils/abortable-iterable.ts +104 -0
  463. package/src/utils/composite-context-provider.test.ts +25 -0
  464. package/src/utils/composite-context-provider.ts +23 -2
  465. package/src/utils/getGroupStatus.test.ts +70 -4
  466. package/src/utils/getGroupStatus.ts +35 -12
  467. package/src/utils/record.test.ts +48 -0
  468. package/src/utils/record.ts +11 -0
  469. package/src/utils/wire-media.test.ts +10 -0
  470. package/src/utils/wire-media.ts +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["Unsubscribe","Tool","LanguageModelV1CallSettings","maxTokens","temperature","topP","presencePenalty","frequencyPenalty","seed","headers","Record","LanguageModelConfig","apiKey","baseUrl","modelName","reasoningEffort","ModelContext","priority","system","tools","callSettings","config","unstable_composerMetadata","ModelContextProvider","getModelContext","subscribe","callback","AssistantToolProps","TArgs","TResult","toolName","render","AssistantInstructionsConfig","disabled","instruction","AssistantContextConfig","getContext","stripOverwrite","tool","overwrite","_","rest","mergeModelContexts","configSet","Set","configs","Array","from","map","c","sort","a","b","toolPriorities","reduce","acc","name","Object","entries","existing","existingPriority","Error","higherPriorityTool","lowerPriorityTool","Math","max"],"sources":["../../src/model-context/types.ts"],"sourcesContent":["import type { Unsubscribe } from \"../types/unsubscribe\";\nimport type { Tool } from \"assistant-stream\";\n\nexport type LanguageModelV1CallSettings = {\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n seed?: number;\n headers?: Record<string, string | undefined>;\n};\n\nexport type LanguageModelConfig = {\n apiKey?: string;\n baseUrl?: string;\n modelName?: string;\n reasoningEffort?: string;\n};\n\nexport type ModelContext = {\n priority?: number | undefined;\n system?: string | undefined;\n tools?: Record<string, Tool<any, any>> | undefined;\n callSettings?: LanguageModelV1CallSettings | undefined;\n config?: LanguageModelConfig | undefined;\n /**\n * Persisted message metadata pulled at send time and merged into the outgoing\n * user message's `metadata.custom` (not forwarded to the model directly).\n * Ignored by the transport, which only reads system/tools/callSettings/config.\n */\n unstable_composerMetadata?: Record<string, unknown> | undefined;\n};\n\nexport type ModelContextProvider = {\n getModelContext: () => ModelContext;\n subscribe?: (callback: () => void) => Unsubscribe;\n};\n\nexport type AssistantToolProps<\n TArgs extends Record<string, unknown>,\n TResult,\n> = Tool<TArgs, TResult> & {\n toolName: string;\n render?: unknown;\n};\n\nexport type AssistantInstructionsConfig = {\n disabled?: boolean | undefined;\n instruction: string;\n};\n\nexport type AssistantContextConfig = {\n getContext: () => string;\n disabled?: boolean | undefined;\n};\n\nconst stripOverwrite = (tool: Tool<any, any>): Tool<any, any> => {\n if (!tool.overwrite) return tool;\n const { overwrite: _, ...rest } = tool;\n return rest as Tool<any, any>;\n};\n\nexport const mergeModelContexts = (\n configSet: Set<ModelContextProvider>,\n): ModelContext => {\n const configs = Array.from(configSet)\n .map((c) => c.getModelContext())\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n const toolPriorities: Record<string, number> = {};\n\n return configs.reduce((acc, config) => {\n const priority = config.priority ?? 0;\n if (config.system) {\n if (acc.system) {\n acc.system += `\\n\\n${config.system}`;\n } else {\n acc.system = config.system;\n }\n }\n if (config.tools) {\n for (const [name, tool] of Object.entries(config.tools)) {\n const existing = acc.tools?.[name];\n if (existing && existing !== tool) {\n const existingPriority = toolPriorities[name]!;\n if (existingPriority === priority) {\n if (!tool.overwrite) {\n throw new Error(\n `You tried to define a tool with the name ${name}, but it already exists.`,\n );\n }\n acc.tools![name] = stripOverwrite(tool);\n continue;\n }\n\n const higherPriorityTool =\n existingPriority > priority ? existing : tool;\n const lowerPriorityTool =\n existingPriority > priority ? tool : existing;\n acc.tools![name] = stripOverwrite({\n ...lowerPriorityTool,\n ...higherPriorityTool,\n } as Tool<any, any>);\n toolPriorities[name] = Math.max(existingPriority, priority);\n continue;\n }\n\n if (!acc.tools) acc.tools = {};\n acc.tools[name] = stripOverwrite(tool);\n toolPriorities[name] ??= priority;\n }\n }\n if (config.config) {\n acc.config = {\n ...acc.config,\n ...config.config,\n };\n }\n if (config.callSettings) {\n acc.callSettings = {\n ...acc.callSettings,\n ...config.callSettings,\n };\n }\n if (config.unstable_composerMetadata) {\n acc.unstable_composerMetadata = {\n ...acc.unstable_composerMetadata,\n ...config.unstable_composerMetadata,\n };\n }\n return acc;\n }, {} as ModelContext);\n};\n"],"mappings":";AAyDA,MAAMqC,kBAAkBC,SAAyC;CAC/D,IAAI,CAACA,KAAKC,WAAW,OAAOD;CAC5B,MAAM,EAAEC,WAAWC,GAAG,GAAGC,SAASH;CAClC,OAAOG;AACT;AAEA,MAAaC,sBACXC,cACiB;CACjB,MAAME,UAAUC,MAAMC,KAAKJ,SAAS,CAAC,CAClCK,KAAKC,MAAMA,EAAEzB,gBAAgB,CAAC,CAAC,CAC/B0B,MAAMC,GAAGC,OAAOA,EAAEnC,YAAY,MAAMkC,EAAElC,YAAY,EAAE;CAEvD,MAAMoC,iBAAyC,CAAC;CAEhD,OAAOR,QAAQS,QAAQC,KAAKlC,WAAW;EACrC,MAAMJ,WAAWI,OAAOJ,YAAY;EACpC,IAAII,OAAOH,QAAQ;GACjB,IAAIqC,IAAIrC,QACNqC,IAAIrC,UAAU,OAAOG,OAAOH;QAE5BqC,IAAIrC,SAASG,OAAOH;EAExB;EACA,IAAIG,OAAOF,OACT,KAAK,MAAM,CAACqC,MAAMlB,SAASmB,OAAOC,QAAQrC,OAAOF,KAAK,GAAG;GACvD,MAAMwC,WAAWJ,IAAIpC,QAAQqC;GAC7B,IAAIG,YAAYA,aAAarB,MAAM;IACjC,MAAMsB,mBAAmBP,eAAeG;IACxC,IAAII,qBAAqB3C,UAAU;KACjC,IAAI,CAACqB,KAAKC,WACR,MAAM,IAAIsB,MACR,4CAA4CL,KAAI,yBAClD;KAEFD,IAAIpC,MAAOqC,QAAQnB,eAAeC,IAAI;KACtC;IACF;IAEA,MAAMwB,qBACJF,mBAAmB3C,WAAW0C,WAAWrB;IAC3C,MAAMyB,oBACJH,mBAAmB3C,WAAWqB,OAAOqB;IACvCJ,IAAIpC,MAAOqC,QAAQnB,eAAe;KAChC,GAAG0B;KACH,GAAGD;IACL,CAAmB;IACnBT,eAAeG,QAAQQ,KAAKC,IAAIL,kBAAkB3C,QAAQ;IAC1D;GACF;GAEA,IAAI,CAACsC,IAAIpC,OAAOoC,IAAIpC,QAAQ,CAAC;GAC7BoC,IAAIpC,MAAMqC,QAAQnB,eAAeC,IAAI;GACrCe,eAAeG,UAAUvC;EAC3B;EAEF,IAAII,OAAOA,QACTkC,IAAIlC,SAAS;GACX,GAAGkC,IAAIlC;GACP,GAAGA,OAAOA;EACZ;EAEF,IAAIA,OAAOD,cACTmC,IAAInC,eAAe;GACjB,GAAGmC,IAAInC;GACP,GAAGC,OAAOD;EACZ;EAEF,IAAIC,OAAOC,2BACTiC,IAAIjC,4BAA4B;GAC9B,GAAGiC,IAAIjC;GACP,GAAGD,OAAOC;EACZ;EAEF,OAAOiC;CACT,GAAG,CAAC,CAAiB;AACvB"}
1
+ {"version":3,"file":"types.js","names":["Unsubscribe","Tool","nullProtoRecord","LanguageModelV1CallSettings","maxTokens","temperature","topP","presencePenalty","frequencyPenalty","seed","headers","Record","LanguageModelConfig","apiKey","baseUrl","modelName","reasoningEffort","ModelContext","priority","system","tools","callSettings","config","unstable_composerMetadata","ModelContextProvider","getModelContext","subscribe","callback","AssistantToolProps","TArgs","TResult","toolName","render","AssistantInstructionsConfig","disabled","instruction","AssistantContextConfig","getContext","stripOverwrite","tool","overwrite","_","rest","mergeModelContexts","configSet","Set","configs","Array","from","map","c","sort","a","b","toolPriorities","reduce","acc","name","Object","entries","hasExisting","undefined","hasOwn","existing","existingPriority","Error","higherPriorityTool","lowerPriorityTool","Math","max"],"sources":["../../src/model-context/types.ts"],"sourcesContent":["import type { Unsubscribe } from \"../types/unsubscribe\";\nimport type { Tool } from \"assistant-stream\";\nimport { nullProtoRecord } from \"../utils/record\";\n\nexport type LanguageModelV1CallSettings = {\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n seed?: number;\n headers?: Record<string, string | undefined>;\n};\n\nexport type LanguageModelConfig = {\n apiKey?: string;\n baseUrl?: string;\n modelName?: string;\n reasoningEffort?: string;\n};\n\nexport type ModelContext = {\n priority?: number | undefined;\n system?: string | undefined;\n tools?: Record<string, Tool<any, any>> | undefined;\n callSettings?: LanguageModelV1CallSettings | undefined;\n config?: LanguageModelConfig | undefined;\n /**\n * Persisted message metadata pulled at send time and merged into the outgoing\n * user message's `metadata.custom` (not forwarded to the model directly).\n * Ignored by the transport, which only reads system/tools/callSettings/config.\n */\n unstable_composerMetadata?: Record<string, unknown> | undefined;\n};\n\nexport type ModelContextProvider = {\n getModelContext: () => ModelContext;\n subscribe?: (callback: () => void) => Unsubscribe;\n};\n\nexport type AssistantToolProps<\n TArgs extends Record<string, unknown>,\n TResult,\n> = Tool<TArgs, TResult> & {\n toolName: string;\n render?: unknown;\n};\n\nexport type AssistantInstructionsConfig = {\n disabled?: boolean | undefined;\n instruction: string;\n};\n\nexport type AssistantContextConfig = {\n getContext: () => string;\n disabled?: boolean | undefined;\n};\n\nconst stripOverwrite = (tool: Tool<any, any>): Tool<any, any> => {\n if (!tool.overwrite) return tool;\n const { overwrite: _, ...rest } = tool;\n return rest as Tool<any, any>;\n};\n\nexport const mergeModelContexts = (\n configSet: Set<ModelContextProvider>,\n): ModelContext => {\n const configs = Array.from(configSet)\n .map((c) => c.getModelContext())\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n const toolPriorities = nullProtoRecord<number>();\n\n return configs.reduce((acc, config) => {\n const priority = config.priority ?? 0;\n if (config.system) {\n if (acc.system) {\n acc.system += `\\n\\n${config.system}`;\n } else {\n acc.system = config.system;\n }\n }\n if (config.tools) {\n for (const [name, tool] of Object.entries(config.tools)) {\n const hasExisting =\n acc.tools !== undefined && Object.hasOwn(acc.tools, name);\n const existing = hasExisting ? acc.tools![name] : undefined;\n if (existing && existing !== tool) {\n const existingPriority = toolPriorities[name]!;\n if (existingPriority === priority) {\n if (!tool.overwrite) {\n throw new Error(\n `You tried to define a tool with the name ${name}, but it already exists.`,\n );\n }\n acc.tools![name] = stripOverwrite(tool);\n continue;\n }\n\n const higherPriorityTool =\n existingPriority > priority ? existing : tool;\n const lowerPriorityTool =\n existingPriority > priority ? tool : existing;\n acc.tools![name] = stripOverwrite({\n ...lowerPriorityTool,\n ...higherPriorityTool,\n } as Tool<any, any>);\n toolPriorities[name] = Math.max(existingPriority, priority);\n continue;\n }\n\n if (!acc.tools) acc.tools = nullProtoRecord();\n acc.tools[name] = stripOverwrite(tool);\n if (!Object.hasOwn(toolPriorities, name)) {\n toolPriorities[name] = priority;\n }\n }\n }\n if (config.config) {\n acc.config = {\n ...acc.config,\n ...config.config,\n };\n }\n if (config.callSettings) {\n acc.callSettings = {\n ...acc.callSettings,\n ...config.callSettings,\n };\n }\n if (config.unstable_composerMetadata) {\n acc.unstable_composerMetadata = {\n ...acc.unstable_composerMetadata,\n ...config.unstable_composerMetadata,\n };\n }\n return acc;\n }, {} as ModelContext);\n};\n"],"mappings":";;AA0DA,MAAMsC,kBAAkBC,SAAyC;CAC/D,IAAI,CAACA,KAAKC,WAAW,OAAOD;CAC5B,MAAM,EAAEC,WAAWC,GAAG,GAAGC,SAASH;CAClC,OAAOG;AACT;AAEA,MAAaC,sBACXC,cACiB;CACjB,MAAME,UAAUC,MAAMC,KAAKJ,SAAS,CAAC,CAClCK,KAAKC,MAAMA,EAAEzB,gBAAgB,CAAC,CAAC,CAC/B0B,MAAMC,GAAGC,OAAOA,EAAEnC,YAAY,MAAMkC,EAAElC,YAAY,EAAE;CAEvD,MAAMoC,iBAAiBpD,gBAAwB;CAE/C,OAAO4C,QAAQS,QAAQC,KAAKlC,WAAW;EACrC,MAAMJ,WAAWI,OAAOJ,YAAY;EACpC,IAAII,OAAOH,QAAQ;GACjB,IAAIqC,IAAIrC,QACNqC,IAAIrC,UAAU,OAAOG,OAAOH;QAE5BqC,IAAIrC,SAASG,OAAOH;EAExB;EACA,IAAIG,OAAOF,OACT,KAAK,MAAM,CAACqC,MAAMlB,SAASmB,OAAOC,QAAQrC,OAAOF,KAAK,GAAG;GAGvD,MAAM2C,WADJP,IAAIpC,UAAUyC,KAAAA,KAAaH,OAAOI,OAAON,IAAIpC,OAAOqC,IAAI,IAC3BD,IAAIpC,MAAOqC,QAAQI,KAAAA;GAClD,IAAIE,YAAYA,aAAaxB,MAAM;IACjC,MAAMyB,mBAAmBV,eAAeG;IACxC,IAAIO,qBAAqB9C,UAAU;KACjC,IAAI,CAACqB,KAAKC,WACR,MAAM,IAAIyB,MACR,4CAA4CR,KAAI,yBAClD;KAEFD,IAAIpC,MAAOqC,QAAQnB,eAAeC,IAAI;KACtC;IACF;IAEA,MAAM2B,qBACJF,mBAAmB9C,WAAW6C,WAAWxB;IAC3C,MAAM4B,oBACJH,mBAAmB9C,WAAWqB,OAAOwB;IACvCP,IAAIpC,MAAOqC,QAAQnB,eAAe;KAChC,GAAG6B;KACH,GAAGD;IACL,CAAmB;IACnBZ,eAAeG,QAAQW,KAAKC,IAAIL,kBAAkB9C,QAAQ;IAC1D;GACF;GAEA,IAAI,CAACsC,IAAIpC,OAAOoC,IAAIpC,QAAQlB,gBAAgB;GAC5CsD,IAAIpC,MAAMqC,QAAQnB,eAAeC,IAAI;GACrC,IAAI,CAACmB,OAAOI,OAAOR,gBAAgBG,IAAI,GACrCH,eAAeG,QAAQvC;EAE3B;EAEF,IAAII,OAAOA,QACTkC,IAAIlC,SAAS;GACX,GAAGkC,IAAIlC;GACP,GAAGA,OAAOA;EACZ;EAEF,IAAIA,OAAOD,cACTmC,IAAInC,eAAe;GACjB,GAAGmC,IAAInC;GACP,GAAGC,OAAOD;EACZ;EAEF,IAAIC,OAAOC,2BACTiC,IAAIjC,4BAA4B;GAC9B,GAAGiC,IAAIjC;GACP,GAAGD,OAAOC;EACZ;EAEF,OAAOiC;CACT,GAAG,CAAC,CAAiB;AACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalStorageThreadListAdapter.d.ts","names":[],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"mappings":";;;;;;KA8BY;EACV,QAAQ,cAAc;EACtB,QAAQ,aAAa,gBAAgB;EACrC,WAAW,cAAc;;KAkCtB;EACH,SAAS;EACT;EACA,iBAAiB;;KAGd;EACH;EACA;EACA;EACA;EACA,SAAS;;cAqIE,4BACX,uBACC;cAoCU,+BACX,uBACC;cAqIU,4BACX,SAAS,+BACR"}
1
+ {"version":3,"file":"LocalStorageThreadListAdapter.d.ts","names":[],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"mappings":";;;;;;KAiCY;EACV,QAAQ,cAAc;EACtB,QAAQ,aAAa,gBAAgB;EACrC,WAAW,cAAc;;KAkCtB;EACH,SAAS;EACT;EACA,iBAAiB;;KAGd;EACH;EACA;EACA;EACA;EACA,SAAS;;cAmOE,4BACX,uBACC;cAoCU,+BACX,uBACC;cAqIU,4BACX,SAAS,+BACR"}
@@ -55,7 +55,41 @@ const parseDate = (value) => {
55
55
  return Number.isNaN(date.getTime()) ? null : date;
56
56
  };
57
57
  const isMessageRole = (value) => value === "system" || value === "user" || value === "assistant";
58
- const parseStoredThreadMessage = (value) => {
58
+ const MAX_STORED_MESSAGE_DEPTH = 100;
59
+ const storedPartGuards = {
60
+ text: (part) => typeof part.text === "string",
61
+ reasoning: (part) => typeof part.text === "string" || typeof part.unstable_summary === "string",
62
+ image: (part) => typeof part.image === "string",
63
+ file: (part) => typeof part.data === "string" && typeof part.mimeType === "string",
64
+ audio: (part) => isRecord(part.audio) && typeof part.audio.data === "string" && typeof part.audio.format === "string",
65
+ data: (part) => typeof part.name === "string",
66
+ source: (part) => typeof part.id === "string" && (part.sourceType === "url" ? typeof part.url === "string" : part.sourceType === "document" && typeof part.title === "string" && typeof part.mediaType === "string"),
67
+ "generative-ui": (part) => isRecord(part.spec),
68
+ "tool-call": (part) => typeof part.toolCallId === "string" && typeof part.toolName === "string" && isRecord(part.args) && typeof part.argsText === "string"
69
+ };
70
+ const isStoredMessagePart = (value) => isRecord(value) && typeof value.type === "string" && (!Object.hasOwn(storedPartGuards, value.type) || storedPartGuards[value.type](value));
71
+ const parseStoredMessageParts = (content, depth) => content.flatMap((part) => {
72
+ if (!isStoredMessagePart(part)) return [];
73
+ if (part.type !== "tool-call" || part.messages === void 0) return [part];
74
+ const { messages, ...toolCall } = part;
75
+ if (!Array.isArray(messages)) return [toolCall];
76
+ return [{
77
+ ...toolCall,
78
+ messages: messages.flatMap((item) => {
79
+ const message = parseStoredThreadMessage(item, depth + 1);
80
+ return message ? [message] : [];
81
+ })
82
+ }];
83
+ });
84
+ const parseStoredAttachment = (value) => {
85
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.type !== "string" || typeof value.name !== "string" || !isRecord(value.status) || value.status.type !== "complete" || !Array.isArray(value.content)) return null;
86
+ return {
87
+ ...value,
88
+ content: value.content.filter(isStoredMessagePart)
89
+ };
90
+ };
91
+ const parseStoredThreadMessage = (value, depth) => {
92
+ if (depth > MAX_STORED_MESSAGE_DEPTH) return null;
59
93
  if (!isRecord(value) || typeof value.id !== "string") return null;
60
94
  if (!isMessageRole(value.role)) return null;
61
95
  if (!Array.isArray(value.content)) return null;
@@ -70,7 +104,7 @@ const parseStoredThreadMessage = (value) => {
70
104
  return {
71
105
  id: value.id,
72
106
  role: "assistant",
73
- content: value.content,
107
+ content: parseStoredMessageParts(value.content, depth),
74
108
  status,
75
109
  createdAt,
76
110
  metadata: {
@@ -88,16 +122,20 @@ const parseStoredThreadMessage = (value) => {
88
122
  if (value.role === "user") return {
89
123
  id: value.id,
90
124
  role: "user",
91
- content: value.content,
92
- attachments: Array.isArray(value.attachments) ? value.attachments : [],
125
+ content: parseStoredMessageParts(value.content, depth),
126
+ attachments: Array.isArray(value.attachments) ? value.attachments.flatMap((item) => {
127
+ const attachment = parseStoredAttachment(item);
128
+ return attachment ? [attachment] : [];
129
+ }) : [],
93
130
  createdAt,
94
131
  metadata: { custom: metadata.custom }
95
132
  };
96
- if (value.content.length !== 1) return null;
133
+ const content = parseStoredMessageParts(value.content, depth);
134
+ if (content.length !== 1) return null;
97
135
  return {
98
136
  id: value.id,
99
137
  role: "system",
100
- content: [value.content[0]],
138
+ content: [content[0]],
101
139
  createdAt,
102
140
  metadata: { custom: metadata.custom }
103
141
  };
@@ -112,7 +150,7 @@ const parseStoredThreadMetadata = (raw) => {
112
150
  };
113
151
  const parseStoredMessageRepositoryItem = (value) => {
114
152
  if (!isRecord(value)) return null;
115
- const message = parseStoredThreadMessage(value.message);
153
+ const message = parseStoredThreadMessage(value.message, 0);
116
154
  if (!message) return null;
117
155
  const parentId = value.parentId;
118
156
  if (parentId !== void 0 && parentId !== null && typeof parentId !== "string") return null;
@@ -1 +1 @@
1
- {"version":3,"file":"LocalStorageThreadListAdapter.js","names":["AssistantStream","createAssistantStream","FC","PropsWithChildren","useEffect","useMemo","useRef","useState","useAui","RemoteThreadInitializeResponse","RemoteThreadListAdapter","RemoteThreadListResponse","RemoteThreadMetadata","ThreadHistoryAdapter","ThreadMessage","RunConfig","ExportedMessageRepository","ExportedMessageRepositoryItem","isRecord","RuntimeAdapterProvider","RuntimeAdapters","TitleGenerationAdapter","AsyncStorageLike","getItem","key","Promise","setItem","value","removeItem","KeyedMutationQueue","tails","Map","run","mutation","T","previous","get","result","then","tail","undefined","set","delete","mutationQueues","WeakMap","getMutationQueue","storage","queue","LocalStorageAdapterOptions","prefix","titleGenerator","StoredThreadMetadata","remoteId","externalId","status","title","custom","Record","StoredSystemMessage","Extract","role","StoredUserMessage","StoredAssistantMessage","parseJSON","raw","JSON","parse","parseStoredThread","parseDate","Date","Number","isNaN","getTime","date","isMessageRole","parseStoredThreadMessage","id","Array","isArray","content","createdAt","metadata","type","submittedFeedback","submittedFeedbackType","unstable_state","unstable_annotations","unstable_data","steps","timing","NonNullable","isOptimistic","attachments","length","parseStoredThreadMetadata","parsed","flatMap","item","thread","parseStoredMessageRepositoryItem","message","parentId","runConfig","parseStoredMessageRepository","messages","candidateMessages","parsedItem","acceptedIds","Set","has","add","headId","some","AsyncStorageHistoryAdapter","getAui","ReturnType","mutationQueue","constructor","aui","_messagesKey","load","threadListItem","getState","append","initialize","repo","idx","findIndex","m","push","stringify","useLocalStorageThreadAdapters","auiRef","current","history","createHistoryProvider","Provider","t0","$","_c","children","adapters","t1","createLocalStorageAdapter","options","threadsKey","messagesKey","threadId","loadThreadMetadata","saveThreadMetadata","threads","updateThreadMetadata","update","find","adapter","unstable_Provider","unstable_useAdapters","useLocalStorageAdapters","list","map","t","unshift","rename","newTitle","updateCustom","archive","unarchive","filtered","filter","fetch","Error","generateTitle","controller","appendText"],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"sourcesContent":["import { type AssistantStream, createAssistantStream } from \"assistant-stream\";\nimport {\n type FC,\n type PropsWithChildren,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n ThreadHistoryAdapter,\n ThreadMessage,\n RunConfig,\n} from \"../../index\";\nimport type {\n ExportedMessageRepository,\n ExportedMessageRepositoryItem,\n} from \"../../internal\";\nimport { isRecord } from \"../../utils/json/is-json\";\nimport {\n RuntimeAdapterProvider,\n type RuntimeAdapters,\n} from \"../runtimes/RuntimeAdapterProvider\";\nimport type { TitleGenerationAdapter } from \"./TitleGenerationAdapter\";\n\nexport type AsyncStorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nclass KeyedMutationQueue {\n private readonly tails = new Map<string, Promise<void>>();\n\n run<T>(key: string, mutation: () => Promise<T>): Promise<T> {\n const previous = this.tails.get(key);\n const result = previous ? previous.then(mutation) : mutation();\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n\n this.tails.set(key, tail);\n void tail.then(() => {\n if (this.tails.get(key) === tail) this.tails.delete(key);\n });\n\n return result;\n }\n}\n\nconst mutationQueues = new WeakMap<AsyncStorageLike, KeyedMutationQueue>();\n\nconst getMutationQueue = (storage: AsyncStorageLike): KeyedMutationQueue => {\n let queue = mutationQueues.get(storage);\n if (!queue) {\n queue = new KeyedMutationQueue();\n mutationQueues.set(storage, queue);\n }\n return queue;\n};\n\ntype LocalStorageAdapterOptions = {\n storage: AsyncStorageLike;\n prefix?: string | undefined;\n titleGenerator?: TitleGenerationAdapter | undefined;\n};\n\ntype StoredThreadMetadata = {\n remoteId: string;\n externalId?: string;\n status: \"regular\" | \"archived\";\n title?: string;\n custom?: Record<string, unknown> | undefined;\n};\n\ntype StoredSystemMessage = Extract<ThreadMessage, { role: \"system\" }>;\ntype StoredUserMessage = Extract<ThreadMessage, { role: \"user\" }>;\ntype StoredAssistantMessage = Extract<ThreadMessage, { role: \"assistant\" }>;\n\nconst parseJSON = (raw: string | null): unknown => {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n};\n\nconst parseStoredThread = (value: unknown): StoredThreadMetadata | null => {\n if (!isRecord(value) || typeof value.remoteId !== \"string\") return null;\n\n const status = value.status ?? \"regular\";\n if (status !== \"regular\" && status !== \"archived\") return null;\n\n return {\n remoteId: value.remoteId,\n status,\n ...(typeof value.externalId === \"string\"\n ? { externalId: value.externalId }\n : undefined),\n ...(typeof value.title === \"string\" ? { title: value.title } : undefined),\n ...(isRecord(value.custom) ? { custom: value.custom } : undefined),\n };\n};\n\nconst parseDate = (value: unknown): Date | null => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst isMessageRole = (value: unknown): value is ThreadMessage[\"role\"] =>\n value === \"system\" || value === \"user\" || value === \"assistant\";\n\nconst parseStoredThreadMessage = (value: unknown): ThreadMessage | null => {\n if (!isRecord(value) || typeof value.id !== \"string\") return null;\n if (!isMessageRole(value.role)) return null;\n if (!Array.isArray(value.content)) return null;\n\n const createdAt = parseDate(value.createdAt);\n if (!createdAt) return null;\n\n const metadata = value.metadata;\n if (!isRecord(metadata) || !isRecord(metadata.custom)) return null;\n\n if (value.role === \"assistant\") {\n const status = value.status;\n if (!isRecord(status) || typeof status.type !== \"string\") return null;\n\n const submittedFeedback = isRecord(metadata.submittedFeedback)\n ? metadata.submittedFeedback\n : undefined;\n const submittedFeedbackType = submittedFeedback?.type;\n\n return {\n id: value.id,\n role: \"assistant\",\n content: value.content as StoredAssistantMessage[\"content\"],\n status: status as StoredAssistantMessage[\"status\"],\n createdAt,\n metadata: {\n unstable_state: (metadata.unstable_state ??\n null) as StoredAssistantMessage[\"metadata\"][\"unstable_state\"],\n unstable_annotations: Array.isArray(metadata.unstable_annotations)\n ? (metadata.unstable_annotations as StoredAssistantMessage[\"metadata\"][\"unstable_annotations\"])\n : [],\n unstable_data: Array.isArray(metadata.unstable_data)\n ? (metadata.unstable_data as StoredAssistantMessage[\"metadata\"][\"unstable_data\"])\n : [],\n steps: Array.isArray(metadata.steps)\n ? (metadata.steps as StoredAssistantMessage[\"metadata\"][\"steps\"])\n : [],\n ...(submittedFeedbackType === \"positive\" ||\n submittedFeedbackType === \"negative\"\n ? {\n submittedFeedback: {\n type: submittedFeedbackType,\n },\n }\n : undefined),\n ...(metadata.timing !== undefined\n ? {\n timing: metadata.timing as NonNullable<\n StoredAssistantMessage[\"metadata\"][\"timing\"]\n >,\n }\n : undefined),\n ...(metadata.isOptimistic === true\n ? { isOptimistic: true }\n : undefined),\n custom: metadata.custom,\n },\n };\n }\n\n if (value.role === \"user\") {\n return {\n id: value.id,\n role: \"user\",\n content: value.content as StoredUserMessage[\"content\"],\n attachments: Array.isArray(value.attachments)\n ? (value.attachments as StoredUserMessage[\"attachments\"])\n : [],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n }\n\n if (value.content.length !== 1) return null;\n\n return {\n id: value.id,\n role: \"system\",\n content: [value.content[0] as StoredSystemMessage[\"content\"][0]],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n};\n\nexport const parseStoredThreadMetadata = (\n raw: string | null,\n): StoredThreadMetadata[] => {\n const parsed = parseJSON(raw);\n if (!Array.isArray(parsed)) return [];\n\n return parsed.flatMap((item) => {\n const thread = parseStoredThread(item);\n return thread ? [thread] : [];\n });\n};\n\nconst parseStoredMessageRepositoryItem = (\n value: unknown,\n): ExportedMessageRepositoryItem | null => {\n if (!isRecord(value)) return null;\n\n const message = parseStoredThreadMessage(value.message);\n if (!message) return null;\n\n const parentId = value.parentId;\n if (\n parentId !== undefined &&\n parentId !== null &&\n typeof parentId !== \"string\"\n ) {\n return null;\n }\n\n return {\n message,\n parentId: parentId ?? null,\n ...(isRecord(value.runConfig)\n ? { runConfig: value.runConfig as RunConfig }\n : undefined),\n };\n};\n\nexport const parseStoredMessageRepository = (\n raw: string | null,\n): ExportedMessageRepository => {\n const parsed = parseJSON(raw);\n if (!isRecord(parsed) || !Array.isArray(parsed.messages)) {\n return { messages: [] };\n }\n\n const candidateMessages = parsed.messages.flatMap((item) => {\n const parsedItem = parseStoredMessageRepositoryItem(item);\n return parsedItem ? [parsedItem] : [];\n });\n\n const acceptedIds = new Set<string>();\n const messages = candidateMessages.flatMap((item) => {\n if (acceptedIds.has(item.message.id)) return [];\n if (item.parentId !== null && !acceptedIds.has(item.parentId)) return [];\n\n acceptedIds.add(item.message.id);\n return [item];\n });\n\n const headId =\n parsed.headId === null ||\n (typeof parsed.headId === \"string\" &&\n messages.some((item) => item.message.id === parsed.headId))\n ? parsed.headId\n : undefined;\n\n return {\n ...(headId !== undefined ? { headId } : undefined),\n messages,\n };\n};\n\nclass AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {\n private storage: AsyncStorageLike;\n private getAui: () => ReturnType<typeof useAui>;\n private prefix: string;\n private mutationQueue: KeyedMutationQueue;\n\n constructor(\n storage: AsyncStorageLike,\n getAui: () => ReturnType<typeof useAui>,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n ) {\n this.storage = storage;\n this.getAui = getAui;\n this.prefix = prefix;\n this.mutationQueue = mutationQueue;\n }\n\n private get aui(): ReturnType<typeof useAui> {\n return this.getAui();\n }\n\n private _messagesKey(remoteId: string) {\n return `${this.prefix}messages:${remoteId}`;\n }\n\n async load(): Promise<ExportedMessageRepository> {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n\n const raw = await this.storage.getItem(this._messagesKey(remoteId));\n return parseStoredMessageRepository(raw);\n }\n\n async append(item: ExportedMessageRepositoryItem): Promise<void> {\n const { remoteId } = await this.aui.threadListItem.initialize();\n\n const key = this._messagesKey(remoteId);\n await this.mutationQueue.run(key, async () => {\n const raw = await this.storage.getItem(key);\n const repo = parseStoredMessageRepository(raw);\n\n const idx = repo.messages.findIndex(\n (m) => m.message.id === item.message.id,\n );\n if (idx >= 0) {\n repo.messages[idx] = item;\n } else {\n repo.messages.push(item);\n }\n repo.headId = item.message.id;\n\n await this.storage.setItem(key, JSON.stringify(repo));\n });\n }\n}\n\nconst useLocalStorageThreadAdapters = (\n storage: AsyncStorageLike,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n): RuntimeAdapters => {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [history] = useState(\n () =>\n new AsyncStorageHistoryAdapter(\n storage,\n () => auiRef.current,\n prefix,\n mutationQueue,\n ),\n );\n return useMemo(() => ({ history }), [history]);\n};\n\nconst createHistoryProvider = (\n storage: AsyncStorageLike,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n): FC<PropsWithChildren> => {\n const Provider: FC<PropsWithChildren> = ({ children }) => {\n const adapters = useLocalStorageThreadAdapters(\n storage,\n prefix,\n mutationQueue,\n );\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n return Provider;\n};\n\nexport const createLocalStorageAdapter = (\n options: LocalStorageAdapterOptions,\n): RemoteThreadListAdapter => {\n const { storage, prefix = \"@assistant-ui:\", titleGenerator } = options;\n\n const threadsKey = `${prefix}threads`;\n const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;\n const mutationQueue = getMutationQueue(storage);\n\n const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {\n const raw = await storage.getItem(threadsKey);\n return parseStoredThreadMetadata(raw);\n };\n\n const saveThreadMetadata = async (\n threads: StoredThreadMetadata[],\n ): Promise<void> => {\n await storage.setItem(threadsKey, JSON.stringify(threads));\n };\n\n const updateThreadMetadata = async (\n remoteId: string,\n update: (thread: StoredThreadMetadata) => void,\n ): Promise<void> => {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const thread = threads.find((item) => item.remoteId === remoteId);\n if (thread) {\n update(thread);\n await saveThreadMetadata(threads);\n }\n });\n };\n\n const adapter: RemoteThreadListAdapter = {\n unstable_Provider: createHistoryProvider(storage, prefix, mutationQueue),\n unstable_useAdapters: function useLocalStorageAdapters() {\n return useLocalStorageThreadAdapters(storage, prefix, mutationQueue);\n },\n\n async list(): Promise<RemoteThreadListResponse> {\n const threads = await loadThreadMetadata();\n return {\n threads: threads.map((t) => ({\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: t.status,\n title: t.title,\n custom: t.custom,\n })),\n };\n },\n\n async initialize(\n threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const remoteId = threadId;\n return mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n\n // Only add if not already present\n if (!threads.some((t) => t.remoteId === remoteId)) {\n threads.unshift({\n remoteId,\n status: \"regular\",\n });\n await saveThreadMetadata(threads);\n }\n\n return { remoteId, externalId: undefined };\n });\n },\n\n async rename(remoteId: string, newTitle: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = newTitle;\n });\n },\n\n async updateCustom(\n remoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.custom = custom;\n });\n },\n\n async archive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"archived\";\n });\n },\n\n async unarchive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"regular\";\n });\n },\n\n async delete(remoteId: string): Promise<void> {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const filtered = threads.filter((t) => t.remoteId !== remoteId);\n await saveThreadMetadata(filtered);\n });\n const key = messagesKey(remoteId);\n await mutationQueue.run(key, () => storage.removeItem(key));\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === threadId);\n if (!thread)\n throw new Error(\n `Stored thread \"${threadId}\" not found while fetching thread metadata.`,\n );\n return {\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n custom: thread.custom,\n };\n },\n\n async generateTitle(\n remoteId: string,\n messages: readonly ThreadMessage[],\n ): Promise<AssistantStream> {\n if (titleGenerator) {\n const title = await titleGenerator.generateTitle(messages);\n\n // Update the stored title\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = title;\n });\n\n // Return a stream with a single text part\n return createAssistantStream((controller) => {\n controller.appendText(title);\n });\n }\n\n // No title generator — return empty stream\n return createAssistantStream(() => {});\n },\n };\n\n return adapter;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"LocalStorageThreadListAdapter.js","names":["AssistantStream","createAssistantStream","FC","PropsWithChildren","useEffect","useMemo","useRef","useState","useAui","CompleteAttachment","RemoteThreadInitializeResponse","RemoteThreadListAdapter","RemoteThreadListResponse","RemoteThreadMetadata","ThreadAssistantMessagePart","ThreadHistoryAdapter","ThreadMessage","ThreadUserMessagePart","RunConfig","ExportedMessageRepository","ExportedMessageRepositoryItem","isRecord","RuntimeAdapterProvider","RuntimeAdapters","TitleGenerationAdapter","AsyncStorageLike","getItem","key","Promise","setItem","value","removeItem","KeyedMutationQueue","tails","Map","run","mutation","T","previous","get","result","then","tail","undefined","set","delete","mutationQueues","WeakMap","getMutationQueue","storage","queue","LocalStorageAdapterOptions","prefix","titleGenerator","StoredThreadMetadata","remoteId","externalId","status","title","custom","Record","StoredSystemMessage","Extract","role","StoredUserMessage","StoredAssistantMessage","parseJSON","raw","JSON","parse","parseStoredThread","parseDate","Date","Number","isNaN","getTime","date","isMessageRole","MAX_STORED_MESSAGE_DEPTH","storedPartGuards","text","part","reasoning","unstable_summary","image","file","data","mimeType","audio","format","name","source","id","sourceType","url","mediaType","spec","toolCallId","toolName","args","argsText","isStoredMessagePart","type","Object","hasOwn","parseStoredMessageParts","content","depth","flatMap","messages","toolCall","Array","isArray","item","message","parseStoredThreadMessage","parseStoredAttachment","filter","createdAt","metadata","submittedFeedback","submittedFeedbackType","unstable_state","unstable_annotations","unstable_data","steps","timing","NonNullable","isOptimistic","attachments","attachment","length","parseStoredThreadMetadata","parsed","thread","parseStoredMessageRepositoryItem","parentId","runConfig","parseStoredMessageRepository","candidateMessages","parsedItem","acceptedIds","Set","has","add","headId","some","AsyncStorageHistoryAdapter","getAui","ReturnType","mutationQueue","constructor","aui","_messagesKey","load","threadListItem","getState","append","initialize","repo","idx","findIndex","m","push","stringify","useLocalStorageThreadAdapters","auiRef","current","history","createHistoryProvider","Provider","t0","$","_c","children","adapters","t1","createLocalStorageAdapter","options","threadsKey","messagesKey","threadId","loadThreadMetadata","saveThreadMetadata","threads","updateThreadMetadata","update","find","adapter","unstable_Provider","unstable_useAdapters","useLocalStorageAdapters","list","map","t","unshift","rename","newTitle","updateCustom","archive","unarchive","filtered","fetch","Error","generateTitle","controller","appendText"],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"sourcesContent":["import { type AssistantStream, createAssistantStream } from \"assistant-stream\";\nimport {\n type FC,\n type PropsWithChildren,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport type {\n CompleteAttachment,\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n ThreadAssistantMessagePart,\n ThreadHistoryAdapter,\n ThreadMessage,\n ThreadUserMessagePart,\n RunConfig,\n} from \"../../index\";\nimport type {\n ExportedMessageRepository,\n ExportedMessageRepositoryItem,\n} from \"../../internal\";\nimport { isRecord } from \"../../utils/json/is-json\";\nimport {\n RuntimeAdapterProvider,\n type RuntimeAdapters,\n} from \"../runtimes/RuntimeAdapterProvider\";\nimport type { TitleGenerationAdapter } from \"./TitleGenerationAdapter\";\n\nexport type AsyncStorageLike = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nclass KeyedMutationQueue {\n private readonly tails = new Map<string, Promise<void>>();\n\n run<T>(key: string, mutation: () => Promise<T>): Promise<T> {\n const previous = this.tails.get(key);\n const result = previous ? previous.then(mutation) : mutation();\n const tail = result.then(\n () => undefined,\n () => undefined,\n );\n\n this.tails.set(key, tail);\n void tail.then(() => {\n if (this.tails.get(key) === tail) this.tails.delete(key);\n });\n\n return result;\n }\n}\n\nconst mutationQueues = new WeakMap<AsyncStorageLike, KeyedMutationQueue>();\n\nconst getMutationQueue = (storage: AsyncStorageLike): KeyedMutationQueue => {\n let queue = mutationQueues.get(storage);\n if (!queue) {\n queue = new KeyedMutationQueue();\n mutationQueues.set(storage, queue);\n }\n return queue;\n};\n\ntype LocalStorageAdapterOptions = {\n storage: AsyncStorageLike;\n prefix?: string | undefined;\n titleGenerator?: TitleGenerationAdapter | undefined;\n};\n\ntype StoredThreadMetadata = {\n remoteId: string;\n externalId?: string;\n status: \"regular\" | \"archived\";\n title?: string;\n custom?: Record<string, unknown> | undefined;\n};\n\ntype StoredSystemMessage = Extract<ThreadMessage, { role: \"system\" }>;\ntype StoredUserMessage = Extract<ThreadMessage, { role: \"user\" }>;\ntype StoredAssistantMessage = Extract<ThreadMessage, { role: \"assistant\" }>;\n\nconst parseJSON = (raw: string | null): unknown => {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return undefined;\n }\n};\n\nconst parseStoredThread = (value: unknown): StoredThreadMetadata | null => {\n if (!isRecord(value) || typeof value.remoteId !== \"string\") return null;\n\n const status = value.status ?? \"regular\";\n if (status !== \"regular\" && status !== \"archived\") return null;\n\n return {\n remoteId: value.remoteId,\n status,\n ...(typeof value.externalId === \"string\"\n ? { externalId: value.externalId }\n : undefined),\n ...(typeof value.title === \"string\" ? { title: value.title } : undefined),\n ...(isRecord(value.custom) ? { custom: value.custom } : undefined),\n };\n};\n\nconst parseDate = (value: unknown): Date | null => {\n if (value instanceof Date && !Number.isNaN(value.getTime())) return value;\n if (typeof value !== \"string\" && typeof value !== \"number\") return null;\n\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\nconst isMessageRole = (value: unknown): value is ThreadMessage[\"role\"] =>\n value === \"system\" || value === \"user\" || value === \"assistant\";\n\nconst MAX_STORED_MESSAGE_DEPTH = 100;\n\nconst storedPartGuards = {\n text: (part) => typeof part.text === \"string\",\n reasoning: (part) =>\n typeof part.text === \"string\" || typeof part.unstable_summary === \"string\",\n image: (part) => typeof part.image === \"string\",\n file: (part) =>\n typeof part.data === \"string\" && typeof part.mimeType === \"string\",\n audio: (part) =>\n isRecord(part.audio) &&\n typeof part.audio.data === \"string\" &&\n typeof part.audio.format === \"string\",\n data: (part) => typeof part.name === \"string\",\n source: (part) =>\n typeof part.id === \"string\" &&\n (part.sourceType === \"url\"\n ? typeof part.url === \"string\"\n : part.sourceType === \"document\" &&\n typeof part.title === \"string\" &&\n typeof part.mediaType === \"string\"),\n \"generative-ui\": (part) => isRecord(part.spec),\n \"tool-call\": (part) =>\n typeof part.toolCallId === \"string\" &&\n typeof part.toolName === \"string\" &&\n isRecord(part.args) &&\n typeof part.argsText === \"string\",\n} satisfies Record<\n (ThreadUserMessagePart | ThreadAssistantMessagePart)[\"type\"],\n (part: Record<string, unknown>) => boolean\n>;\n\nconst isStoredMessagePart = (\n value: unknown,\n): value is Record<string, unknown> & { type: string } =>\n isRecord(value) &&\n typeof value.type === \"string\" &&\n (!Object.hasOwn(storedPartGuards, value.type) ||\n storedPartGuards[value.type as keyof typeof storedPartGuards](value));\n\nconst parseStoredMessageParts = (\n content: unknown[],\n depth: number,\n): unknown[] =>\n content.flatMap((part) => {\n if (!isStoredMessagePart(part)) return [];\n if (part.type !== \"tool-call\" || part.messages === undefined) return [part];\n\n const { messages, ...toolCall } = part;\n if (!Array.isArray(messages)) return [toolCall];\n return [\n {\n ...toolCall,\n messages: messages.flatMap((item) => {\n const message = parseStoredThreadMessage(item, depth + 1);\n return message ? [message] : [];\n }),\n },\n ];\n });\n\nconst parseStoredAttachment = (value: unknown): CompleteAttachment | null => {\n if (\n !isRecord(value) ||\n typeof value.id !== \"string\" ||\n typeof value.type !== \"string\" ||\n typeof value.name !== \"string\" ||\n !isRecord(value.status) ||\n value.status.type !== \"complete\" ||\n !Array.isArray(value.content)\n ) {\n return null;\n }\n\n return {\n ...value,\n content: value.content.filter(isStoredMessagePart),\n } as CompleteAttachment;\n};\n\nconst parseStoredThreadMessage = (\n value: unknown,\n depth: number,\n): ThreadMessage | null => {\n if (depth > MAX_STORED_MESSAGE_DEPTH) return null;\n if (!isRecord(value) || typeof value.id !== \"string\") return null;\n if (!isMessageRole(value.role)) return null;\n if (!Array.isArray(value.content)) return null;\n\n const createdAt = parseDate(value.createdAt);\n if (!createdAt) return null;\n\n const metadata = value.metadata;\n if (!isRecord(metadata) || !isRecord(metadata.custom)) return null;\n\n if (value.role === \"assistant\") {\n const status = value.status;\n if (!isRecord(status) || typeof status.type !== \"string\") return null;\n\n const submittedFeedback = isRecord(metadata.submittedFeedback)\n ? metadata.submittedFeedback\n : undefined;\n const submittedFeedbackType = submittedFeedback?.type;\n\n return {\n id: value.id,\n role: \"assistant\",\n content: parseStoredMessageParts(\n value.content,\n depth,\n ) as StoredAssistantMessage[\"content\"],\n status: status as StoredAssistantMessage[\"status\"],\n createdAt,\n metadata: {\n unstable_state: (metadata.unstable_state ??\n null) as StoredAssistantMessage[\"metadata\"][\"unstable_state\"],\n unstable_annotations: Array.isArray(metadata.unstable_annotations)\n ? (metadata.unstable_annotations as StoredAssistantMessage[\"metadata\"][\"unstable_annotations\"])\n : [],\n unstable_data: Array.isArray(metadata.unstable_data)\n ? (metadata.unstable_data as StoredAssistantMessage[\"metadata\"][\"unstable_data\"])\n : [],\n steps: Array.isArray(metadata.steps)\n ? (metadata.steps as StoredAssistantMessage[\"metadata\"][\"steps\"])\n : [],\n ...(submittedFeedbackType === \"positive\" ||\n submittedFeedbackType === \"negative\"\n ? {\n submittedFeedback: {\n type: submittedFeedbackType,\n },\n }\n : undefined),\n ...(metadata.timing !== undefined\n ? {\n timing: metadata.timing as NonNullable<\n StoredAssistantMessage[\"metadata\"][\"timing\"]\n >,\n }\n : undefined),\n ...(metadata.isOptimistic === true\n ? { isOptimistic: true }\n : undefined),\n custom: metadata.custom,\n },\n };\n }\n\n if (value.role === \"user\") {\n return {\n id: value.id,\n role: \"user\",\n content: parseStoredMessageParts(\n value.content,\n depth,\n ) as StoredUserMessage[\"content\"],\n attachments: Array.isArray(value.attachments)\n ? value.attachments.flatMap((item) => {\n const attachment = parseStoredAttachment(item);\n return attachment ? [attachment] : [];\n })\n : [],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n }\n\n const content = parseStoredMessageParts(value.content, depth);\n if (content.length !== 1) return null;\n\n return {\n id: value.id,\n role: \"system\",\n content: [content[0] as StoredSystemMessage[\"content\"][0]],\n createdAt,\n metadata: {\n custom: metadata.custom,\n },\n };\n};\n\nexport const parseStoredThreadMetadata = (\n raw: string | null,\n): StoredThreadMetadata[] => {\n const parsed = parseJSON(raw);\n if (!Array.isArray(parsed)) return [];\n\n return parsed.flatMap((item) => {\n const thread = parseStoredThread(item);\n return thread ? [thread] : [];\n });\n};\n\nconst parseStoredMessageRepositoryItem = (\n value: unknown,\n): ExportedMessageRepositoryItem | null => {\n if (!isRecord(value)) return null;\n\n const message = parseStoredThreadMessage(value.message, 0);\n if (!message) return null;\n\n const parentId = value.parentId;\n if (\n parentId !== undefined &&\n parentId !== null &&\n typeof parentId !== \"string\"\n ) {\n return null;\n }\n\n return {\n message,\n parentId: parentId ?? null,\n ...(isRecord(value.runConfig)\n ? { runConfig: value.runConfig as RunConfig }\n : undefined),\n };\n};\n\nexport const parseStoredMessageRepository = (\n raw: string | null,\n): ExportedMessageRepository => {\n const parsed = parseJSON(raw);\n if (!isRecord(parsed) || !Array.isArray(parsed.messages)) {\n return { messages: [] };\n }\n\n const candidateMessages = parsed.messages.flatMap((item) => {\n const parsedItem = parseStoredMessageRepositoryItem(item);\n return parsedItem ? [parsedItem] : [];\n });\n\n const acceptedIds = new Set<string>();\n const messages = candidateMessages.flatMap((item) => {\n if (acceptedIds.has(item.message.id)) return [];\n if (item.parentId !== null && !acceptedIds.has(item.parentId)) return [];\n\n acceptedIds.add(item.message.id);\n return [item];\n });\n\n const headId =\n parsed.headId === null ||\n (typeof parsed.headId === \"string\" &&\n messages.some((item) => item.message.id === parsed.headId))\n ? parsed.headId\n : undefined;\n\n return {\n ...(headId !== undefined ? { headId } : undefined),\n messages,\n };\n};\n\nclass AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {\n private storage: AsyncStorageLike;\n private getAui: () => ReturnType<typeof useAui>;\n private prefix: string;\n private mutationQueue: KeyedMutationQueue;\n\n constructor(\n storage: AsyncStorageLike,\n getAui: () => ReturnType<typeof useAui>,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n ) {\n this.storage = storage;\n this.getAui = getAui;\n this.prefix = prefix;\n this.mutationQueue = mutationQueue;\n }\n\n private get aui(): ReturnType<typeof useAui> {\n return this.getAui();\n }\n\n private _messagesKey(remoteId: string) {\n return `${this.prefix}messages:${remoteId}`;\n }\n\n async load(): Promise<ExportedMessageRepository> {\n const remoteId = this.aui.threadListItem.getState().remoteId;\n if (!remoteId) return { messages: [] };\n\n const raw = await this.storage.getItem(this._messagesKey(remoteId));\n return parseStoredMessageRepository(raw);\n }\n\n async append(item: ExportedMessageRepositoryItem): Promise<void> {\n const { remoteId } = await this.aui.threadListItem.initialize();\n\n const key = this._messagesKey(remoteId);\n await this.mutationQueue.run(key, async () => {\n const raw = await this.storage.getItem(key);\n const repo = parseStoredMessageRepository(raw);\n\n const idx = repo.messages.findIndex(\n (m) => m.message.id === item.message.id,\n );\n if (idx >= 0) {\n repo.messages[idx] = item;\n } else {\n repo.messages.push(item);\n }\n repo.headId = item.message.id;\n\n await this.storage.setItem(key, JSON.stringify(repo));\n });\n }\n}\n\nconst useLocalStorageThreadAdapters = (\n storage: AsyncStorageLike,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n): RuntimeAdapters => {\n const aui = useAui();\n // Not useEffectEvent: history adapter methods run during render (SSR load).\n const auiRef = useRef(aui);\n useEffect(() => {\n auiRef.current = aui;\n });\n const [history] = useState(\n () =>\n new AsyncStorageHistoryAdapter(\n storage,\n () => auiRef.current,\n prefix,\n mutationQueue,\n ),\n );\n return useMemo(() => ({ history }), [history]);\n};\n\nconst createHistoryProvider = (\n storage: AsyncStorageLike,\n prefix: string,\n mutationQueue: KeyedMutationQueue,\n): FC<PropsWithChildren> => {\n const Provider: FC<PropsWithChildren> = ({ children }) => {\n const adapters = useLocalStorageThreadAdapters(\n storage,\n prefix,\n mutationQueue,\n );\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n };\n return Provider;\n};\n\nexport const createLocalStorageAdapter = (\n options: LocalStorageAdapterOptions,\n): RemoteThreadListAdapter => {\n const { storage, prefix = \"@assistant-ui:\", titleGenerator } = options;\n\n const threadsKey = `${prefix}threads`;\n const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;\n const mutationQueue = getMutationQueue(storage);\n\n const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {\n const raw = await storage.getItem(threadsKey);\n return parseStoredThreadMetadata(raw);\n };\n\n const saveThreadMetadata = async (\n threads: StoredThreadMetadata[],\n ): Promise<void> => {\n await storage.setItem(threadsKey, JSON.stringify(threads));\n };\n\n const updateThreadMetadata = async (\n remoteId: string,\n update: (thread: StoredThreadMetadata) => void,\n ): Promise<void> => {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const thread = threads.find((item) => item.remoteId === remoteId);\n if (thread) {\n update(thread);\n await saveThreadMetadata(threads);\n }\n });\n };\n\n const adapter: RemoteThreadListAdapter = {\n unstable_Provider: createHistoryProvider(storage, prefix, mutationQueue),\n unstable_useAdapters: function useLocalStorageAdapters() {\n return useLocalStorageThreadAdapters(storage, prefix, mutationQueue);\n },\n\n async list(): Promise<RemoteThreadListResponse> {\n const threads = await loadThreadMetadata();\n return {\n threads: threads.map((t) => ({\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: t.status,\n title: t.title,\n custom: t.custom,\n })),\n };\n },\n\n async initialize(\n threadId: string,\n ): Promise<RemoteThreadInitializeResponse> {\n const remoteId = threadId;\n return mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n\n // Only add if not already present\n if (!threads.some((t) => t.remoteId === remoteId)) {\n threads.unshift({\n remoteId,\n status: \"regular\",\n });\n await saveThreadMetadata(threads);\n }\n\n return { remoteId, externalId: undefined };\n });\n },\n\n async rename(remoteId: string, newTitle: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = newTitle;\n });\n },\n\n async updateCustom(\n remoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.custom = custom;\n });\n },\n\n async archive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"archived\";\n });\n },\n\n async unarchive(remoteId: string): Promise<void> {\n await updateThreadMetadata(remoteId, (thread) => {\n thread.status = \"regular\";\n });\n },\n\n async delete(remoteId: string): Promise<void> {\n await mutationQueue.run(threadsKey, async () => {\n const threads = await loadThreadMetadata();\n const filtered = threads.filter((t) => t.remoteId !== remoteId);\n await saveThreadMetadata(filtered);\n });\n const key = messagesKey(remoteId);\n await mutationQueue.run(key, () => storage.removeItem(key));\n },\n\n async fetch(threadId: string): Promise<RemoteThreadMetadata> {\n const threads = await loadThreadMetadata();\n const thread = threads.find((t) => t.remoteId === threadId);\n if (!thread)\n throw new Error(\n `Stored thread \"${threadId}\" not found while fetching thread metadata.`,\n );\n return {\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n custom: thread.custom,\n };\n },\n\n async generateTitle(\n remoteId: string,\n messages: readonly ThreadMessage[],\n ): Promise<AssistantStream> {\n if (titleGenerator) {\n const title = await titleGenerator.generateTitle(messages);\n\n // Update the stored title\n await updateThreadMetadata(remoteId, (thread) => {\n thread.title = title;\n });\n\n // Return a stream with a single text part\n return createAssistantStream((controller) => {\n controller.appendText(title);\n });\n }\n\n // No title generator — return empty stream\n return createAssistantStream(() => {});\n },\n };\n\n return adapter;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataRenderers.d.ts","names":[],"sources":["../../../src/react/client/DataRenderers.ts"],"mappings":";;cAmEa,2CAAa,SAAA"}
1
+ {"version":3,"file":"DataRenderers.d.ts","names":[],"sources":["../../../src/react/client/DataRenderers.ts"],"mappings":";;cAuEa,2CAAa,SAAA"}
@@ -1,3 +1,4 @@
1
+ import { nullProtoRecord } from "../../utils/record.js";
1
2
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
2
3
  import { useState } from "@assistant-ui/tap/react-shim";
3
4
  import { resource } from "@assistant-ui/tap";
@@ -15,21 +16,25 @@ const useDataRenderers = () => {
15
16
  let t0;
16
17
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
17
18
  t0 = (name, render) => {
18
- setState((prev) => ({
19
- ...prev,
20
- renderers: {
21
- ...prev.renderers,
22
- [name]: [...prev.renderers[name] ?? [], render]
23
- }
24
- }));
19
+ setState((prev) => {
20
+ const renderers = nullProtoRecord(prev.renderers);
21
+ renderers[name] = [...renderers[name] ?? [], render];
22
+ return {
23
+ ...prev,
24
+ renderers
25
+ };
26
+ });
25
27
  return () => {
26
- setState((prev_0) => ({
27
- ...prev_0,
28
- renderers: {
29
- ...prev_0.renderers,
30
- [name]: prev_0.renderers[name]?.filter((r) => r !== render) ?? []
31
- }
32
- }));
28
+ setState((prev_0) => {
29
+ const renderers_0 = nullProtoRecord(prev_0.renderers);
30
+ const remaining = renderers_0[name]?.filter((r) => r !== render) ?? [];
31
+ if (remaining.length > 0) renderers_0[name] = remaining;
32
+ else delete renderers_0[name];
33
+ return {
34
+ ...prev_0,
35
+ renderers: renderers_0
36
+ };
37
+ });
33
38
  };
34
39
  };
35
40
  $[0] = t0;
@@ -67,7 +72,7 @@ const useDataRenderers = () => {
67
72
  const DataRenderers = resource(useDataRenderers);
68
73
  function _temp() {
69
74
  return {
70
- renderers: {},
75
+ renderers: nullProtoRecord(),
71
76
  fallbacks: []
72
77
  };
73
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DataRenderers.js","names":["useState","useCallback","resource","ClientOutput","DataRenderersState","DataMessagePartComponent","useDataRenderers","$","_c","state","setState","_temp","t0","Symbol","for","name","render","prev","renderers","prev_0","filter","r","setDataUI","t1","render_0","prev_1","fallbacks","prev_2","r_0","setFallbackDataUI","t2","getState","DataRenderers"],"sources":["../../../src/react/client/DataRenderers.ts"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport type { DataRenderersState } from \"../types/scopes/dataRenderers\";\nimport type { DataMessagePartComponent } from \"../types/MessagePartComponentTypes\";\n\n/**\n * Registers renderers for `data` message parts.\n *\n * Data renderers are looked up by the part's `name` field. Use this resource\n * directly for a renderer scope, or prefer {@link useAssistantDataUI} /\n * {@link makeAssistantDataUI} when registering from React components.\n */\nconst useDataRenderers = (): ClientOutput<\"dataRenderers\"> => {\n const [state, setState] = useState<DataRenderersState>(() => ({\n renderers: {},\n fallbacks: [],\n }));\n\n const setDataUI = useCallback(\n (name: string, render: DataMessagePartComponent) => {\n setState((prev) => {\n return {\n ...prev,\n renderers: {\n ...prev.renderers,\n [name]: [...(prev.renderers[name] ?? []), render],\n },\n };\n });\n\n return () => {\n setState((prev) => {\n return {\n ...prev,\n renderers: {\n ...prev.renderers,\n [name]: prev.renderers[name]?.filter((r) => r !== render) ?? [],\n },\n };\n });\n };\n },\n [],\n );\n\n const setFallbackDataUI = useCallback((render: DataMessagePartComponent) => {\n setState((prev) => ({\n ...prev,\n fallbacks: [...prev.fallbacks, render],\n }));\n\n return () => {\n setState((prev) => ({\n ...prev,\n fallbacks: prev.fallbacks.filter((r) => r !== render),\n }));\n };\n }, []);\n\n return {\n getState: () => state,\n setDataUI,\n setFallbackDataUI,\n };\n};\n\nexport const DataRenderers = resource(useDataRenderers);\n"],"mappings":";;;;;;;;;;;AAaA,MAAMM,yBAAmB;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACvB,MAAA,CAAAC,OAAAC,YAA0BV,SAA6BW,KAGrD;CAAE,IAAAC;CAAA,IAAAL,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAGFF,MAAAG,MAAAC,WAAA;GACEN,UAASO,UACA;IAAA,GACFA;IAAIC,WACI;KAAA,GACND,KAAIC;MACNH,OAAO,CAAA,GAAKE,KAAIC,UAAWH,SAAf,CAAA,GAA6BC,MAAM;IAClD;GACF,EACD;GAAC,aAEK;IACLN,UAASS,YACA;KAAA,GACFF;KAAIC,WACI;MAAA,GACND,OAAIC;OACNH,OAAOE,OAAIC,UAAWH,KAAa,EAAAK,QAACC,MAAOA,MAAML,MAAY,KAAtD,CAAA;KACV;IACF,EACD;GAAC;EACH;EACFT,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAvBH,MAAAe,YAAkBV;CAyBhB,IAAAW;CAAA,IAAAhB,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAEoCS,MAAAC,aAAA;GACpCd,UAASe,YAAW;IAAA,GACfR;IAAIS,WACI,CAAA,GAAIT,OAAIS,WAAYV,QAAM;GACvC,EAAE;GAAC,aAEI;IACLN,UAASiB,YAAW;KAAA,GACfV;KAAIS,WACIT,OAAIS,UAAUN,QAAQQ,QAAOP,QAAML,QAAM;IACtD,EAAE;GAAC;EACJ;EACFT,EAAA,KAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAZD,MAAAsB,oBAA0BN;CAYnB,IAAAO;CAAA,IAAAvB,EAAA,OAAAE,OAAA;EAEAqB,KAAA;GAAAC,gBACWtB;GAAKa;GAAAO;EAGvB;EAACtB,EAAA,KAAAE;EAAAF,EAAA,KAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,OAJMuB;AAIN;AAGH,MAAaE,gBAAgB9B,SAASI,gBAAgB;AAtD7B,SAAAK,QAAA;CAAA,OACuC;EAAAO,WACjD,CAAC;EAACQ,WACF,CAAA;CACb;AAAC"}
1
+ {"version":3,"file":"DataRenderers.js","names":["useState","useCallback","resource","ClientOutput","DataRenderersState","DataMessagePartComponent","nullProtoRecord","useDataRenderers","$","_c","state","setState","_temp","t0","Symbol","for","name","render","prev","renderers","prev_0","renderers_0","remaining","filter","r","length","setDataUI","t1","render_0","prev_1","fallbacks","prev_2","r_0","setFallbackDataUI","t2","getState","DataRenderers"],"sources":["../../../src/react/client/DataRenderers.ts"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport type { DataRenderersState } from \"../types/scopes/dataRenderers\";\nimport type { DataMessagePartComponent } from \"../types/MessagePartComponentTypes\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\n/**\n * Registers renderers for `data` message parts.\n *\n * Data renderers are looked up by the part's `name` field. Use this resource\n * directly for a renderer scope, or prefer {@link useAssistantDataUI} /\n * {@link makeAssistantDataUI} when registering from React components.\n */\nconst useDataRenderers = (): ClientOutput<\"dataRenderers\"> => {\n const [state, setState] = useState<DataRenderersState>(() => ({\n renderers: nullProtoRecord(),\n fallbacks: [],\n }));\n\n const setDataUI = useCallback(\n (name: string, render: DataMessagePartComponent) => {\n setState((prev) => {\n const renderers = nullProtoRecord(prev.renderers);\n renderers[name] = [...(renderers[name] ?? []), render];\n return {\n ...prev,\n renderers,\n };\n });\n\n return () => {\n setState((prev) => {\n const renderers = nullProtoRecord(prev.renderers);\n const remaining = renderers[name]?.filter((r) => r !== render) ?? [];\n if (remaining.length > 0) {\n renderers[name] = remaining;\n } else {\n delete renderers[name];\n }\n return {\n ...prev,\n renderers,\n };\n });\n };\n },\n [],\n );\n\n const setFallbackDataUI = useCallback((render: DataMessagePartComponent) => {\n setState((prev) => ({\n ...prev,\n fallbacks: [...prev.fallbacks, render],\n }));\n\n return () => {\n setState((prev) => ({\n ...prev,\n fallbacks: prev.fallbacks.filter((r) => r !== render),\n }));\n };\n }, []);\n\n return {\n getState: () => state,\n setDataUI,\n setFallbackDataUI,\n };\n};\n\nexport const DataRenderers = resource(useDataRenderers);\n"],"mappings":";;;;;;;;;;;;AAcA,MAAMO,yBAAmB;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACvB,MAAA,CAAAC,OAAAC,YAA0BX,SAA6BY,KAGrD;CAAE,IAAAC;CAAA,IAAAL,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAGFF,MAAAG,MAAAC,WAAA;GACEN,UAASO,SAAA;IACP,MAAAC,YAAkBb,gBAAgBY,KAAIC,SAAU;IAChDA,UAAUH,QAAQ,CAAA,GAAKG,UAAUH,SAAV,CAAA,GAAwBC,MAAM;IAAtC,OACR;KAAA,GACFC;KAAIC;IAET;GAAC,CACF;GAAC,aAEK;IACLR,UAASS,WAAA;KACP,MAAAC,cAAkBf,gBAAgBY,OAAIC,SAAU;KAChD,MAAAG,YAAkBH,YAAUH,KAAa,EAAAO,QAACC,MAAOA,MAAMP,MAAY,KAAjD,CAAA;KAClB,IAAIK,UAASG,SAAU,GACrBN,YAAUH,QAAQM;UAElB,OAAOH,YAAUH;KAClB,OACM;MAAA,GACFE;MAAIC,WACPA;KACF;IAAC,CACF;GAAC;EACH;EACFX,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CA1BH,MAAAkB,YAAkBb;CA4BhB,IAAAc;CAAA,IAAAnB,EAAA,OAAAM,OAAAC,IAAA,2BAAA,GAAA;EAEoCY,MAAAC,aAAA;GACpCjB,UAASkB,YAAW;IAAA,GACfX;IAAIY,WACI,CAAA,GAAIZ,OAAIY,WAAYb,QAAM;GACvC,EAAE;GAAC,aAEI;IACLN,UAASoB,YAAW;KAAA,GACfb;KAAIY,WACIZ,OAAIY,UAAUP,QAAQS,QAAOR,QAAMP,QAAM;IACtD,EAAE;GAAC;EACJ;EACFT,EAAA,KAAAmB;CAAA,OAAAA,KAAAnB,EAAA;CAZD,MAAAyB,oBAA0BN;CAYnB,IAAAO;CAAA,IAAA1B,EAAA,OAAAE,OAAA;EAEAwB,KAAA;GAAAC,gBACWzB;GAAKgB;GAAAO;EAGvB;EAACzB,EAAA,KAAAE;EAAAF,EAAA,KAAA0B;CAAA,OAAAA,KAAA1B,EAAA;CAAA,OAJM0B;AAIN;AAGH,MAAaE,gBAAgBlC,SAASK,gBAAgB;AAzD7B,SAAAK,QAAA;CAAA,OACuC;EAAAO,WACjDb,gBAAgB;EAACwB,WACjB,CAAA;CACb;AAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryThreadList.d.ts","names":[],"sources":["../../../src/react/client/InMemoryThreadList.ts"],"mappings":";;;KAqBY;EACV,SAAS,qBAAqB,gBAAgB;EAC9C,oBAAoB;EACpB;EACA,YAAY;;cAiOD,gDAAkB,SAAA,0BAAA,OAAA;;;;;;cAOlB,oCACX,QAAQ,cACR,QAAQ"}
1
+ {"version":3,"file":"InMemoryThreadList.d.ts","names":[],"sources":["../../../src/react/client/InMemoryThreadList.ts"],"mappings":";;;KAqBY;EACV,SAAS,qBAAqB,gBAAgB;EAC9C,oBAAoB;EACpB;EACA,YAAY;;cAkOD,gDAAkB,SAAA,0BAAA,OAAA;;;;;;cAOlB,oCACX,QAAQ,cACR,QAAQ"}
@@ -74,7 +74,7 @@ const useThreadListItemClient = (props) => {
74
74
  };
75
75
  const ThreadListItemClient = resource(useThreadListItemClient);
76
76
  const useInMemoryThreadList = (props) => {
77
- const $ = c(62);
77
+ const $ = c(64);
78
78
  const { thread: threadFactory, onSwitchToThread, onSwitchToNewThread, onDelete } = props;
79
79
  const [t0, setListState] = useState(_temp3);
80
80
  const { threads, mainThreadId } = t0;
@@ -232,16 +232,18 @@ const useInMemoryThreadList = (props) => {
232
232
  let t15;
233
233
  let t16;
234
234
  let t17;
235
+ let t18;
235
236
  if ($[25] !== mainThreadId || $[26] !== threads) {
236
237
  const regularThreads = threads.filter(_temp5);
237
238
  const archivedThreads = threads.filter(_temp6);
238
239
  t11 = mainThreadId;
239
240
  t12 = null;
240
241
  t13 = false;
241
- t14 = false;
242
+ t14 = void 0;
242
243
  t15 = false;
243
- t16 = regularThreads.map(_temp7);
244
- t17 = archivedThreads.map(_temp8);
244
+ t16 = false;
245
+ t17 = regularThreads.map(_temp7);
246
+ t18 = archivedThreads.map(_temp8);
245
247
  $[25] = mainThreadId;
246
248
  $[26] = threads;
247
249
  $[27] = t11;
@@ -251,6 +253,7 @@ const useInMemoryThreadList = (props) => {
251
253
  $[31] = t15;
252
254
  $[32] = t16;
253
255
  $[33] = t17;
256
+ $[34] = t18;
254
257
  } else {
255
258
  t11 = $[27];
256
259
  t12 = $[28];
@@ -259,47 +262,50 @@ const useInMemoryThreadList = (props) => {
259
262
  t15 = $[31];
260
263
  t16 = $[32];
261
264
  t17 = $[33];
265
+ t18 = $[34];
262
266
  }
263
- let t18;
264
- if ($[34] !== mainThreadClient.state || $[35] !== t11 || $[36] !== t12 || $[37] !== t13 || $[38] !== t14 || $[39] !== t15 || $[40] !== t16 || $[41] !== t17 || $[42] !== threadListItems.state) {
265
- t18 = {
267
+ let t19;
268
+ if ($[35] !== mainThreadClient.state || $[36] !== t11 || $[37] !== t12 || $[38] !== t13 || $[39] !== t14 || $[40] !== t15 || $[41] !== t16 || $[42] !== t17 || $[43] !== t18 || $[44] !== threadListItems.state) {
269
+ t19 = {
266
270
  mainThreadId: t11,
267
271
  newThreadId: t12,
268
272
  isLoading: t13,
269
- isLoadingMore: t14,
270
- hasMore: t15,
271
- threadIds: t16,
272
- archivedThreadIds: t17,
273
+ loadError: t14,
274
+ isLoadingMore: t15,
275
+ hasMore: t16,
276
+ threadIds: t17,
277
+ archivedThreadIds: t18,
273
278
  threadItems: threadListItems.state,
274
279
  main: mainThreadClient.state
275
280
  };
276
- $[34] = mainThreadClient.state;
277
- $[35] = t11;
278
- $[36] = t12;
279
- $[37] = t13;
280
- $[38] = t14;
281
- $[39] = t15;
282
- $[40] = t16;
283
- $[41] = t17;
284
- $[42] = threadListItems.state;
281
+ $[35] = mainThreadClient.state;
282
+ $[36] = t11;
283
+ $[37] = t12;
284
+ $[38] = t13;
285
+ $[39] = t14;
286
+ $[40] = t15;
287
+ $[41] = t16;
288
+ $[42] = t17;
285
289
  $[43] = t18;
286
- } else t18 = $[43];
287
- const state = t18;
288
- let t19;
289
- if ($[44] !== state) {
290
- t19 = () => state;
291
- $[44] = state;
290
+ $[44] = threadListItems.state;
292
291
  $[45] = t19;
293
292
  } else t19 = $[45];
293
+ const state = t19;
294
294
  let t20;
295
- if ($[46] !== mainThreadClient.methods) {
296
- t20 = () => mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE;
297
- $[46] = mainThreadClient.methods;
295
+ if ($[46] !== state) {
296
+ t20 = () => state;
297
+ $[46] = state;
298
298
  $[47] = t20;
299
299
  } else t20 = $[47];
300
300
  let t21;
301
- if ($[48] !== mainThreadId || $[49] !== state || $[50] !== threadListItems || $[51] !== threads) {
302
- t21 = (selector) => {
301
+ if ($[48] !== mainThreadClient.methods) {
302
+ t21 = () => mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE;
303
+ $[48] = mainThreadClient.methods;
304
+ $[49] = t21;
305
+ } else t21 = $[49];
306
+ let t22;
307
+ if ($[50] !== mainThreadId || $[51] !== state || $[52] !== threadListItems || $[53] !== threads) {
308
+ t22 = (selector) => {
303
309
  if (selector === "main") {
304
310
  const index = threads.findIndex((t_10) => t_10.id === mainThreadId);
305
311
  return threadListItems.get({ index: index === -1 ? 0 : index });
@@ -313,40 +319,40 @@ const useInMemoryThreadList = (props) => {
313
319
  const index_1 = threads.findIndex((t_12) => t_12.id === id);
314
320
  return threadListItems.get({ index: index_1 });
315
321
  };
316
- $[48] = mainThreadId;
317
- $[49] = state;
318
- $[50] = threadListItems;
319
- $[51] = threads;
320
- $[52] = t21;
321
- } else t21 = $[52];
322
- let t22;
323
- if ($[53] !== mainThreadClient.methods) {
324
- t22 = () => mainThreadClient.methods;
325
- $[53] = mainThreadClient.methods;
322
+ $[50] = mainThreadId;
323
+ $[51] = state;
324
+ $[52] = threadListItems;
325
+ $[53] = threads;
326
326
  $[54] = t22;
327
327
  } else t22 = $[54];
328
328
  let t23;
329
- if ($[55] !== handleSwitchToNewThread || $[56] !== handleSwitchToThread || $[57] !== t19 || $[58] !== t20 || $[59] !== t21 || $[60] !== t22) {
330
- t23 = {
331
- getState: t19,
329
+ if ($[55] !== mainThreadClient.methods) {
330
+ t23 = () => mainThreadClient.methods;
331
+ $[55] = mainThreadClient.methods;
332
+ $[56] = t23;
333
+ } else t23 = $[56];
334
+ let t24;
335
+ if ($[57] !== handleSwitchToNewThread || $[58] !== handleSwitchToThread || $[59] !== t20 || $[60] !== t21 || $[61] !== t22 || $[62] !== t23) {
336
+ t24 = {
337
+ getState: t20,
332
338
  switchToThread: handleSwitchToThread,
333
339
  switchToNewThread: handleSwitchToNewThread,
334
340
  getLoadThreadsPromise: _temp9,
335
341
  reload: _temp0,
336
- reloadMainThread: t20,
342
+ reloadMainThread: t21,
337
343
  loadMore: _temp1,
338
- item: t21,
339
- thread: t22
344
+ item: t22,
345
+ thread: t23
340
346
  };
341
- $[55] = handleSwitchToNewThread;
342
- $[56] = handleSwitchToThread;
343
- $[57] = t19;
344
- $[58] = t20;
345
- $[59] = t21;
346
- $[60] = t22;
347
- $[61] = t23;
348
- } else t23 = $[61];
349
- return t23;
347
+ $[57] = handleSwitchToNewThread;
348
+ $[58] = handleSwitchToThread;
349
+ $[59] = t20;
350
+ $[60] = t21;
351
+ $[61] = t22;
352
+ $[62] = t23;
353
+ $[63] = t24;
354
+ } else t24 = $[63];
355
+ return t24;
350
356
  };
351
357
  const InMemoryThreadList = resource(useInMemoryThreadList);
352
358
  /**