@assistant-ui/core 0.3.13 → 0.3.15

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 (463) hide show
  1. package/dist/adapters/speech.d.ts.map +1 -1
  2. package/dist/adapters/speech.js +9 -15
  3. package/dist/adapters/speech.js.map +1 -1
  4. package/dist/adapters/thread-history.d.ts +2 -0
  5. package/dist/adapters/thread-history.d.ts.map +1 -1
  6. package/dist/adapters/voice.d.ts.map +1 -1
  7. package/dist/adapters/voice.js +38 -15
  8. package/dist/adapters/voice.js.map +1 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/internal.d.ts +3 -2
  13. package/dist/internal.js +8 -7
  14. package/dist/model-context/frame/host.d.ts +1 -1
  15. package/dist/model-context/frame/host.d.ts.map +1 -1
  16. package/dist/model-context/frame/host.js +19 -4
  17. package/dist/model-context/frame/host.js.map +1 -1
  18. package/dist/model-context/frame/provider.d.ts +4 -0
  19. package/dist/model-context/frame/provider.d.ts.map +1 -1
  20. package/dist/model-context/frame/provider.js +50 -3
  21. package/dist/model-context/frame/provider.js.map +1 -1
  22. package/dist/model-context/frame/types.d.ts +4 -1
  23. package/dist/model-context/frame/types.d.ts.map +1 -1
  24. package/dist/model-context/frame/types.js.map +1 -1
  25. package/dist/model-context/registry.d.ts.map +1 -1
  26. package/dist/model-context/registry.js +16 -4
  27. package/dist/model-context/registry.js.map +1 -1
  28. package/dist/react/RuntimeAdapter.d.ts +8 -1
  29. package/dist/react/RuntimeAdapter.d.ts.map +1 -1
  30. package/dist/react/RuntimeAdapter.js +23 -18
  31. package/dist/react/RuntimeAdapter.js.map +1 -1
  32. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  33. package/dist/react/adapters/LocalStorageThreadListAdapter.js +28 -12
  34. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  35. package/dist/react/client/AdaptedRemoteThread.d.ts +11 -0
  36. package/dist/react/client/AdaptedRemoteThread.d.ts.map +1 -0
  37. package/dist/react/client/AdaptedRemoteThread.js +27 -0
  38. package/dist/react/client/AdaptedRemoteThread.js.map +1 -0
  39. package/dist/react/client/InMemoryThreadList.d.ts +19 -0
  40. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -0
  41. package/dist/react/client/InMemoryThreadList.js +418 -0
  42. package/dist/react/client/InMemoryThreadList.js.map +1 -0
  43. package/dist/react/client/Interactables.d.ts.map +1 -1
  44. package/dist/react/client/Interactables.js +159 -102
  45. package/dist/react/client/Interactables.js.map +1 -1
  46. package/dist/react/client/RemoteThreadList.d.ts +34 -0
  47. package/dist/react/client/RemoteThreadList.d.ts.map +1 -0
  48. package/dist/react/client/RemoteThreadList.js +898 -0
  49. package/dist/react/client/RemoteThreadList.js.map +1 -0
  50. package/dist/react/client/Tools.d.ts.map +1 -1
  51. package/dist/react/client/Tools.js +38 -27
  52. package/dist/react/client/Tools.js.map +1 -1
  53. package/dist/react/index.d.ts +7 -2
  54. package/dist/react/index.js +5 -2
  55. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  56. package/dist/react/interactables-legacy/Interactables.js +145 -110
  57. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  58. package/dist/react/primitive-hooks/useActionBarCopy.d.ts.map +1 -1
  59. package/dist/react/primitive-hooks/useActionBarCopy.js +20 -19
  60. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  61. package/dist/react/primitive-hooks/useActionBarEdit.d.ts.map +1 -1
  62. package/dist/react/primitive-hooks/useActionBarEdit.js +2 -4
  63. package/dist/react/primitive-hooks/useActionBarEdit.js.map +1 -1
  64. package/dist/react/primitive-hooks/useActionBarReload.d.ts.map +1 -1
  65. package/dist/react/primitive-hooks/useActionBarReload.js +2 -4
  66. package/dist/react/primitive-hooks/useActionBarReload.js.map +1 -1
  67. package/dist/react/primitive-hooks/useBranchPickerNext.d.ts.map +1 -1
  68. package/dist/react/primitive-hooks/useBranchPickerNext.js +2 -6
  69. package/dist/react/primitive-hooks/useBranchPickerNext.js.map +1 -1
  70. package/dist/react/primitive-hooks/useBranchPickerPrevious.d.ts.map +1 -1
  71. package/dist/react/primitive-hooks/useBranchPickerPrevious.js +2 -6
  72. package/dist/react/primitive-hooks/useBranchPickerPrevious.js.map +1 -1
  73. package/dist/react/primitive-hooks/useComposerCancel.d.ts.map +1 -1
  74. package/dist/react/primitive-hooks/useComposerCancel.js +2 -4
  75. package/dist/react/primitive-hooks/useComposerCancel.js.map +1 -1
  76. package/dist/react/primitive-hooks/useComposerSend.d.ts.map +1 -1
  77. package/dist/react/primitive-hooks/useComposerSend.js +2 -4
  78. package/dist/react/primitive-hooks/useComposerSend.js.map +1 -1
  79. package/dist/react/primitive-hooks/useSuggestionTrigger.d.ts.map +1 -1
  80. package/dist/react/primitive-hooks/useSuggestionTrigger.js +6 -2
  81. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  82. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +3 -0
  83. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  84. package/dist/react/primitive-hooks/useThreadIsEmpty.js +3 -0
  85. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  86. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +3 -0
  87. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  88. package/dist/react/primitive-hooks/useThreadIsRunning.js +3 -0
  89. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  90. package/dist/react/primitives/message/MessageParts.d.ts +13 -0
  91. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  92. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  93. package/dist/react/primitives/thread/ThreadMessages.d.ts.map +1 -1
  94. package/dist/react/primitives/thread/ThreadMessages.js +1 -1
  95. package/dist/react/primitives/thread/ThreadMessages.js.map +1 -1
  96. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +24 -10
  97. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  98. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +115 -71
  99. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  100. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +14 -2
  101. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  102. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +232 -63
  103. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  104. package/dist/react/runtimes/RemoteThreadResource.d.ts +30 -0
  105. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -0
  106. package/dist/react/runtimes/RemoteThreadResource.js +136 -0
  107. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -0
  108. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts +3 -10
  109. package/dist/react/runtimes/RuntimeAdapterProvider.d.ts.map +1 -1
  110. package/dist/react/runtimes/RuntimeAdapterProvider.js +3 -6
  111. package/dist/react/runtimes/RuntimeAdapterProvider.js.map +1 -1
  112. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts +17 -0
  113. package/dist/react/runtimes/assistant-transport/commandQueue.d.ts.map +1 -0
  114. package/dist/react/runtimes/assistant-transport/commandQueue.js +55 -0
  115. package/dist/react/runtimes/assistant-transport/commandQueue.js.map +1 -0
  116. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts +11 -0
  117. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.d.ts.map +1 -0
  118. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js +165 -0
  119. package/dist/react/runtimes/assistant-transport/replayBoundaryStream.js.map +1 -0
  120. package/dist/react/runtimes/assistant-transport/runManager.d.ts +15 -0
  121. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -0
  122. package/dist/react/runtimes/assistant-transport/runManager.js +86 -0
  123. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -0
  124. package/dist/react/runtimes/assistant-transport/types.d.ts +130 -0
  125. package/dist/react/runtimes/assistant-transport/types.d.ts.map +1 -0
  126. package/dist/react/runtimes/assistant-transport/types.js +0 -0
  127. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts +14 -0
  128. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -0
  129. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +296 -0
  130. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -0
  131. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts +7 -0
  132. package/dist/react/runtimes/assistant-transport/useConvertedState.d.ts.map +1 -0
  133. package/dist/react/runtimes/assistant-transport/useConvertedState.js +25 -0
  134. package/dist/react/runtimes/assistant-transport/useConvertedState.js.map +1 -0
  135. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts +7 -0
  136. package/dist/react/runtimes/assistant-transport/useLatestRef.d.ts.map +1 -0
  137. package/dist/react/runtimes/assistant-transport/useLatestRef.js +27 -0
  138. package/dist/react/runtimes/assistant-transport/useLatestRef.js.map +1 -0
  139. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  140. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +39 -13
  141. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  142. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts +2 -1
  143. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.d.ts.map +1 -1
  144. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js +3 -3
  145. package/dist/react/runtimes/cloud/CloudFileAttachmentAdapter.js.map +1 -1
  146. package/dist/react/runtimes/cloud/auiV0.d.ts +4 -0
  147. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  148. package/dist/react/runtimes/cloud/auiV0.js +7 -0
  149. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  150. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  151. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +60 -17
  152. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  153. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts +16 -0
  154. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.d.ts.map +1 -0
  155. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js +36 -0
  156. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -0
  157. package/dist/react/runtimes/external-message-converter.js +14 -14
  158. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  159. package/dist/react/runtimes/useExternalStoreRuntime.d.ts.map +1 -1
  160. package/dist/react/runtimes/useExternalStoreRuntime.js +44 -28
  161. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  162. package/dist/react/runtimes/useExternalStoreSharedOptions.js.map +1 -1
  163. package/dist/react/runtimes/useLocalRuntime.js +1 -1
  164. package/dist/react/runtimes/useRuntimeAdapters.d.ts +9 -0
  165. package/dist/react/runtimes/useRuntimeAdapters.d.ts.map +1 -0
  166. package/dist/react/runtimes/useRuntimeAdapters.js +20 -0
  167. package/dist/react/runtimes/useRuntimeAdapters.js.map +1 -0
  168. package/dist/runtime/api/composer-runtime.d.ts +5 -0
  169. package/dist/runtime/api/composer-runtime.d.ts.map +1 -1
  170. package/dist/runtime/api/composer-runtime.js.map +1 -1
  171. package/dist/runtime/api/message-runtime.js +1 -1
  172. package/dist/runtime/api/thread-list-runtime.d.ts +1 -0
  173. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  174. package/dist/runtime/api/thread-list-runtime.js +4 -2
  175. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  176. package/dist/runtime/api/thread-runtime.d.ts +12 -2
  177. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  178. package/dist/runtime/api/thread-runtime.js +8 -2
  179. package/dist/runtime/api/thread-runtime.js.map +1 -1
  180. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  181. package/dist/runtime/base/base-composer-runtime-core.js +8 -7
  182. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  183. package/dist/runtime/base/base-thread-runtime-core.d.ts +1 -0
  184. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  185. package/dist/runtime/base/base-thread-runtime-core.js +3 -3
  186. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  187. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +0 -1
  188. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  189. package/dist/runtime/base/default-thread-composer-runtime-core.js +10 -4
  190. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  191. package/dist/runtime/interfaces/thread-runtime-core.d.ts +6 -0
  192. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  193. package/dist/runtime/internal.js +5 -5
  194. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  195. package/dist/runtime/queue/message-queue.js +2 -1
  196. package/dist/runtime/queue/message-queue.js.map +1 -1
  197. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  198. package/dist/runtime/utils/message-repository.js +27 -18
  199. package/dist/runtime/utils/message-repository.js.map +1 -1
  200. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts +8 -0
  201. package/dist/runtime/utils/thread-runtime-lifecycle.d.ts.map +1 -0
  202. package/dist/runtime/utils/thread-runtime-lifecycle.js +11 -0
  203. package/dist/runtime/utils/thread-runtime-lifecycle.js.map +1 -0
  204. package/dist/runtimes/external-store/external-store-shared-options.js.map +1 -1
  205. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  206. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -1
  207. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  208. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +8 -0
  209. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  210. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +37 -13
  211. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  212. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +102 -0
  213. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -0
  214. package/dist/runtimes/inert/InertThreadRuntimeCore.js +156 -0
  215. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -0
  216. package/dist/runtimes/internal.d.ts +1 -1
  217. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -0
  218. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  219. package/dist/runtimes/local/local-thread-runtime-core.js +78 -19
  220. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  221. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +12 -59
  222. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  223. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +10 -142
  224. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  225. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +9 -0
  226. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -0
  227. package/dist/runtimes/remote-thread-list/adapter-changed.js +13 -0
  228. package/dist/runtimes/remote-thread-list/adapter-changed.js.map +1 -0
  229. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  230. package/dist/runtimes/remote-thread-list/empty-thread-core.js +16 -152
  231. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  232. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +2 -0
  233. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  234. package/dist/runtimes/remote-thread-list/optimistic-state.js +11 -0
  235. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  236. package/dist/runtimes/remote-thread-list/types.d.ts +32 -1
  237. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  238. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts +1 -12
  239. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  240. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +67 -38
  241. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  242. package/dist/store/clients/external-thread.js +1 -1
  243. package/dist/store/clients/external-thread.js.map +1 -1
  244. package/dist/store/clients/suggestions.js +2 -2
  245. package/dist/store/clients/suggestions.js.map +1 -1
  246. package/dist/store/clients/thread-selection-events.d.ts +10 -0
  247. package/dist/store/clients/thread-selection-events.d.ts.map +1 -0
  248. package/dist/store/clients/thread-selection-events.js +40 -0
  249. package/dist/store/clients/thread-selection-events.js.map +1 -0
  250. package/dist/store/env.d.ts +5 -0
  251. package/dist/store/env.d.ts.map +1 -0
  252. package/dist/store/env.js +12 -0
  253. package/dist/store/env.js.map +1 -0
  254. package/dist/store/index.d.ts +5 -3
  255. package/dist/store/index.js +4 -2
  256. package/dist/store/internal.d.ts +4 -1
  257. package/dist/store/internal.js +4 -1
  258. package/dist/store/primitive-predicates.d.ts +19 -0
  259. package/dist/store/primitive-predicates.d.ts.map +1 -0
  260. package/dist/store/primitive-predicates.js +19 -0
  261. package/dist/store/primitive-predicates.js.map +1 -0
  262. package/dist/store/runtime-clients/attachment-runtime-client.d.ts.map +1 -1
  263. package/dist/store/runtime-clients/attachment-runtime-client.js +18 -11
  264. package/dist/store/runtime-clients/attachment-runtime-client.js.map +1 -1
  265. package/dist/store/runtime-clients/handle-runtime-action.d.ts +5 -0
  266. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -0
  267. package/dist/store/runtime-clients/handle-runtime-action.js +14 -0
  268. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -0
  269. package/dist/store/runtime-clients/handle-thread-list-action.d.ts +5 -0
  270. package/dist/store/runtime-clients/handle-thread-list-action.d.ts.map +1 -0
  271. package/dist/store/runtime-clients/handle-thread-list-action.js +7 -0
  272. package/dist/store/runtime-clients/handle-thread-list-action.js.map +1 -0
  273. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  274. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +62 -29
  275. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  276. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  277. package/dist/store/runtime-clients/thread-list-runtime-client.js +5 -6
  278. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  279. package/dist/store/scopes/composer.d.ts +9 -4
  280. package/dist/store/scopes/composer.d.ts.map +1 -1
  281. package/dist/store/scopes/thread-list-item.d.ts +7 -6
  282. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  283. package/dist/store/scopes/thread.d.ts +8 -7
  284. package/dist/store/scopes/thread.d.ts.map +1 -1
  285. package/dist/store/scopes/threads.d.ts +17 -1
  286. package/dist/store/scopes/threads.d.ts.map +1 -1
  287. package/dist/subscribable/subscribable.d.ts +2 -1
  288. package/dist/subscribable/subscribable.d.ts.map +1 -1
  289. package/dist/subscribable/subscribable.js +23 -18
  290. package/dist/subscribable/subscribable.js.map +1 -1
  291. package/dist/types/message.d.ts +1 -1
  292. package/dist/types/message.js.map +1 -1
  293. package/dist/utils/composite-context-provider.d.ts +1 -0
  294. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  295. package/dist/utils/composite-context-provider.js +25 -9
  296. package/dist/utils/composite-context-provider.js.map +1 -1
  297. package/dist/utils/notify-event-listeners.d.ts +2 -2
  298. package/dist/utils/notify-event-listeners.d.ts.map +1 -1
  299. package/dist/utils/notify-event-listeners.js +2 -2
  300. package/dist/utils/notify-event-listeners.js.map +1 -1
  301. package/dist/utils/silent-runtime-action.d.ts +6 -0
  302. package/dist/utils/silent-runtime-action.d.ts.map +1 -0
  303. package/dist/utils/silent-runtime-action.js +7 -0
  304. package/dist/utils/silent-runtime-action.js.map +1 -0
  305. package/package.json +8 -8
  306. package/src/adapters/speech.test.ts +118 -1
  307. package/src/adapters/speech.ts +21 -22
  308. package/src/adapters/thread-history.ts +2 -0
  309. package/src/adapters/voice.test.ts +134 -0
  310. package/src/adapters/voice.ts +35 -27
  311. package/src/index.ts +1 -0
  312. package/src/internal.ts +1 -0
  313. package/src/model-context/frame/host.test.ts +87 -5
  314. package/src/model-context/frame/host.ts +18 -4
  315. package/src/model-context/frame/provider.test.ts +347 -20
  316. package/src/model-context/frame/provider.ts +58 -2
  317. package/src/model-context/frame/types.ts +5 -0
  318. package/src/model-context/registry.test.ts +131 -0
  319. package/src/model-context/registry.ts +16 -6
  320. package/src/react/RuntimeAdapter.test.ts +2 -0
  321. package/src/react/RuntimeAdapter.ts +20 -8
  322. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +34 -17
  323. package/src/react/client/AdaptedRemoteThread.ts +41 -0
  324. package/src/react/client/InMemoryThreadList.test.tsx +148 -0
  325. package/src/react/client/InMemoryThreadList.ts +290 -0
  326. package/src/react/client/Interactables.test.ts +326 -2
  327. package/src/react/client/Interactables.ts +227 -110
  328. package/src/react/client/RemoteThreadList.test.ts +1222 -0
  329. package/src/react/client/RemoteThreadList.ts +1136 -0
  330. package/src/react/client/Tools.ts +36 -29
  331. package/src/react/index.ts +13 -0
  332. package/src/react/interactables-legacy/Interactables.test.ts +317 -0
  333. package/src/react/interactables-legacy/Interactables.ts +204 -128
  334. package/src/react/primitive-hooks/useActionBarCopy.test.ts +15 -0
  335. package/src/react/primitive-hooks/useActionBarCopy.ts +15 -10
  336. package/src/react/primitive-hooks/useActionBarEdit.ts +2 -1
  337. package/src/react/primitive-hooks/useActionBarReload.ts +2 -6
  338. package/src/react/primitive-hooks/useBranchPickerNext.ts +2 -7
  339. package/src/react/primitive-hooks/useBranchPickerPrevious.ts +2 -7
  340. package/src/react/primitive-hooks/useComposerCancel.ts +2 -1
  341. package/src/react/primitive-hooks/useComposerSend.ts +2 -5
  342. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +11 -0
  343. package/src/react/primitive-hooks/useSuggestionTrigger.ts +4 -5
  344. package/src/react/primitive-hooks/useThreadIsEmpty.ts +3 -0
  345. package/src/react/primitive-hooks/useThreadIsRunning.ts +3 -0
  346. package/src/react/primitives/message/MessageParts.tsx +0 -1
  347. package/src/react/primitives/thread/ThreadMessages.tsx +2 -1
  348. package/src/react/runtimes/RemoteThreadListHookInstanceManager.retry.test.tsx +116 -0
  349. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +1 -1
  350. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +57 -6
  351. package/src/react/runtimes/RemoteThreadListHookInstanceManager.title.test.tsx +272 -0
  352. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +171 -124
  353. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.republish.test.ts +87 -0
  354. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +327 -83
  355. package/src/react/runtimes/RemoteThreadResource.test.ts +141 -0
  356. package/src/react/runtimes/RemoteThreadResource.ts +233 -0
  357. package/src/react/runtimes/RuntimeAdapterProvider.tsx +8 -20
  358. package/src/react/runtimes/assistant-transport/commandQueue.ts +68 -0
  359. package/src/react/runtimes/assistant-transport/replayBoundaryStream.test.ts +455 -0
  360. package/src/react/runtimes/assistant-transport/replayBoundaryStream.ts +172 -0
  361. package/src/react/runtimes/assistant-transport/runManager.ts +124 -0
  362. package/src/react/runtimes/assistant-transport/transport-delivery.test.tsx +79 -0
  363. package/src/react/runtimes/assistant-transport/transport-parentid.test.tsx +97 -0
  364. package/src/react/runtimes/assistant-transport/transport-scheduling.test.ts +414 -0
  365. package/src/react/runtimes/assistant-transport/types.ts +170 -0
  366. package/src/react/runtimes/assistant-transport/useAssistantTransport.spec.md +141 -0
  367. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +683 -0
  368. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +483 -0
  369. package/src/react/runtimes/assistant-transport/useConvertedState.ts +20 -0
  370. package/src/react/runtimes/assistant-transport/useLatestRef.ts +9 -0
  371. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +131 -6
  372. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +61 -15
  373. package/src/react/runtimes/cloud/CloudFileAttachmentAdapter.ts +6 -4
  374. package/src/react/runtimes/cloud/auiV0.ts +17 -1
  375. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +98 -3
  376. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +104 -27
  377. package/src/react/runtimes/cloud/useCloudThreadListRuntime.test.tsx +56 -0
  378. package/src/react/runtimes/cloud/useCloudThreadListRuntime.ts +31 -0
  379. package/src/react/runtimes/external-message-converter.test.ts +143 -0
  380. package/src/react/runtimes/external-message-converter.ts +41 -41
  381. package/src/react/runtimes/remote-thread-hook-on-tap.test.ts +58 -0
  382. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +83 -0
  383. package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +13 -3
  384. package/src/react/runtimes/useExternalStoreRuntime.ts +7 -0
  385. package/src/react/runtimes/useExternalStoreSharedOptions.ts +3 -1
  386. package/src/react/runtimes/useLocalRuntime.test.tsx +134 -8
  387. package/src/react/runtimes/useRuntimeAdapters.test.tsx +62 -0
  388. package/src/react/runtimes/useRuntimeAdapters.ts +28 -0
  389. package/src/runtime/api/composer-runtime.ts +5 -0
  390. package/src/runtime/api/thread-list-runtime.ts +3 -1
  391. package/src/runtime/api/thread-runtime.ts +20 -2
  392. package/src/runtime/base/base-composer-runtime-core.ts +6 -5
  393. package/src/runtime/base/base-thread-runtime-core.test.ts +191 -0
  394. package/src/runtime/base/base-thread-runtime-core.ts +11 -2
  395. package/src/runtime/base/default-thread-composer-runtime-core.ts +12 -4
  396. package/src/runtime/interfaces/thread-runtime-core.ts +6 -0
  397. package/src/runtime/queue/message-queue.ts +2 -1
  398. package/src/runtime/utils/message-repository.ts +26 -18
  399. package/src/runtime/utils/thread-runtime-lifecycle.ts +18 -0
  400. package/src/runtimes/external-store/external-store-shared-options.ts +3 -1
  401. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +4 -1
  402. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +103 -34
  403. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +253 -0
  404. package/src/runtimes/inert/InertThreadRuntimeCore.ts +232 -0
  405. package/src/runtimes/local/local-thread-runtime-core.test.ts +692 -4
  406. package/src/runtimes/local/local-thread-runtime-core.ts +117 -22
  407. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +17 -205
  408. package/src/runtimes/remote-thread-list/adapter-changed.ts +10 -0
  409. package/src/runtimes/remote-thread-list/empty-thread-core.ts +28 -217
  410. package/src/runtimes/remote-thread-list/optimistic-state.test.ts +18 -0
  411. package/src/runtimes/remote-thread-list/optimistic-state.ts +13 -0
  412. package/src/runtimes/remote-thread-list/types.ts +34 -0
  413. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -6
  414. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +243 -0
  415. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +127 -61
  416. package/src/store/clients/external-thread.ts +1 -1
  417. package/src/store/clients/model-context-client.test.ts +16 -8
  418. package/src/store/clients/suggestions.ts +2 -2
  419. package/src/store/clients/thread-selection-events.ts +21 -0
  420. package/src/store/env.ts +11 -0
  421. package/src/store/index.ts +14 -1
  422. package/src/store/internal.ts +13 -0
  423. package/src/store/primitive-predicates.test.ts +184 -0
  424. package/src/store/primitive-predicates.ts +43 -0
  425. package/src/store/runtime-clients/attachment-runtime-client.test.ts +41 -0
  426. package/src/store/runtime-clients/attachment-runtime-client.ts +2 -1
  427. package/src/store/runtime-clients/handle-runtime-action.test.ts +40 -0
  428. package/src/store/runtime-clients/handle-runtime-action.ts +14 -0
  429. package/src/store/runtime-clients/handle-thread-list-action.test.ts +69 -0
  430. package/src/store/runtime-clients/handle-thread-list-action.ts +6 -0
  431. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +15 -7
  432. package/src/store/runtime-clients/thread-list-runtime-client.ts +9 -6
  433. package/src/store/scopes/composer.ts +9 -4
  434. package/src/store/scopes/thread-list-item.ts +7 -6
  435. package/src/store/scopes/thread.ts +8 -7
  436. package/src/store/scopes/threads.ts +14 -0
  437. package/src/subscribable/subscribable.test.ts +77 -1
  438. package/src/subscribable/subscribable.ts +38 -23
  439. package/src/tests/MessageRepository.test.ts +48 -0
  440. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +2 -2
  441. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +8 -6
  442. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-unarchive.test.ts +25 -0
  443. package/src/tests/auiV0Encode.test.ts +66 -0
  444. package/src/tests/base-composer-runtime-core-send.test.ts +30 -0
  445. package/src/tests/base-composer-runtime-core.test.ts +28 -0
  446. package/src/tests/composer-can-cancel.test.ts +101 -0
  447. package/src/tests/empty-thread-core.test.ts +6 -0
  448. package/src/tests/external-store-thread-list-runtime-core.test.ts +101 -0
  449. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +211 -1
  450. package/src/tests/external-store-thread-runtime-core.test.ts +124 -0
  451. package/src/tests/external-thread-isEmpty.test.tsx +100 -0
  452. package/src/tests/interactables-toolui-migration.test.tsx +66 -0
  453. package/src/tests/message-queue.test.ts +28 -0
  454. package/src/tests/remote-thread-list-adapter-switch.test.ts +383 -0
  455. package/src/tests/session-reset-notification.test.ts +145 -0
  456. package/src/tests/thread-switch-events.test.tsx +99 -1
  457. package/src/tests/tools-scope-migration.test.tsx +58 -0
  458. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +67 -0
  459. package/src/types/message.ts +1 -1
  460. package/src/utils/composite-context-provider.test.ts +139 -0
  461. package/src/utils/composite-context-provider.ts +26 -8
  462. package/src/utils/notify-event-listeners.ts +10 -5
  463. package/src/utils/silent-runtime-action.ts +6 -0
