@assistant-ui/core 0.2.20 → 0.2.22

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 (610) hide show
  1. package/dist/adapters/attachment.d.ts +2 -2
  2. package/dist/adapters/attachment.d.ts.map +1 -1
  3. package/dist/adapters/attachment.js +14 -7
  4. package/dist/adapters/attachment.js.map +1 -1
  5. package/dist/adapters/directive-formatter.d.ts +0 -1
  6. package/dist/adapters/directive-formatter.d.ts.map +1 -1
  7. package/dist/adapters/feedback.d.ts +0 -1
  8. package/dist/adapters/feedback.d.ts.map +1 -1
  9. package/dist/adapters/index.d.ts +2 -2
  10. package/dist/adapters/index.js +2 -1
  11. package/dist/adapters/speech.d.ts +0 -1
  12. package/dist/adapters/speech.d.ts.map +1 -1
  13. package/dist/adapters/speech.js +9 -2
  14. package/dist/adapters/speech.js.map +1 -1
  15. package/dist/adapters/suggestion.d.ts +16 -2
  16. package/dist/adapters/suggestion.d.ts.map +1 -1
  17. package/dist/adapters/suggestion.js +36 -0
  18. package/dist/adapters/suggestion.js.map +1 -0
  19. package/dist/adapters/thread-history.d.ts +2 -2
  20. package/dist/adapters/thread-history.d.ts.map +1 -1
  21. package/dist/adapters/trigger.d.ts +5 -3
  22. package/dist/adapters/trigger.d.ts.map +1 -1
  23. package/dist/adapters/voice.d.ts +0 -1
  24. package/dist/adapters/voice.d.ts.map +1 -1
  25. package/dist/adapters/voice.js +13 -5
  26. package/dist/adapters/voice.js.map +1 -1
  27. package/dist/index.d.ts +4 -3
  28. package/dist/index.js +3 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/internal/duplicate-detection.d.ts.map +1 -1
  31. package/dist/internal.d.ts +9 -1
  32. package/dist/internal.js +8 -2
  33. package/dist/model-context/frame/host.d.ts +1 -1
  34. package/dist/model-context/frame/host.d.ts.map +1 -1
  35. package/dist/model-context/frame/host.js +5 -0
  36. package/dist/model-context/frame/host.js.map +1 -1
  37. package/dist/model-context/frame/provider.d.ts +0 -1
  38. package/dist/model-context/frame/provider.d.ts.map +1 -1
  39. package/dist/model-context/frame/provider.js +1 -0
  40. package/dist/model-context/frame/provider.js.map +1 -1
  41. package/dist/model-context/frame/types.d.ts.map +1 -1
  42. package/dist/model-context/interactable-composer-metadata.d.ts +4 -2
  43. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  44. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  45. package/dist/model-context/registry-handles.d.ts +0 -1
  46. package/dist/model-context/registry-handles.d.ts.map +1 -1
  47. package/dist/model-context/registry.d.ts +0 -1
  48. package/dist/model-context/registry.d.ts.map +1 -1
  49. package/dist/model-context/tool.d.ts +23 -9
  50. package/dist/model-context/tool.d.ts.map +1 -1
  51. package/dist/model-context/tool.js +0 -25
  52. package/dist/model-context/tool.js.map +1 -1
  53. package/dist/model-context/types.d.ts +0 -1
  54. package/dist/model-context/types.d.ts.map +1 -1
  55. package/dist/react/AssistantProvider.d.ts +0 -1
  56. package/dist/react/AssistantProvider.d.ts.map +1 -1
  57. package/dist/react/AssistantProvider.js.map +1 -1
  58. package/dist/react/AssistantRuntimeProvider.d.ts +1 -6
  59. package/dist/react/AssistantRuntimeProvider.d.ts.map +1 -1
  60. package/dist/react/RuntimeAdapter.d.ts +1 -0
  61. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  62. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts +13 -2
  63. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  64. package/dist/react/adapters/LocalStorageThreadListAdapter.js +196 -54
  65. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  66. package/dist/react/adapters/TitleGenerationAdapter.d.ts +0 -1
  67. package/dist/react/adapters/TitleGenerationAdapter.d.ts.map +1 -1
  68. package/dist/react/client/DataRenderers.d.ts +0 -1
  69. package/dist/react/client/DataRenderers.d.ts.map +1 -1
  70. package/dist/react/client/Interactables.d.ts +0 -1
  71. package/dist/react/client/Interactables.d.ts.map +1 -1
  72. package/dist/react/client/Interactables.js.map +1 -1
  73. package/dist/react/client/Tools.d.ts +3 -2
  74. package/dist/react/client/Tools.d.ts.map +1 -1
  75. package/dist/react/client/interactable-model-context.d.ts +0 -1
  76. package/dist/react/client/interactable-model-context.d.ts.map +1 -1
  77. package/dist/react/index.d.ts +2 -2
  78. package/dist/react/interactables-legacy/Interactables.d.ts +0 -1
  79. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  80. package/dist/react/interactables-legacy/interactable-model-context.d.ts +0 -1
  81. package/dist/react/interactables-legacy/interactable-model-context.d.ts.map +1 -1
  82. package/dist/react/interactables-legacy/scopes.d.ts +4 -2
  83. package/dist/react/interactables-legacy/scopes.d.ts.map +1 -1
  84. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts +0 -1
  85. package/dist/react/interactables-legacy/useAssistantInteractable.d.ts.map +1 -1
  86. package/dist/react/interactables-legacy/useInteractableState.d.ts.map +1 -1
  87. package/dist/react/model-context/define-mcp-toolkit.d.ts +19 -4
  88. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -1
  89. package/dist/react/model-context/define-mcp-toolkit.js +17 -5
  90. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -1
  91. package/dist/react/model-context/define-toolkit.d.ts +1 -2
  92. package/dist/react/model-context/define-toolkit.d.ts.map +1 -1
  93. package/dist/react/model-context/external-tool.d.ts.map +1 -1
  94. package/dist/react/model-context/human-tool.d.ts.map +1 -1
  95. package/dist/react/model-context/interactableTool.d.ts +2 -2
  96. package/dist/react/model-context/interactableTool.d.ts.map +1 -1
  97. package/dist/react/model-context/makeAssistantDataUI.d.ts +2 -2
  98. package/dist/react/model-context/makeAssistantDataUI.d.ts.map +1 -1
  99. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  100. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  101. package/dist/react/model-context/makeAssistantToolUI.d.ts +2 -2
  102. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  103. package/dist/react/model-context/provider-tool.d.ts +0 -1
  104. package/dist/react/model-context/provider-tool.d.ts.map +1 -1
  105. package/dist/react/model-context/stub-tool.d.ts.map +1 -1
  106. package/dist/react/model-context/toolbox.d.ts +5 -5
  107. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  108. package/dist/react/model-context/useAssistantContext.d.ts +1 -0
  109. package/dist/react/model-context/useAssistantContext.d.ts.map +1 -1
  110. package/dist/react/model-context/useAssistantDataUI.d.ts +3 -2
  111. package/dist/react/model-context/useAssistantDataUI.d.ts.map +1 -1
  112. package/dist/react/model-context/useAssistantInstructions.d.ts +1 -0
  113. package/dist/react/model-context/useAssistantInstructions.d.ts.map +1 -1
  114. package/dist/react/model-context/useAssistantTool.d.ts +4 -2
  115. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  116. package/dist/react/model-context/useAssistantToolUI.d.ts +3 -2
  117. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  118. package/dist/react/model-context/useAuiToolOverrides.d.ts +0 -1
  119. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -1
  120. package/dist/react/model-context/useInlineRender.d.ts +0 -1
  121. package/dist/react/model-context/useInlineRender.d.ts.map +1 -1
  122. package/dist/react/model-context/useInteractable.d.ts +7 -4
  123. package/dist/react/model-context/useInteractable.d.ts.map +1 -1
  124. package/dist/react/model-context/useInteractable.js.map +1 -1
  125. package/dist/react/model-context/useInteractableState.d.ts.map +1 -1
  126. package/dist/react/model-context/useInteractableVersions.d.ts +0 -1
  127. package/dist/react/model-context/useInteractableVersions.d.ts.map +1 -1
  128. package/dist/react/model-context/useToolArgsStatus.d.ts +3 -1
  129. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  130. package/dist/react/primitive-hooks/useActionBarCopy.d.ts +1 -4
  131. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  132. package/dist/react/primitive-hooks/useActionBarCopy.js +13 -13
  133. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  134. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  135. package/dist/react/primitive-hooks/useActionBarFeedback.d.ts.map +1 -1
  136. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  137. package/dist/react/primitive-hooks/useActionBarSpeak.d.ts.map +1 -1
  138. package/dist/react/primitive-hooks/useActionBarStopSpeaking.d.ts.map +1 -1
  139. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  140. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  141. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts +0 -1
  142. package/dist/react/primitive-hooks/useComposerAddAttachment.d.ts.map +1 -1
  143. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  144. package/dist/react/primitive-hooks/useComposerDictate.d.ts.map +1 -1
  145. package/dist/react/primitive-hooks/useComposerSend.d.ts +0 -1
  146. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  147. package/dist/react/primitive-hooks/useEditComposerCancel.d.ts.map +1 -1
  148. package/dist/react/primitive-hooks/useEditComposerSend.d.ts.map +1 -1
  149. package/dist/react/primitive-hooks/useMessageBranching.d.ts.map +1 -1
  150. package/dist/react/primitive-hooks/useMessageError.d.ts.map +1 -1
  151. package/dist/react/primitive-hooks/useMessageError.js +5 -1
  152. package/dist/react/primitive-hooks/useMessageError.js.map +1 -1
  153. package/dist/react/primitive-hooks/useMessageReload.d.ts.map +1 -1
  154. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts +1 -5
  155. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  156. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  157. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  158. package/dist/react/primitive-hooks/useThreadListItemArchive.d.ts.map +1 -1
  159. package/dist/react/primitive-hooks/useThreadListItemDelete.d.ts.map +1 -1
  160. package/dist/react/primitive-hooks/useThreadListItemTrigger.d.ts.map +1 -1
  161. package/dist/react/primitive-hooks/useThreadListItemUnarchive.d.ts.map +1 -1
  162. package/dist/react/primitive-hooks/useThreadListLoadMore.d.ts.map +1 -1
  163. package/dist/react/primitive-hooks/useThreadListNew.d.ts.map +1 -1
  164. package/dist/react/primitive-hooks/useThreadMessageIds.d.ts.map +1 -1
  165. package/dist/react/primitive-hooks/useThreadMessages.d.ts +0 -1
  166. package/dist/react/primitive-hooks/useThreadMessages.d.ts.map +1 -1
  167. package/dist/react/primitive-hooks/useVoice.d.ts +0 -1
  168. package/dist/react/primitive-hooks/useVoice.d.ts.map +1 -1
  169. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts +7 -4
  170. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.d.ts.map +1 -1
  171. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js +1 -1
  172. package/dist/react/primitives/chainOfThought/ChainOfThoughtParts.js.map +1 -1
  173. package/dist/react/primitives/composer/ComposerAttachments.d.ts +4 -3
  174. package/dist/react/primitives/composer/ComposerAttachments.d.ts.map +1 -1
  175. package/dist/react/primitives/composer/ComposerAttachments.js.map +1 -1
  176. package/dist/react/primitives/composer/ComposerIf.d.ts +4 -3
  177. package/dist/react/primitives/composer/ComposerIf.d.ts.map +1 -1
  178. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -2
  179. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  180. package/dist/react/primitives/composer/ComposerQueue.js.map +1 -1
  181. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts +2 -2
  182. package/dist/react/primitives/generativeUI/GenerativeUI.d.ts.map +1 -1
  183. package/dist/react/primitives/message/MessageAttachments.d.ts +4 -3
  184. package/dist/react/primitives/message/MessageAttachments.d.ts.map +1 -1
  185. package/dist/react/primitives/message/MessageAttachments.js.map +1 -1
  186. package/dist/react/primitives/message/MessageGroupedParts.d.ts +1 -6
  187. package/dist/react/primitives/message/MessageGroupedParts.d.ts.map +1 -1
  188. package/dist/react/primitives/message/MessageGroupedParts.js.map +1 -1
  189. package/dist/react/primitives/message/MessageParts.d.ts +44 -25
  190. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  191. package/dist/react/primitives/message/MessageParts.js +48 -37
  192. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  193. package/dist/react/primitives/message/MessageQuote.d.ts +2 -2
  194. package/dist/react/primitives/message/MessageQuote.d.ts.map +1 -1
  195. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts +0 -1
  196. package/dist/react/primitives/messagePart/MessagePartInProgress.d.ts.map +1 -1
  197. package/dist/react/primitives/part/PartMessages.d.ts +2 -2
  198. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  199. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  200. package/dist/react/primitives/thread/ThreadMessages.d.ts +35 -17
  201. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  202. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  203. package/dist/react/primitives/thread/ThreadSuggestions.d.ts +6 -4
  204. package/dist/react/primitives/thread/ThreadSuggestions.d.ts.map +1 -1
  205. package/dist/react/primitives/thread/ThreadSuggestions.js.map +1 -1
  206. package/dist/react/primitives/threadList/ThreadListItems.d.ts +4 -3
  207. package/dist/react/primitives/threadList/ThreadListItems.d.ts.map +1 -1
  208. package/dist/react/primitives/threadList/ThreadListItems.js.map +1 -1
  209. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts +0 -1
  210. package/dist/react/primitives/threadListItem/ThreadListItemTitle.d.ts.map +1 -1
  211. package/dist/react/providers/AttachmentByIndexProvider.d.ts +0 -1
  212. package/dist/react/providers/AttachmentByIndexProvider.d.ts.map +1 -1
  213. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts +0 -1
  214. package/dist/react/providers/ChainOfThoughtByIndicesProvider.d.ts.map +1 -1
  215. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts +0 -1
  216. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.d.ts.map +1 -1
  217. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js +18 -30
  218. package/dist/react/providers/ChainOfThoughtPartByIndexProvider.js.map +1 -1
  219. package/dist/react/providers/MessageByIdProvider.d.ts +0 -1
  220. package/dist/react/providers/MessageByIdProvider.d.ts.map +1 -1
  221. package/dist/react/providers/MessageByIndexProvider.d.ts +0 -1
  222. package/dist/react/providers/MessageByIndexProvider.d.ts.map +1 -1
  223. package/dist/react/providers/PartByIndexProvider.d.ts +0 -1
  224. package/dist/react/providers/PartByIndexProvider.d.ts.map +1 -1
  225. package/dist/react/providers/PartByIndexProvider.js +18 -30
  226. package/dist/react/providers/PartByIndexProvider.js.map +1 -1
  227. package/dist/react/providers/QueueItemByIndexProvider.d.ts +0 -1
  228. package/dist/react/providers/QueueItemByIndexProvider.d.ts.map +1 -1
  229. package/dist/react/providers/ReadonlyThreadProvider.d.ts +0 -1
  230. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  231. package/dist/react/providers/SuggestionByIndexProvider.d.ts +0 -1
  232. package/dist/react/providers/SuggestionByIndexProvider.d.ts.map +1 -1
  233. package/dist/react/providers/TextMessagePartProvider.d.ts +0 -1
  234. package/dist/react/providers/TextMessagePartProvider.d.ts.map +1 -1
  235. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts +0 -1
  236. package/dist/react/providers/ThreadListItemByIndexProvider.d.ts.map +1 -1
  237. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts +1 -1
  238. package/dist/react/providers/ThreadListItemRuntimeProvider.d.ts.map +1 -1
  239. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -1
  240. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  241. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +2 -1
  242. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  243. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +12 -3
  244. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  245. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +70 -27
  246. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  247. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +0 -1
  248. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  249. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +0 -1
  250. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  251. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +1 -1
  252. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  253. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +1 -4
  254. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  255. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +8 -4
  256. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  257. package/dist/react/runtimes/cloud/auiV0.d.ts +12 -2
  258. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  259. package/dist/react/runtimes/cloud/auiV0.js +30 -1
  260. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  261. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts +0 -1
  262. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  263. package/dist/react/runtimes/createMessageConverter.d.ts +1 -7
  264. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  265. package/dist/react/runtimes/createRuntimeExtras.d.ts +0 -1
  266. package/dist/react/runtimes/createRuntimeExtras.d.ts.map +1 -1
  267. package/dist/react/runtimes/external-message-converter.d.ts +1 -8
  268. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  269. package/dist/react/runtimes/external-message-converter.js +43 -45
  270. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  271. package/dist/react/runtimes/useExternalStoreRuntime.d.ts +0 -1
  272. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  273. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts +0 -1
  274. package/dist/react/runtimes/useExternalStoreSharedOptions.d.ts.map +1 -1
  275. package/dist/react/runtimes/useLocalRuntime.d.ts +3 -5
  276. package/dist/react/runtimes/useLocalRuntime.d.ts.map +1 -1
  277. package/dist/react/runtimes/useLocalRuntime.js +9 -1
  278. package/dist/react/runtimes/useLocalRuntime.js.map +1 -1
  279. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts +0 -1
  280. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  281. package/dist/react/runtimes/useStreamingTiming.d.ts +0 -1
  282. package/dist/react/runtimes/useStreamingTiming.d.ts.map +1 -1
  283. package/dist/react/types/MessagePartComponentTypes.d.ts +6 -3
  284. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  285. package/dist/react/types/scopes/dataRenderers.d.ts +1 -1
  286. package/dist/react/types/scopes/dataRenderers.d.ts.map +1 -1
  287. package/dist/react/types/scopes/interactables.d.ts +4 -2
  288. package/dist/react/types/scopes/interactables.d.ts.map +1 -1
  289. package/dist/react/types/scopes/tools.d.ts +5 -3
  290. package/dist/react/types/scopes/tools.d.ts.map +1 -1
  291. package/dist/react/types/store-augmentation.d.ts +1 -2
  292. package/dist/react/types/store-augmentation.d.ts.map +1 -1
  293. package/dist/react/utils/getMessageQuote.d.ts +0 -1
  294. package/dist/react/utils/getMessageQuote.d.ts.map +1 -1
  295. package/dist/react/utils/groupParts.d.ts +2 -2
  296. package/dist/react/utils/groupParts.d.ts.map +1 -1
  297. package/dist/react/utils/useJSONEqual.d.ts.map +1 -1
  298. package/dist/runtime/api/assistant-runtime.d.ts +0 -1
  299. package/dist/runtime/api/assistant-runtime.d.ts.map +1 -1
  300. package/dist/runtime/api/attachment-runtime.d.ts +0 -1
  301. package/dist/runtime/api/attachment-runtime.d.ts.map +1 -1
  302. package/dist/runtime/api/bindings.d.ts +0 -1
  303. package/dist/runtime/api/bindings.d.ts.map +1 -1
  304. package/dist/runtime/api/composer-runtime.d.ts +6 -4
  305. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  306. package/dist/runtime/api/message-part-runtime.d.ts +0 -1
  307. package/dist/runtime/api/message-part-runtime.d.ts.map +1 -1
  308. package/dist/runtime/api/message-runtime.d.ts +6 -16
  309. package/dist/runtime/api/message-runtime.d.ts.map +1 -1
  310. package/dist/runtime/api/message-runtime.js +5 -5
  311. package/dist/runtime/api/message-runtime.js.map +1 -1
  312. package/dist/runtime/api/paths.d.ts.map +1 -1
  313. package/dist/runtime/api/thread-list-item-runtime.d.ts +0 -1
  314. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  315. package/dist/runtime/api/thread-list-item-runtime.js +2 -1
  316. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  317. package/dist/runtime/api/thread-list-runtime.d.ts +0 -1
  318. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  319. package/dist/runtime/api/thread-runtime.d.ts +3 -1
  320. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  321. package/dist/runtime/base/base-assistant-runtime-core.d.ts +0 -1
  322. package/dist/runtime/base/base-assistant-runtime-core.d.ts.map +1 -1
  323. package/dist/runtime/base/base-composer-runtime-core.d.ts +4 -2
  324. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  325. package/dist/runtime/base/base-composer-runtime-core.js +51 -10
  326. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  327. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
  328. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  329. package/dist/runtime/base/base-thread-runtime-core.js +3 -2
  330. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  331. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts +1 -5
  332. package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
  333. package/dist/runtime/base/default-edit-composer-runtime-core.js +4 -2
  334. package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
  335. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -0
  336. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  337. package/dist/runtime/base/default-thread-composer-runtime-core.js +2 -2
  338. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  339. package/dist/runtime/branch/external-thread-branch-adapter.d.ts.map +1 -1
  340. package/dist/runtime/interfaces/assistant-runtime-core.d.ts +0 -1
  341. package/dist/runtime/interfaces/assistant-runtime-core.d.ts.map +1 -1
  342. package/dist/runtime/interfaces/composer-runtime-core.d.ts +2 -2
  343. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  344. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +0 -1
  345. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  346. package/dist/runtime/interfaces/thread-runtime-core.d.ts +2 -2
  347. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  348. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +0 -1
  349. package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
  350. package/dist/runtime/queue/message-queue.d.ts +6 -4
  351. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  352. package/dist/runtime/queue/message-queue.js +1 -1
  353. package/dist/runtime/utils/auto-status.d.ts +0 -1
  354. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  355. package/dist/runtime/utils/chat-model-adapter.d.ts +0 -1
  356. package/dist/runtime/utils/chat-model-adapter.d.ts.map +1 -1
  357. package/dist/runtime/utils/external-store-message.d.ts +0 -1
  358. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  359. package/dist/runtime/utils/message-repository.d.ts +1 -5
  360. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  361. package/dist/runtime/utils/message-repository.js +3 -1
  362. package/dist/runtime/utils/message-repository.js.map +1 -1
  363. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts +0 -1
  364. package/dist/runtime/utils/resolveToolApprovalResponse.d.ts.map +1 -1
  365. package/dist/runtime/utils/streaming-timing.d.ts +5 -3
  366. package/dist/runtime/utils/streaming-timing.d.ts.map +1 -1
  367. package/dist/runtime/utils/thread-message-like.d.ts +2 -2
  368. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  369. package/dist/runtime/utils/thread-message-like.js +4 -1
  370. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  371. package/dist/runtimes/assistant-transport/utils.d.ts.map +1 -1
  372. package/dist/runtimes/external-store/external-store-adapter.d.ts +2 -2
  373. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  374. package/dist/runtimes/external-store/external-store-runtime-core.d.ts +0 -1
  375. package/dist/runtimes/external-store/external-store-runtime-core.d.ts.map +1 -1
  376. package/dist/runtimes/external-store/external-store-shared-options.d.ts +0 -1
  377. package/dist/runtimes/external-store/external-store-shared-options.d.ts.map +1 -1
  378. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +0 -1
  379. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  380. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +2 -0
  381. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  382. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +1 -1
  383. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  384. package/dist/runtimes/external-store/thread-message-converter.d.ts +0 -1
  385. package/dist/runtimes/external-store/thread-message-converter.d.ts.map +1 -1
  386. package/dist/runtimes/local/local-runtime-core.d.ts +0 -1
  387. package/dist/runtimes/local/local-runtime-core.d.ts.map +1 -1
  388. package/dist/runtimes/local/local-runtime-options.d.ts +0 -1
  389. package/dist/runtimes/local/local-runtime-options.d.ts.map +1 -1
  390. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts +0 -1
  391. package/dist/runtimes/local/local-thread-list-runtime-core.d.ts.map +1 -1
  392. package/dist/runtimes/local/local-thread-runtime-core.d.ts +5 -21
  393. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  394. package/dist/runtimes/local/local-thread-runtime-core.js +29 -17
  395. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  396. package/dist/runtimes/local/should-continue.d.ts +0 -1
  397. package/dist/runtimes/local/should-continue.d.ts.map +1 -1
  398. package/dist/runtimes/local/should-continue.js +2 -2
  399. package/dist/runtimes/local/should-continue.js.map +1 -1
  400. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +0 -1
  401. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  402. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -2
  403. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  404. package/dist/runtimes/remote-thread-list/adapter/in-memory.js +5 -3
  405. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  406. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts +0 -1
  407. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  408. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +10 -8
  409. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  410. package/dist/runtimes/remote-thread-list/optimistic-state.js +22 -9
  411. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  412. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +0 -1
  413. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  414. package/dist/runtimes/remote-thread-list/types.d.ts +1 -2
  415. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  416. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +2 -2
  417. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  418. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +1 -2
  419. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  420. package/dist/store/clients/chain-of-thought-client.d.ts +0 -1
  421. package/dist/store/clients/chain-of-thought-client.d.ts.map +1 -1
  422. package/dist/store/clients/model-context-client.d.ts +0 -1
  423. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  424. package/dist/store/clients/no-op-composer-client.d.ts +0 -1
  425. package/dist/store/clients/no-op-composer-client.d.ts.map +1 -1
  426. package/dist/store/clients/runtime-adapter.d.ts +0 -1
  427. package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
  428. package/dist/store/clients/suggestions.d.ts +0 -1
  429. package/dist/store/clients/suggestions.d.ts.map +1 -1
  430. package/dist/store/clients/thread-message-client.d.ts +0 -1
  431. package/dist/store/clients/thread-message-client.d.ts.map +1 -1
  432. package/dist/store/runtime-clients/attachment-runtime-client.d.ts +0 -1
  433. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  434. package/dist/store/runtime-clients/composer-runtime-client.d.ts +0 -1
  435. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  436. package/dist/store/runtime-clients/liveRef.d.ts.map +1 -1
  437. package/dist/store/runtime-clients/message-part-runtime-client.d.ts +0 -1
  438. package/dist/store/runtime-clients/message-part-runtime-client.d.ts.map +1 -1
  439. package/dist/store/runtime-clients/message-runtime-client.d.ts +0 -1
  440. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  441. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +0 -1
  442. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  443. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts +0 -1
  444. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  445. package/dist/store/runtime-clients/thread-runtime-client.d.ts +0 -1
  446. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  447. package/dist/store/runtime-clients/useSubscribable.d.ts +0 -1
  448. package/dist/store/runtime-clients/useSubscribable.d.ts.map +1 -1
  449. package/dist/store/scope-registration.d.ts +1 -2
  450. package/dist/store/scope-registration.d.ts.map +1 -1
  451. package/dist/store/scopes/attachment.d.ts +0 -1
  452. package/dist/store/scopes/attachment.d.ts.map +1 -1
  453. package/dist/store/scopes/chain-of-thought.d.ts +0 -1
  454. package/dist/store/scopes/chain-of-thought.d.ts.map +1 -1
  455. package/dist/store/scopes/composer.d.ts +0 -1
  456. package/dist/store/scopes/composer.d.ts.map +1 -1
  457. package/dist/store/scopes/message.d.ts +6 -4
  458. package/dist/store/scopes/message.d.ts.map +1 -1
  459. package/dist/store/scopes/model-context.d.ts +0 -1
  460. package/dist/store/scopes/model-context.d.ts.map +1 -1
  461. package/dist/store/scopes/part.d.ts +0 -1
  462. package/dist/store/scopes/part.d.ts.map +1 -1
  463. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  464. package/dist/store/scopes/suggestion.d.ts.map +1 -1
  465. package/dist/store/scopes/suggestions.d.ts +0 -1
  466. package/dist/store/scopes/suggestions.d.ts.map +1 -1
  467. package/dist/store/scopes/thread-list-item.d.ts +0 -1
  468. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  469. package/dist/store/scopes/thread.d.ts +4 -3
  470. package/dist/store/scopes/thread.d.ts.map +1 -1
  471. package/dist/store/scopes/threads.d.ts +0 -1
  472. package/dist/store/scopes/threads.d.ts.map +1 -1
  473. package/dist/subscribable/subscribable.d.ts +1 -2
  474. package/dist/subscribable/subscribable.d.ts.map +1 -1
  475. package/dist/subscribable/subscribable.js +11 -3
  476. package/dist/subscribable/subscribable.js.map +1 -1
  477. package/dist/tests/remote-thread-list-test-helpers.d.ts +2 -2
  478. package/dist/tests/remote-thread-list-test-helpers.d.ts.map +1 -1
  479. package/dist/tests/remote-thread-list-test-helpers.js +5 -2
  480. package/dist/tests/remote-thread-list-test-helpers.js.map +1 -1
  481. package/dist/types/attachment.d.ts +3 -2
  482. package/dist/types/attachment.d.ts.map +1 -1
  483. package/dist/types/attachment.js +6 -0
  484. package/dist/types/attachment.js.map +1 -0
  485. package/dist/types/directive.d.ts +3 -2
  486. package/dist/types/directive.d.ts.map +1 -1
  487. package/dist/types/error.d.ts +15 -0
  488. package/dist/types/error.d.ts.map +1 -0
  489. package/dist/types/error.js +46 -0
  490. package/dist/types/error.js.map +1 -0
  491. package/dist/types/index.d.ts +2 -2
  492. package/dist/types/message.d.ts +71 -33
  493. package/dist/types/message.d.ts.map +1 -1
  494. package/dist/types/message.js.map +1 -1
  495. package/dist/types/quote.d.ts.map +1 -1
  496. package/dist/types/trigger.d.ts +0 -1
  497. package/dist/types/trigger.d.ts.map +1 -1
  498. package/dist/types/unsubscribe.d.ts.map +1 -1
  499. package/dist/utils/composite-context-provider.d.ts +1 -0
  500. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  501. package/dist/utils/data-url.d.ts +9 -0
  502. package/dist/utils/data-url.d.ts.map +1 -0
  503. package/dist/utils/data-url.js +14 -0
  504. package/dist/utils/data-url.js.map +1 -0
  505. package/dist/utils/id.d.ts.map +1 -1
  506. package/dist/utils/json/is-json-equal.d.ts.map +1 -1
  507. package/dist/utils/json/is-json.d.ts +0 -1
  508. package/dist/utils/json/is-json.d.ts.map +1 -1
  509. package/dist/utils/json/is-json.js +1 -1
  510. package/dist/utils/json/is-json.js.map +1 -1
  511. package/dist/utils/json/stable-stringify-tool-args.d.ts +7 -0
  512. package/dist/utils/json/stable-stringify-tool-args.d.ts.map +1 -0
  513. package/dist/utils/json/stable-stringify-tool-args.js +32 -0
  514. package/dist/utils/json/stable-stringify-tool-args.js.map +1 -0
  515. package/dist/utils/notify-event-listeners.d.ts +6 -0
  516. package/dist/utils/notify-event-listeners.d.ts.map +1 -0
  517. package/dist/utils/notify-event-listeners.js +16 -0
  518. package/dist/utils/notify-event-listeners.js.map +1 -0
  519. package/dist/utils/text.d.ts +0 -1
  520. package/dist/utils/text.d.ts.map +1 -1
  521. package/package.json +14 -10
  522. package/src/adapters/attachment.test.ts +107 -0
  523. package/src/adapters/attachment.ts +20 -10
  524. package/src/adapters/index.ts +6 -1
  525. package/src/adapters/speech.test.ts +88 -0
  526. package/src/adapters/speech.ts +17 -2
  527. package/src/adapters/suggestion.test.ts +187 -0
  528. package/src/adapters/suggestion.ts +75 -1
  529. package/src/adapters/voice.test.ts +130 -0
  530. package/src/adapters/voice.ts +26 -6
  531. package/src/index.ts +15 -1
  532. package/src/internal.ts +21 -0
  533. package/src/model-context/frame/host.test.ts +100 -0
  534. package/src/model-context/frame/host.ts +10 -0
  535. package/src/model-context/frame/provider.test.ts +83 -0
  536. package/src/model-context/frame/provider.ts +1 -0
  537. package/src/model-context/tool.test.ts +110 -0
  538. package/src/model-context/tool.ts +31 -9
  539. package/src/react/adapters/LocalStorageThreadListAdapter.test.ts +304 -0
  540. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +307 -60
  541. package/src/react/index.ts +2 -0
  542. package/src/react/model-context/define-mcp-toolkit.ts +39 -6
  543. package/src/react/model-context/define-toolkit.test.ts +107 -0
  544. package/src/react/primitive-hooks/useActionBarCopy.test.ts +79 -0
  545. package/src/react/primitive-hooks/useActionBarCopy.ts +4 -3
  546. package/src/react/primitive-hooks/useMessageError.test.ts +64 -0
  547. package/src/react/primitive-hooks/useMessageError.ts +19 -6
  548. package/src/react/primitives/chainOfThought/ChainOfThoughtParts.tsx +1 -3
  549. package/src/react/primitives/message/MessageParts.tsx +48 -35
  550. package/src/react/providers/ChainOfThoughtPartByIndexProvider.tsx +19 -2
  551. package/src/react/providers/PartByIndexProvider.tsx +16 -2
  552. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +18 -0
  553. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +4 -1
  554. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +96 -26
  555. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +69 -0
  556. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +1 -1
  557. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.test.ts +127 -0
  558. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +15 -4
  559. package/src/react/runtimes/cloud/auiV0.ts +71 -2
  560. package/src/react/runtimes/external-message-converter.test.tsx +123 -0
  561. package/src/react/runtimes/external-message-converter.ts +36 -11
  562. package/src/react/runtimes/useLocalRuntime.test.tsx +56 -0
  563. package/src/react/runtimes/useLocalRuntime.ts +13 -1
  564. package/src/runtime/api/message-runtime.test.ts +81 -0
  565. package/src/runtime/api/message-runtime.ts +4 -6
  566. package/src/runtime/api/thread-list-item-runtime.ts +6 -1
  567. package/src/runtime/base/base-composer-runtime-core.ts +95 -30
  568. package/src/runtime/base/base-thread-runtime-core.ts +2 -1
  569. package/src/runtime/base/default-edit-composer-runtime-core.ts +4 -2
  570. package/src/runtime/base/default-thread-composer-runtime-core.ts +2 -2
  571. package/src/runtime/utils/message-repository.ts +8 -3
  572. package/src/runtime/utils/thread-message-like.ts +3 -0
  573. package/src/runtimes/local/local-thread-runtime-core.test.ts +276 -3
  574. package/src/runtimes/local/local-thread-runtime-core.ts +29 -25
  575. package/src/runtimes/local/should-continue.ts +5 -2
  576. package/src/runtimes/remote-thread-list/adapter/in-memory.test.ts +14 -0
  577. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +13 -5
  578. package/src/runtimes/remote-thread-list/optimistic-state.test.ts +63 -0
  579. package/src/runtimes/remote-thread-list/optimistic-state.ts +49 -17
  580. package/src/runtimes/remote-thread-list/types.ts +1 -1
  581. package/src/runtimes/tool-invocations/EDGE_CASES.md +13 -19
  582. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +127 -6
  583. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +4 -2
  584. package/src/subscribable/subscribable.test.ts +58 -0
  585. package/src/subscribable/subscribable.ts +13 -3
  586. package/src/tests/MessageRepository.test.ts +26 -0
  587. package/src/tests/OptimisticState-list-race.test.ts +33 -0
  588. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +42 -0
  589. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-order.test.ts +223 -0
  590. package/src/tests/attachment-adapters.test.ts +14 -2
  591. package/src/tests/auiV0Encode.test.ts +134 -1
  592. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +123 -5
  593. package/src/tests/base-composer-runtime-core-send.test.ts +573 -0
  594. package/src/tests/default-edit-composer-runtime-core.test.ts +43 -5
  595. package/src/tests/event-subscription-listener-errors.test.ts +205 -0
  596. package/src/tests/remote-thread-list-test-helpers.ts +14 -7
  597. package/src/tests/thread-message-like.test.ts +97 -0
  598. package/src/types/attachment.ts +6 -0
  599. package/src/types/error.test.ts +122 -0
  600. package/src/types/error.ts +74 -0
  601. package/src/types/index.ts +1 -0
  602. package/src/types/message.ts +12 -3
  603. package/src/utils/data-url.test.ts +50 -0
  604. package/src/utils/data-url.ts +9 -0
  605. package/src/utils/json/is-json-equal.test.ts +84 -0
  606. package/src/utils/json/is-json.test.ts +123 -0
  607. package/src/utils/json/is-json.ts +1 -1
  608. package/src/utils/json/stable-stringify-tool-args.test.ts +105 -0
  609. package/src/utils/json/stable-stringify-tool-args.ts +70 -0
  610. package/src/utils/notify-event-listeners.ts +30 -0
