@assistant-ui/core 0.3.16 → 0.3.18

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 (474) 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/index.d.ts +3 -3
  5. package/dist/index.js +2 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal.d.ts +4 -2
  8. package/dist/internal.js +4 -2
  9. package/dist/model-context/frame/host.d.ts.map +1 -1
  10. package/dist/model-context/frame/host.js +10 -4
  11. package/dist/model-context/frame/host.js.map +1 -1
  12. package/dist/model-context/frame/provider.d.ts +5 -0
  13. package/dist/model-context/frame/provider.d.ts.map +1 -1
  14. package/dist/model-context/frame/provider.js +101 -28
  15. package/dist/model-context/frame/provider.js.map +1 -1
  16. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  17. package/dist/model-context/interactable-composer-metadata.js +16 -9
  18. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  19. package/dist/model-context/registry.d.ts.map +1 -1
  20. package/dist/model-context/registry.js +3 -5
  21. package/dist/model-context/registry.js.map +1 -1
  22. package/dist/model-context/tool-call-text.d.ts +26 -0
  23. package/dist/model-context/tool-call-text.d.ts.map +1 -0
  24. package/dist/model-context/tool-call-text.js +18 -0
  25. package/dist/model-context/tool-call-text.js.map +1 -0
  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/RuntimeAdapter.js +1 -1
  30. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  31. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  32. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  33. package/dist/react/client/AdaptedRemoteThread.js +1 -1
  34. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  35. package/dist/react/client/InMemoryThreadList.js +63 -57
  36. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  37. package/dist/react/client/Interactables.d.ts.map +1 -1
  38. package/dist/react/client/Interactables.js +25 -28
  39. package/dist/react/client/Interactables.js.map +1 -1
  40. package/dist/react/client/RemoteThreadList.d.ts +16 -0
  41. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  42. package/dist/react/client/RemoteThreadList.js +354 -242
  43. package/dist/react/client/RemoteThreadList.js.map +1 -1
  44. package/dist/react/client/Tools.d.ts.map +1 -1
  45. package/dist/react/client/Tools.js +24 -18
  46. package/dist/react/client/Tools.js.map +1 -1
  47. package/dist/react/index.d.ts +2 -1
  48. package/dist/react/index.js +2 -1
  49. package/dist/react/interactables-legacy/Interactables.js +246 -125
  50. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  51. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  52. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  53. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  54. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  55. package/dist/react/model-context/makeAssistantTool.js +1 -1
  56. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  57. package/dist/react/model-context/toolbox.d.ts +2 -14
  58. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  59. package/dist/react/model-context/toolbox.js +1 -13
  60. package/dist/react/model-context/toolbox.js.map +1 -1
  61. package/dist/react/model-context/useAssistantContext.js +37 -7
  62. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  63. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  64. package/dist/react/model-context/useAssistantTool.js +1 -1
  65. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  66. package/dist/react/model-context/useAuiToolOverrides.js +31 -5
  67. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  68. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  69. package/dist/react/model-context/useInlineRender.js +10 -36
  70. package/dist/react/model-context/useInlineRender.js.map +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/primitive-hooks/useMessageError.d.ts.map +1 -1
  75. package/dist/react/primitive-hooks/useMessageError.js +2 -8
  76. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  77. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  78. package/dist/react/primitive-hooks/useThreadListLoadMore.js +2 -4
  79. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  80. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  81. package/dist/react/primitives/composer/ComposerAttachments.js +4 -3
  82. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  83. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  84. package/dist/react/primitives/composer/ComposerQueue.js +4 -3
  85. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  86. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  87. package/dist/react/primitives/message/MessageAttachments.js +7 -6
  88. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  89. package/dist/react/primitives/message/MessageGroupedParts.js +2 -2
  90. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  91. package/dist/react/primitives/message/MessageParts.js +3 -3
  92. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  93. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  94. package/dist/react/primitives/threadList/ThreadListItems.js +5 -4
  95. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  96. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +6 -4
  97. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  98. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +59 -29
  99. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  100. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +11 -6
  101. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +160 -143
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadResource.d.ts +2 -6
  105. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  106. package/dist/react/runtimes/RemoteThreadResource.js +15 -13
  107. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  108. package/dist/react/runtimes/assistant-transport/useLatestRef.js +2 -2
  109. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -1
  110. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +4 -1
  111. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  112. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +424 -52
  113. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  114. package/dist/react/runtimes/cloud/auiV0.d.ts +5 -1
  115. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  116. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  117. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts +29 -0
  118. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -0
  119. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +160 -0
  120. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -0
  121. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +1 -9
  122. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  123. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +16 -153
  124. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  125. package/dist/react/runtimes/external-message-converter.js +1 -1
  126. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  127. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  128. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  129. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  130. package/dist/react/runtimes/useRemoteThreadListRuntime.js +77 -29
  131. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  132. package/dist/react/types/MessagePartComponentTypes.d.ts +7 -3
  133. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  134. package/dist/react/types/scopes/tools.d.ts +2 -0
  135. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  136. package/dist/runtime/api/message-part-runtime.d.ts +2 -2
  137. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  138. package/dist/runtime/api/message-part-runtime.js +1 -1
  139. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  140. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  141. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  142. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  143. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  144. package/dist/runtime/api/thread-list-runtime.d.ts +12 -1
  145. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  146. package/dist/runtime/api/thread-list-runtime.js +23 -14
  147. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  148. package/dist/runtime/api/thread-runtime.d.ts +5 -1
  149. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  150. package/dist/runtime/api/thread-runtime.js +1 -1
  151. package/dist/runtime/api/thread-runtime.js.map +1 -1
  152. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  153. package/dist/runtime/base/base-composer-runtime-core.js +16 -12
  154. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  155. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -2
  156. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  157. package/dist/runtime/base/base-thread-runtime-core.js +8 -7
  158. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  159. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  160. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  161. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +18 -3
  162. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  163. package/dist/runtime/interfaces/thread-runtime-core.d.ts +15 -1
  164. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  165. package/dist/runtime/utils/auto-status.d.ts +1 -1
  166. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  167. package/dist/runtime/utils/auto-status.js +6 -2
  168. package/dist/runtime/utils/auto-status.js.map +1 -1
  169. package/dist/runtime/utils/external-message-conversion.d.ts +3 -2
  170. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -1
  171. package/dist/runtime/utils/external-message-conversion.js +5 -4
  172. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  173. package/dist/runtime/utils/message-repository.d.ts +1 -0
  174. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  175. package/dist/runtime/utils/message-repository.js +15 -6
  176. package/dist/runtime/utils/message-repository.js.map +1 -1
  177. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +6 -3
  178. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  179. package/dist/runtime/utils/resolveToolApprovalResponse.js +12 -3
  180. package/dist/runtime/utils/resolveToolApprovalResponse.js.map +1 -1
  181. package/dist/runtime/utils/thread-message-like.d.ts +2 -10
  182. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  183. package/dist/runtime/utils/thread-message-like.js +1 -1
  184. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  185. package/dist/runtime/utils/tool-call-tree.d.ts +39 -0
  186. package/dist/runtime/utils/tool-call-tree.d.ts.map +1 -0
  187. package/dist/runtime/utils/tool-call-tree.js +85 -0
  188. package/dist/runtime/utils/tool-call-tree.js.map +1 -0
  189. package/dist/runtimes/external-store/external-store-adapter.d.ts +29 -2
  190. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  191. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  192. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  193. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  194. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -1
  195. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  196. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +34 -28
  197. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  198. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +1 -1
  199. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -1
  200. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -1
  201. package/dist/runtimes/internal.d.ts +2 -2
  202. package/dist/runtimes/internal.js +2 -2
  203. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -1
  204. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  205. package/dist/runtimes/local/local-thread-runtime-core.js +3 -1
  206. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  207. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  208. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  209. package/dist/runtimes/remote-thread-list/remote-thread-state.js +148 -43
  210. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  211. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  212. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  213. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  214. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  215. package/dist/runtimes/remote-thread-list/title.d.ts +11 -0
  216. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -0
  217. package/dist/runtimes/remote-thread-list/title.js +14 -0
  218. package/dist/runtimes/remote-thread-list/title.js.map +1 -0
  219. package/dist/runtimes/remote-thread-list/types.d.ts +16 -5
  220. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  221. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +31 -8
  222. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  223. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +97 -60
  224. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  225. package/dist/store/clients/external-thread.d.ts +1 -1
  226. package/dist/store/clients/external-thread.d.ts.map +1 -1
  227. package/dist/store/clients/external-thread.js +30 -7
  228. package/dist/store/clients/external-thread.js.map +1 -1
  229. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  230. package/dist/store/clients/model-context-client.js +2 -1
  231. package/dist/store/clients/model-context-client.js.map +1 -1
  232. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  233. package/dist/store/clients/single-thread-list.js +2 -1
  234. package/dist/store/clients/single-thread-list.js.map +1 -1
  235. package/dist/store/clients/suggestions.d.ts.map +1 -1
  236. package/dist/store/clients/suggestions.js +19 -6
  237. package/dist/store/clients/suggestions.js.map +1 -1
  238. package/dist/store/clients/thread-message-client.js +1 -1
  239. package/dist/store/clients/thread-selection-events.js +1 -1
  240. package/dist/store/index.d.ts +2 -1
  241. package/dist/store/index.js +2 -1
  242. package/dist/store/internal.d.ts +2 -2
  243. package/dist/store/internal.js +2 -2
  244. package/dist/store/primitive-predicates.d.ts +4 -1
  245. package/dist/store/primitive-predicates.d.ts.map +1 -1
  246. package/dist/store/primitive-predicates.js +9 -1
  247. package/dist/store/primitive-predicates.js.map +1 -1
  248. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  249. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  250. package/dist/store/runtime-clients/composer-runtime-client.js +98 -62
  251. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  252. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  253. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  254. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  255. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  256. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  257. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +2 -2
  258. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  259. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  260. package/dist/store/runtime-clients/thread-list-runtime-client.js +128 -107
  261. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  262. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/thread-runtime-client.js +194 -122
  264. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/useSubscribable.d.ts +3 -1
  266. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  267. package/dist/store/runtime-clients/useSubscribable.js +1 -1
  268. package/dist/store/runtime-clients/useSubscribable.js.map +1 -1
  269. package/dist/store/scopes/composer.d.ts +10 -2
  270. package/dist/store/scopes/composer.d.ts.map +1 -1
  271. package/dist/store/scopes/message.d.ts +30 -1
  272. package/dist/store/scopes/message.d.ts.map +1 -1
  273. package/dist/store/scopes/part.d.ts +6 -3
  274. package/dist/store/scopes/part.d.ts.map +1 -1
  275. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  276. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  277. package/dist/store/scopes/thread.d.ts +8 -0
  278. package/dist/store/scopes/thread.d.ts.map +1 -1
  279. package/dist/store/scopes/threads.d.ts +1 -0
  280. package/dist/store/scopes/threads.d.ts.map +1 -1
  281. package/dist/subscribable/subscribable.d.ts +8 -1
  282. package/dist/subscribable/subscribable.d.ts.map +1 -1
  283. package/dist/subscribable/subscribable.js +24 -16
  284. package/dist/subscribable/subscribable.js.map +1 -1
  285. package/dist/types/attachment.d.ts +2 -1
  286. package/dist/types/attachment.d.ts.map +1 -1
  287. package/dist/types/attachment.js +2 -1
  288. package/dist/types/attachment.js.map +1 -1
  289. package/dist/types/message.d.ts +40 -1
  290. package/dist/types/message.d.ts.map +1 -1
  291. package/dist/types/message.js +7 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/abortable-iterable.d.ts +19 -0
  294. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  295. package/dist/utils/abortable-iterable.js +72 -0
  296. package/dist/utils/abortable-iterable.js.map +1 -0
  297. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  298. package/dist/utils/composite-context-provider.js +20 -2
  299. package/dist/utils/composite-context-provider.js.map +1 -1
  300. package/dist/utils/record.d.ts +11 -0
  301. package/dist/utils/record.d.ts.map +1 -0
  302. package/dist/utils/record.js +12 -0
  303. package/dist/utils/record.js.map +1 -0
  304. package/package.json +12 -17
  305. package/src/adapters/attachment.test.ts +50 -1
  306. package/src/adapters/attachment.ts +7 -4
  307. package/src/index.ts +7 -1
  308. package/src/internal.ts +12 -0
  309. package/src/model-context/frame/host.test.ts +24 -0
  310. package/src/model-context/frame/host.ts +10 -4
  311. package/src/model-context/frame/provider.test.ts +288 -1
  312. package/src/model-context/frame/provider.ts +148 -30
  313. package/src/model-context/interactable-composer-metadata.test.ts +28 -0
  314. package/src/model-context/interactable-composer-metadata.ts +9 -3
  315. package/src/model-context/registry.test.ts +12 -0
  316. package/src/model-context/registry.ts +3 -2
  317. package/src/model-context/tool-call-text.test.ts +67 -0
  318. package/src/model-context/tool-call-text.ts +67 -0
  319. package/src/model-context/types.test.ts +25 -0
  320. package/src/model-context/types.ts +9 -4
  321. package/src/react/AssistantRuntimeProvider.test.tsx +66 -2
  322. package/src/react/RuntimeAdapter.test.ts +34 -0
  323. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +1 -3
  324. package/src/react/client/InMemoryThreadList.ts +1 -0
  325. package/src/react/client/Interactables.test.ts +28 -0
  326. package/src/react/client/Interactables.ts +15 -13
  327. package/src/react/client/RemoteThreadList.background.test.ts +526 -0
  328. package/src/react/client/RemoteThreadList.concurrent.test.tsx +315 -0
  329. package/src/react/client/RemoteThreadList.test.ts +617 -3
  330. package/src/react/client/RemoteThreadList.ts +433 -167
  331. package/src/react/client/Tools.ts +29 -12
  332. package/src/react/index.ts +4 -0
  333. package/src/react/interactables-legacy/Interactables.ts +16 -16
  334. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  335. package/src/react/model-context/makeAssistantTool.ts +2 -2
  336. package/src/react/model-context/modelContextHooks.test.tsx +131 -0
  337. package/src/react/model-context/toolbox.test.ts +9 -9
  338. package/src/react/model-context/toolbox.ts +9 -36
  339. package/src/react/model-context/useAssistantContext.ts +4 -2
  340. package/src/react/model-context/useAssistantTool.ts +2 -2
  341. package/src/react/model-context/useAuiToolOverrides.ts +4 -2
  342. package/src/react/model-context/useInlineRender.test.tsx +48 -0
  343. package/src/react/model-context/useInlineRender.ts +14 -10
  344. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  345. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  346. package/src/react/primitive-hooks/useMessageError.ts +2 -19
  347. package/src/react/primitive-hooks/useThreadListLoadMore.ts +2 -3
  348. package/src/react/primitives/composer/ComposerAttachments.test.tsx +76 -0
  349. package/src/react/primitives/composer/ComposerAttachments.tsx +9 -4
  350. package/src/react/primitives/composer/ComposerQueue.test.tsx +72 -0
  351. package/src/react/primitives/composer/ComposerQueue.tsx +7 -4
  352. package/src/react/primitives/message/MessageAttachments.test.tsx +107 -37
  353. package/src/react/primitives/message/MessageAttachments.tsx +10 -7
  354. package/src/react/primitives/message/MessageGroupedParts.tsx +2 -2
  355. package/src/react/primitives/message/MessageParts.tsx +3 -3
  356. package/src/react/primitives/threadList/ThreadListItems.test.tsx +99 -0
  357. package/src/react/primitives/threadList/ThreadListItems.tsx +8 -5
  358. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  359. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +127 -1
  360. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  361. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +99 -35
  362. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  363. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +274 -0
  364. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +223 -152
  365. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  366. package/src/react/runtimes/RemoteThreadResource.ts +20 -16
  367. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +51 -2
  368. package/src/react/runtimes/assistant-transport/useLatestRef.ts +2 -2
  369. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.ts +45 -0
  370. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +546 -5
  371. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +546 -103
  372. package/src/react/runtimes/cloud/auiV0.ts +5 -0
  373. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +103 -0
  374. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +237 -0
  375. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +90 -1
  376. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +33 -238
  377. package/src/react/runtimes/external-message-converter.ts +1 -0
  378. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  379. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  380. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  381. package/src/react/runtimes/useRemoteThreadListRuntime.concurrent.test.tsx +216 -0
  382. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  383. package/src/react/runtimes/useRemoteThreadListRuntime.ts +57 -6
  384. package/src/react/types/MessagePartComponentTypes.ts +7 -3
  385. package/src/react/types/scopes/tools.ts +2 -0
  386. package/src/runtime/api/message-part-runtime.ts +3 -3
  387. package/src/runtime/api/message-runtime.test.ts +75 -0
  388. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  389. package/src/runtime/api/thread-list-runtime.ts +46 -12
  390. package/src/runtime/api/thread-runtime.test.ts +78 -0
  391. package/src/runtime/api/thread-runtime.ts +8 -1
  392. package/src/runtime/base/base-composer-runtime-core.ts +36 -8
  393. package/src/runtime/base/base-thread-runtime-core.test.ts +149 -4
  394. package/src/runtime/base/base-thread-runtime-core.ts +16 -8
  395. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  396. package/src/runtime/interfaces/thread-list-runtime-core.ts +25 -2
  397. package/src/runtime/interfaces/thread-runtime-core.ts +17 -1
  398. package/src/runtime/utils/auto-status.test.ts +57 -0
  399. package/src/runtime/utils/auto-status.ts +13 -1
  400. package/src/runtime/utils/external-message-conversion.test.ts +165 -0
  401. package/src/runtime/utils/external-message-conversion.ts +18 -2
  402. package/src/runtime/utils/message-repository.ts +29 -17
  403. package/src/runtime/utils/resolveToolApprovalResponse.test.ts +73 -0
  404. package/src/runtime/utils/resolveToolApprovalResponse.ts +27 -6
  405. package/src/runtime/utils/thread-message-like.ts +3 -11
  406. package/src/runtime/utils/tool-call-tree.test.ts +191 -0
  407. package/src/runtime/utils/tool-call-tree.ts +97 -0
  408. package/src/runtimes/external-store/external-store-adapter.ts +38 -2
  409. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  410. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +56 -33
  411. package/src/runtimes/inert/InertThreadRuntimeCore.ts +1 -1
  412. package/src/runtimes/internal.ts +1 -0
  413. package/src/runtimes/local/local-thread-runtime-core.test.ts +29 -3
  414. package/src/runtimes/local/local-thread-runtime-core.ts +5 -1
  415. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +238 -0
  416. package/src/runtimes/remote-thread-list/remote-thread-state.ts +223 -44
  417. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  418. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  419. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  420. package/src/runtimes/remote-thread-list/title.ts +16 -0
  421. package/src/runtimes/remote-thread-list/types.ts +16 -5
  422. package/src/runtimes/tool-invocations/EDGE_CASES.md +110 -5
  423. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +750 -136
  424. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +144 -91
  425. package/src/store/clients/external-thread.ts +62 -11
  426. package/src/store/clients/model-context-client.ts +5 -1
  427. package/src/store/clients/single-thread-list.ts +1 -0
  428. package/src/store/clients/suggestions.test.ts +195 -1
  429. package/src/store/clients/suggestions.ts +45 -34
  430. package/src/store/index.ts +4 -0
  431. package/src/store/internal.ts +2 -0
  432. package/src/store/primitive-predicates.ts +35 -0
  433. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  434. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  435. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  436. package/src/store/runtime-clients/thread-list-runtime-client.ts +17 -2
  437. package/src/store/runtime-clients/thread-runtime-client.ts +58 -10
  438. package/src/store/runtime-clients/useSubscribable.ts +8 -2
  439. package/src/store/scopes/composer.ts +16 -4
  440. package/src/store/scopes/message.ts +14 -0
  441. package/src/store/scopes/part.ts +6 -3
  442. package/src/store/scopes/thread-list-item.ts +5 -2
  443. package/src/store/scopes/thread.ts +4 -0
  444. package/src/store/scopes/threads.ts +1 -0
  445. package/src/subscribable/subscribable.test.ts +50 -0
  446. package/src/subscribable/subscribable.ts +33 -21
  447. package/src/tests/MessageRepository.test.ts +116 -0
  448. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  449. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  450. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +158 -0
  451. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +78 -0
  452. package/src/tests/RemoteThreadListThreadListRuntimeCore-reload.test.ts +52 -0
  453. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  454. package/src/tests/attachment-adapters.test.ts +14 -0
  455. package/src/tests/base-composer-runtime-core.test.ts +39 -0
  456. package/src/tests/external-store-optimistic-id.test.ts +79 -0
  457. package/src/tests/external-store-repository-instance.test.ts +166 -0
  458. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  459. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +49 -34
  460. package/src/tests/external-thread-attachments.test.tsx +224 -1
  461. package/src/tests/external-thread-parity.test.tsx +23 -0
  462. package/src/tests/remote-thread-list-adapter-switch.test.ts +66 -1
  463. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  464. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  465. package/src/tests/thread-switch-events.test.tsx +475 -2
  466. package/src/tests/tools-scope-migration.test.tsx +28 -0
  467. package/src/types/attachment.ts +4 -0
  468. package/src/types/message.ts +50 -2
  469. package/src/utils/abortable-iterable.test.ts +213 -0
  470. package/src/utils/abortable-iterable.ts +93 -0
  471. package/src/utils/composite-context-provider.test.ts +25 -0
  472. package/src/utils/composite-context-provider.ts +23 -2
  473. package/src/utils/record.test.ts +48 -0
  474. package/src/utils/record.ts +11 -0