@@ -1,3 +1,5 @@
1
+ import { notifySubscribers } from "../../subscribable/subscribable.js";
2
+ import { generateId } from "../../utils/id.js";
1
3
  import { FRAME_MESSAGE_CHANNEL } from "./types.js";
2
4
  //#region src/model-context/frame/host.ts
3
5
  /**
@@ -26,7 +28,6 @@ var AssistantFrameHost = class {
26
28
  _context = {};
27
29
  _subscribers = /* @__PURE__ */ new Set();
28
30
  _pendingRequests = /* @__PURE__ */ new Map();
29
- _requestCounter = 0;
30
31
  _iframeWindow;
31
32
  _targetOrigin;
32
33
  _disposed = false;
@@ -71,7 +72,7 @@ var AssistantFrameHost = class {
71
72
  callTool(toolName, args, abortSignal) {
72
73
  return this.sendRequest({
73
74
  type: "tool-call",
74
- id: `tool-${this._requestCounter++}`,
75
+ id: `tool-${generateId()}`,
75
76
  toolName,
76
77
  args
77
78
  }, 3e4, `Tool call "${toolName}" timed out`, abortSignal);
@@ -85,6 +86,7 @@ var AssistantFrameHost = class {
85
86
  if (!abortSignal) return;
86
87
  const pending = this._pendingRequests.get(message.id);
87
88
  if (pending) {
89
+ this.cancelToolCall(message.id);
88
90
  pending.reject(getAbortReason(abortSignal));
89
91
  this._pendingRequests.delete(message.id);
90
92
  }
@@ -106,6 +108,7 @@ var AssistantFrameHost = class {
106
108
  timeoutId = setTimeout(() => {
107
109
  const pending = this._pendingRequests.get(message.id);
108
110
  if (pending) {
111
+ this.cancelToolCall(message.id);
109
112
  pending.reject(new Error(timeoutMessage));
110
113
  this._pendingRequests.delete(message.id);
111
114
  }
@@ -117,6 +120,15 @@ var AssistantFrameHost = class {
117
120
  }, this._targetOrigin);
118
121
  });
119
122
  }
123
+ cancelToolCall(id) {
124
+ this._iframeWindow.postMessage({
125
+ channel: FRAME_MESSAGE_CHANNEL,
126
+ message: {
127
+ type: "tool-cancel",
128
+ id
129
+ }
130
+ }, this._targetOrigin);
131
+ }
120
132
  requestContext() {
121
133
  this._iframeWindow.postMessage({
122
134
  channel: FRAME_MESSAGE_CHANNEL,
@@ -124,7 +136,7 @@ var AssistantFrameHost = class {
124
136
  }, this._targetOrigin);
125
137
  }
126
138
  notifySubscribers() {
127
- this._subscribers.forEach((callback) => callback());
139
+ notifySubscribers(this._subscribers);
128
140
  }
129
141
  getModelContext() {
130
142
  return this._context;
@@ -138,7 +150,10 @@ var AssistantFrameHost = class {
138
150
  window.removeEventListener("message", this.handleMessage);
139
151
  this._subscribers.clear();
140
152
  const error = /* @__PURE__ */ new Error("AssistantFrameHost has been disposed");
141
- for (const pending of this._pendingRequests.values()) pending.reject(error);
153
+ for (const [id, pending] of this._pendingRequests) {
154
+ this.cancelToolCall(id);
155
+ pending.reject(error);
156
+ }
142
157
  this._pendingRequests.clear();
143
158
  }
144
159
  };
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","names":["ModelContextProvider","ModelContext","Unsubscribe","Tool","FrameMessage","FRAME_MESSAGE_CHANNEL","SerializedModelContext","SerializedTool","deserializeTool","serializedTool","parameters","description","disabled","undefined","type","deserializeModelContext","serialized","system","tools","Object","fromEntries","entries","map","name","tool","getAbortReason","signal","AbortSignal","reason","error","Error","AssistantFrameHost","_context","_subscribers","Set","_pendingRequests","Map","resolve","value","reject","_requestCounter","_iframeWindow","Window","_targetOrigin","_disposed","constructor","iframeWindow","targetOrigin","handleMessage","bind","window","addEventListener","requestContext","event","MessageEvent","origin","source","data","channel","message","updateContext","context","pending","get","id","result","delete","serializedContext","execute","args","abortSignal","callTool","notifySubscribers","toolName","Promise","sendRequest","T","timeout","timeoutMessage","aborted","timeoutId","ReturnType","setTimeout","onAbort","cleanup","clearTimeout","removeEventListener","set","once","postMessage","forEach","callback","getModelContext","subscribe","add","dispose","clear","values"],"sources":["../../../src/model-context/frame/host.ts"],"sourcesContent":["import type { ModelContextProvider, ModelContext } from \"../types\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { Tool } from \"assistant-stream\";\nimport {\n type FrameMessage,\n FRAME_MESSAGE_CHANNEL,\n type SerializedModelContext,\n type SerializedTool,\n} from \"./types\";\n\n/**\n * Deserializes tools from JSON Schema format back to Tool objects\n */\nconst deserializeTool = (serializedTool: SerializedTool): Tool<any, any> =>\n ({\n parameters: serializedTool.parameters,\n ...(serializedTool.description && {\n description: serializedTool.description,\n }),\n ...(serializedTool.disabled !== undefined && {\n disabled: serializedTool.disabled,\n }),\n ...(serializedTool.type && { type: serializedTool.type }),\n }) as Tool<any, any>;\n\n/**\n * Deserializes a ModelContext from transmission format\n */\nconst deserializeModelContext = (\n serialized: SerializedModelContext,\n): ModelContext => ({\n ...(serialized.system !== undefined && { system: serialized.system }),\n ...(serialized.tools && {\n tools: Object.fromEntries(\n Object.entries(serialized.tools).map(([name, tool]) => [\n name,\n deserializeTool(tool),\n ]),\n ),\n }),\n});\n\nconst getAbortReason = (signal: AbortSignal): unknown => {\n if (signal.reason !== undefined) return signal.reason;\n const error = new Error(\"Tool call was aborted\");\n error.name = \"AbortError\";\n return error;\n};\n\nexport class AssistantFrameHost implements ModelContextProvider {\n private _context: ModelContext = {};\n private _subscribers = new Set<() => void>();\n private _pendingRequests = new Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }\n >();\n private _requestCounter = 0;\n private _iframeWindow: Window;\n private _targetOrigin: string;\n private _disposed = false;\n\n constructor(iframeWindow: Window, targetOrigin: string = \"*\") {\n this._iframeWindow = iframeWindow;\n this._targetOrigin = targetOrigin;\n\n this.handleMessage = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.handleMessage);\n\n this.requestContext();\n }\n\n private handleMessage(event: MessageEvent) {\n if (this._targetOrigin !== \"*\" && event.origin !== this._targetOrigin)\n return;\n if (event.source !== this._iframeWindow) return;\n if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;\n\n const message = event.data.message as FrameMessage;\n\n switch (message.type) {\n case \"model-context-update\": {\n this.updateContext(message.context);\n break;\n }\n\n case \"tool-result\": {\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n if (message.error) {\n pending.reject(new Error(message.error));\n } else {\n pending.resolve(message.result);\n }\n this._pendingRequests.delete(message.id);\n }\n break;\n }\n }\n }\n\n private updateContext(serializedContext: SerializedModelContext) {\n const context = deserializeModelContext(serializedContext);\n this._context = {\n ...context,\n tools:\n context.tools &&\n Object.fromEntries(\n Object.entries(context.tools).map(([name, tool]) => [\n name,\n {\n ...tool,\n execute: (args: any, context: { abortSignal: AbortSignal }) =>\n this.callTool(name, args, context.abortSignal),\n } as Tool<any, any>,\n ]),\n ),\n };\n this.notifySubscribers();\n }\n\n private callTool(\n toolName: string,\n args: any,\n abortSignal: AbortSignal,\n ): Promise<any> {\n return this.sendRequest(\n {\n type: \"tool-call\",\n id: `tool-${this._requestCounter++}`,\n toolName,\n args,\n },\n 30000,\n `Tool call \"${toolName}\" timed out`,\n abortSignal,\n );\n }\n\n private sendRequest<T extends FrameMessage & { id: string }>(\n message: T,\n timeout = 30000,\n timeoutMessage = \"Request timed out\",\n abortSignal?: AbortSignal,\n ): Promise<any> {\n if (this._disposed) {\n return Promise.reject(new Error(\"AssistantFrameHost has been disposed\"));\n }\n if (abortSignal?.aborted) {\n return Promise.reject(getAbortReason(abortSignal));\n }\n\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const onAbort = () => {\n if (!abortSignal) return;\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n pending.reject(getAbortReason(abortSignal));\n this._pendingRequests.delete(message.id);\n }\n };\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n abortSignal?.removeEventListener(\"abort\", onAbort);\n };\n\n this._pendingRequests.set(message.id, {\n resolve: (value: any) => {\n cleanup();\n resolve(value);\n },\n reject: (error: any) => {\n cleanup();\n reject(error);\n },\n });\n\n timeoutId = setTimeout(() => {\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n pending.reject(new Error(timeoutMessage));\n this._pendingRequests.delete(message.id);\n }\n }, timeout);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n this._iframeWindow.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message },\n this._targetOrigin,\n );\n });\n }\n\n private requestContext() {\n this._iframeWindow.postMessage(\n {\n channel: FRAME_MESSAGE_CHANNEL,\n message: {\n type: \"model-context-request\",\n } as FrameMessage,\n },\n this._targetOrigin,\n );\n }\n\n private notifySubscribers() {\n this._subscribers.forEach((callback) => callback());\n }\n\n getModelContext(): ModelContext {\n return this._context;\n }\n\n subscribe(callback: () => void): Unsubscribe {\n this._subscribers.add(callback);\n return () => this._subscribers.delete(callback);\n }\n\n dispose() {\n this._disposed = true;\n window.removeEventListener(\"message\", this.handleMessage);\n this._subscribers.clear();\n const error = new Error(\"AssistantFrameHost has been disposed\");\n for (const pending of this._pendingRequests.values()) {\n pending.reject(error);\n }\n this._pendingRequests.clear();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"host.js","names":["ModelContextProvider","ModelContext","Unsubscribe","Tool","notifySubscribers","notifyStateSubscribers","generateId","FrameMessage","FRAME_MESSAGE_CHANNEL","SerializedModelContext","SerializedTool","deserializeTool","serializedTool","parameters","description","disabled","undefined","type","deserializeModelContext","serialized","system","tools","Object","fromEntries","entries","map","name","tool","getAbortReason","signal","AbortSignal","reason","error","Error","AssistantFrameHost","_context","_subscribers","Set","_pendingRequests","Map","resolve","value","reject","_iframeWindow","Window","_targetOrigin","_disposed","constructor","iframeWindow","targetOrigin","handleMessage","bind","window","addEventListener","requestContext","event","MessageEvent","origin","source","data","channel","message","updateContext","context","pending","get","id","result","delete","serializedContext","execute","args","abortSignal","callTool","toolName","Promise","sendRequest","T","timeout","timeoutMessage","aborted","timeoutId","ReturnType","setTimeout","onAbort","cancelToolCall","cleanup","clearTimeout","removeEventListener","set","once","postMessage","getModelContext","subscribe","callback","add","dispose","clear"],"sources":["../../../src/model-context/frame/host.ts"],"sourcesContent":["import type { ModelContextProvider, ModelContext } from \"../types\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { Tool } from \"assistant-stream\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { generateId } from \"../../utils/id\";\nimport {\n type FrameMessage,\n FRAME_MESSAGE_CHANNEL,\n type SerializedModelContext,\n type SerializedTool,\n} from \"./types\";\n\n/**\n * Deserializes tools from JSON Schema format back to Tool objects\n */\nconst deserializeTool = (serializedTool: SerializedTool): Tool<any, any> =>\n ({\n parameters: serializedTool.parameters,\n ...(serializedTool.description && {\n description: serializedTool.description,\n }),\n ...(serializedTool.disabled !== undefined && {\n disabled: serializedTool.disabled,\n }),\n ...(serializedTool.type && { type: serializedTool.type }),\n }) as Tool<any, any>;\n\n/**\n * Deserializes a ModelContext from transmission format\n */\nconst deserializeModelContext = (\n serialized: SerializedModelContext,\n): ModelContext => ({\n ...(serialized.system !== undefined && { system: serialized.system }),\n ...(serialized.tools && {\n tools: Object.fromEntries(\n Object.entries(serialized.tools).map(([name, tool]) => [\n name,\n deserializeTool(tool),\n ]),\n ),\n }),\n});\n\nconst getAbortReason = (signal: AbortSignal): unknown => {\n if (signal.reason !== undefined) return signal.reason;\n const error = new Error(\"Tool call was aborted\");\n error.name = \"AbortError\";\n return error;\n};\n\nexport class AssistantFrameHost implements ModelContextProvider {\n private _context: ModelContext = {};\n private _subscribers = new Set<() => void>();\n private _pendingRequests = new Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }\n >();\n private _iframeWindow: Window;\n private _targetOrigin: string;\n private _disposed = false;\n\n constructor(iframeWindow: Window, targetOrigin: string = \"*\") {\n this._iframeWindow = iframeWindow;\n this._targetOrigin = targetOrigin;\n\n this.handleMessage = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.handleMessage);\n\n this.requestContext();\n }\n\n private handleMessage(event: MessageEvent) {\n if (this._targetOrigin !== \"*\" && event.origin !== this._targetOrigin)\n return;\n if (event.source !== this._iframeWindow) return;\n if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;\n\n const message = event.data.message as FrameMessage;\n\n switch (message.type) {\n case \"model-context-update\": {\n this.updateContext(message.context);\n break;\n }\n\n case \"tool-result\": {\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n if (message.error) {\n pending.reject(new Error(message.error));\n } else {\n pending.resolve(message.result);\n }\n this._pendingRequests.delete(message.id);\n }\n break;\n }\n }\n }\n\n private updateContext(serializedContext: SerializedModelContext) {\n const context = deserializeModelContext(serializedContext);\n this._context = {\n ...context,\n tools:\n context.tools &&\n Object.fromEntries(\n Object.entries(context.tools).map(([name, tool]) => [\n name,\n {\n ...tool,\n execute: (args: any, context: { abortSignal: AbortSignal }) =>\n this.callTool(name, args, context.abortSignal),\n } as Tool<any, any>,\n ]),\n ),\n };\n this.notifySubscribers();\n }\n\n private callTool(\n toolName: string,\n args: any,\n abortSignal: AbortSignal,\n ): Promise<any> {\n return this.sendRequest(\n {\n type: \"tool-call\",\n id: `tool-${generateId()}`,\n toolName,\n args,\n },\n 30000,\n `Tool call \"${toolName}\" timed out`,\n abortSignal,\n );\n }\n\n private sendRequest<T extends FrameMessage & { id: string }>(\n message: T,\n timeout = 30000,\n timeoutMessage = \"Request timed out\",\n abortSignal?: AbortSignal,\n ): Promise<any> {\n if (this._disposed) {\n return Promise.reject(new Error(\"AssistantFrameHost has been disposed\"));\n }\n if (abortSignal?.aborted) {\n return Promise.reject(getAbortReason(abortSignal));\n }\n\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const onAbort = () => {\n if (!abortSignal) return;\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n this.cancelToolCall(message.id);\n pending.reject(getAbortReason(abortSignal));\n this._pendingRequests.delete(message.id);\n }\n };\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n abortSignal?.removeEventListener(\"abort\", onAbort);\n };\n\n this._pendingRequests.set(message.id, {\n resolve: (value: any) => {\n cleanup();\n resolve(value);\n },\n reject: (error: any) => {\n cleanup();\n reject(error);\n },\n });\n\n timeoutId = setTimeout(() => {\n const pending = this._pendingRequests.get(message.id);\n if (pending) {\n this.cancelToolCall(message.id);\n pending.reject(new Error(timeoutMessage));\n this._pendingRequests.delete(message.id);\n }\n }, timeout);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n this._iframeWindow.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message },\n this._targetOrigin,\n );\n });\n }\n\n private cancelToolCall(id: string) {\n this._iframeWindow.postMessage(\n {\n channel: FRAME_MESSAGE_CHANNEL,\n message: { type: \"tool-cancel\", id } satisfies FrameMessage,\n },\n this._targetOrigin,\n );\n }\n\n private requestContext() {\n this._iframeWindow.postMessage(\n {\n channel: FRAME_MESSAGE_CHANNEL,\n message: {\n type: \"model-context-request\",\n } as FrameMessage,\n },\n this._targetOrigin,\n );\n }\n\n private notifySubscribers() {\n notifyStateSubscribers(this._subscribers);\n }\n\n getModelContext(): ModelContext {\n return this._context;\n }\n\n subscribe(callback: () => void): Unsubscribe {\n this._subscribers.add(callback);\n return () => this._subscribers.delete(callback);\n }\n\n dispose() {\n this._disposed = true;\n window.removeEventListener(\"message\", this.handleMessage);\n this._subscribers.clear();\n const error = new Error(\"AssistantFrameHost has been disposed\");\n for (const [id, pending] of this._pendingRequests) {\n this.cancelToolCall(id);\n pending.reject(error);\n }\n this._pendingRequests.clear();\n }\n}\n"],"mappings":"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"}
@@ -5,11 +5,15 @@ declare class AssistantFrameProvider {
5
5
  private static _instance;
6
6
  private _providers;
7
7
  private _providerUnsubscribes;
8
+ private _activeToolCalls;
8
9
  private _targetOrigin;
10
+ private _strictRegistrations;
9
11
  private constructor();
10
12
  private static getInstance;
13
+ private reconcileTargetOrigin;
11
14
  private handleMessage;
12
15
  private handleToolCall;
16
+ private cancelToolCall;
13
17
  private sendMessage;
14
18
  private getModelContext;
15
19
  private broadcastUpdate;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","names":[],"sources":["../../../src/model-context/frame/provider.ts"],"mappings":";;;cA+Ba;iBACI;UAEP;UACA;UAIA;UAED;iBAQQ;UASP;UAsBM;UAoCN;UAOA;UAkBA;SAcD,wBACL,UAAU,sBACV,wBACC;SAmBI"}
1
+ {"version":3,"file":"provider.d.ts","names":[],"sources":["../../../src/model-context/frame/provider.ts"],"mappings":";;;cA+Ba;iBACI;UAEP;UACA;UAIA;UAIA;UACA;UAED;iBAQQ;UAWP;UAaA;UA0BM;UA2CN;UAOA;UAOA;UAkBA;SAcD,wBACL,UAAU,sBACV,wBACC;SA4BI"}
@@ -15,7 +15,9 @@ var AssistantFrameProvider = class AssistantFrameProvider {
15
15
  static _instance = null;
16
16
  _providers = /* @__PURE__ */ new Set();
17
17
  _providerUnsubscribes = /* @__PURE__ */ new Map();
18
+ _activeToolCalls = /* @__PURE__ */ new Map();
18
19
  _targetOrigin;
20
+ _strictRegistrations = 0;
19
21
  constructor(targetOrigin = "*") {
20
22
  this._targetOrigin = targetOrigin;
21
23
  this.handleMessage = this.handleMessage.bind(this);
@@ -24,8 +26,17 @@ var AssistantFrameProvider = class AssistantFrameProvider {
24
26
  }
25
27
  static getInstance(targetOrigin) {
26
28
  if (!AssistantFrameProvider._instance) AssistantFrameProvider._instance = new AssistantFrameProvider(targetOrigin);
29
+ else AssistantFrameProvider._instance.reconcileTargetOrigin(targetOrigin);
27
30
  return AssistantFrameProvider._instance;
28
31
  }
32
+ reconcileTargetOrigin(targetOrigin = "*") {
33
+ if (targetOrigin === "*" || targetOrigin === this._targetOrigin) return;
34
+ if (this._targetOrigin === "*") {
35
+ this._targetOrigin = targetOrigin;
36
+ return;
37
+ }
38
+ throw new Error(`AssistantFrameProvider cannot register conflicting target origins: "${this._targetOrigin}" and "${targetOrigin}"`);
39
+ }
29
40
  handleMessage(event) {
30
41
  if (this._targetOrigin !== "*" && event.origin !== this._targetOrigin) return;
31
42
  if (event.source !== window.parent) return;
@@ -38,18 +49,28 @@ var AssistantFrameProvider = class AssistantFrameProvider {
38
49
  context: serializeModelContext(this.getModelContext())
39
50
  });
40
51
  break;
41
- case "tool-call": this.handleToolCall(message, event);
52
+ case "tool-call":
53
+ this.handleToolCall(message, event);
54
+ break;
55
+ case "tool-cancel": this.cancelToolCall(message.id);
42
56
  }
43
57
  }
44
58
  async handleToolCall(message, event) {
45
59
  const tool = this.getModelContext().tools?.[message.toolName];
60
+ const abortController = new AbortController();
61
+ this._activeToolCalls.get(message.id)?.abortController.abort();
62
+ const activeCall = {
63
+ abortController,
64
+ event
65
+ };
66
+ this._activeToolCalls.set(message.id, activeCall);
46
67
  let result;
47
68
  let error;
48
69
  if (!tool) error = `Tool "${message.toolName}" not found`;
49
70
  else try {
50
71
  result = tool.execute ? await tool.execute(message.args, {
51
72
  toolCallId: message.id,
52
- abortSignal: new AbortController().signal,
73
+ abortSignal: abortController.signal,
53
74
  human: async () => {
54
75
  throw new Error("Tool human input is not supported in frame context");
55
76
  }
@@ -57,12 +78,20 @@ var AssistantFrameProvider = class AssistantFrameProvider {
57
78
  } catch (e) {
58
79
  error = e instanceof Error ? e.message : String(e);
59
80
  }
81
+ if (this._activeToolCalls.get(message.id) !== activeCall) return;
82
+ this._activeToolCalls.delete(message.id);
60
83
  this.sendMessage(event, {
61
84
  type: "tool-result",
62
85
  id: message.id,
63
86
  ...error ? { error } : { result }
64
87
  });
65
88
  }
89
+ cancelToolCall(id) {
90
+ const activeCall = this._activeToolCalls.get(id);
91
+ if (!activeCall) return;
92
+ this._activeToolCalls.delete(id);
93
+ activeCall.abortController.abort();
94
+ }
66
95
  sendMessage(event, message) {
67
96
  event.source?.postMessage({
68
97
  channel: FRAME_MESSAGE_CHANNEL,
@@ -91,15 +120,24 @@ var AssistantFrameProvider = class AssistantFrameProvider {
91
120
  }
92
121
  }
93
122
  static addModelContextProvider(provider, targetOrigin) {
94
- const instance = AssistantFrameProvider.getInstance(targetOrigin);
123
+ const origin = targetOrigin ?? "*";
124
+ const instance = AssistantFrameProvider.getInstance(origin);
95
125
  instance._providers.add(provider);
126
+ if (origin !== "*") instance._strictRegistrations += 1;
96
127
  const unsubscribe = provider.subscribe?.(() => instance.broadcastUpdate());
97
128
  if (unsubscribe) instance._providerUnsubscribes.set(provider, unsubscribe);
98
129
  instance.broadcastUpdate();
130
+ let released = false;
99
131
  return () => {
132
+ if (released) return;
133
+ released = true;
100
134
  instance._providers.delete(provider);
101
135
  instance._providerUnsubscribes.get(provider)?.();
102
136
  instance._providerUnsubscribes.delete(provider);
137
+ if (origin !== "*") {
138
+ instance._strictRegistrations -= 1;
139
+ if (instance._strictRegistrations === 0) instance._targetOrigin = "*";
140
+ }
103
141
  instance.broadcastUpdate();
104
142
  };
105
143
  }
@@ -110,6 +148,15 @@ var AssistantFrameProvider = class AssistantFrameProvider {
110
148
  instance._providerUnsubscribes.forEach((unsubscribe) => unsubscribe?.());
111
149
  instance._providerUnsubscribes.clear();
112
150
  instance._providers.clear();
151
+ instance._activeToolCalls.forEach(({ abortController, event }, id) => {
152
+ abortController.abort();
153
+ instance.sendMessage(event, {
154
+ type: "tool-result",
155
+ id,
156
+ error: "AssistantFrameProvider has been disposed"
157
+ });
158
+ });
159
+ instance._activeToolCalls.clear();
113
160
  AssistantFrameProvider._instance = null;
114
161
  }
115
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","names":["ModelContextProvider","ModelContext","Unsubscribe","Tool","toJSONSchema","FrameMessage","FRAME_MESSAGE_CHANNEL","SerializedModelContext","SerializedTool","serializeTool","tool","description","parameters","undefined","disabled","type","serializeModelContext","context","system","tools","Object","fromEntries","entries","map","name","AssistantFrameProvider","_instance","_providers","Set","_providerUnsubscribes","Map","_targetOrigin","constructor","targetOrigin","handleMessage","bind","window","addEventListener","setTimeout","broadcastUpdate","getInstance","event","MessageEvent","origin","source","parent","data","channel","message","sendMessage","getModelContext","handleToolCall","Extract","toolName","result","error","execute","args","toolCallId","id","abortSignal","AbortController","signal","human","Error","e","String","postMessage","contexts","Array","from","p","reduce","merged","updateMessage","addModelContextProvider","provider","instance","add","unsubscribe","subscribe","set","delete","get","dispose","removeEventListener","forEach","clear"],"sources":["../../../src/model-context/frame/provider.ts"],"sourcesContent":["import type { ModelContextProvider, ModelContext } from \"../types\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { type Tool, toJSONSchema } from \"assistant-stream\";\nimport {\n type FrameMessage,\n FRAME_MESSAGE_CHANNEL,\n type SerializedModelContext,\n type SerializedTool,\n} from \"./types\";\n\nconst serializeTool = (tool: Tool<any, any>): SerializedTool => ({\n ...(tool.description && { description: tool.description }),\n parameters: tool.parameters ? toJSONSchema(tool.parameters) : undefined,\n ...(tool.disabled !== undefined && { disabled: tool.disabled }),\n ...(tool.type && { type: tool.type }),\n});\n\nconst serializeModelContext = (\n context: ModelContext,\n): SerializedModelContext => ({\n ...(context.system !== undefined && { system: context.system }),\n ...(context.tools && {\n tools: Object.fromEntries(\n Object.entries(context.tools).map(([name, tool]) => [\n name,\n serializeTool(tool),\n ]),\n ),\n }),\n});\n\nexport class AssistantFrameProvider {\n private static _instance: AssistantFrameProvider | null = null;\n\n private _providers = new Set<ModelContextProvider>();\n private _providerUnsubscribes = new Map<\n ModelContextProvider,\n Unsubscribe | undefined\n >();\n private _targetOrigin: string;\n\n private constructor(targetOrigin: string = \"*\") {\n this._targetOrigin = targetOrigin;\n this.handleMessage = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.handleMessage);\n\n setTimeout(() => this.broadcastUpdate(), 0);\n }\n\n private static getInstance(targetOrigin?: string): AssistantFrameProvider {\n if (!AssistantFrameProvider._instance) {\n AssistantFrameProvider._instance = new AssistantFrameProvider(\n targetOrigin,\n );\n }\n return AssistantFrameProvider._instance;\n }\n\n private handleMessage(event: MessageEvent) {\n if (this._targetOrigin !== \"*\" && event.origin !== this._targetOrigin)\n return;\n if (event.source !== window.parent) return;\n if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;\n\n const message = event.data.message as FrameMessage;\n\n switch (message.type) {\n case \"model-context-request\":\n this.sendMessage(event, {\n type: \"model-context-update\",\n context: serializeModelContext(this.getModelContext()),\n });\n break;\n\n case \"tool-call\":\n this.handleToolCall(message, event);\n break;\n }\n }\n\n private async handleToolCall(\n message: Extract<FrameMessage, { type: \"tool-call\" }>,\n event: MessageEvent,\n ) {\n const tool = this.getModelContext().tools?.[message.toolName];\n\n let result: any;\n let error: string | undefined;\n\n if (!tool) {\n error = `Tool \"${message.toolName}\" not found`;\n } else {\n try {\n result = tool.execute\n ? await tool.execute(message.args, {\n toolCallId: message.id,\n abortSignal: new AbortController().signal,\n human: async () => {\n throw new Error(\n \"Tool human input is not supported in frame context\",\n );\n },\n })\n : undefined;\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n }\n\n this.sendMessage(event, {\n type: \"tool-result\",\n id: message.id,\n ...(error ? { error } : { result }),\n });\n }\n\n private sendMessage(event: MessageEvent, message: FrameMessage) {\n event.source?.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message },\n { targetOrigin: event.origin },\n );\n }\n\n private getModelContext(): ModelContext {\n const contexts = Array.from(this._providers).map((p) =>\n p.getModelContext(),\n );\n\n return contexts.reduce(\n (merged, context) => ({\n system: context.system\n ? merged.system\n ? `${merged.system}\\n\\n${context.system}`\n : context.system\n : merged.system,\n tools: { ...(merged.tools || {}), ...(context.tools || {}) },\n }),\n {} as ModelContext,\n );\n }\n\n private broadcastUpdate() {\n if (window.parent && window.parent !== window) {\n const updateMessage: FrameMessage = {\n type: \"model-context-update\",\n context: serializeModelContext(this.getModelContext()),\n };\n\n window.parent.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message: updateMessage },\n this._targetOrigin,\n );\n }\n }\n\n static addModelContextProvider(\n provider: ModelContextProvider,\n targetOrigin?: string,\n ): Unsubscribe {\n const instance = AssistantFrameProvider.getInstance(targetOrigin);\n instance._providers.add(provider);\n\n const unsubscribe = provider.subscribe?.(() => instance.broadcastUpdate());\n if (unsubscribe) {\n instance._providerUnsubscribes.set(provider, unsubscribe);\n }\n\n instance.broadcastUpdate();\n\n return () => {\n instance._providers.delete(provider);\n instance._providerUnsubscribes.get(provider)?.();\n instance._providerUnsubscribes.delete(provider);\n instance.broadcastUpdate();\n };\n }\n\n static dispose() {\n if (AssistantFrameProvider._instance) {\n const instance = AssistantFrameProvider._instance;\n window.removeEventListener(\"message\", instance.handleMessage);\n\n instance._providerUnsubscribes.forEach((unsubscribe) => unsubscribe?.());\n instance._providerUnsubscribes.clear();\n instance._providers.clear();\n\n AssistantFrameProvider._instance = null;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","names":["ModelContextProvider","ModelContext","Unsubscribe","Tool","toJSONSchema","FrameMessage","FRAME_MESSAGE_CHANNEL","SerializedModelContext","SerializedTool","serializeTool","tool","description","parameters","undefined","disabled","type","serializeModelContext","context","system","tools","Object","fromEntries","entries","map","name","AssistantFrameProvider","_instance","_providers","Set","_providerUnsubscribes","Map","_activeToolCalls","abortController","AbortController","event","MessageEvent","_targetOrigin","_strictRegistrations","constructor","targetOrigin","handleMessage","bind","window","addEventListener","setTimeout","broadcastUpdate","getInstance","reconcileTargetOrigin","Error","origin","source","parent","data","channel","message","sendMessage","getModelContext","handleToolCall","cancelToolCall","id","Extract","toolName","get","abort","activeCall","set","result","error","execute","args","toolCallId","abortSignal","signal","human","e","String","delete","postMessage","contexts","Array","from","p","reduce","merged","updateMessage","addModelContextProvider","provider","instance","add","unsubscribe","subscribe","released","dispose","removeEventListener","forEach","clear"],"sources":["../../../src/model-context/frame/provider.ts"],"sourcesContent":["import type { ModelContextProvider, ModelContext } from \"../types\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { type Tool, toJSONSchema } from \"assistant-stream\";\nimport {\n type FrameMessage,\n FRAME_MESSAGE_CHANNEL,\n type SerializedModelContext,\n type SerializedTool,\n} from \"./types\";\n\nconst serializeTool = (tool: Tool<any, any>): SerializedTool => ({\n ...(tool.description && { description: tool.description }),\n parameters: tool.parameters ? toJSONSchema(tool.parameters) : undefined,\n ...(tool.disabled !== undefined && { disabled: tool.disabled }),\n ...(tool.type && { type: tool.type }),\n});\n\nconst serializeModelContext = (\n context: ModelContext,\n): SerializedModelContext => ({\n ...(context.system !== undefined && { system: context.system }),\n ...(context.tools && {\n tools: Object.fromEntries(\n Object.entries(context.tools).map(([name, tool]) => [\n name,\n serializeTool(tool),\n ]),\n ),\n }),\n});\n\nexport class AssistantFrameProvider {\n private static _instance: AssistantFrameProvider | null = null;\n\n private _providers = new Set<ModelContextProvider>();\n private _providerUnsubscribes = new Map<\n ModelContextProvider,\n Unsubscribe | undefined\n >();\n private _activeToolCalls = new Map<\n string,\n { abortController: AbortController; event: MessageEvent }\n >();\n private _targetOrigin: string;\n private _strictRegistrations = 0;\n\n private constructor(targetOrigin: string = \"*\") {\n this._targetOrigin = targetOrigin;\n this.handleMessage = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.handleMessage);\n\n setTimeout(() => this.broadcastUpdate(), 0);\n }\n\n private static getInstance(targetOrigin?: string): AssistantFrameProvider {\n if (!AssistantFrameProvider._instance) {\n AssistantFrameProvider._instance = new AssistantFrameProvider(\n targetOrigin,\n );\n } else {\n AssistantFrameProvider._instance.reconcileTargetOrigin(targetOrigin);\n }\n return AssistantFrameProvider._instance;\n }\n\n private reconcileTargetOrigin(targetOrigin: string = \"*\") {\n if (targetOrigin === \"*\" || targetOrigin === this._targetOrigin) return;\n\n if (this._targetOrigin === \"*\") {\n this._targetOrigin = targetOrigin;\n return;\n }\n\n throw new Error(\n `AssistantFrameProvider cannot register conflicting target origins: \"${this._targetOrigin}\" and \"${targetOrigin}\"`,\n );\n }\n\n private handleMessage(event: MessageEvent) {\n if (this._targetOrigin !== \"*\" && event.origin !== this._targetOrigin)\n return;\n if (event.source !== window.parent) return;\n if (event.data?.channel !== FRAME_MESSAGE_CHANNEL) return;\n\n const message = event.data.message as FrameMessage;\n\n switch (message.type) {\n case \"model-context-request\":\n this.sendMessage(event, {\n type: \"model-context-update\",\n context: serializeModelContext(this.getModelContext()),\n });\n break;\n\n case \"tool-call\":\n this.handleToolCall(message, event);\n break;\n\n case \"tool-cancel\":\n this.cancelToolCall(message.id);\n break;\n }\n }\n\n private async handleToolCall(\n message: Extract<FrameMessage, { type: \"tool-call\" }>,\n event: MessageEvent,\n ) {\n const tool = this.getModelContext().tools?.[message.toolName];\n const abortController = new AbortController();\n this._activeToolCalls.get(message.id)?.abortController.abort();\n const activeCall = { abortController, event };\n this._activeToolCalls.set(message.id, activeCall);\n\n let result: any;\n let error: string | undefined;\n\n if (!tool) {\n error = `Tool \"${message.toolName}\" not found`;\n } else {\n try {\n result = tool.execute\n ? await tool.execute(message.args, {\n toolCallId: message.id,\n abortSignal: abortController.signal,\n human: async () => {\n throw new Error(\n \"Tool human input is not supported in frame context\",\n );\n },\n })\n : undefined;\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n }\n\n if (this._activeToolCalls.get(message.id) !== activeCall) return;\n this._activeToolCalls.delete(message.id);\n\n this.sendMessage(event, {\n type: \"tool-result\",\n id: message.id,\n ...(error ? { error } : { result }),\n });\n }\n\n private cancelToolCall(id: string) {\n const activeCall = this._activeToolCalls.get(id);\n if (!activeCall) return;\n this._activeToolCalls.delete(id);\n activeCall.abortController.abort();\n }\n\n private sendMessage(event: MessageEvent, message: FrameMessage) {\n event.source?.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message },\n { targetOrigin: event.origin },\n );\n }\n\n private getModelContext(): ModelContext {\n const contexts = Array.from(this._providers).map((p) =>\n p.getModelContext(),\n );\n\n return contexts.reduce(\n (merged, context) => ({\n system: context.system\n ? merged.system\n ? `${merged.system}\\n\\n${context.system}`\n : context.system\n : merged.system,\n tools: { ...(merged.tools || {}), ...(context.tools || {}) },\n }),\n {} as ModelContext,\n );\n }\n\n private broadcastUpdate() {\n if (window.parent && window.parent !== window) {\n const updateMessage: FrameMessage = {\n type: \"model-context-update\",\n context: serializeModelContext(this.getModelContext()),\n };\n\n window.parent.postMessage(\n { channel: FRAME_MESSAGE_CHANNEL, message: updateMessage },\n this._targetOrigin,\n );\n }\n }\n\n static addModelContextProvider(\n provider: ModelContextProvider,\n targetOrigin?: string,\n ): Unsubscribe {\n const origin = targetOrigin ?? \"*\";\n const instance = AssistantFrameProvider.getInstance(origin);\n instance._providers.add(provider);\n if (origin !== \"*\") instance._strictRegistrations += 1;\n\n const unsubscribe = provider.subscribe?.(() => instance.broadcastUpdate());\n if (unsubscribe) {\n instance._providerUnsubscribes.set(provider, unsubscribe);\n }\n\n instance.broadcastUpdate();\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n instance._providers.delete(provider);\n instance._providerUnsubscribes.get(provider)?.();\n instance._providerUnsubscribes.delete(provider);\n if (origin !== \"*\") {\n instance._strictRegistrations -= 1;\n if (instance._strictRegistrations === 0) instance._targetOrigin = \"*\";\n }\n instance.broadcastUpdate();\n };\n }\n\n static dispose() {\n if (AssistantFrameProvider._instance) {\n const instance = AssistantFrameProvider._instance;\n window.removeEventListener(\"message\", instance.handleMessage);\n\n instance._providerUnsubscribes.forEach((unsubscribe) => unsubscribe?.());\n instance._providerUnsubscribes.clear();\n instance._providers.clear();\n instance._activeToolCalls.forEach(({ abortController, event }, id) => {\n abortController.abort();\n instance.sendMessage(event, {\n type: \"tool-result\",\n id,\n error: \"AssistantFrameProvider has been disposed\",\n });\n });\n instance._activeToolCalls.clear();\n\n AssistantFrameProvider._instance = null;\n }\n }\n}\n"],"mappings":";;;AAUA,MAAMS,iBAAiBC,UAA0C;CAC/D,GAAIA,KAAKC,eAAe,EAAEA,aAAaD,KAAKC,YAAY;CACxDC,YAAYF,KAAKE,aAAaR,aAAaM,KAAKE,UAAU,IAAIC,KAAAA;CAC9D,GAAIH,KAAKI,aAAaD,KAAAA,KAAa,EAAEC,UAAUJ,KAAKI,SAAS;CAC7D,GAAIJ,KAAKK,QAAQ,EAAEA,MAAML,KAAKK,KAAK;AACrC;AAEA,MAAMC,yBACJC,aAC4B;CAC5B,GAAIA,QAAQC,WAAWL,KAAAA,KAAa,EAAEK,QAAQD,QAAQC,OAAO;CAC7D,GAAID,QAAQE,SAAS,EACnBA,OAAOC,OAAOC,YACZD,OAAOE,QAAQL,QAAQE,KAAK,CAAC,CAACI,KAAK,CAACC,MAAMd,UAAU,CAClDc,MACAf,cAAcC,IAAI,CAAC,CACpB,CACH,EACF;AACF;AAEA,IAAae,yBAAb,MAAaA,uBAAuB;CAClC,OAAeC,YAA2C;CAE1D,6BAAqB,IAAIE,IAA0B;CACnD,wCAAgC,IAAIE,IAGlC;CACF,mCAA2B,IAAIA,IAG7B;CACF;CACA,uBAA+B;CAE/B,YAAoBS,eAAuB,KAAK;EAC9C,KAAKH,gBAAgBG;EACrB,KAAKC,gBAAgB,KAAKA,cAAcC,KAAK,IAAI;EACjDC,OAAOC,iBAAiB,WAAW,KAAKH,aAAa;EAErDI,iBAAiB,KAAKC,gBAAgB,GAAG,CAAC;CAC5C;CAEA,OAAeC,YAAYP,cAA+C;EACxE,IAAI,CAACd,uBAAuBC,WAC1BD,uBAAuBC,YAAY,IAAID,uBACrCc,YACF;OAEAd,uBAAuBC,UAAUqB,sBAAsBR,YAAY;EAErE,OAAOd,uBAAuBC;CAChC;CAEA,sBAA8Ba,eAAuB,KAAK;EACxD,IAAIA,iBAAiB,OAAOA,iBAAiB,KAAKH,eAAe;EAEjE,IAAI,KAAKA,kBAAkB,KAAK;GAC9B,KAAKA,gBAAgBG;GACrB;EACF;EAEA,MAAM,IAAIS,MACR,uEAAuE,KAAKZ,cAAa,SAAUG,aAAY,EACjH;CACF;CAEA,cAAsBL,OAAqB;EACzC,IAAI,KAAKE,kBAAkB,OAAOF,MAAMe,WAAW,KAAKb,eACtD;EACF,IAAIF,MAAMgB,WAAWR,OAAOS,QAAQ;EACpC,IAAIjB,MAAMkB,MAAMC,YAAAA,sBAAmC;EAEnD,MAAMC,UAAUpB,MAAMkB,KAAKE;EAE3B,QAAQA,QAAQvC,MAAhB;GACE,KAAK;IACH,KAAKwC,YAAYrB,OAAO;KACtBnB,MAAM;KACNE,SAASD,sBAAsB,KAAKwC,gBAAgB,CAAC;IACvD,CAAC;IACD;GAEF,KAAK;IACH,KAAKC,eAAeH,SAASpB,KAAK;IAClC;GAEF,KAAK,eACH,KAAKwB,eAAeJ,QAAQK,EAAE;EAElC;CACF;CAEA,MAAcF,eACZH,SACApB,OACA;EACA,MAAMxB,OAAO,KAAK8C,gBAAgB,CAAC,CAACrC,QAAQmC,QAAQO;EACpD,MAAM7B,kBAAkB,IAAIC,gBAAgB;EAC5C,KAAKF,iBAAiB+B,IAAIR,QAAQK,EAAE,CAAC,EAAE3B,gBAAgB+B,MAAM;EAC7D,MAAMC,aAAa;GAAEhC;GAAiBE;EAAM;EAC5C,KAAKH,iBAAiBkC,IAAIX,QAAQK,IAAIK,UAAU;EAEhD,IAAIE;EACJ,IAAIC;EAEJ,IAAI,CAACzD,MACHyD,QAAQ,SAASb,QAAQO,SAAQ;OAEjC,IAAI;GACFK,SAASxD,KAAK0D,UACV,MAAM1D,KAAK0D,QAAQd,QAAQe,MAAM;IAC/BC,YAAYhB,QAAQK;IACpBY,aAAavC,gBAAgBwC;IAC7BC,OAAO,YAAY;KACjB,MAAM,IAAIzB,MACR,oDACF;IACF;GACF,CAAC,IACDnC,KAAAA;EACN,SAAS6D,GAAG;GACVP,QAAQO,aAAa1B,QAAQ0B,EAAEpB,UAAUqB,OAAOD,CAAC;EACnD;EAGF,IAAI,KAAK3C,iBAAiB+B,IAAIR,QAAQK,EAAE,MAAMK,YAAY;EAC1D,KAAKjC,iBAAiB6C,OAAOtB,QAAQK,EAAE;EAEvC,KAAKJ,YAAYrB,OAAO;GACtBnB,MAAM;GACN4C,IAAIL,QAAQK;GACZ,GAAIQ,QAAQ,EAAEA,MAAM,IAAI,EAAED,OAAO;EACnC,CAAC;CACH;CAEA,eAAuBP,IAAY;EACjC,MAAMK,aAAa,KAAKjC,iBAAiB+B,IAAIH,EAAE;EAC/C,IAAI,CAACK,YAAY;EACjB,KAAKjC,iBAAiB6C,OAAOjB,EAAE;EAC/BK,WAAWhC,gBAAgB+B,MAAM;CACnC;CAEA,YAAoB7B,OAAqBoB,SAAuB;EAC9DpB,MAAMgB,QAAQ2B,YACZ;GAAExB,SAAS/C;GAAuBgD;EAAQ,GAC1C,EAAEf,cAAcL,MAAMe,OAAO,CAC/B;CACF;CAEA,kBAAwC;EAKtC,OAJiB8B,MAAMC,KAAK,KAAKrD,UAAU,CAAC,CAACJ,KAAK0D,MAChDA,EAAEzB,gBAAgB,CAGbsB,CAAQ,CAACI,QACbC,QAAQlE,aAAa;GACpBC,QAAQD,QAAQC,SACZiE,OAAOjE,SACL,GAAGiE,OAAOjE,OAAM,MAAOD,QAAQC,WAC/BD,QAAQC,SACViE,OAAOjE;GACXC,OAAO;IAAE,GAAIgE,OAAOhE,SAAS,CAAC;IAAI,GAAIF,QAAQE,SAAS,CAAC;GAAG;EAC7D,IACA,CAAC,CACH;CACF;CAEA,kBAA0B;EACxB,IAAIuB,OAAOS,UAAUT,OAAOS,WAAWT,QAAQ;GAC7C,MAAM0C,gBAA8B;IAClCrE,MAAM;IACNE,SAASD,sBAAsB,KAAKwC,gBAAgB,CAAC;GACvD;GAEAd,OAAOS,OAAO0B,YACZ;IAAExB,SAAS/C;IAAuBgD,SAAS8B;GAAc,GACzD,KAAKhD,aACP;EACF;CACF;CAEA,OAAOiD,wBACLC,UACA/C,cACa;EACb,MAAMU,SAASV,gBAAgB;EAC/B,MAAMgD,WAAW9D,uBAAuBqB,YAAYG,MAAM;EAC1DsC,SAAS5D,WAAW6D,IAAIF,QAAQ;EAChC,IAAIrC,WAAW,KAAKsC,SAASlD,wBAAwB;EAErD,MAAMoD,cAAcH,SAASI,kBAAkBH,SAAS1C,gBAAgB,CAAC;EACzE,IAAI4C,aACFF,SAAS1D,sBAAsBoC,IAAIqB,UAAUG,WAAW;EAG1DF,SAAS1C,gBAAgB;EAEzB,IAAI8C,WAAW;EACf,aAAa;GACX,IAAIA,UAAU;GACdA,WAAW;GACXJ,SAAS5D,WAAWiD,OAAOU,QAAQ;GACnCC,SAAS1D,sBAAsBiC,IAAIwB,QAAQ,CAAC,GAAG;GAC/CC,SAAS1D,sBAAsB+C,OAAOU,QAAQ;GAC9C,IAAIrC,WAAW,KAAK;IAClBsC,SAASlD,wBAAwB;IACjC,IAAIkD,SAASlD,yBAAyB,GAAGkD,SAASnD,gBAAgB;GACpE;GACAmD,SAAS1C,gBAAgB;EAC3B;CACF;CAEA,OAAO+C,UAAU;EACf,IAAInE,uBAAuBC,WAAW;GACpC,MAAM6D,WAAW9D,uBAAuBC;GACxCgB,OAAOmD,oBAAoB,WAAWN,SAAS/C,aAAa;GAE5D+C,SAAS1D,sBAAsBiE,SAASL,gBAAgBA,cAAc,CAAC;GACvEF,SAAS1D,sBAAsBkE,MAAM;GACrCR,SAAS5D,WAAWoE,MAAM;GAC1BR,SAASxD,iBAAiB+D,SAAS,EAAE9D,iBAAiBE,SAASyB,OAAO;IACpE3B,gBAAgB+B,MAAM;IACtBwB,SAAShC,YAAYrB,OAAO;KAC1BnB,MAAM;KACN4C;KACAQ,OAAO;IACT,CAAC;GACH,CAAC;GACDoB,SAASxD,iBAAiBgE,MAAM;GAEhCtE,uBAAuBC,YAAY;EACrC;CACF;AACF"}
@@ -9,7 +9,7 @@ type SerializedModelContext = {
9
9
  system?: string;
10
10
  tools?: Record<string, SerializedTool>;
11
11
  };
12
- type FrameMessageType = "model-context-request" | "model-context-update" | "tool-call" | "tool-result";
12
+ type FrameMessageType = "model-context-request" | "model-context-update" | "tool-call" | "tool-cancel" | "tool-result";
13
13
  type FrameMessage = {
14
14
  type: "model-context-request";
15
15
  } | {
@@ -20,6 +20,9 @@ type FrameMessage = {
20
20
  id: string;
21
21
  toolName: string;
22
22
  args: unknown;
23
+ } | {
24
+ type: "tool-cancel";
25
+ id: string;
23
26
  } | {
24
27
  type: "tool-result";
25
28
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/model-context/frame/types.ts"],"mappings":";KAAY;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA,QAAQ,eAAe;;KAGb;KAMA;EAEN;;EAGA;EACA,SAAS;;EAGT;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;;cAGO"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/model-context/frame/types.ts"],"mappings":";KAAY;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA,QAAQ,eAAe;;KAGb;KAOA;EAEN;;EAGA;EACA,SAAS;;EAGT;EACA;EACA;EACA;;EAGA;EACA;;EAGA;EACA;EACA;EACA;;cAGO"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["SerializedTool","description","parameters","disabled","type","SerializedModelContext","system","tools","Record","FrameMessageType","FrameMessage","context","id","toolName","args","result","error","FRAME_MESSAGE_CHANNEL"],"sources":["../../../src/model-context/frame/types.ts"],"sourcesContent":["export type SerializedTool = {\n description?: string;\n parameters: any; // JSON Schema\n disabled?: boolean;\n type?: string;\n};\n\nexport type SerializedModelContext = {\n system?: string;\n tools?: Record<string, SerializedTool>;\n};\n\nexport type FrameMessageType =\n | \"model-context-request\"\n | \"model-context-update\"\n | \"tool-call\"\n | \"tool-result\";\n\nexport type FrameMessage =\n | {\n type: \"model-context-request\";\n }\n | {\n type: \"model-context-update\";\n context: SerializedModelContext;\n }\n | {\n type: \"tool-call\";\n id: string;\n toolName: string;\n args: unknown;\n }\n | {\n type: \"tool-result\";\n id: string;\n result?: unknown;\n error?: string;\n };\n\nexport const FRAME_MESSAGE_CHANNEL = \"assistant-ui-frame\";\n"],"mappings":";AAuCA,MAAaiB,wBAAwB"}
1
+ {"version":3,"file":"types.js","names":["SerializedTool","description","parameters","disabled","type","SerializedModelContext","system","tools","Record","FrameMessageType","FrameMessage","context","id","toolName","args","result","error","FRAME_MESSAGE_CHANNEL"],"sources":["../../../src/model-context/frame/types.ts"],"sourcesContent":["export type SerializedTool = {\n description?: string;\n parameters: any; // JSON Schema\n disabled?: boolean;\n type?: string;\n};\n\nexport type SerializedModelContext = {\n system?: string;\n tools?: Record<string, SerializedTool>;\n};\n\nexport type FrameMessageType =\n | \"model-context-request\"\n | \"model-context-update\"\n | \"tool-call\"\n | \"tool-cancel\"\n | \"tool-result\";\n\nexport type FrameMessage =\n | {\n type: \"model-context-request\";\n }\n | {\n type: \"model-context-update\";\n context: SerializedModelContext;\n }\n | {\n type: \"tool-call\";\n id: string;\n toolName: string;\n args: unknown;\n }\n | {\n type: \"tool-cancel\";\n id: string;\n }\n | {\n type: \"tool-result\";\n id: string;\n result?: unknown;\n error?: string;\n };\n\nexport const FRAME_MESSAGE_CHANNEL = \"assistant-ui-frame\";\n"],"mappings":";AA4CA,MAAaiB,wBAAwB"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/model-context/registry.ts"],"mappings":";;;;cAea,gCAAgC;UACnC;UACA;UACA;UACA;UACA;EAER,mBAAmB;EAiDnB,UAAU,uBAAuB;UAKzB;EAMR,QAAQ,cAAc,yBAAyB,SAC7C,MAAM,mBAAmB,OAAO,WAC/B,+BAA+B,OAAO;EAoBzC,eACE,iBAAiB,8BAChB;EAiCH,YACE,UAAU,uBACT"}
1
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/model-context/registry.ts"],"mappings":";;;;cAgBa,gCAAgC;UACnC;UACA;UACA;UACA;UACA;EAER,mBAAmB;EAiDnB,UAAU,uBAAuB;UAKzB;EAIR,QAAQ,cAAc,yBAAyB,SAC7C,MAAM,mBAAmB,OAAO,WAC/B,+BAA+B,OAAO;EAoBzC,eACE,iBAAiB,8BAChB;EAiCH,YACE,UAAU,uBACT"}
@@ -1,4 +1,5 @@
1
1
  import { mergeModelContexts } from "./types.js";
2
+ import { notifySubscribers } from "../subscribable/subscribable.js";
2
3
  //#region src/model-context/registry.ts
3
4
  var ModelContextRegistry = class {
4
5
  _tools = /* @__PURE__ */ new Map();
@@ -34,7 +35,7 @@ var ModelContextRegistry = class {
34
35
  return () => this._subscribers.delete(callback);
35
36
  }
36
37
  notifySubscribers() {
37
- for (const callback of this._subscribers) callback();
38
+ notifySubscribers(this._subscribers);
38
39
  }
39
40
  addTool(tool) {
40
41
  const id = Symbol();
@@ -76,9 +77,20 @@ var ModelContextRegistry = class {
76
77
  addProvider(provider) {
77
78
  const id = Symbol();
78
79
  this._providers.set(id, provider);
79
- const unsubscribe = provider.subscribe?.(() => {
80
- this.notifySubscribers();
81
- });
80
+ let unsubscribe;
81
+ try {
82
+ unsubscribe = provider.subscribe?.(() => {
83
+ this.notifySubscribers();
84
+ });
85
+ } catch (error) {
86
+ this._providers.delete(id);
87
+ try {
88
+ this.notifySubscribers();
89
+ } catch (notifyError) {
90
+ console.error(notifyError);
91
+ }
92
+ throw error;
93
+ }
82
94
  this._providerUnsubscribes.set(id, unsubscribe);
83
95
  this.notifySubscribers();
84
96
  return { remove: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":["Tool","ModelContext","ModelContextProvider","mergeModelContexts","AssistantToolProps","AssistantInstructionsConfig","Unsubscribe","ModelContextRegistryToolHandle","ModelContextRegistryInstructionHandle","ModelContextRegistryProviderHandle","ModelContextRegistry","_tools","Map","_instructions","_providers","_subscribers","Set","_providerUnsubscribes","getModelContext","instructions","Array","from","values","filter","Boolean","system","length","join","undefined","tools","Record","toolProps","toolName","render","tool","providerContexts","context","Object","keys","callSettings","config","unstable_composerMetadata","subscribe","callback","add","delete","notifySubscribers","addTool","TArgs","TResult","id","Symbol","set","update","newTool","has","remove","addInstruction","instruction","disabled","newConfig","newInstruction","newDisabled","addProvider","provider","unsubscribe","get"],"sources":["../../src/model-context/registry.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport {\n type ModelContext,\n type ModelContextProvider,\n mergeModelContexts,\n type AssistantToolProps,\n type AssistantInstructionsConfig,\n} from \"./types\";\nimport type { Unsubscribe } from \"../types/unsubscribe\";\nimport type {\n ModelContextRegistryToolHandle,\n ModelContextRegistryInstructionHandle,\n ModelContextRegistryProviderHandle,\n} from \"./registry-handles\";\n\nexport class ModelContextRegistry implements ModelContextProvider {\n private _tools = new Map<symbol, AssistantToolProps<any, any>>();\n private _instructions = new Map<symbol, string>();\n private _providers = new Map<symbol, ModelContextProvider>();\n private _subscribers = new Set<() => void>();\n private _providerUnsubscribes = new Map<symbol, Unsubscribe | undefined>();\n\n getModelContext(): ModelContext {\n const instructions = Array.from(this._instructions.values()).filter(\n Boolean,\n );\n\n const system =\n instructions.length > 0 ? instructions.join(\"\\n\\n\") : undefined;\n\n const tools: Record<string, Tool<any, any>> = {};\n for (const toolProps of this._tools.values()) {\n const { toolName, render, ...tool } = toolProps;\n tools[toolName] = tool;\n }\n\n const providerContexts = mergeModelContexts(\n new Set(this._providers.values()),\n );\n\n const context: ModelContext = {\n system,\n tools: Object.keys(tools).length > 0 ? tools : undefined,\n };\n\n if (providerContexts.system) {\n context.system = context.system\n ? `${context.system}\\n\\n${providerContexts.system}`\n : providerContexts.system;\n }\n\n if (providerContexts.tools) {\n context.tools = { ...(context.tools || {}), ...providerContexts.tools };\n }\n\n if (providerContexts.callSettings) {\n context.callSettings = providerContexts.callSettings;\n }\n\n if (providerContexts.config) {\n context.config = providerContexts.config;\n }\n\n if (providerContexts.unstable_composerMetadata) {\n context.unstable_composerMetadata =\n providerContexts.unstable_composerMetadata;\n }\n\n return context;\n }\n\n subscribe(callback: () => void): Unsubscribe {\n this._subscribers.add(callback);\n return () => this._subscribers.delete(callback);\n }\n\n private notifySubscribers(): void {\n for (const callback of this._subscribers) {\n callback();\n }\n }\n\n addTool<TArgs extends Record<string, unknown>, TResult>(\n tool: AssistantToolProps<TArgs, TResult>,\n ): ModelContextRegistryToolHandle<TArgs, TResult> {\n const id = Symbol();\n\n this._tools.set(id, tool);\n this.notifySubscribers();\n\n return {\n update: (newTool: AssistantToolProps<TArgs, TResult>) => {\n if (this._tools.has(id)) {\n this._tools.set(id, newTool);\n this.notifySubscribers();\n }\n },\n remove: () => {\n this._tools.delete(id);\n this.notifySubscribers();\n },\n };\n }\n\n addInstruction(\n config: string | AssistantInstructionsConfig,\n ): ModelContextRegistryInstructionHandle {\n const id = Symbol();\n\n const instruction =\n typeof config === \"string\" ? config : config.instruction;\n const disabled = typeof config === \"object\" ? config.disabled : false;\n\n if (!disabled) {\n this._instructions.set(id, instruction);\n this.notifySubscribers();\n }\n\n return {\n update: (newConfig: string | AssistantInstructionsConfig) => {\n const newInstruction =\n typeof newConfig === \"string\" ? newConfig : newConfig.instruction;\n const newDisabled =\n typeof newConfig === \"object\" ? newConfig.disabled : false;\n\n if (newDisabled) {\n this._instructions.delete(id);\n } else {\n this._instructions.set(id, newInstruction);\n }\n this.notifySubscribers();\n },\n remove: () => {\n this._instructions.delete(id);\n this.notifySubscribers();\n },\n };\n }\n\n addProvider(\n provider: ModelContextProvider,\n ): ModelContextRegistryProviderHandle {\n const id = Symbol();\n\n this._providers.set(id, provider);\n\n const unsubscribe = provider.subscribe?.(() => {\n this.notifySubscribers();\n });\n this._providerUnsubscribes.set(id, unsubscribe);\n\n this.notifySubscribers();\n\n return {\n remove: () => {\n this._providers.delete(id);\n const unsubscribe = this._providerUnsubscribes.get(id);\n unsubscribe?.();\n this._providerUnsubscribes.delete(id);\n this.notifySubscribers();\n },\n };\n }\n}\n"],"mappings":";;AAeA,IAAaU,uBAAb,MAAkE;CAChE,yBAAiB,IAAIE,IAA0C;CAC/D,gCAAwB,IAAIA,IAAoB;CAChD,6BAAqB,IAAIA,IAAkC;CAC3D,+BAAuB,IAAII,IAAgB;CAC3C,wCAAgC,IAAIJ,IAAqC;CAEzEM,kBAAgC;EAC9B,MAAMC,eAAeC,MAAMC,KAAK,KAAKR,cAAcS,OAAO,CAAC,CAAC,CAACC,OAC3DC,OACF;EAEA,MAAMC,SACJN,aAAaO,SAAS,IAAIP,aAAaQ,KAAK,MAAM,IAAIC,KAAAA;EAExD,MAAMC,QAAwC,CAAC;EAC/C,KAAK,MAAME,aAAa,KAAKpB,OAAOW,OAAO,GAAG;GAC5C,MAAM,EAAEU,UAAUC,QAAQ,GAAGC,SAASH;GACtCF,MAAMG,YAAYE;EACpB;EAEA,MAAMC,mBAAmBhC,mBACvB,IAAIa,IAAI,KAAKF,WAAWQ,OAAO,CAAC,CAClC;EAEA,MAAMc,UAAwB;GAC5BX;GACAI,OAAOQ,OAAOC,KAAKT,KAAK,CAAC,CAACH,SAAS,IAAIG,QAAQD,KAAAA;EACjD;EAEA,IAAIO,iBAAiBV,QACnBW,QAAQX,SAASW,QAAQX,SACrB,GAAGW,QAAQX,OAAM,MAAOU,iBAAiBV,WACzCU,iBAAiBV;EAGvB,IAAIU,iBAAiBN,OACnBO,QAAQP,QAAQ;GAAE,GAAIO,QAAQP,SAAS,CAAC;GAAI,GAAGM,iBAAiBN;EAAM;EAGxE,IAAIM,iBAAiBI,cACnBH,QAAQG,eAAeJ,iBAAiBI;EAG1C,IAAIJ,iBAAiBK,QACnBJ,QAAQI,SAASL,iBAAiBK;EAGpC,IAAIL,iBAAiBM,2BACnBL,QAAQK,4BACNN,iBAAiBM;EAGrB,OAAOL;CACT;CAEAM,UAAUC,UAAmC;EAC3C,KAAK5B,aAAa6B,IAAID,QAAQ;EAC9B,aAAa,KAAK5B,aAAa8B,OAAOF,QAAQ;CAChD;CAEA,oBAAkC;EAChC,KAAK,MAAMA,YAAY,KAAK5B,cAC1B4B,SAAS;CAEb;CAEAI,QACEb,MACgD;EAChD,MAAMgB,KAAKC,OAAO;EAElB,KAAKxC,OAAOyC,IAAIF,IAAIhB,IAAI;EACxB,KAAKY,kBAAkB;EAEvB,OAAO;GACLO,SAASC,YAAgD;IACvD,IAAI,KAAK3C,OAAO4C,IAAIL,EAAE,GAAG;KACvB,KAAKvC,OAAOyC,IAAIF,IAAII,OAAO;KAC3B,KAAKR,kBAAkB;IACzB;GACF;GACAU,cAAc;IACZ,KAAK7C,OAAOkC,OAAOK,EAAE;IACrB,KAAKJ,kBAAkB;GACzB;EACF;CACF;CAEAW,eACEjB,QACuC;EACvC,MAAMU,KAAKC,OAAO;EAElB,MAAMO,cACJ,OAAOlB,WAAW,WAAWA,SAASA,OAAOkB;EAG/C,IAAI,EAFa,OAAOlB,WAAW,WAAWA,OAAOmB,WAAW,QAEjD;GACb,KAAK9C,cAAcuC,IAAIF,IAAIQ,WAAW;GACtC,KAAKZ,kBAAkB;EACzB;EAEA,OAAO;GACLO,SAASO,cAAoD;IAC3D,MAAMC,iBACJ,OAAOD,cAAc,WAAWA,YAAYA,UAAUF;IAIxD,IAFE,OAAOE,cAAc,WAAWA,UAAUD,WAAW,OAGrD,KAAK9C,cAAcgC,OAAOK,EAAE;SAE5B,KAAKrC,cAAcuC,IAAIF,IAAIW,cAAc;IAE3C,KAAKf,kBAAkB;GACzB;GACAU,cAAc;IACZ,KAAK3C,cAAcgC,OAAOK,EAAE;IAC5B,KAAKJ,kBAAkB;GACzB;EACF;CACF;CAEAiB,YACEC,UACoC;EACpC,MAAMd,KAAKC,OAAO;EAElB,KAAKrC,WAAWsC,IAAIF,IAAIc,QAAQ;EAEhC,MAAMC,cAAcD,SAAStB,kBAAkB;GAC7C,KAAKI,kBAAkB;EACzB,CAAC;EACD,KAAK7B,sBAAsBmC,IAAIF,IAAIe,WAAW;EAE9C,KAAKnB,kBAAkB;EAEvB,OAAO,EACLU,cAAc;GACZ,KAAK1C,WAAW+B,OAAOK,EAAE;GAEzBe,KADyBhD,sBAAsBiD,IAAIhB,EACnDe,CAAW,GAAG;GACd,KAAKhD,sBAAsB4B,OAAOK,EAAE;GACpC,KAAKJ,kBAAkB;EACzB,EACF;CACF;AACF"}
1
+ {"version":3,"file":"registry.js","names":["Tool","ModelContext","ModelContextProvider","mergeModelContexts","AssistantToolProps","AssistantInstructionsConfig","Unsubscribe","notifySubscribers","notifyStateSubscribers","ModelContextRegistryToolHandle","ModelContextRegistryInstructionHandle","ModelContextRegistryProviderHandle","ModelContextRegistry","_tools","Map","_instructions","_providers","_subscribers","Set","_providerUnsubscribes","getModelContext","instructions","Array","from","values","filter","Boolean","system","length","join","undefined","tools","Record","toolProps","toolName","render","tool","providerContexts","context","Object","keys","callSettings","config","unstable_composerMetadata","subscribe","callback","add","delete","addTool","TArgs","TResult","id","Symbol","set","update","newTool","has","remove","addInstruction","instruction","disabled","newConfig","newInstruction","newDisabled","addProvider","provider","unsubscribe","error","notifyError","console","get"],"sources":["../../src/model-context/registry.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport {\n type ModelContext,\n type ModelContextProvider,\n mergeModelContexts,\n type AssistantToolProps,\n type AssistantInstructionsConfig,\n} from \"./types\";\nimport type { Unsubscribe } from \"../types/unsubscribe\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../subscribable/subscribable\";\nimport type {\n ModelContextRegistryToolHandle,\n ModelContextRegistryInstructionHandle,\n ModelContextRegistryProviderHandle,\n} from \"./registry-handles\";\n\nexport class ModelContextRegistry implements ModelContextProvider {\n private _tools = new Map<symbol, AssistantToolProps<any, any>>();\n private _instructions = new Map<symbol, string>();\n private _providers = new Map<symbol, ModelContextProvider>();\n private _subscribers = new Set<() => void>();\n private _providerUnsubscribes = new Map<symbol, Unsubscribe | undefined>();\n\n getModelContext(): ModelContext {\n const instructions = Array.from(this._instructions.values()).filter(\n Boolean,\n );\n\n const system =\n instructions.length > 0 ? instructions.join(\"\\n\\n\") : undefined;\n\n const tools: Record<string, Tool<any, any>> = {};\n for (const toolProps of this._tools.values()) {\n const { toolName, render, ...tool } = toolProps;\n tools[toolName] = tool;\n }\n\n const providerContexts = mergeModelContexts(\n new Set(this._providers.values()),\n );\n\n const context: ModelContext = {\n system,\n tools: Object.keys(tools).length > 0 ? tools : undefined,\n };\n\n if (providerContexts.system) {\n context.system = context.system\n ? `${context.system}\\n\\n${providerContexts.system}`\n : providerContexts.system;\n }\n\n if (providerContexts.tools) {\n context.tools = { ...(context.tools || {}), ...providerContexts.tools };\n }\n\n if (providerContexts.callSettings) {\n context.callSettings = providerContexts.callSettings;\n }\n\n if (providerContexts.config) {\n context.config = providerContexts.config;\n }\n\n if (providerContexts.unstable_composerMetadata) {\n context.unstable_composerMetadata =\n providerContexts.unstable_composerMetadata;\n }\n\n return context;\n }\n\n subscribe(callback: () => void): Unsubscribe {\n this._subscribers.add(callback);\n return () => this._subscribers.delete(callback);\n }\n\n private notifySubscribers(): void {\n notifyStateSubscribers(this._subscribers);\n }\n\n addTool<TArgs extends Record<string, unknown>, TResult>(\n tool: AssistantToolProps<TArgs, TResult>,\n ): ModelContextRegistryToolHandle<TArgs, TResult> {\n const id = Symbol();\n\n this._tools.set(id, tool);\n this.notifySubscribers();\n\n return {\n update: (newTool: AssistantToolProps<TArgs, TResult>) => {\n if (this._tools.has(id)) {\n this._tools.set(id, newTool);\n this.notifySubscribers();\n }\n },\n remove: () => {\n this._tools.delete(id);\n this.notifySubscribers();\n },\n };\n }\n\n addInstruction(\n config: string | AssistantInstructionsConfig,\n ): ModelContextRegistryInstructionHandle {\n const id = Symbol();\n\n const instruction =\n typeof config === \"string\" ? config : config.instruction;\n const disabled = typeof config === \"object\" ? config.disabled : false;\n\n if (!disabled) {\n this._instructions.set(id, instruction);\n this.notifySubscribers();\n }\n\n return {\n update: (newConfig: string | AssistantInstructionsConfig) => {\n const newInstruction =\n typeof newConfig === \"string\" ? newConfig : newConfig.instruction;\n const newDisabled =\n typeof newConfig === \"object\" ? newConfig.disabled : false;\n\n if (newDisabled) {\n this._instructions.delete(id);\n } else {\n this._instructions.set(id, newInstruction);\n }\n this.notifySubscribers();\n },\n remove: () => {\n this._instructions.delete(id);\n this.notifySubscribers();\n },\n };\n }\n\n addProvider(\n provider: ModelContextProvider,\n ): ModelContextRegistryProviderHandle {\n const id = Symbol();\n\n this._providers.set(id, provider);\n\n let unsubscribe: Unsubscribe | undefined;\n try {\n unsubscribe = provider.subscribe?.(() => {\n this.notifySubscribers();\n });\n } catch (error) {\n this._providers.delete(id);\n try {\n this.notifySubscribers();\n } catch (notifyError) {\n console.error(notifyError);\n }\n throw error;\n }\n this._providerUnsubscribes.set(id, unsubscribe);\n\n this.notifySubscribers();\n\n return {\n remove: () => {\n this._providers.delete(id);\n const unsubscribe = this._providerUnsubscribes.get(id);\n unsubscribe?.();\n this._providerUnsubscribes.delete(id);\n this.notifySubscribers();\n },\n };\n }\n}\n"],"mappings":";;;AAgBA,IAAaY,uBAAb,MAAkE;CAChE,yBAAiB,IAAIE,IAA0C;CAC/D,gCAAwB,IAAIA,IAAoB;CAChD,6BAAqB,IAAIA,IAAkC;CAC3D,+BAAuB,IAAII,IAAgB;CAC3C,wCAAgC,IAAIJ,IAAqC;CAEzEM,kBAAgC;EAC9B,MAAMC,eAAeC,MAAMC,KAAK,KAAKR,cAAcS,OAAO,CAAC,CAAC,CAACC,OAC3DC,OACF;EAEA,MAAMC,SACJN,aAAaO,SAAS,IAAIP,aAAaQ,KAAK,MAAM,IAAIC,KAAAA;EAExD,MAAMC,QAAwC,CAAC;EAC/C,KAAK,MAAME,aAAa,KAAKpB,OAAOW,OAAO,GAAG;GAC5C,MAAM,EAAEU,UAAUC,QAAQ,GAAGC,SAASH;GACtCF,MAAMG,YAAYE;EACpB;EAEA,MAAMC,mBAAmBlC,mBACvB,IAAIe,IAAI,KAAKF,WAAWQ,OAAO,CAAC,CAClC;EAEA,MAAMc,UAAwB;GAC5BX;GACAI,OAAOQ,OAAOC,KAAKT,KAAK,CAAC,CAACH,SAAS,IAAIG,QAAQD,KAAAA;EACjD;EAEA,IAAIO,iBAAiBV,QACnBW,QAAQX,SAASW,QAAQX,SACrB,GAAGW,QAAQX,OAAM,MAAOU,iBAAiBV,WACzCU,iBAAiBV;EAGvB,IAAIU,iBAAiBN,OACnBO,QAAQP,QAAQ;GAAE,GAAIO,QAAQP,SAAS,CAAC;GAAI,GAAGM,iBAAiBN;EAAM;EAGxE,IAAIM,iBAAiBI,cACnBH,QAAQG,eAAeJ,iBAAiBI;EAG1C,IAAIJ,iBAAiBK,QACnBJ,QAAQI,SAASL,iBAAiBK;EAGpC,IAAIL,iBAAiBM,2BACnBL,QAAQK,4BACNN,iBAAiBM;EAGrB,OAAOL;CACT;CAEAM,UAAUC,UAAmC;EAC3C,KAAK5B,aAAa6B,IAAID,QAAQ;EAC9B,aAAa,KAAK5B,aAAa8B,OAAOF,QAAQ;CAChD;CAEA,oBAAkC;EAChCrC,kBAAuB,KAAKS,YAAY;CAC1C;CAEA+B,QACEZ,MACgD;EAChD,MAAMe,KAAKC,OAAO;EAElB,KAAKvC,OAAOwC,IAAIF,IAAIf,IAAI;EACxB,KAAK7B,kBAAkB;EAEvB,OAAO;GACL+C,SAASC,YAAgD;IACvD,IAAI,KAAK1C,OAAO2C,IAAIL,EAAE,GAAG;KACvB,KAAKtC,OAAOwC,IAAIF,IAAII,OAAO;KAC3B,KAAKhD,kBAAkB;IACzB;GACF;GACAkD,cAAc;IACZ,KAAK5C,OAAOkC,OAAOI,EAAE;IACrB,KAAK5C,kBAAkB;GACzB;EACF;CACF;CAEAmD,eACEhB,QACuC;EACvC,MAAMS,KAAKC,OAAO;EAElB,MAAMO,cACJ,OAAOjB,WAAW,WAAWA,SAASA,OAAOiB;EAG/C,IAAI,EAFa,OAAOjB,WAAW,WAAWA,OAAOkB,WAAW,QAEjD;GACb,KAAK7C,cAAcsC,IAAIF,IAAIQ,WAAW;GACtC,KAAKpD,kBAAkB;EACzB;EAEA,OAAO;GACL+C,SAASO,cAAoD;IAC3D,MAAMC,iBACJ,OAAOD,cAAc,WAAWA,YAAYA,UAAUF;IAIxD,IAFE,OAAOE,cAAc,WAAWA,UAAUD,WAAW,OAGrD,KAAK7C,cAAcgC,OAAOI,EAAE;SAE5B,KAAKpC,cAAcsC,IAAIF,IAAIW,cAAc;IAE3C,KAAKvD,kBAAkB;GACzB;GACAkD,cAAc;IACZ,KAAK1C,cAAcgC,OAAOI,EAAE;IAC5B,KAAK5C,kBAAkB;GACzB;EACF;CACF;CAEAyD,YACEC,UACoC;EACpC,MAAMd,KAAKC,OAAO;EAElB,KAAKpC,WAAWqC,IAAIF,IAAIc,QAAQ;EAEhC,IAAIC;EACJ,IAAI;GACFA,cAAcD,SAASrB,kBAAkB;IACvC,KAAKrC,kBAAkB;GACzB,CAAC;EACH,SAAS4D,OAAO;GACd,KAAKnD,WAAW+B,OAAOI,EAAE;GACzB,IAAI;IACF,KAAK5C,kBAAkB;GACzB,SAAS6D,aAAa;IACpBC,QAAQF,MAAMC,WAAW;GAC3B;GACA,MAAMD;EACR;EACA,KAAKhD,sBAAsBkC,IAAIF,IAAIe,WAAW;EAE9C,KAAK3D,kBAAkB;EAEvB,OAAO,EACLkD,cAAc;GACZ,KAAKzC,WAAW+B,OAAOI,EAAE;GAEzBe,KADyB/C,sBAAsBmD,IAAInB,EACnDe,CAAW,GAAG;GACd,KAAK/C,sBAAsB4B,OAAOI,EAAE;GACpC,KAAK5C,kBAAkB;EACzB,EACF;CACF;AACF"}
@@ -1,7 +1,14 @@
1
1
  import { AssistantRuntime } from "../runtime/api/assistant-runtime.js";
2
2
  import "../index.js";
3
+ import { AssistantClient, ScopesConfig } from "@assistant-ui/store";
3
4
  //#region src/react/RuntimeAdapter.d.ts
4
5
  declare const RuntimeAdapter: import("@assistant-ui/tap").Resource<import("@assistant-ui/store").ClientOutput<"threads">, [runtime: AssistantRuntime]>;
6
+ /**
7
+ * The scope defaults `RuntimeAdapter` installs when it is used as the `threads`
8
+ * config entry. Adapter packages that wrap a runtime in their own config entry
9
+ * attach this to the wrapping resource for scope parity with `RuntimeAdapter`.
10
+ */
11
+ declare const runtimeAdapterTransformScopes: (scopes: ScopesConfig, parent: AssistantClient) => void;
5
12
  //#endregion
6
- export { RuntimeAdapter };
13
+ export { RuntimeAdapter, runtimeAdapterTransformScopes };
7
14
  //# sourceMappingURL=RuntimeAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeAdapter.d.ts","names":[],"sources":["../../src/react/RuntimeAdapter.ts"],"mappings":";;;cA+Ba,4CAAc,uCAAA,0BAAA,SAAA"}
1
+ {"version":3,"file":"RuntimeAdapter.d.ts","names":[],"sources":["../../src/react/RuntimeAdapter.ts"],"mappings":";;;;cAiCa,4CAAc,uCAAA,0BAAA,SAAA;;;;;;cAOd,gCACX,QAAQ,cACR,QAAQ"}
@@ -3,45 +3,50 @@ import { baseRuntimeAdapterTransformScopes } from "../store/clients/runtime-adap
3
3
  import { DataRenderers } from "./client/DataRenderers.js";
4
4
  import { Tools } from "./client/Tools.js";
5
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
6
- import { useEffect } from "@assistant-ui/tap/react-shim";
7
6
  import { resource, useResource } from "@assistant-ui/tap";
8
- import { attachTransformScopes, useAssistantClientRef } from "@assistant-ui/store/client";
7
+ import { attachTransformScopes, useAssistantClientRef, useAssistantScopeEffect } from "@assistant-ui/store/client";
9
8
  //#region src/react/RuntimeAdapter.ts
10
9
  const useRuntimeAdapter = (runtime) => {
11
- const $ = c(6);
10
+ const $ = c(7);
12
11
  const clientRef = useAssistantClientRef();
13
12
  let t0;
14
- let t1;
15
13
  if ($[0] !== clientRef || $[1] !== runtime) {
16
14
  t0 = () => runtime.registerModelContextProvider(clientRef.current.modelContext());
17
- t1 = [runtime, clientRef];
18
15
  $[0] = clientRef;
19
16
  $[1] = runtime;
20
17
  $[2] = t0;
21
- $[3] = t1;
22
- } else {
23
- t0 = $[2];
24
- t1 = $[3];
25
- }
26
- useEffect(t0, t1);
18
+ } else t0 = $[2];
19
+ let t1;
20
+ if ($[3] !== runtime) {
21
+ t1 = [runtime];
22
+ $[3] = runtime;
23
+ $[4] = t1;
24
+ } else t1 = $[4];
25
+ useAssistantScopeEffect("modelContext", t0, t1);
27
26
  let t2;
28
- if ($[4] !== runtime) {
27
+ if ($[5] !== runtime) {
29
28
  t2 = ThreadListClient({
30
29
  runtime: runtime.threads,
31
30
  __internal_assistantRuntime: runtime
32
31
  });
33
- $[4] = runtime;
34
- $[5] = t2;
35
- } else t2 = $[5];
32
+ $[5] = runtime;
33
+ $[6] = t2;
34
+ } else t2 = $[6];
36
35
  return useResource(t2);
37
36
  };
38
37
  const RuntimeAdapter = resource(useRuntimeAdapter);
39
- attachTransformScopes(useRuntimeAdapter, (scopes, parent) => {
38
+ /**
39
+ * The scope defaults `RuntimeAdapter` installs when it is used as the `threads`
40
+ * config entry. Adapter packages that wrap a runtime in their own config entry
41
+ * attach this to the wrapping resource for scope parity with `RuntimeAdapter`.
42
+ */
43
+ const runtimeAdapterTransformScopes = (scopes, parent) => {
40
44
  baseRuntimeAdapterTransformScopes(scopes, parent);
41
45
  if (!scopes.tools && parent.tools.source === null) scopes.tools = Tools({});
42
46
  if (!scopes.dataRenderers && parent.dataRenderers.source === null) scopes.dataRenderers = DataRenderers();
43
- });
47
+ };
48
+ attachTransformScopes(useRuntimeAdapter, runtimeAdapterTransformScopes);
44
49
  //#endregion
45
- export { RuntimeAdapter };
50
+ export { RuntimeAdapter, runtimeAdapterTransformScopes };
46
51
 
47
52
  //# sourceMappingURL=RuntimeAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeAdapter.js","names":["useEffect","useResource","resource","AssistantRuntime","baseRuntimeAdapterTransformScopes","ThreadListClient","attachTransformScopes","useAssistantClientRef","DataRenderers","Tools","useRuntimeAdapter","runtime","$","_c","clientRef","t0","t1","registerModelContextProvider","current","modelContext","t2","threads","__internal_assistantRuntime","RuntimeAdapter","scopes","parent","tools","source","dataRenderers"],"sources":["../../src/react/RuntimeAdapter.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useResource, resource } from \"@assistant-ui/tap\";\nimport type { AssistantRuntime } from \"..\";\nimport {\n baseRuntimeAdapterTransformScopes,\n ThreadListClient,\n} from \"../store/internal\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n} from \"@assistant-ui/store/client\";\nimport { DataRenderers } from \"./client/DataRenderers\";\nimport { Tools } from \"./client/Tools\";\n\nconst useRuntimeAdapter = (runtime: AssistantRuntime) => {\n const clientRef = useAssistantClientRef();\n\n useEffect(() => {\n return runtime.registerModelContextProvider(\n clientRef.current!.modelContext(),\n );\n }, [runtime, clientRef]);\n\n return useResource(\n ThreadListClient({\n runtime: runtime.threads,\n __internal_assistantRuntime: runtime,\n }),\n );\n};\n\nexport const RuntimeAdapter = resource(useRuntimeAdapter);\n\nattachTransformScopes(useRuntimeAdapter, (scopes, parent) => {\n baseRuntimeAdapterTransformScopes(scopes, parent);\n\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n});\n"],"mappings":";;;;;;;;;AAcA,MAAMU,qBAAoBC,YAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACxB,MAAAC,YAAkBP,sBAAsB;CAAE,IAAAQ;CAAA,IAAAC;CAAA,IAAAJ,EAAA,OAAAE,aAAAF,EAAA,OAAAD,SAAA;EAEhCI,WACDJ,QAAOM,6BACZH,UAASI,QAAQC,aAAe,CAClC;EACCH,KAAA,CAACL,SAASG,SAAS;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAD;EAAAC,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAA;EAAAD,KAAAH,EAAA;EAAAI,KAAAJ,EAAA;CAAA;CAJvBZ,UAAUe,IAIPC,EAAoB;CAAC,IAAAI;CAAA,IAAAR,EAAA,OAAAD,SAAA;EAGtBS,KAAAf,iBAAiB;GAAAM,SACNA,QAAOU;GAAQC,6BACKX;EAC/B,CAAC;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,OAJGX,YACLmB,EAIF;AAAC;AAGH,MAAaG,iBAAiBrB,SAASQ,iBAAiB;AAExDJ,sBAAsBI,oBAAoBc,QAAQC,WAAW;CAC3DrB,kCAAkCoB,QAAQC,MAAM;CAEhD,IAAI,CAACD,OAAOE,SAASD,OAAOC,MAAMC,WAAW,MAC3CH,OAAOE,QAAQjB,MAAM,CAAC,CAAC;CAGzB,IAAI,CAACe,OAAOI,iBAAiBH,OAAOG,cAAcD,WAAW,MAC3DH,OAAOI,gBAAgBpB,cAAc;AAEzC,CAAC"}
1
+ {"version":3,"file":"RuntimeAdapter.js","names":["useResource","resource","AssistantClient","ScopesConfig","AssistantRuntime","baseRuntimeAdapterTransformScopes","ThreadListClient","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","DataRenderers","Tools","useRuntimeAdapter","runtime","$","_c","clientRef","t0","registerModelContextProvider","current","modelContext","t1","t2","threads","__internal_assistantRuntime","RuntimeAdapter","runtimeAdapterTransformScopes","scopes","parent","tools","source","dataRenderers"],"sources":["../../src/react/RuntimeAdapter.ts"],"sourcesContent":["import { useResource, resource } from \"@assistant-ui/tap\";\nimport type { AssistantClient, ScopesConfig } from \"@assistant-ui/store\";\nimport type { AssistantRuntime } from \"..\";\nimport {\n baseRuntimeAdapterTransformScopes,\n ThreadListClient,\n} from \"../store/internal\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport { DataRenderers } from \"./client/DataRenderers\";\nimport { Tools } from \"./client/Tools\";\n\nconst useRuntimeAdapter = (runtime: AssistantRuntime) => {\n const clientRef = useAssistantClientRef();\n\n useAssistantScopeEffect(\n \"modelContext\",\n () =>\n runtime.registerModelContextProvider(clientRef.current!.modelContext()),\n [runtime],\n );\n\n return useResource(\n ThreadListClient({\n runtime: runtime.threads,\n __internal_assistantRuntime: runtime,\n }),\n );\n};\n\nexport const RuntimeAdapter = resource(useRuntimeAdapter);\n\n/**\n * The scope defaults `RuntimeAdapter` installs when it is used as the `threads`\n * config entry. Adapter packages that wrap a runtime in their own config entry\n * attach this to the wrapping resource for scope parity with `RuntimeAdapter`.\n */\nexport const runtimeAdapterTransformScopes = (\n scopes: ScopesConfig,\n parent: AssistantClient,\n): void => {\n baseRuntimeAdapterTransformScopes(scopes, parent);\n\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n};\n\nattachTransformScopes(useRuntimeAdapter, runtimeAdapterTransformScopes);\n"],"mappings":";;;;;;;;AAeA,MAAMY,qBAAoBC,YAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACxB,MAAAC,YAAkBR,sBAAsB;CAAE,IAAAS;CAAA,IAAAH,EAAA,OAAAE,aAAAF,EAAA,OAAAD,SAAA;EAIxCI,WACEJ,QAAOK,6BAA8BF,UAASG,QAAQC,aAAe,CAAC;EAACN,EAAA,KAAAE;EAAAF,EAAA,KAAAD;EAAAC,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAD,SAAA;EACzEQ,KAAA,CAACR,OAAO;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAJXL,wBACE,gBACAQ,IAEAI,EACF;CAAC,IAAAC;CAAA,IAAAR,EAAA,OAAAD,SAAA;EAGCS,KAAAhB,iBAAiB;GAAAO,SACNA,QAAOU;GAAQC,6BACKX;EAC/B,CAAC;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,OAJGd,YACLsB,EAIF;AAAC;AAGH,MAAaG,iBAAiBxB,SAASW,iBAAiB;;;;;;AAOxD,MAAac,iCACXC,QACAC,WACS;CACTvB,kCAAkCsB,QAAQC,MAAM;CAEhD,IAAI,CAACD,OAAOE,SAASD,OAAOC,MAAMC,WAAW,MAC3CH,OAAOE,QAAQlB,MAAM,CAAC,CAAC;CAGzB,IAAI,CAACgB,OAAOI,iBAAiBH,OAAOG,cAAcD,WAAW,MAC3DH,OAAOI,gBAAgBrB,cAAc;AAEzC;AAEAH,sBAAsBK,mBAAmBc,6BAA6B"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalStorageThreadListAdapter.d.ts","names":[],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"mappings":";;;;;;KA0BY;EACV,QAAQ,cAAc;EACtB,QAAQ,aAAa,gBAAgB;EACrC,WAAW,cAAc;;KAkCtB;EACH,SAAS;EACT;EACA,iBAAiB;;KAGd;EACH;EACA;EACA;EACA;EACA,SAAS;;cAwIE,4BACX,uBACC;cAoCU,+BACX,uBACC;cA0HU,4BACX,SAAS,+BACR"}
1
+ {"version":3,"file":"LocalStorageThreadListAdapter.d.ts","names":[],"sources":["../../../src/react/adapters/LocalStorageThreadListAdapter.tsx"],"mappings":";;;;;;KA6BY;EACV,QAAQ,cAAc;EACtB,QAAQ,aAAa,gBAAgB;EACrC,WAAW,cAAc;;KAkCtB;EACH,SAAS;EACT;EACA,iBAAiB;;KAGd;EACH;EACA;EACA;EACA;EACA,SAAS;;cAwIE,4BACX,uBACC;cAoCU,+BACX,uBACC;cAqIU,4BACX,SAAS,+BACR"}