@@ -8,6 +8,7 @@ import type {
8
8
  RemoteThreadMetadata,
9
9
  ThreadHistoryAdapter,
10
10
  ThreadMessage,
11
+ RunConfig,
11
12
  } from "../../index";
12
13
  import type {
13
14
  ExportedMessageRepository,
@@ -22,6 +23,37 @@ export type AsyncStorageLike = {
22
23
  removeItem(key: string): Promise<void>;
23
24
  };
24
25
 
26
+ class KeyedMutationQueue {
27
+ private readonly tails = new Map<string, Promise<void>>();
28
+
29
+ run<T>(key: string, mutation: () => Promise<T>): Promise<T> {
30
+ const previous = this.tails.get(key);
31
+ const result = previous ? previous.then(mutation) : mutation();
32
+ const tail = result.then(
33
+ () => undefined,
34
+ () => undefined,
35
+ );
36
+
37
+ this.tails.set(key, tail);
38
+ void tail.then(() => {
39
+ if (this.tails.get(key) === tail) this.tails.delete(key);
40
+ });
41
+
42
+ return result;
43
+ }
44
+ }
45
+
46
+ const mutationQueues = new WeakMap<AsyncStorageLike, KeyedMutationQueue>();
47
+
48
+ const getMutationQueue = (storage: AsyncStorageLike): KeyedMutationQueue => {
49
+ let queue = mutationQueues.get(storage);
50
+ if (!queue) {
51
+ queue = new KeyedMutationQueue();
52
+ mutationQueues.set(storage, queue);
53
+ }
54
+ return queue;
55
+ };
56
+
25
57
  type LocalStorageAdapterOptions = {
26
58
  storage: AsyncStorageLike;
27
59
  prefix?: string | undefined;
@@ -36,11 +68,218 @@ type StoredThreadMetadata = {
36
68
  custom?: Record<string, unknown> | undefined;
37
69
  };
38
70
 
71
+ type StoredSystemMessage = Extract<ThreadMessage, { role: "system" }>;
72
+ type StoredUserMessage = Extract<ThreadMessage, { role: "user" }>;
73
+ type StoredAssistantMessage = Extract<ThreadMessage, { role: "assistant" }>;
74
+
75
+ const isRecord = (value: unknown): value is Record<string, unknown> =>
76
+ typeof value === "object" && value !== null && !Array.isArray(value);
77
+
78
+ const parseJSON = (raw: string | null): unknown => {
79
+ if (!raw) return undefined;
80
+ try {
81
+ return JSON.parse(raw) as unknown;
82
+ } catch {
83
+ return undefined;
84
+ }
85
+ };
86
+
87
+ const parseStoredThread = (value: unknown): StoredThreadMetadata | null => {
88
+ if (!isRecord(value) || typeof value.remoteId !== "string") return null;
89
+
90
+ const status = value.status ?? "regular";
91
+ if (status !== "regular" && status !== "archived") return null;
92
+
93
+ return {
94
+ remoteId: value.remoteId,
95
+ status,
96
+ ...(typeof value.externalId === "string"
97
+ ? { externalId: value.externalId }
98
+ : undefined),
99
+ ...(typeof value.title === "string" ? { title: value.title } : undefined),
100
+ ...(isRecord(value.custom) ? { custom: value.custom } : undefined),
101
+ };
102
+ };
103
+
104
+ const parseDate = (value: unknown): Date | null => {
105
+ if (value instanceof Date && !Number.isNaN(value.getTime())) return value;
106
+ if (typeof value !== "string" && typeof value !== "number") return null;
107
+
108
+ const date = new Date(value);
109
+ return Number.isNaN(date.getTime()) ? null : date;
110
+ };
111
+
112
+ const isMessageRole = (value: unknown): value is ThreadMessage["role"] =>
113
+ value === "system" || value === "user" || value === "assistant";
114
+
115
+ const parseStoredThreadMessage = (value: unknown): ThreadMessage | null => {
116
+ if (!isRecord(value) || typeof value.id !== "string") return null;
117
+ if (!isMessageRole(value.role)) return null;
118
+ if (!Array.isArray(value.content)) return null;
119
+
120
+ const createdAt = parseDate(value.createdAt);
121
+ if (!createdAt) return null;
122
+
123
+ const metadata = value.metadata;
124
+ if (!isRecord(metadata) || !isRecord(metadata.custom)) return null;
125
+
126
+ if (value.role === "assistant") {
127
+ const status = value.status;
128
+ if (!isRecord(status) || typeof status.type !== "string") return null;
129
+
130
+ const submittedFeedback = isRecord(metadata.submittedFeedback)
131
+ ? metadata.submittedFeedback
132
+ : undefined;
133
+ const submittedFeedbackType = submittedFeedback?.type;
134
+
135
+ return {
136
+ id: value.id,
137
+ role: "assistant",
138
+ content: value.content as StoredAssistantMessage["content"],
139
+ status: status as StoredAssistantMessage["status"],
140
+ createdAt,
141
+ metadata: {
142
+ unstable_state: (metadata.unstable_state ??
143
+ null) as StoredAssistantMessage["metadata"]["unstable_state"],
144
+ unstable_annotations: Array.isArray(metadata.unstable_annotations)
145
+ ? (metadata.unstable_annotations as StoredAssistantMessage["metadata"]["unstable_annotations"])
146
+ : [],
147
+ unstable_data: Array.isArray(metadata.unstable_data)
148
+ ? (metadata.unstable_data as StoredAssistantMessage["metadata"]["unstable_data"])
149
+ : [],
150
+ steps: Array.isArray(metadata.steps)
151
+ ? (metadata.steps as StoredAssistantMessage["metadata"]["steps"])
152
+ : [],
153
+ ...(submittedFeedbackType === "positive" ||
154
+ submittedFeedbackType === "negative"
155
+ ? {
156
+ submittedFeedback: {
157
+ type: submittedFeedbackType,
158
+ },
159
+ }
160
+ : undefined),
161
+ ...(metadata.timing !== undefined
162
+ ? {
163
+ timing: metadata.timing as NonNullable<
164
+ StoredAssistantMessage["metadata"]["timing"]
165
+ >,
166
+ }
167
+ : undefined),
168
+ ...(metadata.isOptimistic === true
169
+ ? { isOptimistic: true }
170
+ : undefined),
171
+ custom: metadata.custom,
172
+ },
173
+ };
174
+ }
175
+
176
+ if (value.role === "user") {
177
+ return {
178
+ id: value.id,
179
+ role: "user",
180
+ content: value.content as StoredUserMessage["content"],
181
+ attachments: Array.isArray(value.attachments)
182
+ ? (value.attachments as StoredUserMessage["attachments"])
183
+ : [],
184
+ createdAt,
185
+ metadata: {
186
+ custom: metadata.custom,
187
+ },
188
+ };
189
+ }
190
+
191
+ if (value.content.length !== 1) return null;
192
+
193
+ return {
194
+ id: value.id,
195
+ role: "system",
196
+ content: [value.content[0] as StoredSystemMessage["content"][0]],
197
+ createdAt,
198
+ metadata: {
199
+ custom: metadata.custom,
200
+ },
201
+ };
202
+ };
203
+
204
+ export const parseStoredThreadMetadata = (
205
+ raw: string | null,
206
+ ): StoredThreadMetadata[] => {
207
+ const parsed = parseJSON(raw);
208
+ if (!Array.isArray(parsed)) return [];
209
+
210
+ return parsed.flatMap((item) => {
211
+ const thread = parseStoredThread(item);
212
+ return thread ? [thread] : [];
213
+ });
214
+ };
215
+
216
+ const parseStoredMessageRepositoryItem = (
217
+ value: unknown,
218
+ ): ExportedMessageRepositoryItem | null => {
219
+ if (!isRecord(value)) return null;
220
+
221
+ const message = parseStoredThreadMessage(value.message);
222
+ if (!message) return null;
223
+
224
+ const parentId = value.parentId;
225
+ if (
226
+ parentId !== undefined &&
227
+ parentId !== null &&
228
+ typeof parentId !== "string"
229
+ ) {
230
+ return null;
231
+ }
232
+
233
+ return {
234
+ message,
235
+ parentId: parentId ?? null,
236
+ ...(isRecord(value.runConfig)
237
+ ? { runConfig: value.runConfig as RunConfig }
238
+ : undefined),
239
+ };
240
+ };
241
+
242
+ export const parseStoredMessageRepository = (
243
+ raw: string | null,
244
+ ): ExportedMessageRepository => {
245
+ const parsed = parseJSON(raw);
246
+ if (!isRecord(parsed) || !Array.isArray(parsed.messages)) {
247
+ return { messages: [] };
248
+ }
249
+
250
+ const candidateMessages = parsed.messages.flatMap((item) => {
251
+ const parsedItem = parseStoredMessageRepositoryItem(item);
252
+ return parsedItem ? [parsedItem] : [];
253
+ });
254
+
255
+ const acceptedIds = new Set<string>();
256
+ const messages = candidateMessages.flatMap((item) => {
257
+ if (acceptedIds.has(item.message.id)) return [];
258
+ if (item.parentId !== null && !acceptedIds.has(item.parentId)) return [];
259
+
260
+ acceptedIds.add(item.message.id);
261
+ return [item];
262
+ });
263
+
264
+ const headId =
265
+ parsed.headId === null ||
266
+ (typeof parsed.headId === "string" &&
267
+ messages.some((item) => item.message.id === parsed.headId))
268
+ ? parsed.headId
269
+ : undefined;
270
+
271
+ return {
272
+ ...(headId !== undefined ? { headId } : undefined),
273
+ messages,
274
+ };
275
+ };
276
+
39
277
  class AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {
40
278
  constructor(
41
279
  private storage: AsyncStorageLike,
42
280
  private aui: ReturnType<typeof useAui>,
43
281
  private prefix: string,
282
+ private mutationQueue: KeyedMutationQueue,
44
283
  ) {}
45
284
 
46
285
  private _messagesKey(remoteId: string) {
@@ -52,41 +291,41 @@ class AsyncStorageHistoryAdapter implements ThreadHistoryAdapter {
52
291
  if (!remoteId) return { messages: [] };
53
292
 
54
293
  const raw = await this.storage.getItem(this._messagesKey(remoteId));
55
- if (!raw) return { messages: [] };
56
- return JSON.parse(raw) as ExportedMessageRepository;
294
+ return parseStoredMessageRepository(raw);
57
295
  }
58
296
 
59
297
  async append(item: ExportedMessageRepositoryItem): Promise<void> {
60
298
  const { remoteId } = await this.aui.threadListItem().initialize();
61
299
 
62
300
  const key = this._messagesKey(remoteId);
63
- const raw = await this.storage.getItem(key);
64
- const repo: ExportedMessageRepository = raw
65
- ? (JSON.parse(raw) as ExportedMessageRepository)
66
- : { messages: [] };
301
+ await this.mutationQueue.run(key, async () => {
302
+ const raw = await this.storage.getItem(key);
303
+ const repo = parseStoredMessageRepository(raw);
304
+
305
+ const idx = repo.messages.findIndex(
306
+ (m) => m.message.id === item.message.id,
307
+ );
308
+ if (idx >= 0) {
309
+ repo.messages[idx] = item;
310
+ } else {
311
+ repo.messages.push(item);
312
+ }
313
+ repo.headId = item.message.id;
67
314
 
68
- const idx = repo.messages.findIndex(
69
- (m) => m.message.id === item.message.id,
70
- );
71
- if (idx >= 0) {
72
- repo.messages[idx] = item;
73
- } else {
74
- repo.messages.push(item);
75
- }
76
- repo.headId = item.message.id;
77
-
78
- await this.storage.setItem(key, JSON.stringify(repo));
315
+ await this.storage.setItem(key, JSON.stringify(repo));
316
+ });
79
317
  }
80
318
  }
81
319
 
82
320
  const createHistoryProvider = (
83
321
  storage: AsyncStorageLike,
84
322
  prefix: string,
323
+ mutationQueue: KeyedMutationQueue,
85
324
  ): FC<PropsWithChildren> => {
86
325
  const Provider: FC<PropsWithChildren> = ({ children }) => {
87
326
  const aui = useAui();
88
327
  const history = useMemo(
89
- () => new AsyncStorageHistoryAdapter(storage, aui, prefix),
328
+ () => new AsyncStorageHistoryAdapter(storage, aui, prefix, mutationQueue),
90
329
  [aui],
91
330
  );
92
331
  const adapters = useMemo(() => ({ history }), [history]);
@@ -107,10 +346,11 @@ export const createLocalStorageAdapter = (
107
346
 
108
347
  const threadsKey = `${prefix}threads`;
109
348
  const messagesKey = (threadId: string) => `${prefix}messages:${threadId}`;
349
+ const mutationQueue = getMutationQueue(storage);
110
350
 
111
351
  const loadThreadMetadata = async (): Promise<StoredThreadMetadata[]> => {
112
352
  const raw = await storage.getItem(threadsKey);
113
- return raw ? (JSON.parse(raw) as StoredThreadMetadata[]) : [];
353
+ return parseStoredThreadMetadata(raw);
114
354
  };
115
355
 
116
356
  const saveThreadMetadata = async (
@@ -119,8 +359,22 @@ export const createLocalStorageAdapter = (
119
359
  await storage.setItem(threadsKey, JSON.stringify(threads));
120
360
  };
121
361
 
362
+ const updateThreadMetadata = async (
363
+ remoteId: string,
364
+ update: (thread: StoredThreadMetadata) => void,
365
+ ): Promise<void> => {
366
+ await mutationQueue.run(threadsKey, async () => {
367
+ const threads = await loadThreadMetadata();
368
+ const thread = threads.find((item) => item.remoteId === remoteId);
369
+ if (thread) {
370
+ update(thread);
371
+ await saveThreadMetadata(threads);
372
+ }
373
+ });
374
+ };
375
+
122
376
  const adapter: RemoteThreadListAdapter = {
123
- unstable_Provider: createHistoryProvider(storage, prefix),
377
+ unstable_Provider: createHistoryProvider(storage, prefix, mutationQueue),
124
378
 
125
379
  async list(): Promise<RemoteThreadListResponse> {
126
380
  const threads = await loadThreadMetadata();
@@ -139,70 +393,66 @@ export const createLocalStorageAdapter = (
139
393
  threadId: string,
140
394
  ): Promise<RemoteThreadInitializeResponse> {
141
395
  const remoteId = threadId;
142
- const threads = await loadThreadMetadata();
396
+ return mutationQueue.run(threadsKey, async () => {
397
+ const threads = await loadThreadMetadata();
143
398
 
144
- // Only add if not already present
145
- if (!threads.some((t) => t.remoteId === remoteId)) {
146
- threads.unshift({
147
- remoteId,
148
- status: "regular",
149
- });
150
- await saveThreadMetadata(threads);
151
- }
399
+ // Only add if not already present
400
+ if (!threads.some((t) => t.remoteId === remoteId)) {
401
+ threads.unshift({
402
+ remoteId,
403
+ status: "regular",
404
+ });
405
+ await saveThreadMetadata(threads);
406
+ }
152
407
 
153
- return { remoteId, externalId: undefined };
408
+ return { remoteId, externalId: undefined };
409
+ });
154
410
  },
155
411
 
156
412
  async rename(remoteId: string, newTitle: string): Promise<void> {
157
- const threads = await loadThreadMetadata();
158
- const thread = threads.find((t) => t.remoteId === remoteId);
159
- if (thread) {
413
+ await updateThreadMetadata(remoteId, (thread) => {
160
414
  thread.title = newTitle;
161
- await saveThreadMetadata(threads);
162
- }
415
+ });
163
416
  },
164
417
 
165
418
  async updateCustom(
166
419
  remoteId: string,
167
420
  custom: Record<string, unknown> | undefined,
168
421
  ): Promise<void> {
169
- const threads = await loadThreadMetadata();
170
- const thread = threads.find((t) => t.remoteId === remoteId);
171
- if (thread) {
422
+ await updateThreadMetadata(remoteId, (thread) => {
172
423
  thread.custom = custom;
173
- await saveThreadMetadata(threads);
174
- }
424
+ });
175
425
  },
176
426
 
177
427
  async archive(remoteId: string): Promise<void> {
178
- const threads = await loadThreadMetadata();
179
- const thread = threads.find((t) => t.remoteId === remoteId);
180
- if (thread) {
428
+ await updateThreadMetadata(remoteId, (thread) => {
181
429
  thread.status = "archived";
182
- await saveThreadMetadata(threads);
183
- }
430
+ });
184
431
  },
185
432
 
186
433
  async unarchive(remoteId: string): Promise<void> {
187
- const threads = await loadThreadMetadata();
188
- const thread = threads.find((t) => t.remoteId === remoteId);
189
- if (thread) {
434
+ await updateThreadMetadata(remoteId, (thread) => {
190
435
  thread.status = "regular";
191
- await saveThreadMetadata(threads);
192
- }
436
+ });
193
437
  },
194
438
 
195
439
  async delete(remoteId: string): Promise<void> {
196
- const threads = await loadThreadMetadata();
197
- const filtered = threads.filter((t) => t.remoteId !== remoteId);
198
- await saveThreadMetadata(filtered);
199
- await storage.removeItem(messagesKey(remoteId));
440
+ await mutationQueue.run(threadsKey, async () => {
441
+ const threads = await loadThreadMetadata();
442
+ const filtered = threads.filter((t) => t.remoteId !== remoteId);
443
+ await saveThreadMetadata(filtered);
444
+ });
445
+ const key = messagesKey(remoteId);
446
+ await mutationQueue.run(key, () => storage.removeItem(key));
200
447
  },
201
448
 
202
449
  async fetch(threadId: string): Promise<RemoteThreadMetadata> {
203
450
  const threads = await loadThreadMetadata();
204
451
  const thread = threads.find((t) => t.remoteId === threadId);
205
- if (!thread) throw new Error("Thread not found");
452
+ if (!thread)
453
+ throw new Error(
454
+ `Stored thread "${threadId}" not found while fetching thread metadata.`,
455
+ );
206
456
  return {
207
457
  remoteId: thread.remoteId,
208
458
  externalId: thread.externalId,
@@ -220,12 +470,9 @@ export const createLocalStorageAdapter = (
220
470
  const title = await titleGenerator.generateTitle(messages);
221
471
 
222
472
  // Update the stored title
223
- const threads = await loadThreadMetadata();
224
- const thread = threads.find((t) => t.remoteId === remoteId);
225
- if (thread) {
473
+ await updateThreadMetadata(remoteId, (thread) => {
226
474
  thread.title = title;
227
- await saveThreadMetadata(threads);
228
- }
475
+ });
229
476
 
230
477
  // Return a stream with a single text part
231
478
  return createAssistantStream((controller) => {
@@ -50,7 +50,9 @@ export {
50
50
  } from "./model-context/provider-tool";
51
51
  export {
52
52
  defineMcpToolkit,
53
+ type McpToolkitEntry,
53
54
  type McpToolkitDefinition,
55
+ type McpToolkitToolConfig,
54
56
  } from "./model-context/define-mcp-toolkit";
55
57
  /**
56
58
  * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.
@@ -1,16 +1,49 @@
1
1
  import type { McpServerConfig } from "assistant-stream";
2
2
  import type { Toolkit } from "./toolbox";
3
3
 
4
- export type McpToolkitDefinition = Record<string, McpServerConfig>;
4
+ export type McpToolkitEntry =
5
+ | McpServerConfig
6
+ | {
7
+ server: McpServerConfig;
8
+ disabled?: boolean | undefined;
9
+ /**
10
+ * Prefix applied to every tool name exposed by this MCP server. Useful
11
+ * when multiple servers publish the same tool name, such as `search`.
12
+ */
13
+ prefix?: string | undefined;
14
+ tools?: Record<string, McpToolkitToolConfig> | undefined;
15
+ };
16
+
17
+ export type McpToolkitToolConfig = {
18
+ disabled?: boolean | undefined;
19
+ };
20
+
21
+ export type McpToolkitDefinition = Record<string, McpToolkitEntry>;
5
22
 
6
23
  /**
7
- * Defines MCP server tools as a spreadable toolkit fragment.
24
+ * Defines MCP server tools as a spreadable toolkit fragment. Pass a raw
25
+ * `McpServerConfig` for always-on servers, or `{ server, disabled, tools }`
26
+ * when a server should stay configured but not expose all tools for the current
27
+ * request.
8
28
  */
9
29
  export function defineMcpToolkit(definition: McpToolkitDefinition): Toolkit {
10
30
  return Object.fromEntries(
11
- Object.entries(definition).map(([name, server]) => [
12
- name,
13
- { type: "mcp", server },
14
- ]),
31
+ Object.entries(definition).map(([name, entry]) => {
32
+ const server = "server" in entry ? entry.server : entry;
33
+ const disabled = "server" in entry ? entry.disabled : undefined;
34
+ const prefix = "server" in entry ? entry.prefix : undefined;
35
+ const tools = "server" in entry ? entry.tools : undefined;
36
+
37
+ return [
38
+ name,
39
+ {
40
+ type: "mcp",
41
+ server,
42
+ ...(disabled !== undefined && { disabled }),
43
+ ...(prefix !== undefined && { prefix }),
44
+ ...(tools !== undefined && { tools }),
45
+ },
46
+ ];
47
+ }),
15
48
  ) as Toolkit;
16
49
  }
@@ -1,5 +1,6 @@
1
1
  import { describe, it, expect, expectTypeOf } from "vitest";
2
2
  import type { AsyncIterableStream } from "assistant-stream/utils";
3
+ import { defineMcpToolkit } from "./define-mcp-toolkit";
3
4
  import { defineToolkit } from "./define-toolkit";
4
5
  import { hitl, hitlTool, humanTool } from "./human-tool";
5
6
  import { providerTool } from "./provider-tool";
@@ -74,12 +75,118 @@ const checkToolkitDefinitionTypes = () => {
74
75
  };
75
76
  expectTypeOf(checkToolkitDefinitionTypes).toEqualTypeOf<() => void>();
76
77
 
78
+ const checkDefineMcpToolkitTypes = () => {
79
+ defineMcpToolkit({
80
+ docs: {
81
+ type: "http",
82
+ url: "https://example.com/mcp",
83
+ },
84
+ prefixedDocs: {
85
+ server: {
86
+ type: "http",
87
+ url: "https://example.com/prefixed-mcp",
88
+ },
89
+ disabled: true,
90
+ prefix: "docs_",
91
+ },
92
+ gatedDocs: {
93
+ server: {
94
+ type: "http",
95
+ url: "https://example.com/gated-mcp",
96
+ },
97
+ disabled: true,
98
+ tools: {
99
+ privateSearch: {
100
+ disabled: true,
101
+ },
102
+ },
103
+ },
104
+ });
105
+ };
106
+ expectTypeOf(checkDefineMcpToolkitTypes).toEqualTypeOf<() => void>();
107
+
77
108
  describe("use-generative markers", () => {
78
109
  it("defineToolkit returns the toolkit at runtime", () => {
79
110
  const toolkit = {};
80
111
  expect(defineToolkit(toolkit)).toBe(toolkit);
81
112
  });
82
113
 
114
+ it("defineMcpToolkit supports prefixed and disabled MCP entries", () => {
115
+ expect(
116
+ defineMcpToolkit({
117
+ docs: {
118
+ server: { type: "http", url: "https://example.com/mcp" },
119
+ disabled: true,
120
+ prefix: "docs_",
121
+ },
122
+ }),
123
+ ).toEqual({
124
+ docs: {
125
+ type: "mcp",
126
+ server: { type: "http", url: "https://example.com/mcp" },
127
+ disabled: true,
128
+ prefix: "docs_",
129
+ },
130
+ });
131
+ });
132
+
133
+ it("defineMcpToolkit supports disabled server entries", () => {
134
+ expect(
135
+ defineMcpToolkit({
136
+ docs: {
137
+ type: "http",
138
+ url: "https://example.com/mcp",
139
+ },
140
+ gatedDocs: {
141
+ server: {
142
+ type: "http",
143
+ url: "https://example.com/gated-mcp",
144
+ },
145
+ disabled: true,
146
+ tools: {
147
+ privateSearch: {
148
+ disabled: true,
149
+ },
150
+ },
151
+ },
152
+ }),
153
+ ).toEqual({
154
+ docs: {
155
+ type: "mcp",
156
+ server: {
157
+ type: "http",
158
+ url: "https://example.com/mcp",
159
+ },
160
+ },
161
+ gatedDocs: {
162
+ type: "mcp",
163
+ server: {
164
+ type: "http",
165
+ url: "https://example.com/gated-mcp",
166
+ },
167
+ disabled: true,
168
+ tools: {
169
+ privateSearch: {
170
+ disabled: true,
171
+ },
172
+ },
173
+ },
174
+ });
175
+ });
176
+
177
+ it("defineMcpToolkit supports raw MCP server configs", () => {
178
+ expect(
179
+ defineMcpToolkit({
180
+ docs: { type: "http", url: "https://example.com/mcp" },
181
+ }),
182
+ ).toEqual({
183
+ docs: {
184
+ type: "mcp",
185
+ server: { type: "http", url: "https://example.com/mcp" },
186
+ },
187
+ });
188
+ });
189
+
83
190
  it("humanTool throws at runtime — it must be stripped by the compiler, never called", () => {
84
191
  expect(() => humanTool()).toThrow(/no runtime implementation/);
85
192
  });