@@ -1,12 +1,13 @@
1
+ import { nullProtoRecord } from "../../utils/record.js";
1
2
  import { findModelKnownState, interactableToolName } from "../../model-context/interactable-composer-metadata.js";
2
3
  import { notifySubscribers } from "../../subscribable/subscribable.js";
3
4
  import { ModelContext } from "../../store/clients/model-context-client.js";
4
5
  import { useInteractablePersistenceQueue } from "../interactables-shared/useInteractablePersistenceQueue.js";
5
6
  import { buildInteractableModelContext } from "./interactable-model-context.js";
7
+ import { attachTransformScopes, useAssistantClientRef, useAssistantScopeEffect } from "@assistant-ui/store/client";
6
8
  import { toJSONSchema, toPartialJSONSchema } from "assistant-stream";
7
9
  import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
8
10
  import { resource } from "@assistant-ui/tap";
9
- import { attachTransformScopes, useAssistantClientRef, useAssistantScopeEffect } from "@assistant-ui/store/client";
10
11
  //#region src/react/client/Interactables.ts
11
12
  const hasInteractableCreateCall = (messages, id, name) => messages.some((message) => message.role === "assistant" && message.content?.some((part) => {
12
13
  if (!part || typeof part !== "object") return false;
@@ -15,8 +16,8 @@ const hasInteractableCreateCall = (messages, id, name) => messages.some((message
15
16
  }));
16
17
  const useInteractablesResource = ({ persistence } = {}) => {
17
18
  const [state, setState] = useState(() => ({
18
- definitions: {},
19
- persistence: {}
19
+ definitions: nullProtoRecord(),
20
+ persistence: nullProtoRecord()
20
21
  }));
21
22
  const clientRef = useAssistantClientRef();
22
23
  const stateRef = useRef(state);
@@ -36,7 +37,7 @@ const useInteractablesResource = ({ persistence } = {}) => {
36
37
  setState(next);
37
38
  }, []);
38
39
  const exportState = useCallback(() => {
39
- const result = {};
40
+ const result = nullProtoRecord();
40
41
  for (const [id, def] of Object.entries(stateRef.current.definitions)) {
41
42
  if (def.scope === "thread") continue;
42
43
  result[id] = {
@@ -66,7 +67,7 @@ const useInteractablesResource = ({ persistence } = {}) => {
66
67
  for (const [id_0, entry] of Object.entries(saved)) if (shouldStash(id_0)) options.stash.set(id_0, entry.state);
67
68
  setStateAndRef((prev_0) => {
68
69
  let changed = false;
69
- const definitions = { ...prev_0.definitions };
70
+ const definitions = nullProtoRecord(prev_0.definitions);
70
71
  for (const [id_1, entry_0] of Object.entries(saved)) {
71
72
  const def_0 = definitions[id_1];
72
73
  if (!def_0 || !shouldApply(id_1, def_0)) continue;
@@ -130,13 +131,10 @@ const useInteractablesResource = ({ persistence } = {}) => {
130
131
  if (!existing) return prev_1;
131
132
  return {
132
133
  ...prev_1,
133
- definitions: {
134
- ...prev_1.definitions,
135
- [id_4]: {
136
- ...existing,
137
- state: updater_1(existing.state)
138
- }
139
- }
134
+ definitions: nullProtoRecord(prev_1.definitions, { [id_4]: {
135
+ ...existing,
136
+ state: updater_1(existing.state)
137
+ } })
140
138
  };
141
139
  });
142
140
  if (stateRef.current.definitions[id_4]?.scope !== "thread") schedulePersistence(id_4);
@@ -220,18 +218,15 @@ const useInteractablesResource = ({ persistence } = {}) => {
220
218
  const known = scope === "thread" ? findModelKnownState(threadMessages, def_2.id, def_2.name) : void 0;
221
219
  setStateAndRef((prev_2) => ({
222
220
  ...prev_2,
223
- definitions: {
224
- ...prev_2.definitions,
225
- [def_2.id]: {
226
- id: def_2.id,
227
- name: def_2.name,
228
- description: def_2.description,
229
- stateSchema: def_2.stateSchema,
230
- initialState: def_2.initialState,
231
- scope,
232
- state: prev_2.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
233
- }
234
- }
221
+ definitions: nullProtoRecord(prev_2.definitions, { [def_2.id]: {
222
+ id: def_2.id,
223
+ name: def_2.name,
224
+ description: def_2.description,
225
+ stateSchema: def_2.stateSchema,
226
+ initialState: def_2.initialState,
227
+ scope,
228
+ state: prev_2.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
229
+ } })
235
230
  }));
236
231
  return () => {
237
232
  releaseUpdateToolUI?.();
@@ -258,12 +253,14 @@ const useInteractablesResource = ({ persistence } = {}) => {
258
253
  } else detachedAppStateRef.current.set(def_2.id, existing_1.state);
259
254
  }
260
255
  partialSchemaCacheRef.current.delete(def_2.id);
261
- const { [def_2.id]: _, ...rest } = prev_3.definitions;
262
- const { [def_2.id]: __, ...restPersistence } = prev_3.persistence;
256
+ const definitions_0 = nullProtoRecord(prev_3.definitions);
257
+ const persistence_1 = nullProtoRecord(prev_3.persistence);
258
+ delete definitions_0[def_2.id];
259
+ delete persistence_1[def_2.id];
263
260
  return {
264
261
  ...prev_3,
265
- definitions: rest,
266
- persistence: restPersistence
262
+ definitions: definitions_0,
263
+ persistence: persistence_1
267
264
  };
268
265
  });
269
266
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","ClientOutput","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","Unstable_InteractablesState","Unstable_InteractableRegistration","Unstable_InteractablePersistedState","Unstable_InteractablePersistenceAdapter","Unstable_InteractablesConfig","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PartialJSONSchema","findModelKnownState","interactableToolName","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","RestorePersistedStateOptions","stash","Map","shouldStash","id","shouldApply","def","ToolCallLikePart","type","toolCallId","toolName","MessageLike","role","content","InternalInteractableRegistration","scope","UpdateToolUIEntry","count","render","NonNullable","unsubscribe","hasInteractableCreateCall","messages","name","some","message","part","p","useInteractablesResource","persistence","state","setState","definitions","clientRef","stateRef","subscribersRef","Set","partialSchemaCacheRef","streamBaselinesRef","targetId","detachedAppStateRef","detachedThreadStateRef","registrationCountsRef","updateToolUIsRef","loadedStateRef","touchedIdsRef","adapterRef","undefined","setStateAndRef","updater","prev","next","current","exportState","result","Object","entries","updatePersistenceStatus","flushIfPending","schedulePersistence","flush","snapshot","restorePersistedState","saved","options","entry","set","changed","importState","applyLoadedState","has","loadFromAdapter","adapter","load","e","console","warn","setPersistenceAdapter","getCurrentThreadId","client","threadListItem","source","getState","threads","mainThreadId","setDefState","add","existing","provider","getModelContext","defs","subscribe","callback","delete","modelContext","register","installUpdateToolUI","toolsAccessor","tools","setToolUI","standalone","values","threadAccessor","thread","threadMessages","process","env","NODE_ENV","get","releaseUpdateToolUI","updateRender","jsonSchema","stateSchema","threadId","detached","loaded","known","description","initialState","remaining","stateById","_","rest","__","restPersistence","unstable_Interactables","scopes","parent"],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport type {\n Unstable_InteractablesState,\n Unstable_InteractableRegistration,\n Unstable_InteractablePersistedState,\n Unstable_InteractablePersistenceAdapter,\n Unstable_InteractablesConfig,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport {\n buildInteractableModelContext,\n type PartialJSONSchema,\n} from \"./interactable-model-context\";\nimport {\n findModelKnownState,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\n\ntype RestorePersistedStateOptions = {\n stash: Map<string, unknown>;\n shouldStash?: (id: string) => boolean;\n shouldApply?: (\n id: string,\n def: Unstable_InteractablesState[\"definitions\"][string],\n ) => boolean;\n};\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n};\n\ntype MessageLike = {\n role?: string;\n content?: readonly unknown[] | undefined;\n};\n\ntype InternalInteractableRegistration = Unstable_InteractableRegistration & {\n scope?: \"thread\" | undefined;\n};\n\ntype UpdateToolUIEntry = {\n count: number;\n render: NonNullable<Unstable_InteractableRegistration[\"updateRender\"]>;\n unsubscribe: (() => void) | undefined;\n};\n\nconst hasInteractableCreateCall = (\n messages: readonly MessageLike[],\n id: string,\n name: string,\n) =>\n messages.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content?.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const p = part as ToolCallLikePart;\n return (\n p.type === \"tool-call\" && p.toolCallId === id && p.toolName === name\n );\n }),\n );\n\nconst useInteractablesResource = ({\n persistence,\n}: Unstable_InteractablesConfig = {}): ClientOutput<\"unstable_interactables\"> => {\n const [state, setState] = useState<Unstable_InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(new Map<string, PartialJSONSchema>());\n const streamBaselinesRef = useRef(\n new Map<string, { targetId: string; state: unknown }>(),\n );\n const detachedAppStateRef = useRef(new Map<string, unknown>());\n const detachedThreadStateRef = useRef(\n new Map<string, Map<string, unknown>>(),\n );\n // An instance may be registered from several anchors (its creating tool\n // call plus update_* calls); the definition lives until the last one leaves.\n const registrationCountsRef = useRef(new Map<string, number>());\n // One update-tool UI per interactable name, alive while any registrant\n // that supplied an updateRender is mounted.\n const updateToolUIsRef = useRef(new Map<string, UpdateToolUIEntry>());\n // App-scoped state restored via adapter.load(), consumed as components register.\n const loadedStateRef = useRef(new Map<string, unknown>());\n // Ids edited locally this session — a local edit always wins over a slow load.\n const touchedIdsRef = useRef(new Set<string>());\n\n const adapterRef = useRef<\n Unstable_InteractablePersistenceAdapter | undefined\n >(undefined);\n\n const setStateAndRef = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState,\n ) => Unstable_InteractablesState,\n ) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const exportState = useCallback((): Unstable_InteractablePersistedState => {\n const result: Unstable_InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n if (def.scope === \"thread\") continue; // thread items persist via snapshot, not the adapter\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState[\"persistence\"],\n ) => Unstable_InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const restorePersistedState = useCallback(\n (\n saved: Unstable_InteractablePersistedState,\n options: RestorePersistedStateOptions,\n ) => {\n const shouldStash = options.shouldStash ?? (() => true);\n const shouldApply = options.shouldApply ?? (() => true);\n\n for (const [id, entry] of Object.entries(saved)) {\n if (shouldStash(id)) options.stash.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n const def = definitions[id];\n if (!def || !shouldApply(id, def)) continue;\n definitions[id] = { ...def, state: entry.state };\n changed = true;\n }\n if (!changed) return prev;\n return { ...prev, definitions };\n });\n },\n [setStateAndRef],\n );\n\n const importState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, { stash: detachedAppStateRef.current });\n },\n [restorePersistedState],\n );\n\n // Applies adapter.load() output: a local edit made while the load was in\n // flight wins, and thread-scoped items never restore from the adapter.\n const applyLoadedState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, {\n stash: loadedStateRef.current,\n shouldStash: (id) => !touchedIdsRef.current.has(id),\n shouldApply: (id, def) =>\n !touchedIdsRef.current.has(id) && def.scope !== \"thread\",\n });\n },\n [restorePersistedState],\n );\n\n const loadFromAdapter = useCallback(\n async (adapter: Unstable_InteractablePersistenceAdapter) => {\n if (!adapter.load) return;\n try {\n const saved = await adapter.load();\n if (!saved || adapterRef.current !== adapter) return;\n applyLoadedState(saved);\n } catch (e) {\n console.warn(\"[Interactables] Persistence load failed.\", e);\n }\n },\n [applyLoadedState],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n if (adapter) void loadFromAdapter(adapter);\n },\n [flushIfPending, loadFromAdapter],\n );\n\n const getCurrentThreadId = useCallback((): string | undefined => {\n const client = clientRef.current;\n if (!client) return undefined;\n\n const threadListItem = client.threadListItem;\n if (threadListItem.source != null) {\n return threadListItem().getState().id;\n }\n\n const threads = client.threads;\n if (threads.source != null) {\n return threads().getState().mainThreadId;\n }\n\n return undefined;\n }, [clientRef]);\n\n useEffect(() => {\n if (!persistence) return;\n setPersistenceAdapter(persistence);\n return () => {\n if (adapterRef.current === persistence) {\n setPersistenceAdapter(undefined);\n }\n };\n }, [persistence, setPersistenceAdapter]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n touchedIdsRef.current.add(id);\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]?.scope !== \"thread\") {\n schedulePersistence(id);\n }\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n streamBaselinesRef.current,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const installUpdateToolUI = useCallback(\n (name: string, entry: UpdateToolUIEntry) => {\n const toolsAccessor = clientRef.current?.tools;\n if (!toolsAccessor || toolsAccessor.source == null) return false;\n entry.unsubscribe = toolsAccessor().setToolUI(\n interactableToolName(name),\n entry.render,\n { standalone: true },\n );\n return true;\n },\n [clientRef],\n );\n\n // register() installs update-tool UIs against the tools instance bound at\n // call time; this re-applies the retained entries when that instance is\n // structurally replaced and installs entries recorded while no tools\n // scope was available. Each re-apply releases the entry's previous\n // install first, so it is an orphaned no-op against a replaced instance\n // and an idempotent replacement against a live one.\n useAssistantScopeEffect(\n \"tools\",\n () => {\n for (const [name, entry] of updateToolUIsRef.current) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n installUpdateToolUI(name, entry);\n }\n return () => {\n for (const entry of updateToolUIsRef.current.values()) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n },\n [installUpdateToolUI],\n );\n\n const register = useCallback(\n (def: InternalInteractableRegistration) => {\n const threadAccessor = clientRef.current?.thread;\n const threadMessages =\n threadAccessor && threadAccessor.source != null\n ? (threadAccessor().getState().messages ?? [])\n : [];\n const scope =\n def.scope ??\n (hasInteractableCreateCall(threadMessages, def.id, def.name)\n ? \"thread\"\n : \"app\");\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n stateRef.current.definitions[def.id] &&\n scope !== \"thread\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" (${def.id}) is already registered. ` +\n `Register an app-scoped interactable once (unstable_useInteractable) and ` +\n `read it from other components with unstable_useInteractableState.`,\n );\n }\n\n registrationCountsRef.current.set(\n def.id,\n (registrationCountsRef.current.get(def.id) ?? 0) + 1,\n );\n\n let releaseUpdateToolUI: (() => void) | undefined;\n if (def.updateRender) {\n const existing = updateToolUIsRef.current.get(def.name);\n const entry = existing ?? {\n count: 0,\n render: def.updateRender,\n unsubscribe: undefined,\n };\n entry.count++;\n if (!existing) updateToolUIsRef.current.set(def.name, entry);\n\n if (\n !entry.unsubscribe &&\n !installUpdateToolUI(def.name, entry) &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" supplied an updateRender, but no ` +\n `tools scope is available yet; it will be installed once one appears.`,\n );\n }\n\n releaseUpdateToolUI = () => {\n const entry = updateToolUIsRef.current.get(def.name);\n if (!entry) return;\n if (--entry.count === 0) {\n updateToolUIsRef.current.delete(def.name);\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n }\n\n // The same id re-registers once per anchor (its create call + each update_*).\n if (!partialSchemaCacheRef.current.has(def.id)) {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will accept arbitrary fields without validation.`,\n e,\n );\n }\n }\n\n const threadId = scope === \"thread\" ? getCurrentThreadId() : undefined;\n const detached =\n scope === \"thread\"\n ? threadId\n ? detachedThreadStateRef.current.get(threadId)?.get(def.id)\n : undefined\n : detachedAppStateRef.current.get(def.id);\n if (scope === \"thread\") {\n if (threadId)\n detachedThreadStateRef.current.get(threadId)?.delete(def.id);\n } else {\n detachedAppStateRef.current.delete(def.id);\n }\n const loaded =\n scope === \"thread\" ? undefined : loadedStateRef.current.get(def.id);\n\n // Tool-created items restore from what the model already knows in this\n // thread (the creating call's args, sent snapshots, and the model's own\n // update_* calls) on a fresh reload; detached (in-session remount) still\n // wins so an unsent edit survives a scroll/virtualization cycle.\n const known =\n scope === \"thread\"\n ? findModelKnownState(threadMessages, def.id, def.name)\n : undefined;\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n initialState: def.initialState,\n scope,\n state:\n prev.definitions[def.id]?.state ??\n detached ??\n known?.state ??\n loaded ??\n def.initialState,\n },\n },\n }));\n\n return () => {\n releaseUpdateToolUI?.();\n\n const remaining = (registrationCountsRef.current.get(def.id) ?? 1) - 1;\n if (remaining > 0) {\n registrationCountsRef.current.set(def.id, remaining);\n return;\n }\n registrationCountsRef.current.delete(def.id);\n\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n if (existing.scope === \"thread\") {\n const threadId = getCurrentThreadId();\n if (threadId) {\n let stateById = detachedThreadStateRef.current.get(threadId);\n if (!stateById) {\n stateById = new Map();\n detachedThreadStateRef.current.set(threadId, stateById);\n }\n stateById.set(def.id, existing.state);\n }\n } else {\n detachedAppStateRef.current.set(def.id, existing.state);\n }\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [\n flushIfPending,\n clientRef,\n getCurrentThreadId,\n installUpdateToolUI,\n setStateAndRef,\n ],\n );\n\n return {\n getState: () => stateRef.current,\n register,\n setState: setDefState,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * Registers the unstable interactables store scope.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_Interactables = resource(useInteractablesResource);\n\nattachTransformScopes(useInteractablesResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","ClientOutput","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","Unstable_InteractablesState","Unstable_InteractableRegistration","Unstable_InteractablePersistedState","Unstable_InteractablePersistenceAdapter","Unstable_InteractablesConfig","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","PartialJSONSchema","findModelKnownState","interactableToolName","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","nullProtoRecord","RestorePersistedStateOptions","stash","Map","shouldStash","id","shouldApply","def","ToolCallLikePart","type","toolCallId","toolName","MessageLike","role","content","InternalInteractableRegistration","scope","UpdateToolUIEntry","count","render","NonNullable","unsubscribe","hasInteractableCreateCall","messages","name","some","message","part","p","useInteractablesResource","persistence","state","setState","definitions","clientRef","stateRef","subscribersRef","Set","partialSchemaCacheRef","streamBaselinesRef","targetId","detachedAppStateRef","detachedThreadStateRef","registrationCountsRef","updateToolUIsRef","loadedStateRef","touchedIdsRef","adapterRef","undefined","setStateAndRef","updater","prev","next","current","exportState","result","Object","entries","updatePersistenceStatus","flushIfPending","schedulePersistence","flush","snapshot","restorePersistedState","saved","options","entry","set","changed","importState","applyLoadedState","has","loadFromAdapter","adapter","load","e","console","warn","setPersistenceAdapter","getCurrentThreadId","client","threadListItem","source","getState","threads","mainThreadId","setDefState","add","existing","provider","getModelContext","defs","subscribe","callback","delete","modelContext","register","installUpdateToolUI","toolsAccessor","tools","setToolUI","standalone","values","threadAccessor","thread","threadMessages","process","env","NODE_ENV","get","releaseUpdateToolUI","updateRender","jsonSchema","stateSchema","threadId","detached","loaded","known","description","initialState","remaining","stateById","unstable_Interactables","scopes","parent"],"sources":["../../../src/react/client/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport type {\n Unstable_InteractablesState,\n Unstable_InteractableRegistration,\n Unstable_InteractablePersistedState,\n Unstable_InteractablePersistenceAdapter,\n Unstable_InteractablesConfig,\n} from \"../types/scopes/interactables\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport {\n buildInteractableModelContext,\n type PartialJSONSchema,\n} from \"./interactable-model-context\";\nimport {\n findModelKnownState,\n interactableToolName,\n} from \"../../model-context/interactable-composer-metadata\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\ntype RestorePersistedStateOptions = {\n stash: Map<string, unknown>;\n shouldStash?: (id: string) => boolean;\n shouldApply?: (\n id: string,\n def: Unstable_InteractablesState[\"definitions\"][string],\n ) => boolean;\n};\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n};\n\ntype MessageLike = {\n role?: string;\n content?: readonly unknown[] | undefined;\n};\n\ntype InternalInteractableRegistration = Unstable_InteractableRegistration & {\n scope?: \"thread\" | undefined;\n};\n\ntype UpdateToolUIEntry = {\n count: number;\n render: NonNullable<Unstable_InteractableRegistration[\"updateRender\"]>;\n unsubscribe: (() => void) | undefined;\n};\n\nconst hasInteractableCreateCall = (\n messages: readonly MessageLike[],\n id: string,\n name: string,\n) =>\n messages.some(\n (message) =>\n message.role === \"assistant\" &&\n message.content?.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const p = part as ToolCallLikePart;\n return (\n p.type === \"tool-call\" && p.toolCallId === id && p.toolName === name\n );\n }),\n );\n\nconst useInteractablesResource = ({\n persistence,\n}: Unstable_InteractablesConfig = {}): ClientOutput<\"unstable_interactables\"> => {\n const [state, setState] = useState<Unstable_InteractablesState>(() => ({\n definitions: nullProtoRecord(),\n persistence: nullProtoRecord(),\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(new Map<string, PartialJSONSchema>());\n const streamBaselinesRef = useRef(\n new Map<string, { targetId: string; state: unknown }>(),\n );\n const detachedAppStateRef = useRef(new Map<string, unknown>());\n const detachedThreadStateRef = useRef(\n new Map<string, Map<string, unknown>>(),\n );\n // An instance may be registered from several anchors (its creating tool\n // call plus update_* calls); the definition lives until the last one leaves.\n const registrationCountsRef = useRef(new Map<string, number>());\n // One update-tool UI per interactable name, alive while any registrant\n // that supplied an updateRender is mounted.\n const updateToolUIsRef = useRef(new Map<string, UpdateToolUIEntry>());\n // App-scoped state restored via adapter.load(), consumed as components register.\n const loadedStateRef = useRef(new Map<string, unknown>());\n // Ids edited locally this session — a local edit always wins over a slow load.\n const touchedIdsRef = useRef(new Set<string>());\n\n const adapterRef = useRef<\n Unstable_InteractablePersistenceAdapter | undefined\n >(undefined);\n\n const setStateAndRef = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState,\n ) => Unstable_InteractablesState,\n ) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const exportState = useCallback((): Unstable_InteractablePersistedState => {\n const result =\n nullProtoRecord<Unstable_InteractablePersistedState[string]>();\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n if (def.scope === \"thread\") continue; // thread items persist via snapshot, not the adapter\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: Unstable_InteractablesState[\"persistence\"],\n ) => Unstable_InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const restorePersistedState = useCallback(\n (\n saved: Unstable_InteractablePersistedState,\n options: RestorePersistedStateOptions,\n ) => {\n const shouldStash = options.shouldStash ?? (() => true);\n const shouldApply = options.shouldApply ?? (() => true);\n\n for (const [id, entry] of Object.entries(saved)) {\n if (shouldStash(id)) options.stash.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = nullProtoRecord(prev.definitions);\n for (const [id, entry] of Object.entries(saved)) {\n const def = definitions[id];\n if (!def || !shouldApply(id, def)) continue;\n definitions[id] = { ...def, state: entry.state };\n changed = true;\n }\n if (!changed) return prev;\n return { ...prev, definitions };\n });\n },\n [setStateAndRef],\n );\n\n const importState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, { stash: detachedAppStateRef.current });\n },\n [restorePersistedState],\n );\n\n // Applies adapter.load() output: a local edit made while the load was in\n // flight wins, and thread-scoped items never restore from the adapter.\n const applyLoadedState = useCallback(\n (saved: Unstable_InteractablePersistedState) => {\n restorePersistedState(saved, {\n stash: loadedStateRef.current,\n shouldStash: (id) => !touchedIdsRef.current.has(id),\n shouldApply: (id, def) =>\n !touchedIdsRef.current.has(id) && def.scope !== \"thread\",\n });\n },\n [restorePersistedState],\n );\n\n const loadFromAdapter = useCallback(\n async (adapter: Unstable_InteractablePersistenceAdapter) => {\n if (!adapter.load) return;\n try {\n const saved = await adapter.load();\n if (!saved || adapterRef.current !== adapter) return;\n applyLoadedState(saved);\n } catch (e) {\n console.warn(\"[Interactables] Persistence load failed.\", e);\n }\n },\n [applyLoadedState],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: Unstable_InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n if (adapter) void loadFromAdapter(adapter);\n },\n [flushIfPending, loadFromAdapter],\n );\n\n const getCurrentThreadId = useCallback((): string | undefined => {\n const client = clientRef.current;\n if (!client) return undefined;\n\n const threadListItem = client.threadListItem;\n if (threadListItem.source != null) {\n return threadListItem().getState().id;\n }\n\n const threads = client.threads;\n if (threads.source != null) {\n return threads().getState().mainThreadId;\n }\n\n return undefined;\n }, [clientRef]);\n\n useEffect(() => {\n if (!persistence) return;\n setPersistenceAdapter(persistence);\n return () => {\n if (adapterRef.current === persistence) {\n setPersistenceAdapter(undefined);\n }\n };\n }, [persistence, setPersistenceAdapter]);\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n touchedIdsRef.current.add(id);\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [id]: { ...existing, state: updater(existing.state) },\n }),\n };\n });\n if (stateRef.current.definitions[id]?.scope !== \"thread\") {\n schedulePersistence(id);\n }\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n streamBaselinesRef.current,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const installUpdateToolUI = useCallback(\n (name: string, entry: UpdateToolUIEntry) => {\n const toolsAccessor = clientRef.current?.tools;\n if (!toolsAccessor || toolsAccessor.source == null) return false;\n entry.unsubscribe = toolsAccessor().setToolUI(\n interactableToolName(name),\n entry.render,\n { standalone: true },\n );\n return true;\n },\n [clientRef],\n );\n\n // register() installs update-tool UIs against the tools instance bound at\n // call time; this re-applies the retained entries when that instance is\n // structurally replaced and installs entries recorded while no tools\n // scope was available. Each re-apply releases the entry's previous\n // install first, so it is an orphaned no-op against a replaced instance\n // and an idempotent replacement against a live one.\n useAssistantScopeEffect(\n \"tools\",\n () => {\n for (const [name, entry] of updateToolUIsRef.current) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n installUpdateToolUI(name, entry);\n }\n return () => {\n for (const entry of updateToolUIsRef.current.values()) {\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n },\n [installUpdateToolUI],\n );\n\n const register = useCallback(\n (def: InternalInteractableRegistration) => {\n const threadAccessor = clientRef.current?.thread;\n const threadMessages =\n threadAccessor && threadAccessor.source != null\n ? (threadAccessor().getState().messages ?? [])\n : [];\n const scope =\n def.scope ??\n (hasInteractableCreateCall(threadMessages, def.id, def.name)\n ? \"thread\"\n : \"app\");\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n stateRef.current.definitions[def.id] &&\n scope !== \"thread\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" (${def.id}) is already registered. ` +\n `Register an app-scoped interactable once (unstable_useInteractable) and ` +\n `read it from other components with unstable_useInteractableState.`,\n );\n }\n\n registrationCountsRef.current.set(\n def.id,\n (registrationCountsRef.current.get(def.id) ?? 0) + 1,\n );\n\n let releaseUpdateToolUI: (() => void) | undefined;\n if (def.updateRender) {\n const existing = updateToolUIsRef.current.get(def.name);\n const entry = existing ?? {\n count: 0,\n render: def.updateRender,\n unsubscribe: undefined,\n };\n entry.count++;\n if (!existing) updateToolUIsRef.current.set(def.name, entry);\n\n if (\n !entry.unsubscribe &&\n !installUpdateToolUI(def.name, entry) &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n `[Interactables] \"${def.name}\" supplied an updateRender, but no ` +\n `tools scope is available yet; it will be installed once one appears.`,\n );\n }\n\n releaseUpdateToolUI = () => {\n const entry = updateToolUIsRef.current.get(def.name);\n if (!entry) return;\n if (--entry.count === 0) {\n updateToolUIsRef.current.delete(def.name);\n entry.unsubscribe?.();\n entry.unsubscribe = undefined;\n }\n };\n }\n\n // The same id re-registers once per anchor (its create call + each update_*).\n if (!partialSchemaCacheRef.current.has(def.id)) {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will accept arbitrary fields without validation.`,\n e,\n );\n }\n }\n\n const threadId = scope === \"thread\" ? getCurrentThreadId() : undefined;\n const detached =\n scope === \"thread\"\n ? threadId\n ? detachedThreadStateRef.current.get(threadId)?.get(def.id)\n : undefined\n : detachedAppStateRef.current.get(def.id);\n if (scope === \"thread\") {\n if (threadId)\n detachedThreadStateRef.current.get(threadId)?.delete(def.id);\n } else {\n detachedAppStateRef.current.delete(def.id);\n }\n const loaded =\n scope === \"thread\" ? undefined : loadedStateRef.current.get(def.id);\n\n // Tool-created items restore from what the model already knows in this\n // thread (the creating call's args, sent snapshots, and the model's own\n // update_* calls) on a fresh reload; detached (in-session remount) still\n // wins so an unsent edit survives a scroll/virtualization cycle.\n const known =\n scope === \"thread\"\n ? findModelKnownState(threadMessages, def.id, def.name)\n : undefined;\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n initialState: def.initialState,\n scope,\n state:\n prev.definitions[def.id]?.state ??\n detached ??\n known?.state ??\n loaded ??\n def.initialState,\n },\n }),\n }));\n\n return () => {\n releaseUpdateToolUI?.();\n\n const remaining = (registrationCountsRef.current.get(def.id) ?? 1) - 1;\n if (remaining > 0) {\n registrationCountsRef.current.set(def.id, remaining);\n return;\n }\n registrationCountsRef.current.delete(def.id);\n\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n if (existing.scope === \"thread\") {\n const threadId = getCurrentThreadId();\n if (threadId) {\n let stateById = detachedThreadStateRef.current.get(threadId);\n if (!stateById) {\n stateById = new Map();\n detachedThreadStateRef.current.set(threadId, stateById);\n }\n stateById.set(def.id, existing.state);\n }\n } else {\n detachedAppStateRef.current.set(def.id, existing.state);\n }\n }\n partialSchemaCacheRef.current.delete(def.id);\n const definitions = nullProtoRecord(prev.definitions);\n const persistence = nullProtoRecord(prev.persistence);\n delete definitions[def.id];\n delete persistence[def.id];\n return { ...prev, definitions, persistence };\n });\n };\n },\n [\n flushIfPending,\n clientRef,\n getCurrentThreadId,\n installUpdateToolUI,\n setStateAndRef,\n ],\n );\n\n return {\n getState: () => stateRef.current,\n register,\n setState: setDefState,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * Registers the unstable interactables store scope.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport const unstable_Interactables = resource(useInteractablesResource);\n\nattachTransformScopes(useInteractablesResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
@@ -18,7 +18,20 @@ type RemoteThreadListProps = {
18
18
  onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;
19
19
  onSwitchToThread?: ((threadId: string) => void) | undefined;
20
20
  onSwitchToNewThread?: (() => void) | undefined;
21
+ /** Called after the backing adapter successfully deletes the thread. */
21
22
  onDelete?: ((threadId: string) => void) | undefined;
23
+ /**
24
+ * Keeps every thread the session switched to mounted, so a run continues
25
+ * after the user switches away, per-item `isRunning` reflects background
26
+ * runs, and a freshly initialized thread generates its title automatically.
27
+ * A body unmounts on delete, detach, or an adapter replacement (`reload()`
28
+ * after swapping the adapter); visited threads otherwise stay mounted for
29
+ * the client's lifetime. Each body reads its own thread through the ambient
30
+ * `threadListItem` scope, and `unstable_useAdapters` runs once per mounted
31
+ * body. Off (the default), only the visible thread is mounted and a switch
32
+ * unmounts it. The mode is fixed at mount.
33
+ */
34
+ backgroundThreads?: boolean | undefined;
22
35
  };
23
36
  /**
24
37
  * `AuiConfig` `threads` entry backed by a `RemoteThreadListAdapter`. Thread
@@ -27,6 +40,9 @@ type RemoteThreadListProps = {
27
40
  * and attachments come from `unstable_useAdapters`. `useRemoteThreadListRuntime`
28
41
  * uses the same hook when `unstable_Provider` is omitted. Key the factory
29
42
  * with `withKey` so history reloads when the visible thread changes.
43
+ * With `backgroundThreads`, every visited thread stays mounted: runs continue
44
+ * across switches, per-item `isRunning` is live, and freshly initialized
45
+ * threads title themselves.
30
46
  */
31
47
  declare const RemoteThreadList: import("@assistant-ui/tap").Resource<ClientOutput<"threads">, [props: RemoteThreadListProps]>;
32
48
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadList.d.ts","names":[],"sources":["../../../src/react/client/RemoteThreadList.ts"],"mappings":";;;;KA+CY;;;;EAIV,SAAS;;;;;;;EAOT,QAAQ;EACR;EACA,qBAAqB;EACrB,qBAAqB;EACrB;EACA,aAAa;;;;;;;;;;cA8gCF,8CAAgB,SAAA,0BAAA,OAAA"}
1
+ {"version":3,"file":"RemoteThreadList.d.ts","names":[],"sources":["../../../src/react/client/RemoteThreadList.ts"],"mappings":";;;;KAgEY;;;;EAIV,SAAS;;;;;;;EAOT,QAAQ;EACR;EACA,qBAAqB;EACrB,qBAAqB;EACrB;;EAEA,aAAa;;;;;;;;;;;;EAYb;;;;;;;;;;;;;cA0vCW,8CAAgB,SAAA,0BAAA,OAAA"}