@assistant-ui/core 0.2.10 → 0.2.12

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 (362) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +22 -12
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/adapters/directive-formatter.js.map +1 -1
  5. package/dist/adapters/speech.js.map +1 -1
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.js +2 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal.js +1 -1
  10. package/dist/model-context/frame/host.js.map +1 -1
  11. package/dist/model-context/frame/provider.js.map +1 -1
  12. package/dist/model-context/registry.js.map +1 -1
  13. package/dist/model-context/types.js.map +1 -1
  14. package/dist/react/AssistantProvider.js +1 -1
  15. package/dist/react/AssistantRuntimeProvider.d.ts +1 -1
  16. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  17. package/dist/react/AssistantRuntimeProvider.js +1 -1
  18. package/dist/react/RuntimeAdapter.js +4 -2
  19. package/dist/react/RuntimeAdapter.js.map +1 -1
  20. package/dist/react/adapters/LocalStorageThreadListAdapter.js +1 -1
  21. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  22. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  23. package/dist/react/client/DataRenderers.js +6 -5
  24. package/dist/react/client/DataRenderers.js.map +1 -1
  25. package/dist/react/client/Interactables.d.ts.map +1 -1
  26. package/dist/react/client/Interactables.js +30 -29
  27. package/dist/react/client/Interactables.js.map +1 -1
  28. package/dist/react/client/Tools.d.ts.map +1 -1
  29. package/dist/react/client/Tools.js +10 -9
  30. package/dist/react/client/Tools.js.map +1 -1
  31. package/dist/react/index.d.ts +5 -4
  32. package/dist/react/index.js +3 -2
  33. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  34. package/dist/react/model-context/define-toolkit.d.ts +9 -12
  35. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  36. package/dist/react/model-context/define-toolkit.js +1 -1
  37. package/dist/react/model-context/define-toolkit.js.map +1 -1
  38. package/dist/react/model-context/external-tool.d.ts +14 -0
  39. package/dist/react/model-context/external-tool.d.ts.map +1 -0
  40. package/dist/react/model-context/external-tool.js +17 -0
  41. package/dist/react/model-context/external-tool.js.map +1 -0
  42. package/dist/react/model-context/human-tool.d.ts +27 -0
  43. package/dist/react/model-context/human-tool.d.ts.map +1 -0
  44. package/dist/react/model-context/human-tool.js +30 -0
  45. package/dist/react/model-context/human-tool.js.map +1 -0
  46. package/dist/react/model-context/toolbox.d.ts +3 -3
  47. package/dist/react/model-context/toolbox.js.map +1 -1
  48. package/dist/react/model-context/useAssistantContext.js +1 -1
  49. package/dist/react/model-context/useAssistantContext.js.map +1 -1
  50. package/dist/react/model-context/useAssistantDataUI.js +1 -1
  51. package/dist/react/model-context/useAssistantDataUI.js.map +1 -1
  52. package/dist/react/model-context/useAssistantInstructions.js +1 -1
  53. package/dist/react/model-context/useAssistantInstructions.js.map +1 -1
  54. package/dist/react/model-context/useAssistantInteractable.js +1 -1
  55. package/dist/react/model-context/useAssistantInteractable.js.map +1 -1
  56. package/dist/react/model-context/useAssistantTool.js +1 -1
  57. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  58. package/dist/react/model-context/useAssistantToolUI.js +1 -1
  59. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  60. package/dist/react/model-context/useAuiToolOverrides.js +1 -1
  61. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -1
  62. package/dist/react/model-context/useInlineRender.js +1 -1
  63. package/dist/react/model-context/useInlineRender.js.map +1 -1
  64. package/dist/react/model-context/useInteractableState.js +1 -1
  65. package/dist/react/model-context/useInteractableState.js.map +1 -1
  66. package/dist/react/model-context/useToolArgsStatus.js +1 -1
  67. package/dist/react/primitive-hooks/useActionBarCopy.js +1 -1
  68. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  69. package/dist/react/primitive-hooks/useActionBarEdit.js +1 -1
  70. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  71. package/dist/react/primitive-hooks/useActionBarFeedback.js +1 -1
  72. package/dist/react/primitive-hooks/useActionBarFeedback.js.map +1 -1
  73. package/dist/react/primitive-hooks/useActionBarReload.js +1 -1
  74. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  75. package/dist/react/primitive-hooks/useActionBarSpeak.js +1 -1
  76. package/dist/react/primitive-hooks/useActionBarSpeak.js.map +1 -1
  77. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js +1 -1
  78. package/dist/react/primitive-hooks/useActionBarStopSpeaking.js.map +1 -1
  79. package/dist/react/primitive-hooks/useBranchPickerNext.js +1 -1
  80. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  81. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +1 -1
  82. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  83. package/dist/react/primitive-hooks/useComposerAddAttachment.js +1 -1
  84. package/dist/react/primitive-hooks/useComposerAddAttachment.js.map +1 -1
  85. package/dist/react/primitive-hooks/useComposerCancel.js +1 -1
  86. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  87. package/dist/react/primitive-hooks/useComposerDictate.js +1 -1
  88. package/dist/react/primitive-hooks/useComposerDictate.js.map +1 -1
  89. package/dist/react/primitive-hooks/useComposerSend.js +1 -1
  90. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  91. package/dist/react/primitive-hooks/useEditComposerCancel.js +1 -1
  92. package/dist/react/primitive-hooks/useEditComposerCancel.js.map +1 -1
  93. package/dist/react/primitive-hooks/useEditComposerSend.js +1 -1
  94. package/dist/react/primitive-hooks/useEditComposerSend.js.map +1 -1
  95. package/dist/react/primitive-hooks/useMessageBranching.js +1 -1
  96. package/dist/react/primitive-hooks/useMessageBranching.js.map +1 -1
  97. package/dist/react/primitive-hooks/useMessageReload.js +1 -1
  98. package/dist/react/primitive-hooks/useMessageReload.js.map +1 -1
  99. package/dist/react/primitive-hooks/useSuggestionTrigger.js +1 -1
  100. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  101. package/dist/react/primitive-hooks/useThreadListItemArchive.js +1 -1
  102. package/dist/react/primitive-hooks/useThreadListItemArchive.js.map +1 -1
  103. package/dist/react/primitive-hooks/useThreadListItemDelete.js +1 -1
  104. package/dist/react/primitive-hooks/useThreadListItemDelete.js.map +1 -1
  105. package/dist/react/primitive-hooks/useThreadListItemTrigger.js +1 -1
  106. package/dist/react/primitive-hooks/useThreadListItemTrigger.js.map +1 -1
  107. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js +1 -1
  108. package/dist/react/primitive-hooks/useThreadListItemUnarchive.js.map +1 -1
  109. package/dist/react/primitive-hooks/useThreadListLoadMore.js +1 -1
  110. package/dist/react/primitive-hooks/useThreadListLoadMore.js.map +1 -1
  111. package/dist/react/primitive-hooks/useThreadListNew.js +1 -1
  112. package/dist/react/primitive-hooks/useThreadListNew.js.map +1 -1
  113. package/dist/react/primitive-hooks/useVoice.js +1 -1
  114. package/dist/react/primitive-hooks/useVoice.js.map +1 -1
  115. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +1 -1
  116. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  117. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  118. package/dist/react/primitives/composer/ComposerAttachments.js +1 -1
  119. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  120. package/dist/react/primitives/composer/ComposerQueue.js +1 -1
  121. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  122. package/dist/react/primitives/generativeUI/GenerativeUI.js +1 -1
  123. package/dist/react/primitives/generativeUI/GenerativeUI.js.map +1 -1
  124. package/dist/react/primitives/message/MessageAttachments.js +1 -1
  125. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  126. package/dist/react/primitives/message/MessageGroupedParts.js +1 -1
  127. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  128. package/dist/react/primitives/message/MessageParts.d.ts +1 -1
  129. package/dist/react/primitives/message/MessageParts.js +1 -1
  130. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  131. package/dist/react/primitives/message/MessageQuote.js +1 -1
  132. package/dist/react/primitives/part/PartMessages.d.ts +2 -2
  133. package/dist/react/primitives/part/PartMessages.js +3 -3
  134. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  135. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  136. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  137. package/dist/react/primitives/thread/ThreadSuggestions.js +1 -1
  138. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  139. package/dist/react/primitives/threadList/ThreadListItems.js +1 -1
  140. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  141. package/dist/react/providers/AttachmentByIndexProvider.js.map +1 -1
  142. package/dist/react/providers/ChainOfThoughtByIndicesProvider.js.map +1 -1
  143. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  144. package/dist/react/providers/MessageByIndexProvider.js.map +1 -1
  145. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  146. package/dist/react/providers/QueueItemByIndexProvider.js.map +1 -1
  147. package/dist/react/providers/ReadonlyThreadProvider.js +1 -1
  148. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  149. package/dist/react/providers/SuggestionByIndexProvider.js.map +1 -1
  150. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  151. package/dist/react/providers/TextMessagePartProvider.js +4 -3
  152. package/dist/react/providers/TextMessagePartProvider.js.map +1 -1
  153. package/dist/react/providers/ThreadListItemByIndexProvider.js.map +1 -1
  154. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +7 -0
  155. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  156. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +1 -1
  157. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  158. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +7 -0
  159. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  160. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +1 -1
  161. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  162. package/dist/react/runtimes/RuntimeAdapterProvider.js +1 -1
  163. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  164. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  165. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +1 -1
  166. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  167. package/dist/react/runtimes/createMessageConverter.d.ts +2 -2
  168. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  169. package/dist/react/runtimes/createMessageConverter.js.map +1 -1
  170. package/dist/react/runtimes/external-message-converter.d.ts +4 -3
  171. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  172. package/dist/react/runtimes/external-message-converter.js +1 -1
  173. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  174. package/dist/react/runtimes/useExternalStoreRuntime.js +1 -1
  175. package/dist/react/runtimes/useExternalStoreSharedOptions.js +1 -1
  176. package/dist/react/runtimes/useLocalRuntime.d.ts +2 -1
  177. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  178. package/dist/react/runtimes/useLocalRuntime.js +4 -3
  179. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  180. package/dist/react/runtimes/useRemoteThreadListRuntime.js +1 -1
  181. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  182. package/dist/react/utils/groupParts.d.ts +1 -1
  183. package/dist/react/utils/groupParts.js.map +1 -1
  184. package/dist/runtime/api/attachment-runtime.js.map +1 -1
  185. package/dist/runtime/api/composer-runtime.d.ts +8 -2
  186. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  187. package/dist/runtime/api/composer-runtime.js +14 -0
  188. package/dist/runtime/api/composer-runtime.js.map +1 -1
  189. package/dist/runtime/api/message-part-runtime.js.map +1 -1
  190. package/dist/runtime/api/message-runtime.js +1 -1
  191. package/dist/runtime/api/message-runtime.js.map +1 -1
  192. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  193. package/dist/runtime/api/thread-runtime.d.ts +7 -0
  194. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  195. package/dist/runtime/api/thread-runtime.js.map +1 -1
  196. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -0
  197. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  198. package/dist/runtime/base/base-composer-runtime-core.js +7 -1
  199. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  200. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  201. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +4 -0
  202. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  203. package/dist/runtime/base/default-thread-composer-runtime-core.js +17 -1
  204. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  205. package/dist/runtime/interfaces/composer-runtime-core.d.ts +6 -1
  206. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  207. package/dist/runtime/interfaces/thread-runtime-core.d.ts +4 -0
  208. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  209. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +20 -0
  210. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -0
  211. package/dist/runtime/queue/external-thread-queue-adapter.js +0 -0
  212. package/dist/runtime/queue/message-queue.d.ts +20 -0
  213. package/dist/runtime/queue/message-queue.d.ts.map +1 -0
  214. package/dist/runtime/queue/message-queue.js +97 -0
  215. package/dist/runtime/queue/message-queue.js.map +1 -0
  216. package/dist/runtime/utils/message-repository.js.map +1 -1
  217. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  218. package/dist/runtimes/external-store/external-store-adapter.d.ts +3 -1
  219. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  220. package/dist/runtimes/external-store/external-store-runtime-core.js.map +1 -1
  221. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +4 -0
  222. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  223. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +20 -2
  224. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  225. package/dist/runtimes/local/local-runtime-core.js.map +1 -1
  226. package/dist/runtimes/local/local-runtime-options.d.ts +5 -0
  227. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  228. package/dist/runtimes/local/local-thread-runtime-core.d.ts +7 -0
  229. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  230. package/dist/runtimes/local/local-thread-runtime-core.js +45 -0
  231. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  232. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +3 -0
  233. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  234. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +3 -0
  235. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  236. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  237. package/dist/runtimes/remote-thread-list/empty-thread-core.js +3 -0
  238. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  239. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  240. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  241. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  242. package/dist/store/clients/chain-of-thought-client.js +6 -5
  243. package/dist/store/clients/chain-of-thought-client.js.map +1 -1
  244. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  245. package/dist/store/clients/model-context-client.js +6 -5
  246. package/dist/store/clients/model-context-client.js.map +1 -1
  247. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  248. package/dist/store/clients/no-op-composer-client.js +4 -3
  249. package/dist/store/clients/no-op-composer-client.js.map +1 -1
  250. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  251. package/dist/store/clients/runtime-adapter.js +7 -6
  252. package/dist/store/clients/runtime-adapter.js.map +1 -1
  253. package/dist/store/clients/suggestions.d.ts.map +1 -1
  254. package/dist/store/clients/suggestions.js +7 -6
  255. package/dist/store/clients/suggestions.js.map +1 -1
  256. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  257. package/dist/store/clients/thread-message-client.js +13 -12
  258. package/dist/store/clients/thread-message-client.js.map +1 -1
  259. package/dist/store/index.d.ts +1 -1
  260. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  261. package/dist/store/runtime-clients/attachment-runtime-client.js +3 -3
  262. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  263. package/dist/store/runtime-clients/composer-runtime-client.d.ts +12 -5
  264. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  265. package/dist/store/runtime-clients/composer-runtime-client.js +32 -16
  266. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  267. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  268. package/dist/store/runtime-clients/message-part-runtime-client.js +3 -3
  269. package/dist/store/runtime-clients/message-part-runtime-client.js.map +1 -1
  270. package/dist/store/runtime-clients/message-runtime-client.d.ts +6 -3
  271. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  272. package/dist/store/runtime-clients/message-runtime-client.js +17 -16
  273. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  274. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  275. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +8 -7
  276. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  277. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  278. package/dist/store/runtime-clients/thread-list-runtime-client.js +11 -10
  279. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  280. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  281. package/dist/store/runtime-clients/thread-runtime-client.js +15 -14
  282. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  283. package/dist/store/runtime-clients/useSubscribable.d.ts +7 -0
  284. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -0
  285. package/dist/store/runtime-clients/useSubscribable.js +16 -0
  286. package/dist/store/runtime-clients/useSubscribable.js.map +1 -0
  287. package/dist/store/scope-registration.d.ts +1 -1
  288. package/dist/store/scopes/composer.d.ts +1 -1
  289. package/dist/store/scopes/queue-item.d.ts +2 -1
  290. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  291. package/dist/store/scopes/queue-item.js +6 -0
  292. package/dist/store/scopes/queue-item.js.map +1 -0
  293. package/dist/store/scopes/thread.d.ts +1 -1
  294. package/dist/store/scopes/threads.d.ts +1 -1
  295. package/dist/types/message.d.ts +2 -1
  296. package/dist/types/message.d.ts.map +1 -1
  297. package/dist/types/message.js.map +1 -1
  298. package/dist/utils/composite-context-provider.d.ts +1 -1
  299. package/dist/utils/composite-context-provider.js +3 -1
  300. package/dist/utils/composite-context-provider.js.map +1 -1
  301. package/dist/utils/json/is-json.js.map +1 -1
  302. package/dist/utils/text.js.map +1 -1
  303. package/package.json +14 -10
  304. package/src/adapters/attachment.ts +24 -4
  305. package/src/index.ts +8 -0
  306. package/src/react/RuntimeAdapter.ts +6 -4
  307. package/src/react/client/DataRenderers.ts +48 -42
  308. package/src/react/client/Interactables.ts +263 -267
  309. package/src/react/client/Tools.ts +122 -129
  310. package/src/react/index.ts +3 -1
  311. package/src/react/model-context/define-toolkit.test.ts +14 -7
  312. package/src/react/model-context/define-toolkit.ts +18 -19
  313. package/src/react/model-context/external-tool.ts +16 -0
  314. package/src/react/model-context/{hitl.ts → human-tool.ts} +13 -8
  315. package/src/react/model-context/toolbox.ts +3 -3
  316. package/src/react/primitives/message/MessageGroupedParts.tsx +1 -1
  317. package/src/react/primitives/part/PartMessages.tsx +2 -2
  318. package/src/react/providers/TextMessagePartProvider.tsx +31 -32
  319. package/src/react/runtimes/createMessageConverter.ts +2 -1
  320. package/src/react/runtimes/external-message-converter.ts +5 -3
  321. package/src/react/runtimes/useLocalRuntime.ts +2 -0
  322. package/src/runtime/api/composer-runtime.ts +26 -0
  323. package/src/runtime/base/base-composer-runtime-core.ts +11 -0
  324. package/src/runtime/base/default-thread-composer-runtime-core.ts +22 -0
  325. package/src/runtime/interfaces/composer-runtime-core.ts +7 -0
  326. package/src/runtime/interfaces/thread-runtime-core.ts +5 -0
  327. package/src/runtime/queue/external-thread-queue-adapter.ts +14 -0
  328. package/src/runtime/queue/message-queue.ts +128 -0
  329. package/src/runtimes/external-store/external-store-adapter.ts +3 -0
  330. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +31 -2
  331. package/src/runtimes/local/local-runtime-options.ts +6 -0
  332. package/src/runtimes/local/local-thread-runtime-core.ts +70 -0
  333. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +4 -0
  334. package/src/runtimes/remote-thread-list/empty-thread-core.ts +4 -0
  335. package/src/store/clients/chain-of-thought-client.ts +24 -25
  336. package/src/store/clients/model-context-client.ts +22 -19
  337. package/src/store/clients/no-op-composer-client.ts +69 -66
  338. package/src/store/clients/runtime-adapter.ts +9 -6
  339. package/src/store/clients/suggestions.ts +41 -40
  340. package/src/store/clients/thread-message-client.ts +127 -132
  341. package/src/store/runtime-clients/attachment-runtime-client.ts +7 -3
  342. package/src/store/runtime-clients/composer-runtime-client.ts +142 -113
  343. package/src/store/runtime-clients/message-part-runtime-client.ts +16 -14
  344. package/src/store/runtime-clients/message-runtime-client.ts +124 -122
  345. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +44 -45
  346. package/src/store/runtime-clients/thread-list-runtime-client.ts +83 -80
  347. package/src/store/runtime-clients/thread-runtime-client.ts +113 -119
  348. package/src/store/runtime-clients/{tap-subscribable.ts → useSubscribable.ts} +4 -4
  349. package/src/store/scopes/queue-item.ts +2 -0
  350. package/src/tests/attachment-adapters.test.ts +86 -0
  351. package/src/tests/external-store-thread-runtime-core.test.ts +125 -0
  352. package/src/tests/message-queue.test.ts +168 -0
  353. package/src/types/message.ts +2 -0
  354. package/src/utils/composite-context-provider.ts +3 -1
  355. package/dist/react/model-context/hitl.d.ts +0 -23
  356. package/dist/react/model-context/hitl.d.ts.map +0 -1
  357. package/dist/react/model-context/hitl.js +0 -26
  358. package/dist/react/model-context/hitl.js.map +0 -1
  359. package/dist/store/runtime-clients/tap-subscribable.d.ts +0 -7
  360. package/dist/store/runtime-clients/tap-subscribable.d.ts.map +0 -1
  361. package/dist/store/runtime-clients/tap-subscribable.js +0 -16
  362. package/dist/store/runtime-clients/tap-subscribable.js.map +0 -1
