@assistant-ui/core 0.2.10 → 0.2.11

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,57 +1,56 @@
1
1
  import type { Unsubscribe } from "../../types/unsubscribe";
2
- import { resource, tapEffect } from "@assistant-ui/tap";
3
- import { type ClientOutput, tapAssistantEmit } from "@assistant-ui/store";
2
+ import { useEffect } from "react";
3
+ import { resource } from "@assistant-ui/tap";
4
+ import { type ClientOutput, useAssistantEmit } from "@assistant-ui/store";
4
5
  import type {
5
6
  ThreadListItemEventType,
6
7
  ThreadListItemRuntime,
7
8
  } from "../../runtime/api/thread-list-item-runtime";
8
- import { tapSubscribable } from "./tap-subscribable";
9
+ import { useSubscribable } from "./useSubscribable";
9
10
 
10
- export const ThreadListItemClient = resource(
11
- ({
12
- runtime,
13
- }: {
14
- runtime: ThreadListItemRuntime;
15
- }): ClientOutput<"threadListItem"> => {
16
- const state = tapSubscribable(runtime);
17
- const emit = tapAssistantEmit();
11
+ export const ThreadListItemClient = resource(function ThreadListItemClient({
12
+ runtime,
13
+ }: {
14
+ runtime: ThreadListItemRuntime;
15
+ }): ClientOutput<"threadListItem"> {
16
+ const state = useSubscribable(runtime);
17
+ const emit = useAssistantEmit();
18
18
 
19
- // Bind thread list item events to event manager
20
- tapEffect(() => {
21
- const unsubscribers: Unsubscribe[] = [];
19
+ // Bind thread list item events to event manager
20
+ useEffect(() => {
21
+ const unsubscribers: Unsubscribe[] = [];
22
22
 
23
- // Subscribe to thread list item events
24
- const threadListItemEvents: ThreadListItemEventType[] = [
25
- "switchedTo",
26
- "switchedAway",
27
- ];
23
+ // Subscribe to thread list item events
24
+ const threadListItemEvents: ThreadListItemEventType[] = [
25
+ "switchedTo",
26
+ "switchedAway",
27
+ ];
28
28
 
29
- for (const event of threadListItemEvents) {
30
- const unsubscribe = runtime.unstable_on(event, () => {
31
- emit(`threadListItem.${event}`, {
32
- threadId: runtime.getState()!.id,
33
- });
29
+ for (const event of threadListItemEvents) {
30
+ const unsubscribe = runtime.unstable_on(event, () => {
31
+ emit(`threadListItem.${event}`, {
32
+ threadId: runtime.getState()!.id,
34
33
  });
35
- unsubscribers.push(unsubscribe);
36
- }
34
+ });
35
+ unsubscribers.push(unsubscribe);
36
+ }
37
37
 
38
- return () => {
39
- for (const unsub of unsubscribers) unsub();
40
- };
41
- }, [runtime, emit]);
42
-
43
- return {
44
- getState: () => state,
45
- switchTo: runtime.switchTo,
46
- rename: runtime.rename,
47
- updateCustom: runtime.updateCustom,
48
- archive: runtime.archive,
49
- unarchive: runtime.unarchive,
50
- delete: runtime.delete,
51
- generateTitle: runtime.generateTitle,
52
- initialize: runtime.initialize,
53
- detach: runtime.detach,
54
- __internal_getRuntime: () => runtime,
38
+ return () => {
39
+ for (const unsub of unsubscribers) unsub();
55
40
  };
56
- },
57
- );
41
+ }, [runtime, emit]);
42
+
43
+ return {
44
+ getState: () => state,
45
+ switchTo: runtime.switchTo,
46
+ rename: runtime.rename,
47
+ updateCustom: runtime.updateCustom,
48
+ archive: runtime.archive,
49
+ unarchive: runtime.unarchive,
50
+ delete: runtime.delete,
51
+ generateTitle: runtime.generateTitle,
52
+ initialize: runtime.initialize,
53
+ detach: runtime.detach,
54
+ __internal_getRuntime: () => runtime,
55
+ };
56
+ });
@@ -1,96 +1,99 @@
1
- import { withKey, resource, tapResource, tapMemo } from "@assistant-ui/tap";
1
+ import { useMemo } from "react";
2
+ import { useResource, withKey, resource } from "@assistant-ui/tap";
2
3
  import {
3
4
  type ClientOutput,
4
- tapClientLookup,
5
- tapClientResource,
5
+ useClientLookup,
6
+ useClientResource,
6
7
  } from "@assistant-ui/store";
7
8
  import type { ThreadListRuntime } from "../../runtime/api/thread-list-runtime";
8
9
  import type { AssistantRuntime } from "../../runtime/api/assistant-runtime";
9
- import { tapSubscribable } from "./tap-subscribable";
10
+ import { useSubscribable } from "./useSubscribable";
10
11
  import { ThreadListItemClient } from "./thread-list-item-runtime-client";
11
12
  import { ThreadClient } from "./thread-runtime-client";
12
13
  import type { ThreadsState } from "../scopes/threads";
13
14
 
14
- const ThreadListItemClientById = resource(
15
- ({ runtime, id }: { runtime: ThreadListRuntime; id: string }) => {
16
- const threadListItemRuntime = tapMemo(
17
- () => runtime.getItemById(id),
18
- [runtime, id],
19
- );
20
- return tapResource(
21
- ThreadListItemClient({
22
- runtime: threadListItemRuntime,
23
- }),
24
- );
25
- },
26
- );
15
+ const ThreadListItemClientById = resource(function ThreadListItemClientById({
16
+ runtime,
17
+ id,
18
+ }: {
19
+ runtime: ThreadListRuntime;
20
+ id: string;
21
+ }) {
22
+ const threadListItemRuntime = useMemo(
23
+ () => runtime.getItemById(id),
24
+ [runtime, id],
25
+ );
26
+ return useResource(
27
+ ThreadListItemClient({
28
+ runtime: threadListItemRuntime,
29
+ }),
30
+ );
31
+ });
27
32
 
28
- export const ThreadListClient = resource(
29
- ({
30
- runtime,
31
- __internal_assistantRuntime,
32
- }: {
33
- runtime: ThreadListRuntime;
34
- __internal_assistantRuntime: AssistantRuntime;
35
- }): ClientOutput<"threads"> => {
36
- const runtimeState = tapSubscribable(runtime);
33
+ export const ThreadListClient = resource(function ThreadListClient({
34
+ runtime,
35
+ __internal_assistantRuntime,
36
+ }: {
37
+ runtime: ThreadListRuntime;
38
+ __internal_assistantRuntime: AssistantRuntime;
39
+ }): ClientOutput<"threads"> {
40
+ const runtimeState = useSubscribable(runtime);
37
41
 
38
- const main = tapClientResource(
39
- ThreadClient({
40
- runtime: runtime.main,
41
- }),
42
- );
43
- const threadItems = tapClientLookup(
44
- () =>
45
- Object.keys(runtimeState.threadItems).map((id) =>
46
- withKey(id, ThreadListItemClientById({ runtime, id })),
47
- ),
48
- [runtimeState.threadItems, runtime],
49
- );
42
+ const main = useClientResource(
43
+ ThreadClient({
44
+ runtime: runtime.main,
45
+ }),
46
+ );
47
+ const threadItems = useClientLookup(
48
+ () =>
49
+ Object.keys(runtimeState.threadItems).map((id) =>
50
+ withKey(id, ThreadListItemClientById({ runtime, id })),
51
+ ),
52
+ [runtimeState.threadItems, runtime],
53
+ );
50
54
 
51
- const state = tapMemo<ThreadsState>(() => {
52
- return {
53
- mainThreadId: runtimeState.mainThreadId,
54
- newThreadId: runtimeState.newThreadId ?? null,
55
- isLoading: runtimeState.isLoading,
56
- isLoadingMore: runtimeState.isLoadingMore,
57
- hasMore: runtimeState.hasMore,
58
- threadIds: runtimeState.threadIds,
59
- archivedThreadIds: runtimeState.archivedThreadIds,
60
- threadItems: threadItems.state,
55
+ const state = useMemo<ThreadsState>(() => {
56
+ return {
57
+ mainThreadId: runtimeState.mainThreadId,
58
+ newThreadId: runtimeState.newThreadId ?? null,
59
+ isLoading: runtimeState.isLoading,
60
+ isLoadingMore: runtimeState.isLoadingMore,
61
+ hasMore: runtimeState.hasMore,
62
+ threadIds: runtimeState.threadIds,
63
+ archivedThreadIds: runtimeState.archivedThreadIds,
64
+ threadItems: threadItems.state,
61
65
 
62
- main: main.state,
63
- };
64
- }, [runtimeState, threadItems.state, main.state]);
66
+ main: main.state,
67
+ };
68
+ }, [runtimeState, threadItems.state, main.state]);
65
69
 
66
- return {
67
- getState: () => state,
68
- thread: () => main.methods,
69
- item: (threadIdOrOptions) => {
70
- if (threadIdOrOptions === "main") {
71
- return threadItems.get({ key: state.mainThreadId });
72
- }
70
+ return {
71
+ getState: () => state,
72
+ thread: () => main.methods,
73
+ item: (threadIdOrOptions) => {
74
+ if (threadIdOrOptions === "main") {
75
+ return threadItems.get({ key: state.mainThreadId });
76
+ }
73
77
 
74
- if ("id" in threadIdOrOptions) {
75
- return threadItems.get({ key: threadIdOrOptions.id });
76
- }
78
+ if ("id" in threadIdOrOptions) {
79
+ return threadItems.get({ key: threadIdOrOptions.id });
80
+ }
77
81
 
78
- const { index, archived = false } = threadIdOrOptions;
79
- const id = archived
80
- ? state.archivedThreadIds[index]!
81
- : state.threadIds[index]!;
82
- return threadItems.get({ key: id });
83
- },
84
- switchToThread: async (threadId, options) => {
85
- await runtime.switchToThread(threadId, options);
86
- },
87
- switchToNewThread: async () => {
88
- await runtime.switchToNewThread();
89
- },
90
- getLoadThreadsPromise: () => runtime.getLoadThreadsPromise(),
91
- reload: () => runtime.reload(),
92
- loadMore: () => runtime.loadMore(),
93
- __internal_getAssistantRuntime: () => __internal_assistantRuntime,
94
- };
95
- },
96
- );
82
+ const { index, archived = false } = threadIdOrOptions;
83
+ const id = archived
84
+ ? state.archivedThreadIds[index]!
85
+ : state.threadIds[index]!;
86
+ return threadItems.get({ key: id });
87
+ },
88
+ switchToThread: async (threadId, options) => {
89
+ await runtime.switchToThread(threadId, options);
90
+ },
91
+ switchToNewThread: async () => {
92
+ await runtime.switchToNewThread();
93
+ },
94
+ getLoadThreadsPromise: () => runtime.getLoadThreadsPromise(),
95
+ reload: () => runtime.reload(),
96
+ loadMore: () => runtime.loadMore(),
97
+ __internal_getAssistantRuntime: () => __internal_assistantRuntime,
98
+ };
99
+ });
@@ -1,141 +1,135 @@
1
1
  import type { Unsubscribe } from "../../types/unsubscribe";
2
2
  import type { ThreadRuntimeEventType } from "../../runtime/interfaces/thread-runtime-core";
3
3
  import type { ThreadRuntime } from "../../runtime/api/thread-runtime";
4
- import {
5
- resource,
6
- tapResource,
7
- tapMemo,
8
- tapEffect,
9
- type tapRef,
10
- withKey,
11
- } from "@assistant-ui/tap";
4
+ import { useMemo, useEffect, RefObject } from "react";
5
+ import { useResource, resource, withKey } from "@assistant-ui/tap";
12
6
  import {
13
7
  type ClientOutput,
14
- tapAssistantEmit,
15
- tapClientLookup,
16
- tapClientResource,
8
+ useAssistantEmit,
9
+ useClientLookup,
10
+ useClientResource,
17
11
  } from "@assistant-ui/store";
18
12
  import { ComposerClient } from "./composer-runtime-client";
19
13
  import { MessageClient } from "./message-runtime-client";
20
- import { tapSubscribable } from "./tap-subscribable";
14
+ import { useSubscribable } from "./useSubscribable";
21
15
  import type { ThreadState } from "../scopes/thread";
22
16
 
23
- const MessageClientById = resource(
24
- ({
25
- runtime,
26
- id,
27
- threadIdRef,
28
- }: {
29
- runtime: ThreadRuntime;
30
- id: string;
31
- threadIdRef: tapRef.RefObject<string>;
32
- }) => {
33
- const messageRuntime = tapMemo(
34
- () => runtime.getMessageById(id),
35
- [runtime, id],
36
- );
17
+ const MessageClientById = resource(function MessageClientById({
18
+ runtime,
19
+ id,
20
+ threadIdRef,
21
+ }: {
22
+ runtime: ThreadRuntime;
23
+ id: string;
24
+ threadIdRef: RefObject<string>;
25
+ }) {
26
+ const messageRuntime = useMemo(
27
+ () => runtime.getMessageById(id),
28
+ [runtime, id],
29
+ );
37
30
 
38
- return tapResource(MessageClient({ runtime: messageRuntime, threadIdRef }));
39
- },
40
- );
31
+ return useResource(MessageClient({ runtime: messageRuntime, threadIdRef }));
32
+ });
41
33
 
42
- export const ThreadClient = resource(
43
- ({ runtime }: { runtime: ThreadRuntime }): ClientOutput<"thread"> => {
44
- const runtimeState = tapSubscribable(runtime);
45
- const emit = tapAssistantEmit();
34
+ export const ThreadClient = resource(function ThreadClient({
35
+ runtime,
36
+ }: {
37
+ runtime: ThreadRuntime;
38
+ }): ClientOutput<"thread"> {
39
+ const runtimeState = useSubscribable(runtime);
40
+ const emit = useAssistantEmit();
46
41
 
47
- tapEffect(() => {
48
- const unsubscribers: Unsubscribe[] = [];
42
+ useEffect(() => {
43
+ const unsubscribers: Unsubscribe[] = [];
49
44
 
50
- const threadEvents: ThreadRuntimeEventType[] = [
51
- "runStart",
52
- "runEnd",
53
- "initialize",
54
- "modelContextUpdate",
55
- ];
45
+ const threadEvents: ThreadRuntimeEventType[] = [
46
+ "runStart",
47
+ "runEnd",
48
+ "initialize",
49
+ "modelContextUpdate",
50
+ ];
56
51
 
57
- for (const event of threadEvents) {
58
- const unsubscribe = runtime.unstable_on(event, () => {
59
- const threadId = runtime.getState()?.threadId || "unknown";
60
- emit(`thread.${event}`, {
61
- threadId,
62
- });
52
+ for (const event of threadEvents) {
53
+ const unsubscribe = runtime.unstable_on(event, () => {
54
+ const threadId = runtime.getState()?.threadId || "unknown";
55
+ emit(`thread.${event}`, {
56
+ threadId,
63
57
  });
64
- unsubscribers.push(unsubscribe);
65
- }
66
-
67
- return () => {
68
- for (const unsub of unsubscribers) unsub();
69
- };
70
- }, [runtime, emit]);
58
+ });
59
+ unsubscribers.push(unsubscribe);
60
+ }
71
61
 
72
- const threadIdRef = tapMemo(
73
- () => ({
74
- get current() {
75
- return runtime.getState()!.threadId;
76
- },
77
- }),
78
- [runtime],
79
- );
80
-
81
- const composer = tapClientResource(
82
- ComposerClient({
83
- runtime: runtime.composer,
84
- threadIdRef,
85
- }),
86
- );
87
- const messages = tapClientLookup(
88
- () =>
89
- runtimeState.messages.map((m) =>
90
- withKey(m.id, MessageClientById({ runtime, id: m.id, threadIdRef })),
91
- ),
92
- [runtimeState.messages, runtime, threadIdRef],
93
- );
62
+ return () => {
63
+ for (const unsub of unsubscribers) unsub();
64
+ };
65
+ }, [runtime, emit]);
94
66
 
95
- const state = tapMemo<ThreadState>(() => {
96
- return {
97
- isEmpty: messages.state.length === 0 && !runtimeState.isLoading,
98
- isDisabled: runtimeState.isDisabled,
99
- isLoading: runtimeState.isLoading,
100
- isRunning: runtimeState.isRunning,
101
- capabilities: runtimeState.capabilities,
102
- state: runtimeState.state,
103
- suggestions: runtimeState.suggestions,
104
- extras: runtimeState.extras,
105
- speech: runtimeState.speech,
106
- voice: runtimeState.voice,
67
+ const threadIdRef = useMemo(
68
+ () => ({
69
+ get current() {
70
+ return runtime.getState()!.threadId;
71
+ },
72
+ }),
73
+ [runtime],
74
+ );
107
75
 
108
- composer: composer.state,
109
- messages: messages.state,
110
- };
111
- }, [runtimeState, messages, composer.state]);
76
+ const composer = useClientResource(
77
+ ComposerClient({
78
+ runtime: runtime.composer,
79
+ threadIdRef,
80
+ }),
81
+ );
82
+ const messages = useClientLookup(
83
+ () =>
84
+ runtimeState.messages.map((m) =>
85
+ withKey(m.id, MessageClientById({ runtime, id: m.id, threadIdRef })),
86
+ ),
87
+ [runtimeState.messages, runtime, threadIdRef],
88
+ );
112
89
 
90
+ const state = useMemo<ThreadState>(() => {
113
91
  return {
114
- getState: () => state,
115
- composer: () => composer.methods,
116
- append: runtime.append,
117
- startRun: runtime.startRun,
118
- resumeRun: runtime.resumeRun,
119
- cancelRun: runtime.cancelRun,
120
- getModelContext: runtime.getModelContext,
121
- export: runtime.export,
122
- import: runtime.import,
123
- reset: runtime.reset,
124
- stopSpeaking: runtime.stopSpeaking,
125
- connectVoice: runtime.connectVoice,
126
- disconnectVoice: runtime.disconnectVoice,
127
- getVoiceVolume: runtime.getVoiceVolume,
128
- subscribeVoiceVolume: runtime.subscribeVoiceVolume,
129
- muteVoice: runtime.muteVoice,
130
- unmuteVoice: runtime.unmuteVoice,
131
- message: (selector) => {
132
- if ("id" in selector) {
133
- return messages.get({ key: selector.id });
134
- } else {
135
- return messages.get(selector);
136
- }
137
- },
138
- __internal_getRuntime: () => runtime,
92
+ isEmpty: messages.state.length === 0 && !runtimeState.isLoading,
93
+ isDisabled: runtimeState.isDisabled,
94
+ isLoading: runtimeState.isLoading,
95
+ isRunning: runtimeState.isRunning,
96
+ capabilities: runtimeState.capabilities,
97
+ state: runtimeState.state,
98
+ suggestions: runtimeState.suggestions,
99
+ extras: runtimeState.extras,
100
+ speech: runtimeState.speech,
101
+ voice: runtimeState.voice,
102
+
103
+ composer: composer.state,
104
+ messages: messages.state,
139
105
  };
140
- },
141
- );
106
+ }, [runtimeState, messages, composer.state]);
107
+
108
+ return {
109
+ getState: () => state,
110
+ composer: () => composer.methods,
111
+ append: runtime.append,
112
+ startRun: runtime.startRun,
113
+ resumeRun: runtime.resumeRun,
114
+ cancelRun: runtime.cancelRun,
115
+ getModelContext: runtime.getModelContext,
116
+ export: runtime.export,
117
+ import: runtime.import,
118
+ reset: runtime.reset,
119
+ stopSpeaking: runtime.stopSpeaking,
120
+ connectVoice: runtime.connectVoice,
121
+ disconnectVoice: runtime.disconnectVoice,
122
+ getVoiceVolume: runtime.getVoiceVolume,
123
+ subscribeVoiceVolume: runtime.subscribeVoiceVolume,
124
+ muteVoice: runtime.muteVoice,
125
+ unmuteVoice: runtime.unmuteVoice,
126
+ message: (selector) => {
127
+ if ("id" in selector) {
128
+ return messages.get({ key: selector.id });
129
+ } else {
130
+ return messages.get(selector);
131
+ }
132
+ },
133
+ __internal_getRuntime: () => runtime,
134
+ };
135
+ });
@@ -1,11 +1,11 @@
1
- import { tapState, tapEffect } from "@assistant-ui/tap";
1
+ import { useState, useEffect } from "react";
2
2
  import type { SubscribableWithState } from "../../subscribable/subscribable";
3
3
 
4
- export const tapSubscribable = <T>(
4
+ export const useSubscribable = <T>(
5
5
  subscribable: Omit<SubscribableWithState<T, any>, "path">,
6
6
  ) => {
7
- const [, setState] = tapState(subscribable.getState);
8
- tapEffect(() => {
7
+ const [, setState] = useState(subscribable.getState);
8
+ useEffect(() => {
9
9
  setState(subscribable.getState());
10
10
  return subscribable.subscribe(() => {
11
11
  setState(subscribable.getState());
@@ -3,6 +3,8 @@ export type QueueItemState = {
3
3
  readonly prompt: string;
4
4
  };
5
5
 
6
+ export const EMPTY_QUEUE_ITEMS: readonly QueueItemState[] = Object.freeze([]);
7
+
6
8
  export type QueueItemMethods = {
7
9
  getState(): QueueItemState;
8
10
  steer(): void;
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import type { PendingAttachment } from "../types/attachment";
3
+ import {
4
+ type AttachmentAdapter,
5
+ SimpleImageAttachmentAdapter,
6
+ SimpleTextAttachmentAdapter,
7
+ } from "../adapters/attachment";
8
+
9
+ describe("SimpleTextAttachmentAdapter", () => {
10
+ const makeFile = (contents: string, name = "notes.md") =>
11
+ new File([contents], name, { type: "text/markdown" });
12
+
13
+ it("adds a file as a pending document attachment", async () => {
14
+ const pending = (await new SimpleTextAttachmentAdapter().add({
15
+ file: makeFile("hello"),
16
+ })) as PendingAttachment;
17
+
18
+ expect(pending).toMatchObject({
19
+ id: "notes.md",
20
+ type: "document",
21
+ name: "notes.md",
22
+ contentType: "text/markdown",
23
+ status: { type: "requires-action", reason: "composer-send" },
24
+ });
25
+ });
26
+
27
+ it("sends the file contents as a text part without FileReader", async () => {
28
+ expect(typeof FileReader).toBe("undefined");
29
+
30
+ const adapter = new SimpleTextAttachmentAdapter();
31
+ const pending = (await adapter.add({
32
+ file: makeFile("- retry with backoff\n- cap attempts at 3"),
33
+ })) as PendingAttachment;
34
+ const complete = await adapter.send(pending);
35
+
36
+ expect(complete.status).toEqual({ type: "complete" });
37
+ expect(complete.content).toEqual([
38
+ {
39
+ type: "text",
40
+ text: "<attachment name=notes.md>\n- retry with backoff\n- cap attempts at 3\n</attachment>",
41
+ },
42
+ ]);
43
+ });
44
+
45
+ it("remove resolves without error", async () => {
46
+ const adapter: AttachmentAdapter = new SimpleTextAttachmentAdapter();
47
+ const pending = (await adapter.add({
48
+ file: makeFile("hello"),
49
+ })) as PendingAttachment;
50
+ await expect(adapter.remove(pending)).resolves.toBeUndefined();
51
+ });
52
+ });
53
+
54
+ describe("SimpleImageAttachmentAdapter", () => {
55
+ const makeImage = (bytes: number[], name = "pixel.png") =>
56
+ new File([new Uint8Array(bytes)], name, { type: "image/png" });
57
+
58
+ it("adds a file as a pending image attachment", async () => {
59
+ const pending = (await new SimpleImageAttachmentAdapter().add({
60
+ file: makeImage([1, 2, 3]),
61
+ })) as PendingAttachment;
62
+
63
+ expect(pending).toMatchObject({
64
+ id: "pixel.png",
65
+ type: "image",
66
+ name: "pixel.png",
67
+ contentType: "image/png",
68
+ status: { type: "requires-action", reason: "composer-send" },
69
+ });
70
+ });
71
+
72
+ it("sends the file as a base64 data URL without FileReader", async () => {
73
+ expect(typeof FileReader).toBe("undefined");
74
+
75
+ const adapter = new SimpleImageAttachmentAdapter();
76
+ const pending = (await adapter.add({
77
+ file: makeImage([137, 80, 78, 71]),
78
+ })) as PendingAttachment;
79
+ const complete = await adapter.send(pending);
80
+
81
+ expect(complete.status).toEqual({ type: "complete" });
82
+ expect(complete.content).toEqual([
83
+ { type: "image", image: "data:image/png;base64,iVBORw==" },
84
+ ]);
85
+ });
86
+ });