@@ -1,13 +1,7 @@
1
+ import { useState, useEffect, useCallback, useRef, useMemo } from "react";
2
+ import { resource } from "@assistant-ui/tap";
1
3
  import {
2
- resource,
3
- tapState,
4
- tapEffect,
5
- tapCallback,
6
- tapRef,
7
- tapMemo,
8
- } from "@assistant-ui/tap";
9
- import {
10
- tapAssistantClientRef,
4
+ useAssistantClientRef,
11
5
  type ClientOutput,
12
6
  attachTransformScopes,
13
7
  } from "@assistant-ui/store";
@@ -24,183 +18,201 @@ import { buildInteractableModelContext } from "./interactable-model-context";
24
18
 
25
19
  const PERSISTENCE_DEBOUNCE_MS = 500;
26
20
 
27
- export const Interactables = resource((): ClientOutput<"interactables"> => {
28
- const [state, setState] = tapState<InteractablesState>(() => ({
29
- definitions: {},
30
- persistence: {},
31
- }));
32
-
33
- const clientRef = tapAssistantClientRef();
34
-
35
- const stateRef = tapRef(state);
36
- tapEffect(() => {
37
- stateRef.current = state;
38
- }, [state]);
39
-
40
- const subscribersRef = tapRef(new Set<() => void>());
41
- const partialSchemaCacheRef = tapRef(
42
- new Map<string, InteractableStateSchema>(),
43
- );
44
- const detachedStateRef = tapRef(new Map<string, unknown>());
45
-
46
- const adapterRef = tapRef<InteractablePersistenceAdapter | undefined>(
47
- undefined,
48
- );
49
- const debounceTimerRef = tapRef<ReturnType<typeof setTimeout> | undefined>(
50
- undefined,
51
- );
52
- const syncSeqRef = tapRef(0);
53
- const hasPendingLocalChangeRef = tapRef(false);
54
- const flushResolversRef = tapRef<Array<() => void>>([]);
55
- const dirtyIdsRef = tapRef(new Set<string>());
21
+ export const Interactables = resource(
22
+ function Interactables(): ClientOutput<"interactables"> {
23
+ const [state, setState] = useState<InteractablesState>(() => ({
24
+ definitions: {},
25
+ persistence: {},
26
+ }));
56
27
 
57
- const runPersistence = tapCallback(async () => {
58
- const adapter = adapterRef.current;
59
- if (!adapter) {
60
- for (const resolve of flushResolversRef.current) resolve();
61
- flushResolversRef.current = [];
62
- return;
63
- }
28
+ const clientRef = useAssistantClientRef();
64
29
 
65
- const seq = ++syncSeqRef.current;
66
- const dirtyIds = new Set(dirtyIdsRef.current);
67
- dirtyIdsRef.current.clear();
68
- hasPendingLocalChangeRef.current = true;
30
+ const stateRef = useRef(state);
31
+ useEffect(() => {
32
+ stateRef.current = state;
33
+ }, [state]);
69
34
 
70
- // Snapshot before any await so unregistered definitions are still included.
71
- const exported = stateRef.current.definitions;
72
- const payload: InteractablePersistedState = {};
73
- for (const [id, def] of Object.entries(exported)) {
74
- payload[id] = { name: def.name, state: def.state };
75
- }
35
+ const subscribersRef = useRef(new Set<() => void>());
36
+ const partialSchemaCacheRef = useRef(
37
+ new Map<string, InteractableStateSchema>(),
38
+ );
39
+ const detachedStateRef = useRef(new Map<string, unknown>());
76
40
 
77
- setState((prev) => ({
78
- ...prev,
79
- persistence: {
80
- ...prev.persistence,
81
- ...Object.fromEntries(
82
- [...dirtyIds].map((id) => [
83
- id,
84
- { isPending: true, error: undefined },
85
- ]),
86
- ),
87
- },
88
- }));
41
+ const adapterRef = useRef<InteractablePersistenceAdapter | undefined>(
42
+ undefined,
43
+ );
44
+ const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(
45
+ undefined,
46
+ );
47
+ const syncSeqRef = useRef(0);
48
+ const hasPendingLocalChangeRef = useRef(false);
49
+ const flushResolversRef = useRef<Array<() => void>>([]);
50
+ const dirtyIdsRef = useRef(new Set<string>());
89
51
 
90
- try {
91
- await adapter.save(payload);
92
- if (syncSeqRef.current === seq) {
93
- hasPendingLocalChangeRef.current = false;
94
- setState((prev) => {
95
- const persistence = { ...prev.persistence };
96
- for (const id of dirtyIds) delete persistence[id];
97
- return { ...prev, persistence };
98
- });
99
- }
100
- } catch (e) {
101
- if (syncSeqRef.current === seq) {
102
- hasPendingLocalChangeRef.current = false;
103
- setState((prev) => ({
104
- ...prev,
105
- persistence: {
106
- ...prev.persistence,
107
- ...Object.fromEntries(
108
- [...dirtyIds].map((id) => [id, { isPending: false, error: e }]),
109
- ),
110
- },
111
- }));
112
- }
113
- } finally {
114
- if (dirtyIdsRef.current.size > 0 && adapterRef.current) {
115
- runPersistence();
116
- } else {
52
+ const runPersistence = useCallback(async () => {
53
+ const adapter = adapterRef.current;
54
+ if (!adapter) {
117
55
  for (const resolve of flushResolversRef.current) resolve();
118
56
  flushResolversRef.current = [];
57
+ return;
119
58
  }
120
- }
121
- }, []);
122
59
 
123
- const schedulePersistence = tapCallback(
124
- (id: string) => {
125
- if (!adapterRef.current) return;
126
- dirtyIdsRef.current.add(id);
127
- if (debounceTimerRef.current !== undefined) {
128
- clearTimeout(debounceTimerRef.current);
60
+ const seq = ++syncSeqRef.current;
61
+ const dirtyIds = new Set(dirtyIdsRef.current);
62
+ dirtyIdsRef.current.clear();
63
+ hasPendingLocalChangeRef.current = true;
64
+
65
+ // Snapshot before any await so unregistered definitions are still included.
66
+ const exported = stateRef.current.definitions;
67
+ const payload: InteractablePersistedState = {};
68
+ for (const [id, def] of Object.entries(exported)) {
69
+ payload[id] = { name: def.name, state: def.state };
129
70
  }
130
- debounceTimerRef.current = setTimeout(() => {
131
- debounceTimerRef.current = undefined;
132
- if (!hasPendingLocalChangeRef.current) {
71
+
72
+ setState((prev) => ({
73
+ ...prev,
74
+ persistence: {
75
+ ...prev.persistence,
76
+ ...Object.fromEntries(
77
+ [...dirtyIds].map((id) => [
78
+ id,
79
+ { isPending: true, error: undefined },
80
+ ]),
81
+ ),
82
+ },
83
+ }));
84
+
85
+ try {
86
+ await adapter.save(payload);
87
+ if (syncSeqRef.current === seq) {
88
+ hasPendingLocalChangeRef.current = false;
89
+ setState((prev) => {
90
+ const persistence = { ...prev.persistence };
91
+ for (const id of dirtyIds) delete persistence[id];
92
+ return { ...prev, persistence };
93
+ });
94
+ }
95
+ } catch (e) {
96
+ if (syncSeqRef.current === seq) {
97
+ hasPendingLocalChangeRef.current = false;
98
+ setState((prev) => ({
99
+ ...prev,
100
+ persistence: {
101
+ ...prev.persistence,
102
+ ...Object.fromEntries(
103
+ [...dirtyIds].map((id) => [id, { isPending: false, error: e }]),
104
+ ),
105
+ },
106
+ }));
107
+ }
108
+ } finally {
109
+ if (dirtyIdsRef.current.size > 0 && adapterRef.current) {
133
110
  runPersistence();
134
111
  } else {
135
- debounceTimerRef.current = setTimeout(() => {
136
- debounceTimerRef.current = undefined;
137
- runPersistence();
138
- }, PERSISTENCE_DEBOUNCE_MS);
112
+ for (const resolve of flushResolversRef.current) resolve();
113
+ flushResolversRef.current = [];
114
+ }
115
+ }
116
+ }, []);
117
+
118
+ const schedulePersistence = useCallback(
119
+ (id: string) => {
120
+ if (!adapterRef.current) return;
121
+ dirtyIdsRef.current.add(id);
122
+ if (debounceTimerRef.current !== undefined) {
123
+ clearTimeout(debounceTimerRef.current);
139
124
  }
140
- }, PERSISTENCE_DEBOUNCE_MS);
141
- },
142
- [runPersistence],
143
- );
125
+ debounceTimerRef.current = setTimeout(() => {
126
+ debounceTimerRef.current = undefined;
127
+ if (!hasPendingLocalChangeRef.current) {
128
+ runPersistence();
129
+ } else {
130
+ debounceTimerRef.current = setTimeout(() => {
131
+ debounceTimerRef.current = undefined;
132
+ runPersistence();
133
+ }, PERSISTENCE_DEBOUNCE_MS);
134
+ }
135
+ }, PERSISTENCE_DEBOUNCE_MS);
136
+ },
137
+ [runPersistence],
138
+ );
144
139
 
145
- const exportState = tapCallback((): InteractablePersistedState => {
146
- const result: InteractablePersistedState = {};
147
- for (const [id, def] of Object.entries(stateRef.current.definitions)) {
148
- result[id] = { name: def.name, state: def.state };
149
- }
150
- return result;
151
- }, []);
140
+ const exportState = useCallback((): InteractablePersistedState => {
141
+ const result: InteractablePersistedState = {};
142
+ for (const [id, def] of Object.entries(stateRef.current.definitions)) {
143
+ result[id] = { name: def.name, state: def.state };
144
+ }
145
+ return result;
146
+ }, []);
152
147
 
153
- const importState = tapCallback((saved: InteractablePersistedState) => {
154
- for (const [id, entry] of Object.entries(saved)) {
155
- detachedStateRef.current.set(id, entry.state);
156
- }
157
- setState((prev) => {
158
- let changed = false;
159
- const definitions = { ...prev.definitions };
148
+ const importState = useCallback((saved: InteractablePersistedState) => {
160
149
  for (const [id, entry] of Object.entries(saved)) {
161
- if (definitions[id]) {
162
- definitions[id] = { ...definitions[id], state: entry.state };
163
- changed = true;
164
- }
150
+ detachedStateRef.current.set(id, entry.state);
165
151
  }
166
- return changed ? { ...prev, definitions } : prev;
167
- });
168
- }, []);
152
+ setState((prev) => {
153
+ let changed = false;
154
+ const definitions = { ...prev.definitions };
155
+ for (const [id, entry] of Object.entries(saved)) {
156
+ if (definitions[id]) {
157
+ definitions[id] = { ...definitions[id], state: entry.state };
158
+ changed = true;
159
+ }
160
+ }
161
+ return changed ? { ...prev, definitions } : prev;
162
+ });
163
+ }, []);
169
164
 
170
- const setPersistenceAdapter = tapCallback(
171
- (adapter: InteractablePersistenceAdapter | undefined) => {
172
- adapterRef.current = adapter;
173
- },
174
- [],
175
- );
165
+ const setPersistenceAdapter = useCallback(
166
+ (adapter: InteractablePersistenceAdapter | undefined) => {
167
+ adapterRef.current = adapter;
168
+ },
169
+ [],
170
+ );
176
171
 
177
- const flush = tapCallback(async () => {
178
- if (debounceTimerRef.current !== undefined) {
179
- clearTimeout(debounceTimerRef.current);
180
- debounceTimerRef.current = undefined;
181
- }
182
- if (!adapterRef.current) return;
183
- if (!hasPendingLocalChangeRef.current && dirtyIdsRef.current.size === 0)
184
- return;
185
- const p = new Promise<void>((resolve) => {
186
- flushResolversRef.current.push(resolve);
187
- });
188
- if (!hasPendingLocalChangeRef.current) {
189
- runPersistence();
190
- }
191
- return p;
192
- }, [runPersistence]);
172
+ const flush = useCallback(async () => {
173
+ if (debounceTimerRef.current !== undefined) {
174
+ clearTimeout(debounceTimerRef.current);
175
+ debounceTimerRef.current = undefined;
176
+ }
177
+ if (!adapterRef.current) return;
178
+ if (!hasPendingLocalChangeRef.current && dirtyIdsRef.current.size === 0)
179
+ return;
180
+ const p = new Promise<void>((resolve) => {
181
+ flushResolversRef.current.push(resolve);
182
+ });
183
+ if (!hasPendingLocalChangeRef.current) {
184
+ runPersistence();
185
+ }
186
+ return p;
187
+ }, [runPersistence]);
188
+
189
+ const flushIfPending = useCallback(() => {
190
+ if (adapterRef.current && debounceTimerRef.current !== undefined) {
191
+ clearTimeout(debounceTimerRef.current);
192
+ debounceTimerRef.current = undefined;
193
+ runPersistence();
194
+ }
195
+ }, [runPersistence]);
193
196
 
194
- const flushIfPending = tapCallback(() => {
195
- if (adapterRef.current && debounceTimerRef.current !== undefined) {
196
- clearTimeout(debounceTimerRef.current);
197
- debounceTimerRef.current = undefined;
198
- runPersistence();
199
- }
200
- }, [runPersistence]);
197
+ const setDefState = useCallback(
198
+ (id: string, updater: (prev: unknown) => unknown) => {
199
+ setState((prev) => {
200
+ const existing = prev.definitions[id];
201
+ if (!existing) return prev;
202
+ return {
203
+ ...prev,
204
+ definitions: {
205
+ ...prev.definitions,
206
+ [id]: { ...existing, state: updater(existing.state) },
207
+ },
208
+ };
209
+ });
210
+ if (stateRef.current.definitions[id]) schedulePersistence(id);
211
+ },
212
+ [schedulePersistence],
213
+ );
201
214
 
202
- const setDefState = tapCallback(
203
- (id: string, updater: (prev: unknown) => unknown) => {
215
+ const setDefSelected = useCallback((id: string, selected: boolean) => {
204
216
  setState((prev) => {
205
217
  const existing = prev.definitions[id];
206
218
  if (!existing) return prev;
@@ -208,121 +220,105 @@ export const Interactables = resource((): ClientOutput<"interactables"> => {
208
220
  ...prev,
209
221
  definitions: {
210
222
  ...prev.definitions,
211
- [id]: { ...existing, state: updater(existing.state) },
223
+ [id]: { ...existing, selected },
212
224
  },
213
225
  };
214
226
  });
215
- if (stateRef.current.definitions[id]) schedulePersistence(id);
216
- },
217
- [schedulePersistence],
218
- );
227
+ }, []);
219
228
 
220
- const setDefSelected = tapCallback((id: string, selected: boolean) => {
221
- setState((prev) => {
222
- const existing = prev.definitions[id];
223
- if (!existing) return prev;
224
- return {
225
- ...prev,
226
- definitions: {
227
- ...prev.definitions,
228
- [id]: { ...existing, selected },
229
+ const provider = useMemo(
230
+ () => ({
231
+ getModelContext: () => {
232
+ const defs = stateRef.current.definitions;
233
+ return (
234
+ buildInteractableModelContext(
235
+ defs,
236
+ partialSchemaCacheRef.current,
237
+ setDefState,
238
+ ) ?? {}
239
+ );
229
240
  },
230
- };
231
- });
232
- }, []);
233
-
234
- const provider = tapMemo(
235
- () => ({
236
- getModelContext: () => {
237
- const defs = stateRef.current.definitions;
238
- return (
239
- buildInteractableModelContext(
240
- defs,
241
- partialSchemaCacheRef.current,
242
- setDefState,
243
- ) ?? {}
244
- );
245
- },
246
- subscribe: (callback: () => void) => {
247
- subscribersRef.current.add(callback);
248
- return () => {
249
- subscribersRef.current.delete(callback);
250
- };
251
- },
252
- }),
253
- [setDefState],
254
- );
241
+ subscribe: (callback: () => void) => {
242
+ subscribersRef.current.add(callback);
243
+ return () => {
244
+ subscribersRef.current.delete(callback);
245
+ };
246
+ },
247
+ }),
248
+ [setDefState],
249
+ );
255
250
 
256
- tapEffect(() => {
257
- for (const cb of subscribersRef.current) cb();
258
- }, [state]);
251
+ useEffect(() => {
252
+ for (const cb of subscribersRef.current) cb();
253
+ }, [state]);
259
254
 
260
- tapEffect(() => {
261
- return clientRef.current!.modelContext().register(provider);
262
- }, [clientRef, provider]);
255
+ useEffect(() => {
256
+ return clientRef.current!.modelContext().register(provider);
257
+ }, [clientRef, provider]);
263
258
 
264
- const register = tapCallback(
265
- (def: InteractableRegistration) => {
266
- try {
267
- const jsonSchema = toJSONSchema(def.stateSchema);
268
- partialSchemaCacheRef.current.set(
269
- def.id,
270
- toPartialJSONSchema(jsonSchema),
271
- );
272
- } catch (e) {
273
- console.warn(
274
- `[Interactables] Failed to create partial schema for "${def.name}". The update tool will require all fields.`,
275
- e,
276
- );
277
- }
259
+ const register = useCallback(
260
+ (def: InteractableRegistration) => {
261
+ try {
262
+ const jsonSchema = toJSONSchema(def.stateSchema);
263
+ partialSchemaCacheRef.current.set(
264
+ def.id,
265
+ toPartialJSONSchema(jsonSchema),
266
+ );
267
+ } catch (e) {
268
+ console.warn(
269
+ `[Interactables] Failed to create partial schema for "${def.name}". The update tool will require all fields.`,
270
+ e,
271
+ );
272
+ }
278
273
 
279
- const detached = detachedStateRef.current.get(def.id);
280
- detachedStateRef.current.delete(def.id);
274
+ const detached = detachedStateRef.current.get(def.id);
275
+ detachedStateRef.current.delete(def.id);
281
276
 
282
- setState((prev) => ({
283
- ...prev,
284
- definitions: {
285
- ...prev.definitions,
286
- [def.id]: {
287
- id: def.id,
288
- name: def.name,
289
- description: def.description,
290
- stateSchema: def.stateSchema,
291
- state:
292
- prev.definitions[def.id]?.state ?? detached ?? def.initialState,
293
- selected: def.selected,
277
+ setState((prev) => ({
278
+ ...prev,
279
+ definitions: {
280
+ ...prev.definitions,
281
+ [def.id]: {
282
+ id: def.id,
283
+ name: def.name,
284
+ description: def.description,
285
+ stateSchema: def.stateSchema,
286
+ state:
287
+ prev.definitions[def.id]?.state ?? detached ?? def.initialState,
288
+ selected: def.selected,
289
+ },
294
290
  },
295
- },
296
- }));
291
+ }));
297
292
 
298
- return () => {
299
- flushIfPending();
300
- setState((prev) => {
301
- const existing = prev.definitions[def.id];
302
- if (existing) {
303
- detachedStateRef.current.set(def.id, existing.state);
304
- }
305
- partialSchemaCacheRef.current.delete(def.id);
306
- const { [def.id]: _, ...rest } = prev.definitions;
307
- const { [def.id]: __, ...restPersistence } = prev.persistence;
308
- return { ...prev, definitions: rest, persistence: restPersistence };
309
- });
310
- };
311
- },
312
- [flushIfPending],
313
- );
293
+ return () => {
294
+ flushIfPending();
295
+ setState((prev) => {
296
+ const existing = prev.definitions[def.id];
297
+ if (existing) {
298
+ detachedStateRef.current.set(def.id, existing.state);
299
+ }
300
+ partialSchemaCacheRef.current.delete(def.id);
301
+ const { [def.id]: _, ...rest } = prev.definitions;
302
+ const { [def.id]: __, ...restPersistence } = prev.persistence;
303
+ return { ...prev, definitions: rest, persistence: restPersistence };
304
+ });
305
+ };
306
+ },
307
+ [flushIfPending],
308
+ );
314
309
 
315
- return {
316
- getState: () => state,
317
- register,
318
- setState: setDefState,
319
- setSelected: setDefSelected,
320
- exportState,
321
- importState,
322
- setPersistenceAdapter,
323
- flush,
324
- };
325
- });
310
+ return {
311
+ getState: () => state,
312
+ register,
313
+ setState: setDefState,
314
+ setSelected: setDefSelected,
315
+ exportState,
316
+ importState,
317
+ setPersistenceAdapter,
318
+ flush,
319
+ };
320
+ },
321
+ );
326
322
 
327
323
  attachTransformScopes(Interactables, (scopes, parent) => {
328
324
  if (!scopes.modelContext && parent.modelContext.source === null) {