@assistant-ui/core 0.3.17 → 0.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/dist/adapters/attachment.d.ts.map +1 -1
  2. package/dist/adapters/attachment.js +5 -4
  3. package/dist/adapters/attachment.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/internal.d.ts +3 -2
  7. package/dist/internal.js +3 -2
  8. package/dist/model-context/frame/host.d.ts.map +1 -1
  9. package/dist/model-context/frame/host.js +10 -4
  10. package/dist/model-context/frame/host.js.map +1 -1
  11. package/dist/model-context/frame/provider.d.ts +2 -0
  12. package/dist/model-context/frame/provider.d.ts.map +1 -1
  13. package/dist/model-context/frame/provider.js +30 -7
  14. package/dist/model-context/frame/provider.js.map +1 -1
  15. package/dist/model-context/interactable-composer-metadata.d.ts.map +1 -1
  16. package/dist/model-context/interactable-composer-metadata.js +16 -9
  17. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  18. package/dist/model-context/registry.d.ts.map +1 -1
  19. package/dist/model-context/registry.js +3 -5
  20. package/dist/model-context/registry.js.map +1 -1
  21. package/dist/model-context/types.d.ts.map +1 -1
  22. package/dist/model-context/types.js +5 -4
  23. package/dist/model-context/types.js.map +1 -1
  24. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  25. package/dist/react/client/InMemoryThreadList.js +62 -56
  26. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  27. package/dist/react/client/Interactables.d.ts.map +1 -1
  28. package/dist/react/client/Interactables.js +24 -27
  29. package/dist/react/client/Interactables.js.map +1 -1
  30. package/dist/react/client/RemoteThreadList.d.ts +1 -0
  31. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  32. package/dist/react/client/RemoteThreadList.js +151 -141
  33. package/dist/react/client/RemoteThreadList.js.map +1 -1
  34. package/dist/react/client/Tools.d.ts.map +1 -1
  35. package/dist/react/client/Tools.js +18 -16
  36. package/dist/react/client/Tools.js.map +1 -1
  37. package/dist/react/interactables-legacy/Interactables.js +242 -121
  38. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  39. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -1
  40. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +11 -9
  41. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -1
  42. package/dist/react/model-context/makeAssistantTool.d.ts +2 -2
  43. package/dist/react/model-context/makeAssistantTool.js +1 -1
  44. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  45. package/dist/react/model-context/useAssistantTool.d.ts +2 -2
  46. package/dist/react/model-context/useAssistantTool.js +1 -1
  47. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  48. package/dist/react/model-context/useToolArgsStatus.d.ts.map +1 -1
  49. package/dist/react/model-context/useToolArgsStatus.js +2 -1
  50. package/dist/react/model-context/useToolArgsStatus.js.map +1 -1
  51. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  52. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +16 -8
  53. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  54. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +5 -1
  55. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  56. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +103 -103
  57. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  58. package/dist/react/runtimes/RemoteThreadResource.d.ts +1 -0
  59. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  60. package/dist/react/runtimes/RemoteThreadResource.js +13 -11
  61. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  62. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +4 -1
  63. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  64. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +401 -34
  65. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  66. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.d.ts.map +1 -1
  67. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js +2 -1
  68. package/dist/react/runtimes/cloud/createCloudThreadListAdapter.js.map +1 -1
  69. package/dist/react/runtimes/useExternalStoreRuntime.js +75 -46
  70. package/dist/react/runtimes/useExternalStoreRuntime.js.map +1 -1
  71. package/dist/react/runtimes/useRemoteThreadListRuntime.d.ts.map +1 -1
  72. package/dist/react/runtimes/useRemoteThreadListRuntime.js +63 -23
  73. package/dist/react/runtimes/useRemoteThreadListRuntime.js.map +1 -1
  74. package/dist/runtime/api/thread-list-item-runtime.d.ts +7 -3
  75. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  76. package/dist/runtime/api/thread-list-item-runtime.js +2 -2
  77. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  78. package/dist/runtime/api/thread-list-runtime.d.ts +3 -0
  79. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  80. package/dist/runtime/api/thread-list-runtime.js +18 -14
  81. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  82. package/dist/runtime/api/thread-runtime.d.ts +4 -0
  83. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  84. package/dist/runtime/api/thread-runtime.js +1 -1
  85. package/dist/runtime/api/thread-runtime.js.map +1 -1
  86. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  87. package/dist/runtime/base/base-composer-runtime-core.js +16 -12
  88. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  89. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  90. package/dist/runtime/base/base-thread-runtime-core.js +6 -5
  91. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  92. package/dist/runtime/interfaces/composer-runtime-core.d.ts +12 -5
  93. package/dist/runtime/interfaces/composer-runtime-core.d.ts.map +1 -1
  94. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +4 -1
  95. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  96. package/dist/runtime/utils/external-message-conversion.js +1 -1
  97. package/dist/runtime/utils/external-message-conversion.js.map +1 -1
  98. package/dist/runtime/utils/message-repository.d.ts +1 -0
  99. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  100. package/dist/runtime/utils/message-repository.js +15 -6
  101. package/dist/runtime/utils/message-repository.js.map +1 -1
  102. package/dist/runtime/utils/thread-message-like.js +1 -1
  103. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  104. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  105. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +21 -27
  106. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  107. package/dist/runtimes/internal.d.ts +2 -2
  108. package/dist/runtimes/internal.js +2 -2
  109. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +18 -1
  110. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  111. package/dist/runtimes/remote-thread-list/remote-thread-state.js +130 -42
  112. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  113. package/dist/runtimes/remote-thread-list/title-generation.d.ts +49 -0
  114. package/dist/runtimes/remote-thread-list/title-generation.d.ts.map +1 -0
  115. package/dist/runtimes/remote-thread-list/title-generation.js +197 -0
  116. package/dist/runtimes/remote-thread-list/title-generation.js.map +1 -0
  117. package/dist/runtimes/remote-thread-list/title.d.ts +3 -1
  118. package/dist/runtimes/remote-thread-list/title.d.ts.map +1 -1
  119. package/dist/runtimes/remote-thread-list/title.js +9 -1
  120. package/dist/runtimes/remote-thread-list/title.js.map +1 -1
  121. package/dist/runtimes/remote-thread-list/types.d.ts +10 -0
  122. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  123. package/dist/store/clients/external-thread.d.ts.map +1 -1
  124. package/dist/store/clients/external-thread.js +19 -3
  125. package/dist/store/clients/external-thread.js.map +1 -1
  126. package/dist/store/clients/model-context-client.d.ts.map +1 -1
  127. package/dist/store/clients/model-context-client.js +2 -1
  128. package/dist/store/clients/model-context-client.js.map +1 -1
  129. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  130. package/dist/store/clients/single-thread-list.js +1 -0
  131. package/dist/store/clients/single-thread-list.js.map +1 -1
  132. package/dist/store/clients/suggestions.d.ts.map +1 -1
  133. package/dist/store/clients/suggestions.js +5 -4
  134. package/dist/store/clients/suggestions.js.map +1 -1
  135. package/dist/store/runtime-clients/composer-runtime-client.d.ts +1 -0
  136. package/dist/store/runtime-clients/composer-runtime-client.d.ts.map +1 -1
  137. package/dist/store/runtime-clients/composer-runtime-client.js +97 -61
  138. package/dist/store/runtime-clients/composer-runtime-client.js.map +1 -1
  139. package/dist/store/runtime-clients/message-runtime-client.d.ts +1 -0
  140. package/dist/store/runtime-clients/message-runtime-client.d.ts.map +1 -1
  141. package/dist/store/runtime-clients/message-runtime-client.js +221 -144
  142. package/dist/store/runtime-clients/message-runtime-client.js.map +1 -1
  143. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  144. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -1
  145. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  146. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  147. package/dist/store/runtime-clients/thread-list-runtime-client.js +54 -52
  148. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  149. package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
  150. package/dist/store/runtime-clients/thread-runtime-client.js +193 -121
  151. package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
  152. package/dist/store/scopes/composer.d.ts +10 -2
  153. package/dist/store/scopes/composer.d.ts.map +1 -1
  154. package/dist/store/scopes/message.d.ts +30 -1
  155. package/dist/store/scopes/message.d.ts.map +1 -1
  156. package/dist/store/scopes/thread-list-item.d.ts +2 -2
  157. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  158. package/dist/store/scopes/thread.d.ts +8 -0
  159. package/dist/store/scopes/thread.d.ts.map +1 -1
  160. package/dist/store/scopes/threads.d.ts +1 -0
  161. package/dist/store/scopes/threads.d.ts.map +1 -1
  162. package/dist/types/attachment.d.ts +2 -1
  163. package/dist/types/attachment.d.ts.map +1 -1
  164. package/dist/types/attachment.js +2 -1
  165. package/dist/types/attachment.js.map +1 -1
  166. package/dist/utils/abortable-iterable.d.ts +19 -0
  167. package/dist/utils/abortable-iterable.d.ts.map +1 -0
  168. package/dist/utils/abortable-iterable.js +72 -0
  169. package/dist/utils/abortable-iterable.js.map +1 -0
  170. package/dist/utils/composite-context-provider.d.ts.map +1 -1
  171. package/dist/utils/composite-context-provider.js +20 -2
  172. package/dist/utils/composite-context-provider.js.map +1 -1
  173. package/dist/utils/record.d.ts +11 -0
  174. package/dist/utils/record.d.ts.map +1 -0
  175. package/dist/utils/record.js +12 -0
  176. package/dist/utils/record.js.map +1 -0
  177. package/package.json +10 -10
  178. package/src/adapters/attachment.test.ts +50 -1
  179. package/src/adapters/attachment.ts +7 -4
  180. package/src/index.ts +1 -0
  181. package/src/internal.ts +4 -0
  182. package/src/model-context/frame/host.test.ts +24 -0
  183. package/src/model-context/frame/host.ts +10 -4
  184. package/src/model-context/frame/provider.test.ts +71 -0
  185. package/src/model-context/frame/provider.ts +37 -7
  186. package/src/model-context/interactable-composer-metadata.test.ts +28 -0
  187. package/src/model-context/interactable-composer-metadata.ts +9 -3
  188. package/src/model-context/registry.test.ts +12 -0
  189. package/src/model-context/registry.ts +3 -2
  190. package/src/model-context/types.test.ts +25 -0
  191. package/src/model-context/types.ts +9 -4
  192. package/src/react/RuntimeAdapter.test.ts +34 -0
  193. package/src/react/client/InMemoryThreadList.ts +1 -0
  194. package/src/react/client/Interactables.test.ts +28 -0
  195. package/src/react/client/Interactables.ts +15 -13
  196. package/src/react/client/RemoteThreadList.background.test.ts +148 -6
  197. package/src/react/client/RemoteThreadList.concurrent.test.tsx +42 -1
  198. package/src/react/client/RemoteThreadList.test.ts +345 -3
  199. package/src/react/client/RemoteThreadList.ts +166 -110
  200. package/src/react/client/Tools.ts +22 -11
  201. package/src/react/interactables-legacy/Interactables.ts +16 -16
  202. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +9 -10
  203. package/src/react/model-context/makeAssistantTool.ts +2 -2
  204. package/src/react/model-context/useAssistantTool.ts +2 -2
  205. package/src/react/model-context/useToolArgsStatus.test.tsx +30 -0
  206. package/src/react/model-context/useToolArgsStatus.ts +2 -1
  207. package/src/react/runtimes/RemoteThreadListHookInstanceManager.destroy.test.tsx +172 -0
  208. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +33 -0
  209. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +7 -1
  210. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +28 -5
  211. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.load-error.test.ts +132 -0
  212. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.switch-delete.test.ts +105 -0
  213. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +136 -111
  214. package/src/react/runtimes/RemoteThreadResource.test.ts +9 -0
  215. package/src/react/runtimes/RemoteThreadResource.ts +19 -12
  216. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +483 -6
  217. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +504 -68
  218. package/src/react/runtimes/cloud/createCloudThreadListAdapter.test.ts +15 -0
  219. package/src/react/runtimes/cloud/createCloudThreadListAdapter.ts +1 -0
  220. package/src/react/runtimes/useExternalStoreRuntime.lifecycle.test.tsx +41 -0
  221. package/src/react/runtimes/useExternalStoreRuntime.ts +10 -4
  222. package/src/react/runtimes/useLocalRuntime.test.tsx +20 -0
  223. package/src/react/runtimes/useRemoteThreadListRuntime.load-error.test.tsx +108 -0
  224. package/src/react/runtimes/useRemoteThreadListRuntime.ts +33 -0
  225. package/src/runtime/api/message-runtime.test.ts +75 -0
  226. package/src/runtime/api/thread-list-item-runtime.ts +10 -3
  227. package/src/runtime/api/thread-list-runtime.ts +21 -11
  228. package/src/runtime/api/thread-runtime.test.ts +78 -0
  229. package/src/runtime/api/thread-runtime.ts +8 -1
  230. package/src/runtime/base/base-composer-runtime-core.ts +36 -8
  231. package/src/runtime/base/base-thread-runtime-core.test.ts +55 -1
  232. package/src/runtime/base/base-thread-runtime-core.ts +6 -4
  233. package/src/runtime/interfaces/composer-runtime-core.ts +10 -5
  234. package/src/runtime/interfaces/thread-list-runtime-core.ts +5 -1
  235. package/src/runtime/utils/external-message-conversion.test.ts +68 -0
  236. package/src/runtime/utils/external-message-conversion.ts +1 -1
  237. package/src/runtime/utils/message-repository.ts +29 -17
  238. package/src/runtime/utils/thread-message-like.ts +1 -1
  239. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +18 -13
  240. package/src/runtimes/internal.ts +1 -0
  241. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +128 -2
  242. package/src/runtimes/remote-thread-list/remote-thread-state.ts +182 -42
  243. package/src/runtimes/remote-thread-list/title-generation.test.ts +602 -0
  244. package/src/runtimes/remote-thread-list/title-generation.ts +329 -0
  245. package/src/runtimes/remote-thread-list/title.test.ts +62 -0
  246. package/src/runtimes/remote-thread-list/title.ts +13 -0
  247. package/src/runtimes/remote-thread-list/types.ts +10 -0
  248. package/src/store/clients/external-thread.ts +48 -3
  249. package/src/store/clients/model-context-client.ts +5 -1
  250. package/src/store/clients/single-thread-list.ts +1 -0
  251. package/src/store/clients/suggestions.test.ts +40 -0
  252. package/src/store/clients/suggestions.ts +13 -10
  253. package/src/store/runtime-clients/composer-runtime-client.ts +42 -9
  254. package/src/store/runtime-clients/message-runtime-client.ts +54 -6
  255. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +4 -2
  256. package/src/store/runtime-clients/thread-list-runtime-client.ts +1 -0
  257. package/src/store/runtime-clients/thread-runtime-client.ts +58 -10
  258. package/src/store/scopes/composer.ts +16 -4
  259. package/src/store/scopes/message.ts +14 -0
  260. package/src/store/scopes/thread-list-item.ts +5 -2
  261. package/src/store/scopes/thread.ts +4 -0
  262. package/src/store/scopes/threads.ts +1 -0
  263. package/src/tests/MessageRepository.test.ts +116 -0
  264. package/src/tests/OptimisticState-list-race.test.ts +1 -0
  265. package/src/tests/RemoteThreadListThreadListRuntimeCore-initialize-adapter-change.test.ts +38 -0
  266. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +47 -0
  267. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +89 -0
  268. package/src/tests/attachment-adapters.test.ts +14 -0
  269. package/src/tests/base-composer-runtime-core.test.ts +39 -0
  270. package/src/tests/external-store-thread-list-runtime-core.test.ts +83 -0
  271. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +27 -18
  272. package/src/tests/external-thread-attachments.test.tsx +139 -0
  273. package/src/tests/external-thread-parity.test.tsx +23 -0
  274. package/src/tests/remote-thread-list-isLoading.test.ts +1 -0
  275. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
  276. package/src/tests/thread-switch-events.test.tsx +78 -0
  277. package/src/tests/tools-scope-migration.test.tsx +28 -0
  278. package/src/types/attachment.ts +4 -0
  279. package/src/utils/abortable-iterable.test.ts +213 -0
  280. package/src/utils/abortable-iterable.ts +93 -0
  281. package/src/utils/composite-context-provider.test.ts +25 -0
  282. package/src/utils/composite-context-provider.ts +23 -2
  283. package/src/utils/record.test.ts +48 -0
  284. package/src/utils/record.ts +11 -0
@@ -1 +1 @@
1
- {"version":3,"file":"interactable-composer-metadata.d.ts","names":[],"sources":["../../src/model-context/interactable-composer-metadata.ts"],"mappings":";;;;;KAOY;EACV;EACA;EACA;;;;;;EAMA;;;;;;;KAQG;EACH;EACA;EACA;;;;;;;;;;;iBAYc,kCAAkC;EAChD;IACE;;;;;;iBAgBY,oCACd,OAAO;;iBASO,qBAAqB;;;;;;iBA0DrB,8BACd,eACA,kBACA;EAEM;;;;;;EAMA,aAAa;EACb,gBAAgB;;;;;;KAgGZ;;EAEV;EACA;;EAEA;;;;;;;;;;;;;;;;;;iBA0Bc,iCACd,mBAAmB,0BACnB,YACA,eACC;;;;;iBAwEa,oBACd,mBAAmB,0BACnB,YACA;EACG;;;;;;;;;iBAaW,iCACd,MAAM,qCACN,mBAAmB,2BAClB"}
1
+ {"version":3,"file":"interactable-composer-metadata.d.ts","names":[],"sources":["../../src/model-context/interactable-composer-metadata.ts"],"mappings":";;;;;KAOY;EACV;EACA;EACA;;;;;;EAMA;;;;;;;KAQG;EACH;EACA;EACA;;;;;;;;;;;iBAYc,kCAAkC;EAChD;IACE;;;;;;iBAgBY,oCACd,OAAO;;iBASO,qBAAqB;;;;;;iBAgErB,8BACd,eACA,kBACA;EAEM;;;;;;EAMA,aAAa;EACb,gBAAgB;;;;;;KAgGZ;;EAEV;EACA;;EAEA;;;;;;;;;;;;;;;;;;iBA0Bc,iCACd,mBAAmB,0BACnB,YACA,eACC;;;;;iBAwEa,oBACd,mBAAmB,0BACnB,YACA;EACG;;;;;;;;;iBAaW,iCACd,MAAM,qCACN,mBAAmB,2BAClB"}
@@ -47,15 +47,22 @@ function applyArrayUpdate(prev, update, mintId) {
47
47
  });
48
48
  }
49
49
  const patches = update.update;
50
- if (Array.isArray(patches) && patches.length > 0) next = next.map((item) => {
51
- const id = getArrayItemId(item);
52
- if (id === void 0 || !isRecord(item)) return item;
53
- const patch = patches.find((candidate) => isRecord(candidate) && candidate.id === id);
54
- return patch ? {
55
- ...item,
56
- ...patch
57
- } : item;
58
- });
50
+ if (Array.isArray(patches) && patches.length > 0) {
51
+ const patchesById = /* @__PURE__ */ new Map();
52
+ for (const candidate of patches) {
53
+ const id = getArrayItemId(candidate);
54
+ if (id !== void 0 && !Number.isNaN(id) && !patchesById.has(id)) patchesById.set(id, candidate);
55
+ }
56
+ next = next.map((item) => {
57
+ const id = getArrayItemId(item);
58
+ if (id === void 0 || !isRecord(item)) return item;
59
+ const patch = patchesById.get(id);
60
+ return patch ? {
61
+ ...item,
62
+ ...patch
63
+ } : item;
64
+ });
65
+ }
59
66
  if (Array.isArray(update.add) && update.add.length > 0) {
60
67
  const added = mintId ? update.add.map((item) => {
61
68
  if (!isRecord(item) || item.id !== void 0) return item;
@@ -1 +1 @@
1
- {"version":3,"file":"interactable-composer-metadata.js","names":["isJSONValueEqual","isJSONValue","isRecord","Unstable_InteractableSnapshotEntry","id","name","state","partial","SnapshotCarrierMessage","role","metadata","content","unstable_getInteractableSnapshots","message","undefined","custom","Record","items","interactables","Array","isArray","unstable_formatInteractableSnapshot","entry","JSON","stringify","interactableToolName","replace","getArrayItemId","item","applyArrayUpdate","prev","update","mintId","next","set","clear","remove","length","ids","Set","filter","has","patches","map","patch","find","candidate","add","added","shallowMergeInteractableState","options","arrayBaseline","idFactory","field","idKeyedFields","ReadonlySet","baseline","key","value","Object","entries","baseValue","shallowDiffInteractableState","known","keys","diff","changed","ToolCallLikePart","type","toolCallId","toolName","args","result","asToolCallPart","part","p","updateCallTargets","success","argsId","createAddedItemIdFactory","addedItemIds","idsByField","Map","stringIds","size","get","shift","Unstable_InteractableVersion","origin","versionsCache","WeakMap","unstable_getInteractableVersions","messages","byName","byId","cached","versions","current","msg","it","push","_id","findModelKnownState","last","gateInteractableComposerMetadata","meta","rest","gated","pending","process","env","NODE_ENV","console","warn"],"sources":["../../src/model-context/interactable-composer-metadata.ts"],"sourcesContent":["import { isJSONValueEqual } from \"../utils/json/is-json-equal\";\nimport { isJSONValue, isRecord } from \"../utils/json/is-json\";\n\n/**\n * Unstable / Experimental — the interactables API is still evolving and may change in any release.\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport type Unstable_InteractableSnapshotEntry = {\n id: string;\n name: string;\n state: unknown;\n /**\n * When true, `state` carries only the top-level fields that changed since\n * the model's last known state; omitted fields are unchanged. The first\n * snapshot of an instance is always full.\n */\n partial?: boolean | undefined;\n};\n\n/**\n * Minimal message shape needed to read snapshots and `update_*` tool calls out\n * of history. Structurally compatible with both `ThreadMessage` and the AI\n * SDK's `UIMessage`.\n */\ntype SnapshotCarrierMessage = {\n role: string;\n metadata?: unknown;\n content?: readonly unknown[] | undefined;\n};\n\n/**\n * Reads the interactable snapshots stamped on a message's\n * `metadata.custom.interactables`, or `undefined` if none. This is the read\n * half of the snapshot channel — integrations use it to surface interactable\n * state to the model (see `unstable_injectInteractableContext` in\n * `@assistant-ui/ai-sdk` for the AI SDK implementation).\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport function unstable_getInteractableSnapshots(message: {\n metadata?: unknown;\n}): Unstable_InteractableSnapshotEntry[] | undefined {\n const metadata = message.metadata;\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const custom = (metadata as Record<string, unknown>).custom;\n if (!custom || typeof custom !== \"object\") return undefined;\n const items = (custom as Record<string, unknown>).interactables;\n return Array.isArray(items)\n ? (items as Unstable_InteractableSnapshotEntry[])\n : undefined;\n}\n\n/**\n * Canonical model-facing wording for one snapshot entry.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport function unstable_formatInteractableSnapshot(\n entry: Unstable_InteractableSnapshotEntry,\n): string {\n if (entry.partial) {\n return `[State of \"${entry.name}\" (id: ${JSON.stringify(entry.id)}) changed — updated fields: ${JSON.stringify(entry.state)}; fields not listed are unchanged]`;\n }\n return `[Current state of \"${entry.name}\" (id: ${JSON.stringify(entry.id)}): ${JSON.stringify(entry.state)}]`;\n}\n\n/** The model-facing tool name for an interactable `name`. One tool per name. */\nexport function interactableToolName(name: string): string {\n return `update_${name.replace(/[^a-zA-Z0-9_-]/g, \"_\")}`;\n}\n\nconst getArrayItemId = (item: unknown): string | number | undefined => {\n if (!isRecord(item)) return undefined;\n const id = item.id;\n return typeof id === \"string\" || typeof id === \"number\" ? id : undefined;\n};\n\nfunction applyArrayUpdate(\n prev: unknown[],\n update: Record<string, unknown>,\n mintId?: () => string | undefined,\n) {\n let next = Array.isArray(update.set) ? [...update.set] : [...prev];\n\n if (update.clear === true) next = [];\n\n if (Array.isArray(update.remove) && update.remove.length > 0) {\n const ids = new Set(update.remove);\n next = next.filter((item) => {\n const id = getArrayItemId(item);\n return id !== undefined ? !ids.has(id) : !ids.has(item);\n });\n }\n\n const patches = update.update;\n if (Array.isArray(patches) && patches.length > 0) {\n next = next.map((item) => {\n const id = getArrayItemId(item);\n if (id === undefined || !isRecord(item)) return item;\n const patch = patches.find(\n (candidate) => isRecord(candidate) && candidate.id === id,\n );\n return patch ? { ...item, ...patch } : item;\n });\n }\n\n if (Array.isArray(update.add) && update.add.length > 0) {\n const added = mintId\n ? update.add.map((item) => {\n if (!isRecord(item) || item.id !== undefined) return item;\n const id = mintId();\n return id === undefined ? item : { ...item, id };\n })\n : update.add;\n next = [...next, ...added];\n }\n\n return next;\n}\n\n/**\n * The merge `update_*` tools apply: top-level keys replace, rest preserved.\n * Array fields also accept operation objects (`add`, `update`, `remove`,\n * `clear`, `set`) so collection edits do not need a companion manage_* tool.\n */\nexport function shallowMergeInteractableState(\n prev: unknown,\n partial: unknown,\n options?:\n | {\n arrayBaseline?: unknown;\n /**\n * Supplies ids for added items in id-keyed array fields. The live\n * execute path mints fresh ids; history folds replay ids previously\n * returned by execute.\n */\n idFactory?: (field: string) => string | undefined;\n idKeyedFields?: ReadonlySet<string>;\n }\n | undefined,\n): unknown {\n if (!isRecord(prev) || !isRecord(partial)) return partial;\n const baseline = isRecord(options?.arrayBaseline)\n ? options.arrayBaseline\n : prev;\n const next = { ...prev };\n for (const [key, value] of Object.entries(partial)) {\n const baseValue = baseline[key];\n if (Array.isArray(baseValue) && isRecord(value)) {\n const mintId =\n options?.idFactory &&\n (options.idKeyedFields === undefined || options.idKeyedFields.has(key))\n ? () => options.idFactory?.(key)\n : undefined;\n next[key] = applyArrayUpdate(baseValue, value, mintId);\n } else {\n next[key] = value;\n }\n }\n return next;\n}\n\n/**\n * The top-level fields of `next` that differ from `known`, for stamping a\n * partial snapshot. Returns `undefined` when a partial stamp has no benefit:\n * the change is not expressible as a shallow merge (non-object states, or a\n * top-level key was removed), or every field changed anyway — the caller\n * falls back to a full snapshot.\n */\nfunction shallowDiffInteractableState(\n known: unknown,\n next: unknown,\n): Record<string, unknown> | undefined {\n if (!isRecord(known) || !isRecord(next)) return undefined;\n for (const key of Object.keys(known)) {\n if (!(key in next)) return undefined;\n }\n const diff: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(next)) {\n if (!(key in known) || !isJSONValueEqual(known[key], value)) {\n diff[key] = value;\n }\n }\n const changed = Object.keys(diff).length;\n if (changed === 0 || changed === Object.keys(next).length) return undefined;\n return diff;\n}\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n};\n\nconst asToolCallPart = (part: unknown): ToolCallLikePart | undefined => {\n if (!part || typeof part !== \"object\") return undefined;\n const p = part as ToolCallLikePart;\n return p.type === \"tool-call\" ? p : undefined;\n};\n\n/** Whether an accepted `update_*` call addressed instance `id`. */\nconst updateCallTargets = (p: ToolCallLikePart, id: string): boolean => {\n if (!p.args || typeof p.args !== \"object\") return false;\n const result = isRecord(p.result) ? p.result : undefined;\n if (result?.success === false) return false;\n if (typeof result?.id === \"string\") return result.id === id;\n const argsId = (p.args as Record<string, unknown>).id;\n return argsId === id || argsId === undefined;\n};\n\nconst createAddedItemIdFactory = (result: unknown) => {\n const value = isRecord(result) ? result.addedItemIds : undefined;\n if (!isRecord(value)) return undefined;\n\n const idsByField = new Map<string, string[]>();\n for (const [field, ids] of Object.entries(value)) {\n if (!Array.isArray(ids)) continue;\n const stringIds = ids.filter(\n (item): item is string => typeof item === \"string\",\n );\n if (stringIds.length > 0) idsByField.set(field, stringIds);\n }\n if (idsByField.size === 0) return undefined;\n\n return (field: string) => idsByField.get(field)?.shift();\n};\n\n/**\n * Unstable / Experimental — the interactables API is still evolving and may change in any release.\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport type Unstable_InteractableVersion = {\n /** The full state as of this version. */\n state: unknown;\n origin: \"create\" | \"update\" | \"user-edit\";\n /** For create/update versions, the tool call that produced this version. */\n toolCallId?: string | undefined;\n};\n\n// Without this, every mounted anchor re-folds the whole thread on each streaming\n// token, since the repository hands out a new messages array per token.\nconst versionsCache = new WeakMap<\n readonly SnapshotCarrierMessage[],\n Map<string, Map<string, Unstable_InteractableVersion[]>>\n>();\n\n/**\n * Every version of interactable `id` recorded in the thread, oldest first,\n * folded chronologically:\n *\n * - the tool call whose `toolCallId` equals `id` seeds the baseline with its\n * args (`origin: \"create\"`) — the `id: toolCallId` convention for\n * tool-created interactables,\n * - a snapshot stamped on a user message is a `\"user-edit\"` version (a full\n * snapshot replaces the state; a partial one shallow-merges),\n * - each accepted `update_*` call shallow-merges an `\"update\"` version.\n *\n * The last entry is the state the model knows. Partial snapshots and update\n * calls with no baseline to merge into are skipped.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport function unstable_getInteractableVersions(\n messages: readonly SnapshotCarrierMessage[],\n id: string,\n name: string,\n): Unstable_InteractableVersion[] {\n let byName = versionsCache.get(messages);\n if (!byName) {\n byName = new Map();\n versionsCache.set(messages, byName);\n }\n let byId = byName.get(name);\n if (!byId) {\n byId = new Map();\n byName.set(name, byId);\n }\n const cached = byId.get(id);\n if (cached) return cached;\n\n const toolName = interactableToolName(name);\n const versions: Unstable_InteractableVersion[] = [];\n const current = () => versions[versions.length - 1];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const entry = unstable_getInteractableSnapshots(msg)?.find(\n (it) => it.id === id,\n );\n if (!entry) continue;\n if (entry.partial) {\n const prev = current();\n if (prev) {\n versions.push({\n state: shallowMergeInteractableState(prev.state, entry.state),\n origin: \"user-edit\",\n });\n }\n } else {\n versions.push({ state: entry.state, origin: \"user-edit\" });\n }\n continue;\n }\n\n if (msg.role !== \"assistant\") continue;\n for (const part of msg.content ?? []) {\n const p = asToolCallPart(part);\n if (!p) continue;\n if (p.toolCallId === id && p.toolName === name) {\n if (p.args && typeof p.args === \"object\") {\n versions.push({ state: p.args, origin: \"create\", toolCallId: id });\n }\n } else if (p.toolName === toolName && updateCallTargets(p, id)) {\n const prev = current();\n if (prev) {\n const { id: _id, ...partial } = p.args as Record<string, unknown>;\n const idFactory = createAddedItemIdFactory(p.result);\n versions.push({\n state: idFactory\n ? shallowMergeInteractableState(prev.state, partial, {\n idFactory,\n })\n : shallowMergeInteractableState(prev.state, partial),\n origin: \"update\",\n toolCallId: p.toolCallId,\n });\n }\n }\n }\n }\n byId.set(id, versions);\n return versions;\n}\n\n/**\n * The state the model knows for interactable `id` — its latest recorded\n * version, or `undefined` when no baseline exists yet.\n */\nexport function findModelKnownState(\n messages: readonly SnapshotCarrierMessage[],\n id: string,\n name: string,\n): { state: unknown } | undefined {\n const versions = unstable_getInteractableVersions(messages, id, name);\n const last = versions[versions.length - 1];\n return last ? { state: last.state } : undefined;\n}\n\n/**\n * Snapshot gate. Stamps an interactable only when the model doesn't already\n * know its state (no baseline yet, or the live state differs from the folded\n * thread record). A change that fits a shallow merge is stamped as a partial\n * snapshot carrying just the changed fields; otherwise the full state is\n * stamped. Other metadata keys pass through untouched.\n */\nexport function gateInteractableComposerMetadata(\n meta: Record<string, unknown> | undefined,\n messages: readonly SnapshotCarrierMessage[],\n): Record<string, unknown> | undefined {\n if (!meta) return undefined;\n const { interactables, ...rest } = meta as {\n interactables?: Unstable_InteractableSnapshotEntry[];\n } & Record<string, unknown>;\n\n const gated: Record<string, unknown> = { ...rest };\n if (Array.isArray(interactables)) {\n const pending: Unstable_InteractableSnapshotEntry[] = [];\n for (const it of interactables) {\n if (process.env.NODE_ENV !== \"production\" && !isJSONValue(it.state)) {\n console.warn(\n `[Interactables] state for \"${it.name}\" (${it.id}) is not JSON-equatable ` +\n `(an undefined, NaN, Infinity, function, or symbol value?). It will be ` +\n `re-snapshotted on every send, recreating per-message growth. Use plain ` +\n `JSON values.`,\n );\n }\n const known = findModelKnownState(messages, it.id, it.name);\n if (!known) {\n pending.push({ id: it.id, name: it.name, state: it.state });\n continue;\n }\n if (isJSONValueEqual(it.state, known.state)) continue;\n const diff = shallowDiffInteractableState(known.state, it.state);\n pending.push(\n diff\n ? { id: it.id, name: it.name, state: diff, partial: true }\n : { id: it.id, name: it.name, state: it.state },\n );\n }\n if (pending.length) gated.interactables = pending;\n }\n return Object.keys(gated).length ? gated : undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"interactable-composer-metadata.js","names":["isJSONValueEqual","isJSONValue","isRecord","Unstable_InteractableSnapshotEntry","id","name","state","partial","SnapshotCarrierMessage","role","metadata","content","unstable_getInteractableSnapshots","message","undefined","custom","Record","items","interactables","Array","isArray","unstable_formatInteractableSnapshot","entry","JSON","stringify","interactableToolName","replace","getArrayItemId","item","applyArrayUpdate","prev","update","mintId","next","set","clear","remove","length","ids","Set","filter","has","patches","patchesById","Map","candidate","Number","isNaN","map","patch","get","add","added","shallowMergeInteractableState","options","arrayBaseline","idFactory","field","idKeyedFields","ReadonlySet","baseline","key","value","Object","entries","baseValue","shallowDiffInteractableState","known","keys","diff","changed","ToolCallLikePart","type","toolCallId","toolName","args","result","asToolCallPart","part","p","updateCallTargets","success","argsId","createAddedItemIdFactory","addedItemIds","idsByField","stringIds","size","shift","Unstable_InteractableVersion","origin","versionsCache","WeakMap","unstable_getInteractableVersions","messages","byName","byId","cached","versions","current","msg","find","it","push","_id","findModelKnownState","last","gateInteractableComposerMetadata","meta","rest","gated","pending","process","env","NODE_ENV","console","warn"],"sources":["../../src/model-context/interactable-composer-metadata.ts"],"sourcesContent":["import { isJSONValueEqual } from \"../utils/json/is-json-equal\";\nimport { isJSONValue, isRecord } from \"../utils/json/is-json\";\n\n/**\n * Unstable / Experimental — the interactables API is still evolving and may change in any release.\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport type Unstable_InteractableSnapshotEntry = {\n id: string;\n name: string;\n state: unknown;\n /**\n * When true, `state` carries only the top-level fields that changed since\n * the model's last known state; omitted fields are unchanged. The first\n * snapshot of an instance is always full.\n */\n partial?: boolean | undefined;\n};\n\n/**\n * Minimal message shape needed to read snapshots and `update_*` tool calls out\n * of history. Structurally compatible with both `ThreadMessage` and the AI\n * SDK's `UIMessage`.\n */\ntype SnapshotCarrierMessage = {\n role: string;\n metadata?: unknown;\n content?: readonly unknown[] | undefined;\n};\n\n/**\n * Reads the interactable snapshots stamped on a message's\n * `metadata.custom.interactables`, or `undefined` if none. This is the read\n * half of the snapshot channel — integrations use it to surface interactable\n * state to the model (see `unstable_injectInteractableContext` in\n * `@assistant-ui/ai-sdk` for the AI SDK implementation).\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport function unstable_getInteractableSnapshots(message: {\n metadata?: unknown;\n}): Unstable_InteractableSnapshotEntry[] | undefined {\n const metadata = message.metadata;\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const custom = (metadata as Record<string, unknown>).custom;\n if (!custom || typeof custom !== \"object\") return undefined;\n const items = (custom as Record<string, unknown>).interactables;\n return Array.isArray(items)\n ? (items as Unstable_InteractableSnapshotEntry[])\n : undefined;\n}\n\n/**\n * Canonical model-facing wording for one snapshot entry.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport function unstable_formatInteractableSnapshot(\n entry: Unstable_InteractableSnapshotEntry,\n): string {\n if (entry.partial) {\n return `[State of \"${entry.name}\" (id: ${JSON.stringify(entry.id)}) changed — updated fields: ${JSON.stringify(entry.state)}; fields not listed are unchanged]`;\n }\n return `[Current state of \"${entry.name}\" (id: ${JSON.stringify(entry.id)}): ${JSON.stringify(entry.state)}]`;\n}\n\n/** The model-facing tool name for an interactable `name`. One tool per name. */\nexport function interactableToolName(name: string): string {\n return `update_${name.replace(/[^a-zA-Z0-9_-]/g, \"_\")}`;\n}\n\nconst getArrayItemId = (item: unknown): string | number | undefined => {\n if (!isRecord(item)) return undefined;\n const id = item.id;\n return typeof id === \"string\" || typeof id === \"number\" ? id : undefined;\n};\n\nfunction applyArrayUpdate(\n prev: unknown[],\n update: Record<string, unknown>,\n mintId?: () => string | undefined,\n) {\n let next = Array.isArray(update.set) ? [...update.set] : [...prev];\n\n if (update.clear === true) next = [];\n\n if (Array.isArray(update.remove) && update.remove.length > 0) {\n const ids = new Set(update.remove);\n next = next.filter((item) => {\n const id = getArrayItemId(item);\n return id !== undefined ? !ids.has(id) : !ids.has(item);\n });\n }\n\n const patches = update.update;\n if (Array.isArray(patches) && patches.length > 0) {\n const patchesById = new Map<string | number, Record<string, unknown>>();\n for (const candidate of patches) {\n const id = getArrayItemId(candidate);\n if (id !== undefined && !Number.isNaN(id) && !patchesById.has(id)) {\n patchesById.set(id, candidate as Record<string, unknown>);\n }\n }\n\n next = next.map((item) => {\n const id = getArrayItemId(item);\n if (id === undefined || !isRecord(item)) return item;\n const patch = patchesById.get(id);\n return patch ? { ...item, ...patch } : item;\n });\n }\n\n if (Array.isArray(update.add) && update.add.length > 0) {\n const added = mintId\n ? update.add.map((item) => {\n if (!isRecord(item) || item.id !== undefined) return item;\n const id = mintId();\n return id === undefined ? item : { ...item, id };\n })\n : update.add;\n next = [...next, ...added];\n }\n\n return next;\n}\n\n/**\n * The merge `update_*` tools apply: top-level keys replace, rest preserved.\n * Array fields also accept operation objects (`add`, `update`, `remove`,\n * `clear`, `set`) so collection edits do not need a companion manage_* tool.\n */\nexport function shallowMergeInteractableState(\n prev: unknown,\n partial: unknown,\n options?:\n | {\n arrayBaseline?: unknown;\n /**\n * Supplies ids for added items in id-keyed array fields. The live\n * execute path mints fresh ids; history folds replay ids previously\n * returned by execute.\n */\n idFactory?: (field: string) => string | undefined;\n idKeyedFields?: ReadonlySet<string>;\n }\n | undefined,\n): unknown {\n if (!isRecord(prev) || !isRecord(partial)) return partial;\n const baseline = isRecord(options?.arrayBaseline)\n ? options.arrayBaseline\n : prev;\n const next = { ...prev };\n for (const [key, value] of Object.entries(partial)) {\n const baseValue = baseline[key];\n if (Array.isArray(baseValue) && isRecord(value)) {\n const mintId =\n options?.idFactory &&\n (options.idKeyedFields === undefined || options.idKeyedFields.has(key))\n ? () => options.idFactory?.(key)\n : undefined;\n next[key] = applyArrayUpdate(baseValue, value, mintId);\n } else {\n next[key] = value;\n }\n }\n return next;\n}\n\n/**\n * The top-level fields of `next` that differ from `known`, for stamping a\n * partial snapshot. Returns `undefined` when a partial stamp has no benefit:\n * the change is not expressible as a shallow merge (non-object states, or a\n * top-level key was removed), or every field changed anyway — the caller\n * falls back to a full snapshot.\n */\nfunction shallowDiffInteractableState(\n known: unknown,\n next: unknown,\n): Record<string, unknown> | undefined {\n if (!isRecord(known) || !isRecord(next)) return undefined;\n for (const key of Object.keys(known)) {\n if (!(key in next)) return undefined;\n }\n const diff: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(next)) {\n if (!(key in known) || !isJSONValueEqual(known[key], value)) {\n diff[key] = value;\n }\n }\n const changed = Object.keys(diff).length;\n if (changed === 0 || changed === Object.keys(next).length) return undefined;\n return diff;\n}\n\ntype ToolCallLikePart = {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n};\n\nconst asToolCallPart = (part: unknown): ToolCallLikePart | undefined => {\n if (!part || typeof part !== \"object\") return undefined;\n const p = part as ToolCallLikePart;\n return p.type === \"tool-call\" ? p : undefined;\n};\n\n/** Whether an accepted `update_*` call addressed instance `id`. */\nconst updateCallTargets = (p: ToolCallLikePart, id: string): boolean => {\n if (!p.args || typeof p.args !== \"object\") return false;\n const result = isRecord(p.result) ? p.result : undefined;\n if (result?.success === false) return false;\n if (typeof result?.id === \"string\") return result.id === id;\n const argsId = (p.args as Record<string, unknown>).id;\n return argsId === id || argsId === undefined;\n};\n\nconst createAddedItemIdFactory = (result: unknown) => {\n const value = isRecord(result) ? result.addedItemIds : undefined;\n if (!isRecord(value)) return undefined;\n\n const idsByField = new Map<string, string[]>();\n for (const [field, ids] of Object.entries(value)) {\n if (!Array.isArray(ids)) continue;\n const stringIds = ids.filter(\n (item): item is string => typeof item === \"string\",\n );\n if (stringIds.length > 0) idsByField.set(field, stringIds);\n }\n if (idsByField.size === 0) return undefined;\n\n return (field: string) => idsByField.get(field)?.shift();\n};\n\n/**\n * Unstable / Experimental — the interactables API is still evolving and may change in any release.\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport type Unstable_InteractableVersion = {\n /** The full state as of this version. */\n state: unknown;\n origin: \"create\" | \"update\" | \"user-edit\";\n /** For create/update versions, the tool call that produced this version. */\n toolCallId?: string | undefined;\n};\n\n// Without this, every mounted anchor re-folds the whole thread on each streaming\n// token, since the repository hands out a new messages array per token.\nconst versionsCache = new WeakMap<\n readonly SnapshotCarrierMessage[],\n Map<string, Map<string, Unstable_InteractableVersion[]>>\n>();\n\n/**\n * Every version of interactable `id` recorded in the thread, oldest first,\n * folded chronologically:\n *\n * - the tool call whose `toolCallId` equals `id` seeds the baseline with its\n * args (`origin: \"create\"`) — the `id: toolCallId` convention for\n * tool-created interactables,\n * - a snapshot stamped on a user message is a `\"user-edit\"` version (a full\n * snapshot replaces the state; a partial one shallow-merges),\n * - each accepted `update_*` call shallow-merges an `\"update\"` version.\n *\n * The last entry is the state the model knows. Partial snapshots and update\n * calls with no baseline to merge into are skipped.\n *\n * @deprecated Unstable / Experimental (not actually removed).\n */\nexport function unstable_getInteractableVersions(\n messages: readonly SnapshotCarrierMessage[],\n id: string,\n name: string,\n): Unstable_InteractableVersion[] {\n let byName = versionsCache.get(messages);\n if (!byName) {\n byName = new Map();\n versionsCache.set(messages, byName);\n }\n let byId = byName.get(name);\n if (!byId) {\n byId = new Map();\n byName.set(name, byId);\n }\n const cached = byId.get(id);\n if (cached) return cached;\n\n const toolName = interactableToolName(name);\n const versions: Unstable_InteractableVersion[] = [];\n const current = () => versions[versions.length - 1];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const entry = unstable_getInteractableSnapshots(msg)?.find(\n (it) => it.id === id,\n );\n if (!entry) continue;\n if (entry.partial) {\n const prev = current();\n if (prev) {\n versions.push({\n state: shallowMergeInteractableState(prev.state, entry.state),\n origin: \"user-edit\",\n });\n }\n } else {\n versions.push({ state: entry.state, origin: \"user-edit\" });\n }\n continue;\n }\n\n if (msg.role !== \"assistant\") continue;\n for (const part of msg.content ?? []) {\n const p = asToolCallPart(part);\n if (!p) continue;\n if (p.toolCallId === id && p.toolName === name) {\n if (p.args && typeof p.args === \"object\") {\n versions.push({ state: p.args, origin: \"create\", toolCallId: id });\n }\n } else if (p.toolName === toolName && updateCallTargets(p, id)) {\n const prev = current();\n if (prev) {\n const { id: _id, ...partial } = p.args as Record<string, unknown>;\n const idFactory = createAddedItemIdFactory(p.result);\n versions.push({\n state: idFactory\n ? shallowMergeInteractableState(prev.state, partial, {\n idFactory,\n })\n : shallowMergeInteractableState(prev.state, partial),\n origin: \"update\",\n toolCallId: p.toolCallId,\n });\n }\n }\n }\n }\n byId.set(id, versions);\n return versions;\n}\n\n/**\n * The state the model knows for interactable `id` — its latest recorded\n * version, or `undefined` when no baseline exists yet.\n */\nexport function findModelKnownState(\n messages: readonly SnapshotCarrierMessage[],\n id: string,\n name: string,\n): { state: unknown } | undefined {\n const versions = unstable_getInteractableVersions(messages, id, name);\n const last = versions[versions.length - 1];\n return last ? { state: last.state } : undefined;\n}\n\n/**\n * Snapshot gate. Stamps an interactable only when the model doesn't already\n * know its state (no baseline yet, or the live state differs from the folded\n * thread record). A change that fits a shallow merge is stamped as a partial\n * snapshot carrying just the changed fields; otherwise the full state is\n * stamped. Other metadata keys pass through untouched.\n */\nexport function gateInteractableComposerMetadata(\n meta: Record<string, unknown> | undefined,\n messages: readonly SnapshotCarrierMessage[],\n): Record<string, unknown> | undefined {\n if (!meta) return undefined;\n const { interactables, ...rest } = meta as {\n interactables?: Unstable_InteractableSnapshotEntry[];\n } & Record<string, unknown>;\n\n const gated: Record<string, unknown> = { ...rest };\n if (Array.isArray(interactables)) {\n const pending: Unstable_InteractableSnapshotEntry[] = [];\n for (const it of interactables) {\n if (process.env.NODE_ENV !== \"production\" && !isJSONValue(it.state)) {\n console.warn(\n `[Interactables] state for \"${it.name}\" (${it.id}) is not JSON-equatable ` +\n `(an undefined, NaN, Infinity, function, or symbol value?). It will be ` +\n `re-snapshotted on every send, recreating per-message growth. Use plain ` +\n `JSON values.`,\n );\n }\n const known = findModelKnownState(messages, it.id, it.name);\n if (!known) {\n pending.push({ id: it.id, name: it.name, state: it.state });\n continue;\n }\n if (isJSONValueEqual(it.state, known.state)) continue;\n const diff = shallowDiffInteractableState(known.state, it.state);\n pending.push(\n diff\n ? { id: it.id, name: it.name, state: diff, partial: true }\n : { id: it.id, name: it.name, state: it.state },\n );\n }\n if (pending.length) gated.interactables = pending;\n }\n return Object.keys(gated).length ? gated : undefined;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/model-context/registry.ts"],"mappings":";;;;cAgBa,gCAAgC;UACnC;UACA;UACA;UACA;;EAQR,mBAAmB;EA+CnB,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
+ {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/model-context/registry.ts"],"mappings":";;;;cAiBa,gCAAgC;UACnC;UACA;UACA;UACA;;EAQR,mBAAmB;EA+CnB,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,3 +1,4 @@
1
+ import { nullProtoRecord } from "../utils/record.js";
1
2
  import { notifySubscribers } from "../subscribable/subscribable.js";
2
3
  import { CompositeContextProvider } from "../utils/composite-context-provider.js";
3
4
  //#region src/model-context/registry.ts
@@ -14,7 +15,7 @@ var ModelContextRegistry = class {
14
15
  getModelContext() {
15
16
  const instructions = Array.from(this._instructions.values()).filter(Boolean);
16
17
  const system = instructions.length > 0 ? instructions.join("\n\n") : void 0;
17
- const tools = {};
18
+ const tools = nullProtoRecord();
18
19
  for (const toolProps of this._tools.values()) {
19
20
  const { toolName, render, ...tool } = toolProps;
20
21
  tools[toolName] = tool;
@@ -25,10 +26,7 @@ var ModelContextRegistry = class {
25
26
  tools: Object.keys(tools).length > 0 ? tools : void 0
26
27
  };
27
28
  if (providerContexts.system) context.system = context.system ? `${context.system}\n\n${providerContexts.system}` : providerContexts.system;
28
- if (providerContexts.tools) context.tools = {
29
- ...context.tools || {},
30
- ...providerContexts.tools
31
- };
29
+ if (providerContexts.tools) context.tools = nullProtoRecord(context.tools, providerContexts.tools);
32
30
  if (providerContexts.callSettings) context.callSettings = providerContexts.callSettings;
33
31
  if (providerContexts.config) context.config = providerContexts.config;
34
32
  if (providerContexts.unstable_composerMetadata) context.unstable_composerMetadata = providerContexts.unstable_composerMetadata;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":["Tool","ModelContext","ModelContextProvider","AssistantToolProps","AssistantInstructionsConfig","notifySubscribers","notifyStateSubscribers","CompositeContextProvider","Unsubscribe","ModelContextRegistryToolHandle","ModelContextRegistryInstructionHandle","ModelContextRegistryProviderHandle","ModelContextRegistry","_tools","Map","_instructions","_contextProviders","_subscribers","Set","constructor","subscribe","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","callback","add","delete","addTool","TArgs","TResult","id","Symbol","set","update","newTool","has","remove","addInstruction","instruction","disabled","newConfig","newInstruction","newDisabled","addProvider","provider","unregister","registerModelContextProvider"],"sources":["../../src/model-context/registry.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport {\n type ModelContext,\n type ModelContextProvider,\n type AssistantToolProps,\n type AssistantInstructionsConfig,\n} from \"./types\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../subscribable/subscribable\";\nimport { CompositeContextProvider } from \"../utils/composite-context-provider\";\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 _contextProviders = new CompositeContextProvider();\n private _subscribers = new Set<() => void>();\n\n constructor() {\n this._contextProviders.subscribe(() => {\n this.notifySubscribers();\n });\n }\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 = this._contextProviders.getModelContext();\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 unregister =\n this._contextProviders.registerModelContextProvider(provider);\n\n return {\n remove: unregister,\n };\n }\n}\n"],"mappings":";;;AAgBA,IAAaY,uBAAb,MAAkE;CAChE,yBAAiB,IAAIE,IAA0C;CAC/D,gCAAwB,IAAIA,IAAoB;CAChD,oBAA4B,IAAIP,yBAAyB;CACzD,+BAAuB,IAAIW,IAAgB;CAE3CC,cAAc;EACZ,KAAKH,kBAAkBI,gBAAgB;GACrC,KAAKf,kBAAkB;EACzB,CAAC;CACH;CAEAgB,kBAAgC;EAC9B,MAAMC,eAAeC,MAAMC,KAAK,KAAKT,cAAcU,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,KAAKrB,OAAOY,OAAO,GAAG;GAC5C,MAAM,EAAEU,UAAUC,QAAQ,GAAGC,SAASH;GACtCF,MAAMG,YAAYE;EACpB;EAEA,MAAMC,mBAAmB,KAAKtB,kBAAkBK,gBAAgB;EAEhE,MAAMkB,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;CAEAnB,UAAUyB,UAAmC;EAC3C,KAAK5B,aAAa6B,IAAID,QAAQ;EAC9B,aAAa,KAAK5B,aAAa8B,OAAOF,QAAQ;CAChD;CAEA,oBAAkC;EAChCvC,kBAAuB,KAAKW,YAAY;CAC1C;CAEA+B,QACEX,MACgD;EAChD,MAAMc,KAAKC,OAAO;EAElB,KAAKvC,OAAOwC,IAAIF,IAAId,IAAI;EACxB,KAAKhC,kBAAkB;EAEvB,OAAO;GACLiD,SAASC,YAAgD;IACvD,IAAI,KAAK1C,OAAO2C,IAAIL,EAAE,GAAG;KACvB,KAAKtC,OAAOwC,IAAIF,IAAII,OAAO;KAC3B,KAAKlD,kBAAkB;IACzB;GACF;GACAoD,cAAc;IACZ,KAAK5C,OAAOkC,OAAOI,EAAE;IACrB,KAAK9C,kBAAkB;GACzB;EACF;CACF;CAEAqD,eACEf,QACuC;EACvC,MAAMQ,KAAKC,OAAO;EAElB,MAAMO,cACJ,OAAOhB,WAAW,WAAWA,SAASA,OAAOgB;EAG/C,IAAI,EAFa,OAAOhB,WAAW,WAAWA,OAAOiB,WAAW,QAEjD;GACb,KAAK7C,cAAcsC,IAAIF,IAAIQ,WAAW;GACtC,KAAKtD,kBAAkB;EACzB;EAEA,OAAO;GACLiD,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,KAAKzD,kBAAkB;GACzB;GACAoD,cAAc;IACZ,KAAK1C,cAAcgC,OAAOI,EAAE;IAC5B,KAAK9C,kBAAkB;GACzB;EACF;CACF;CAEA2D,YACEC,UACoC;EAIpC,OAAO,EACLR,QAHA,KAAKzC,kBAAkBmD,6BAA6BF,QAG5CC,EACV;CACF;AACF"}
1
+ {"version":3,"file":"registry.js","names":["Tool","ModelContext","ModelContextProvider","AssistantToolProps","AssistantInstructionsConfig","notifySubscribers","notifyStateSubscribers","CompositeContextProvider","Unsubscribe","ModelContextRegistryToolHandle","ModelContextRegistryInstructionHandle","ModelContextRegistryProviderHandle","nullProtoRecord","ModelContextRegistry","_tools","Map","_instructions","_contextProviders","_subscribers","Set","constructor","subscribe","getModelContext","instructions","Array","from","values","filter","Boolean","system","length","join","undefined","tools","toolProps","toolName","render","tool","providerContexts","context","Object","keys","callSettings","config","unstable_composerMetadata","callback","add","delete","addTool","Record","TArgs","TResult","id","Symbol","set","update","newTool","has","remove","addInstruction","instruction","disabled","newConfig","newInstruction","newDisabled","addProvider","provider","unregister","registerModelContextProvider"],"sources":["../../src/model-context/registry.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport {\n type ModelContext,\n type ModelContextProvider,\n type AssistantToolProps,\n type AssistantInstructionsConfig,\n} from \"./types\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../subscribable/subscribable\";\nimport { CompositeContextProvider } from \"../utils/composite-context-provider\";\nimport type { Unsubscribe } from \"../types/unsubscribe\";\nimport type {\n ModelContextRegistryToolHandle,\n ModelContextRegistryInstructionHandle,\n ModelContextRegistryProviderHandle,\n} from \"./registry-handles\";\nimport { nullProtoRecord } from \"../utils/record\";\n\nexport class ModelContextRegistry implements ModelContextProvider {\n private _tools = new Map<symbol, AssistantToolProps<any, any>>();\n private _instructions = new Map<symbol, string>();\n private _contextProviders = new CompositeContextProvider();\n private _subscribers = new Set<() => void>();\n\n constructor() {\n this._contextProviders.subscribe(() => {\n this.notifySubscribers();\n });\n }\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 = nullProtoRecord<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 = this._contextProviders.getModelContext();\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 = nullProtoRecord(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 unregister =\n this._contextProviders.registerModelContextProvider(provider);\n\n return {\n remove: unregister,\n };\n }\n}\n"],"mappings":";;;;AAiBA,IAAaa,uBAAb,MAAkE;CAChE,yBAAiB,IAAIE,IAA0C;CAC/D,gCAAwB,IAAIA,IAAoB;CAChD,oBAA4B,IAAIR,yBAAyB;CACzD,+BAAuB,IAAIY,IAAgB;CAE3CC,cAAc;EACZ,KAAKH,kBAAkBI,gBAAgB;GACrC,KAAKhB,kBAAkB;EACzB,CAAC;CACH;CAEAiB,kBAAgC;EAC9B,MAAMC,eAAeC,MAAMC,KAAK,KAAKT,cAAcU,OAAO,CAAC,CAAC,CAACC,OAC3DC,OACF;EAEA,MAAMC,SACJN,aAAaO,SAAS,IAAIP,aAAaQ,KAAK,MAAM,IAAIC,KAAAA;EAExD,MAAMC,QAAQrB,gBAAgC;EAC9C,KAAK,MAAMsB,aAAa,KAAKpB,OAAOY,OAAO,GAAG;GAC5C,MAAM,EAAES,UAAUC,QAAQ,GAAGC,SAASH;GACtCD,MAAME,YAAYE;EACpB;EAEA,MAAMC,mBAAmB,KAAKrB,kBAAkBK,gBAAgB;EAEhE,MAAMiB,UAAwB;GAC5BV;GACAI,OAAOO,OAAOC,KAAKR,KAAK,CAAC,CAACH,SAAS,IAAIG,QAAQD,KAAAA;EACjD;EAEA,IAAIM,iBAAiBT,QACnBU,QAAQV,SAASU,QAAQV,SACrB,GAAGU,QAAQV,OAAM,MAAOS,iBAAiBT,WACzCS,iBAAiBT;EAGvB,IAAIS,iBAAiBL,OACnBM,QAAQN,QAAQrB,gBAAgB2B,QAAQN,OAAOK,iBAAiBL,KAAK;EAGvE,IAAIK,iBAAiBI,cACnBH,QAAQG,eAAeJ,iBAAiBI;EAG1C,IAAIJ,iBAAiBK,QACnBJ,QAAQI,SAASL,iBAAiBK;EAGpC,IAAIL,iBAAiBM,2BACnBL,QAAQK,4BACNN,iBAAiBM;EAGrB,OAAOL;CACT;CAEAlB,UAAUwB,UAAmC;EAC3C,KAAK3B,aAAa4B,IAAID,QAAQ;EAC9B,aAAa,KAAK3B,aAAa6B,OAAOF,QAAQ;CAChD;CAEA,oBAAkC;EAChCvC,kBAAuB,KAAKY,YAAY;CAC1C;CAEA8B,QACEX,MACgD;EAChD,MAAMe,KAAKC,OAAO;EAElB,KAAKvC,OAAOwC,IAAIF,IAAIf,IAAI;EACxB,KAAKhC,kBAAkB;EAEvB,OAAO;GACLkD,SAASC,YAAgD;IACvD,IAAI,KAAK1C,OAAO2C,IAAIL,EAAE,GAAG;KACvB,KAAKtC,OAAOwC,IAAIF,IAAII,OAAO;KAC3B,KAAKnD,kBAAkB;IACzB;GACF;GACAqD,cAAc;IACZ,KAAK5C,OAAOiC,OAAOK,EAAE;IACrB,KAAK/C,kBAAkB;GACzB;EACF;CACF;CAEAsD,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,KAAKvD,kBAAkB;EACzB;EAEA,OAAO;GACLkD,SAASO,cAAoD;IAC3D,MAAMC,iBACJ,OAAOD,cAAc,WAAWA,YAAYA,UAAUF;IAIxD,IAFE,OAAOE,cAAc,WAAWA,UAAUD,WAAW,OAGrD,KAAK7C,cAAc+B,OAAOK,EAAE;SAE5B,KAAKpC,cAAcsC,IAAIF,IAAIW,cAAc;IAE3C,KAAK1D,kBAAkB;GACzB;GACAqD,cAAc;IACZ,KAAK1C,cAAc+B,OAAOK,EAAE;IAC5B,KAAK/C,kBAAkB;GACzB;EACF;CACF;CAEA4D,YACEC,UACoC;EAIpC,OAAO,EACLR,QAHA,KAAKzC,kBAAkBmD,6BAA6BF,QAG5CC,EACV;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/model-context/types.ts"],"mappings":";;;KAGY;EACV;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;;KAGA;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA,QAAQ,eAAe;EACvB,eAAe;EACf,SAAS;;;;;;EAMT,4BAA4B;;KAGlB;EACV,uBAAuB;EACvB,aAAa,yBAAyB;;KAG5B,mBACV,cAAc,yBACd,WACE,KAAK,OAAO;EACd;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;;cASW,qBACX,WAAW,IAAI,0BACd"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/model-context/types.ts"],"mappings":";;;KAIY;EACV;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;;KAGA;EACV;EACA;EACA;EACA;;KAGU;EACV;EACA;EACA,QAAQ,eAAe;EACvB,eAAe;EACf,SAAS;;;;;;EAMT,4BAA4B;;KAGlB;EACV,uBAAuB;EACvB,aAAa,yBAAyB;;KAG5B,mBACV,cAAc,yBACd,WACE,KAAK,OAAO;EACd;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;;cASW,qBACX,WAAW,IAAI,0BACd"}
@@ -1,3 +1,4 @@
1
+ import { nullProtoRecord } from "../utils/record.js";
1
2
  //#region src/model-context/types.ts
2
3
  const stripOverwrite = (tool) => {
3
4
  if (!tool.overwrite) return tool;
@@ -6,7 +7,7 @@ const stripOverwrite = (tool) => {
6
7
  };
7
8
  const mergeModelContexts = (configSet) => {
8
9
  const configs = Array.from(configSet).map((c) => c.getModelContext()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
9
- const toolPriorities = {};
10
+ const toolPriorities = nullProtoRecord();
10
11
  return configs.reduce((acc, config) => {
11
12
  const priority = config.priority ?? 0;
12
13
  if (config.system) {
@@ -14,7 +15,7 @@ const mergeModelContexts = (configSet) => {
14
15
  else acc.system = config.system;
15
16
  }
16
17
  if (config.tools) for (const [name, tool] of Object.entries(config.tools)) {
17
- const existing = acc.tools?.[name];
18
+ const existing = acc.tools !== void 0 && Object.hasOwn(acc.tools, name) ? acc.tools[name] : void 0;
18
19
  if (existing && existing !== tool) {
19
20
  const existingPriority = toolPriorities[name];
20
21
  if (existingPriority === priority) {
@@ -31,9 +32,9 @@ const mergeModelContexts = (configSet) => {
31
32
  toolPriorities[name] = Math.max(existingPriority, priority);
32
33
  continue;
33
34
  }
34
- if (!acc.tools) acc.tools = {};
35
+ if (!acc.tools) acc.tools = nullProtoRecord();
35
36
  acc.tools[name] = stripOverwrite(tool);
36
- toolPriorities[name] ??= priority;
37
+ if (!Object.hasOwn(toolPriorities, name)) toolPriorities[name] = priority;
37
38
  }
38
39
  if (config.config) acc.config = {
39
40
  ...acc.config,
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["Unsubscribe","Tool","LanguageModelV1CallSettings","maxTokens","temperature","topP","presencePenalty","frequencyPenalty","seed","headers","Record","LanguageModelConfig","apiKey","baseUrl","modelName","reasoningEffort","ModelContext","priority","system","tools","callSettings","config","unstable_composerMetadata","ModelContextProvider","getModelContext","subscribe","callback","AssistantToolProps","TArgs","TResult","toolName","render","AssistantInstructionsConfig","disabled","instruction","AssistantContextConfig","getContext","stripOverwrite","tool","overwrite","_","rest","mergeModelContexts","configSet","Set","configs","Array","from","map","c","sort","a","b","toolPriorities","reduce","acc","name","Object","entries","existing","existingPriority","Error","higherPriorityTool","lowerPriorityTool","Math","max"],"sources":["../../src/model-context/types.ts"],"sourcesContent":["import type { Unsubscribe } from \"../types/unsubscribe\";\nimport type { Tool } from \"assistant-stream\";\n\nexport type LanguageModelV1CallSettings = {\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n seed?: number;\n headers?: Record<string, string | undefined>;\n};\n\nexport type LanguageModelConfig = {\n apiKey?: string;\n baseUrl?: string;\n modelName?: string;\n reasoningEffort?: string;\n};\n\nexport type ModelContext = {\n priority?: number | undefined;\n system?: string | undefined;\n tools?: Record<string, Tool<any, any>> | undefined;\n callSettings?: LanguageModelV1CallSettings | undefined;\n config?: LanguageModelConfig | undefined;\n /**\n * Persisted message metadata pulled at send time and merged into the outgoing\n * user message's `metadata.custom` (not forwarded to the model directly).\n * Ignored by the transport, which only reads system/tools/callSettings/config.\n */\n unstable_composerMetadata?: Record<string, unknown> | undefined;\n};\n\nexport type ModelContextProvider = {\n getModelContext: () => ModelContext;\n subscribe?: (callback: () => void) => Unsubscribe;\n};\n\nexport type AssistantToolProps<\n TArgs extends Record<string, unknown>,\n TResult,\n> = Tool<TArgs, TResult> & {\n toolName: string;\n render?: unknown;\n};\n\nexport type AssistantInstructionsConfig = {\n disabled?: boolean | undefined;\n instruction: string;\n};\n\nexport type AssistantContextConfig = {\n getContext: () => string;\n disabled?: boolean | undefined;\n};\n\nconst stripOverwrite = (tool: Tool<any, any>): Tool<any, any> => {\n if (!tool.overwrite) return tool;\n const { overwrite: _, ...rest } = tool;\n return rest as Tool<any, any>;\n};\n\nexport const mergeModelContexts = (\n configSet: Set<ModelContextProvider>,\n): ModelContext => {\n const configs = Array.from(configSet)\n .map((c) => c.getModelContext())\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n const toolPriorities: Record<string, number> = {};\n\n return configs.reduce((acc, config) => {\n const priority = config.priority ?? 0;\n if (config.system) {\n if (acc.system) {\n acc.system += `\\n\\n${config.system}`;\n } else {\n acc.system = config.system;\n }\n }\n if (config.tools) {\n for (const [name, tool] of Object.entries(config.tools)) {\n const existing = acc.tools?.[name];\n if (existing && existing !== tool) {\n const existingPriority = toolPriorities[name]!;\n if (existingPriority === priority) {\n if (!tool.overwrite) {\n throw new Error(\n `You tried to define a tool with the name ${name}, but it already exists.`,\n );\n }\n acc.tools![name] = stripOverwrite(tool);\n continue;\n }\n\n const higherPriorityTool =\n existingPriority > priority ? existing : tool;\n const lowerPriorityTool =\n existingPriority > priority ? tool : existing;\n acc.tools![name] = stripOverwrite({\n ...lowerPriorityTool,\n ...higherPriorityTool,\n } as Tool<any, any>);\n toolPriorities[name] = Math.max(existingPriority, priority);\n continue;\n }\n\n if (!acc.tools) acc.tools = {};\n acc.tools[name] = stripOverwrite(tool);\n toolPriorities[name] ??= priority;\n }\n }\n if (config.config) {\n acc.config = {\n ...acc.config,\n ...config.config,\n };\n }\n if (config.callSettings) {\n acc.callSettings = {\n ...acc.callSettings,\n ...config.callSettings,\n };\n }\n if (config.unstable_composerMetadata) {\n acc.unstable_composerMetadata = {\n ...acc.unstable_composerMetadata,\n ...config.unstable_composerMetadata,\n };\n }\n return acc;\n }, {} as ModelContext);\n};\n"],"mappings":";AAyDA,MAAMqC,kBAAkBC,SAAyC;CAC/D,IAAI,CAACA,KAAKC,WAAW,OAAOD;CAC5B,MAAM,EAAEC,WAAWC,GAAG,GAAGC,SAASH;CAClC,OAAOG;AACT;AAEA,MAAaC,sBACXC,cACiB;CACjB,MAAME,UAAUC,MAAMC,KAAKJ,SAAS,CAAC,CAClCK,KAAKC,MAAMA,EAAEzB,gBAAgB,CAAC,CAAC,CAC/B0B,MAAMC,GAAGC,OAAOA,EAAEnC,YAAY,MAAMkC,EAAElC,YAAY,EAAE;CAEvD,MAAMoC,iBAAyC,CAAC;CAEhD,OAAOR,QAAQS,QAAQC,KAAKlC,WAAW;EACrC,MAAMJ,WAAWI,OAAOJ,YAAY;EACpC,IAAII,OAAOH,QAAQ;GACjB,IAAIqC,IAAIrC,QACNqC,IAAIrC,UAAU,OAAOG,OAAOH;QAE5BqC,IAAIrC,SAASG,OAAOH;EAExB;EACA,IAAIG,OAAOF,OACT,KAAK,MAAM,CAACqC,MAAMlB,SAASmB,OAAOC,QAAQrC,OAAOF,KAAK,GAAG;GACvD,MAAMwC,WAAWJ,IAAIpC,QAAQqC;GAC7B,IAAIG,YAAYA,aAAarB,MAAM;IACjC,MAAMsB,mBAAmBP,eAAeG;IACxC,IAAII,qBAAqB3C,UAAU;KACjC,IAAI,CAACqB,KAAKC,WACR,MAAM,IAAIsB,MACR,4CAA4CL,KAAI,yBAClD;KAEFD,IAAIpC,MAAOqC,QAAQnB,eAAeC,IAAI;KACtC;IACF;IAEA,MAAMwB,qBACJF,mBAAmB3C,WAAW0C,WAAWrB;IAC3C,MAAMyB,oBACJH,mBAAmB3C,WAAWqB,OAAOqB;IACvCJ,IAAIpC,MAAOqC,QAAQnB,eAAe;KAChC,GAAG0B;KACH,GAAGD;IACL,CAAmB;IACnBT,eAAeG,QAAQQ,KAAKC,IAAIL,kBAAkB3C,QAAQ;IAC1D;GACF;GAEA,IAAI,CAACsC,IAAIpC,OAAOoC,IAAIpC,QAAQ,CAAC;GAC7BoC,IAAIpC,MAAMqC,QAAQnB,eAAeC,IAAI;GACrCe,eAAeG,UAAUvC;EAC3B;EAEF,IAAII,OAAOA,QACTkC,IAAIlC,SAAS;GACX,GAAGkC,IAAIlC;GACP,GAAGA,OAAOA;EACZ;EAEF,IAAIA,OAAOD,cACTmC,IAAInC,eAAe;GACjB,GAAGmC,IAAInC;GACP,GAAGC,OAAOD;EACZ;EAEF,IAAIC,OAAOC,2BACTiC,IAAIjC,4BAA4B;GAC9B,GAAGiC,IAAIjC;GACP,GAAGD,OAAOC;EACZ;EAEF,OAAOiC;CACT,GAAG,CAAC,CAAiB;AACvB"}
1
+ {"version":3,"file":"types.js","names":["Unsubscribe","Tool","nullProtoRecord","LanguageModelV1CallSettings","maxTokens","temperature","topP","presencePenalty","frequencyPenalty","seed","headers","Record","LanguageModelConfig","apiKey","baseUrl","modelName","reasoningEffort","ModelContext","priority","system","tools","callSettings","config","unstable_composerMetadata","ModelContextProvider","getModelContext","subscribe","callback","AssistantToolProps","TArgs","TResult","toolName","render","AssistantInstructionsConfig","disabled","instruction","AssistantContextConfig","getContext","stripOverwrite","tool","overwrite","_","rest","mergeModelContexts","configSet","Set","configs","Array","from","map","c","sort","a","b","toolPriorities","reduce","acc","name","Object","entries","hasExisting","undefined","hasOwn","existing","existingPriority","Error","higherPriorityTool","lowerPriorityTool","Math","max"],"sources":["../../src/model-context/types.ts"],"sourcesContent":["import type { Unsubscribe } from \"../types/unsubscribe\";\nimport type { Tool } from \"assistant-stream\";\nimport { nullProtoRecord } from \"../utils/record\";\n\nexport type LanguageModelV1CallSettings = {\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n presencePenalty?: number;\n frequencyPenalty?: number;\n seed?: number;\n headers?: Record<string, string | undefined>;\n};\n\nexport type LanguageModelConfig = {\n apiKey?: string;\n baseUrl?: string;\n modelName?: string;\n reasoningEffort?: string;\n};\n\nexport type ModelContext = {\n priority?: number | undefined;\n system?: string | undefined;\n tools?: Record<string, Tool<any, any>> | undefined;\n callSettings?: LanguageModelV1CallSettings | undefined;\n config?: LanguageModelConfig | undefined;\n /**\n * Persisted message metadata pulled at send time and merged into the outgoing\n * user message's `metadata.custom` (not forwarded to the model directly).\n * Ignored by the transport, which only reads system/tools/callSettings/config.\n */\n unstable_composerMetadata?: Record<string, unknown> | undefined;\n};\n\nexport type ModelContextProvider = {\n getModelContext: () => ModelContext;\n subscribe?: (callback: () => void) => Unsubscribe;\n};\n\nexport type AssistantToolProps<\n TArgs extends Record<string, unknown>,\n TResult,\n> = Tool<TArgs, TResult> & {\n toolName: string;\n render?: unknown;\n};\n\nexport type AssistantInstructionsConfig = {\n disabled?: boolean | undefined;\n instruction: string;\n};\n\nexport type AssistantContextConfig = {\n getContext: () => string;\n disabled?: boolean | undefined;\n};\n\nconst stripOverwrite = (tool: Tool<any, any>): Tool<any, any> => {\n if (!tool.overwrite) return tool;\n const { overwrite: _, ...rest } = tool;\n return rest as Tool<any, any>;\n};\n\nexport const mergeModelContexts = (\n configSet: Set<ModelContextProvider>,\n): ModelContext => {\n const configs = Array.from(configSet)\n .map((c) => c.getModelContext())\n .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n const toolPriorities = nullProtoRecord<number>();\n\n return configs.reduce((acc, config) => {\n const priority = config.priority ?? 0;\n if (config.system) {\n if (acc.system) {\n acc.system += `\\n\\n${config.system}`;\n } else {\n acc.system = config.system;\n }\n }\n if (config.tools) {\n for (const [name, tool] of Object.entries(config.tools)) {\n const hasExisting =\n acc.tools !== undefined && Object.hasOwn(acc.tools, name);\n const existing = hasExisting ? acc.tools![name] : undefined;\n if (existing && existing !== tool) {\n const existingPriority = toolPriorities[name]!;\n if (existingPriority === priority) {\n if (!tool.overwrite) {\n throw new Error(\n `You tried to define a tool with the name ${name}, but it already exists.`,\n );\n }\n acc.tools![name] = stripOverwrite(tool);\n continue;\n }\n\n const higherPriorityTool =\n existingPriority > priority ? existing : tool;\n const lowerPriorityTool =\n existingPriority > priority ? tool : existing;\n acc.tools![name] = stripOverwrite({\n ...lowerPriorityTool,\n ...higherPriorityTool,\n } as Tool<any, any>);\n toolPriorities[name] = Math.max(existingPriority, priority);\n continue;\n }\n\n if (!acc.tools) acc.tools = nullProtoRecord();\n acc.tools[name] = stripOverwrite(tool);\n if (!Object.hasOwn(toolPriorities, name)) {\n toolPriorities[name] = priority;\n }\n }\n }\n if (config.config) {\n acc.config = {\n ...acc.config,\n ...config.config,\n };\n }\n if (config.callSettings) {\n acc.callSettings = {\n ...acc.callSettings,\n ...config.callSettings,\n };\n }\n if (config.unstable_composerMetadata) {\n acc.unstable_composerMetadata = {\n ...acc.unstable_composerMetadata,\n ...config.unstable_composerMetadata,\n };\n }\n return acc;\n }, {} as ModelContext);\n};\n"],"mappings":";;AA0DA,MAAMsC,kBAAkBC,SAAyC;CAC/D,IAAI,CAACA,KAAKC,WAAW,OAAOD;CAC5B,MAAM,EAAEC,WAAWC,GAAG,GAAGC,SAASH;CAClC,OAAOG;AACT;AAEA,MAAaC,sBACXC,cACiB;CACjB,MAAME,UAAUC,MAAMC,KAAKJ,SAAS,CAAC,CAClCK,KAAKC,MAAMA,EAAEzB,gBAAgB,CAAC,CAAC,CAC/B0B,MAAMC,GAAGC,OAAOA,EAAEnC,YAAY,MAAMkC,EAAElC,YAAY,EAAE;CAEvD,MAAMoC,iBAAiBpD,gBAAwB;CAE/C,OAAO4C,QAAQS,QAAQC,KAAKlC,WAAW;EACrC,MAAMJ,WAAWI,OAAOJ,YAAY;EACpC,IAAII,OAAOH,QAAQ;GACjB,IAAIqC,IAAIrC,QACNqC,IAAIrC,UAAU,OAAOG,OAAOH;QAE5BqC,IAAIrC,SAASG,OAAOH;EAExB;EACA,IAAIG,OAAOF,OACT,KAAK,MAAM,CAACqC,MAAMlB,SAASmB,OAAOC,QAAQrC,OAAOF,KAAK,GAAG;GAGvD,MAAM2C,WADJP,IAAIpC,UAAUyC,KAAAA,KAAaH,OAAOI,OAAON,IAAIpC,OAAOqC,IAAI,IAC3BD,IAAIpC,MAAOqC,QAAQI,KAAAA;GAClD,IAAIE,YAAYA,aAAaxB,MAAM;IACjC,MAAMyB,mBAAmBV,eAAeG;IACxC,IAAIO,qBAAqB9C,UAAU;KACjC,IAAI,CAACqB,KAAKC,WACR,MAAM,IAAIyB,MACR,4CAA4CR,KAAI,yBAClD;KAEFD,IAAIpC,MAAOqC,QAAQnB,eAAeC,IAAI;KACtC;IACF;IAEA,MAAM2B,qBACJF,mBAAmB9C,WAAW6C,WAAWxB;IAC3C,MAAM4B,oBACJH,mBAAmB9C,WAAWqB,OAAOwB;IACvCP,IAAIpC,MAAOqC,QAAQnB,eAAe;KAChC,GAAG6B;KACH,GAAGD;IACL,CAAmB;IACnBZ,eAAeG,QAAQW,KAAKC,IAAIL,kBAAkB9C,QAAQ;IAC1D;GACF;GAEA,IAAI,CAACsC,IAAIpC,OAAOoC,IAAIpC,QAAQlB,gBAAgB;GAC5CsD,IAAIpC,MAAMqC,QAAQnB,eAAeC,IAAI;GACrC,IAAI,CAACmB,OAAOI,OAAOR,gBAAgBG,IAAI,GACrCH,eAAeG,QAAQvC;EAE3B;EAEF,IAAII,OAAOA,QACTkC,IAAIlC,SAAS;GACX,GAAGkC,IAAIlC;GACP,GAAGA,OAAOA;EACZ;EAEF,IAAIA,OAAOD,cACTmC,IAAInC,eAAe;GACjB,GAAGmC,IAAInC;GACP,GAAGC,OAAOD;EACZ;EAEF,IAAIC,OAAOC,2BACTiC,IAAIjC,4BAA4B;GAC9B,GAAGiC,IAAIjC;GACP,GAAGD,OAAOC;EACZ;EAEF,OAAOiC;CACT,GAAG,CAAC,CAAiB;AACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryThreadList.d.ts","names":[],"sources":["../../../src/react/client/InMemoryThreadList.ts"],"mappings":";;;KAqBY;EACV,SAAS,qBAAqB,gBAAgB;EAC9C,oBAAoB;EACpB;EACA,YAAY;;cAiOD,gDAAkB,SAAA,0BAAA,OAAA;;;;;;cAOlB,oCACX,QAAQ,cACR,QAAQ"}
1
+ {"version":3,"file":"InMemoryThreadList.d.ts","names":[],"sources":["../../../src/react/client/InMemoryThreadList.ts"],"mappings":";;;KAqBY;EACV,SAAS,qBAAqB,gBAAgB;EAC9C,oBAAoB;EACpB;EACA,YAAY;;cAkOD,gDAAkB,SAAA,0BAAA,OAAA;;;;;;cAOlB,oCACX,QAAQ,cACR,QAAQ"}
@@ -74,7 +74,7 @@ const useThreadListItemClient = (props) => {
74
74
  };
75
75
  const ThreadListItemClient = resource(useThreadListItemClient);
76
76
  const useInMemoryThreadList = (props) => {
77
- const $ = c(62);
77
+ const $ = c(64);
78
78
  const { thread: threadFactory, onSwitchToThread, onSwitchToNewThread, onDelete } = props;
79
79
  const [t0, setListState] = useState(_temp3);
80
80
  const { threads, mainThreadId } = t0;
@@ -232,16 +232,18 @@ const useInMemoryThreadList = (props) => {
232
232
  let t15;
233
233
  let t16;
234
234
  let t17;
235
+ let t18;
235
236
  if ($[25] !== mainThreadId || $[26] !== threads) {
236
237
  const regularThreads = threads.filter(_temp5);
237
238
  const archivedThreads = threads.filter(_temp6);
238
239
  t11 = mainThreadId;
239
240
  t12 = null;
240
241
  t13 = false;
241
- t14 = false;
242
+ t14 = void 0;
242
243
  t15 = false;
243
- t16 = regularThreads.map(_temp7);
244
- t17 = archivedThreads.map(_temp8);
244
+ t16 = false;
245
+ t17 = regularThreads.map(_temp7);
246
+ t18 = archivedThreads.map(_temp8);
245
247
  $[25] = mainThreadId;
246
248
  $[26] = threads;
247
249
  $[27] = t11;
@@ -251,6 +253,7 @@ const useInMemoryThreadList = (props) => {
251
253
  $[31] = t15;
252
254
  $[32] = t16;
253
255
  $[33] = t17;
256
+ $[34] = t18;
254
257
  } else {
255
258
  t11 = $[27];
256
259
  t12 = $[28];
@@ -259,47 +262,50 @@ const useInMemoryThreadList = (props) => {
259
262
  t15 = $[31];
260
263
  t16 = $[32];
261
264
  t17 = $[33];
265
+ t18 = $[34];
262
266
  }
263
- let t18;
264
- if ($[34] !== mainThreadClient.state || $[35] !== t11 || $[36] !== t12 || $[37] !== t13 || $[38] !== t14 || $[39] !== t15 || $[40] !== t16 || $[41] !== t17 || $[42] !== threadListItems.state) {
265
- t18 = {
267
+ let t19;
268
+ if ($[35] !== mainThreadClient.state || $[36] !== t11 || $[37] !== t12 || $[38] !== t13 || $[39] !== t14 || $[40] !== t15 || $[41] !== t16 || $[42] !== t17 || $[43] !== t18 || $[44] !== threadListItems.state) {
269
+ t19 = {
266
270
  mainThreadId: t11,
267
271
  newThreadId: t12,
268
272
  isLoading: t13,
269
- isLoadingMore: t14,
270
- hasMore: t15,
271
- threadIds: t16,
272
- archivedThreadIds: t17,
273
+ loadError: t14,
274
+ isLoadingMore: t15,
275
+ hasMore: t16,
276
+ threadIds: t17,
277
+ archivedThreadIds: t18,
273
278
  threadItems: threadListItems.state,
274
279
  main: mainThreadClient.state
275
280
  };
276
- $[34] = mainThreadClient.state;
277
- $[35] = t11;
278
- $[36] = t12;
279
- $[37] = t13;
280
- $[38] = t14;
281
- $[39] = t15;
282
- $[40] = t16;
283
- $[41] = t17;
284
- $[42] = threadListItems.state;
281
+ $[35] = mainThreadClient.state;
282
+ $[36] = t11;
283
+ $[37] = t12;
284
+ $[38] = t13;
285
+ $[39] = t14;
286
+ $[40] = t15;
287
+ $[41] = t16;
288
+ $[42] = t17;
285
289
  $[43] = t18;
286
- } else t18 = $[43];
287
- const state = t18;
288
- let t19;
289
- if ($[44] !== state) {
290
- t19 = () => state;
291
- $[44] = state;
290
+ $[44] = threadListItems.state;
292
291
  $[45] = t19;
293
292
  } else t19 = $[45];
293
+ const state = t19;
294
294
  let t20;
295
- if ($[46] !== mainThreadClient.methods) {
296
- t20 = () => mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE;
297
- $[46] = mainThreadClient.methods;
295
+ if ($[46] !== state) {
296
+ t20 = () => state;
297
+ $[46] = state;
298
298
  $[47] = t20;
299
299
  } else t20 = $[47];
300
300
  let t21;
301
- if ($[48] !== mainThreadId || $[49] !== state || $[50] !== threadListItems || $[51] !== threads) {
302
- t21 = (selector) => {
301
+ if ($[48] !== mainThreadClient.methods) {
302
+ t21 = () => mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE;
303
+ $[48] = mainThreadClient.methods;
304
+ $[49] = t21;
305
+ } else t21 = $[49];
306
+ let t22;
307
+ if ($[50] !== mainThreadId || $[51] !== state || $[52] !== threadListItems || $[53] !== threads) {
308
+ t22 = (selector) => {
303
309
  if (selector === "main") {
304
310
  const index = threads.findIndex((t_10) => t_10.id === mainThreadId);
305
311
  return threadListItems.get({ index: index === -1 ? 0 : index });
@@ -313,40 +319,40 @@ const useInMemoryThreadList = (props) => {
313
319
  const index_1 = threads.findIndex((t_12) => t_12.id === id);
314
320
  return threadListItems.get({ index: index_1 });
315
321
  };
316
- $[48] = mainThreadId;
317
- $[49] = state;
318
- $[50] = threadListItems;
319
- $[51] = threads;
320
- $[52] = t21;
321
- } else t21 = $[52];
322
- let t22;
323
- if ($[53] !== mainThreadClient.methods) {
324
- t22 = () => mainThreadClient.methods;
325
- $[53] = mainThreadClient.methods;
322
+ $[50] = mainThreadId;
323
+ $[51] = state;
324
+ $[52] = threadListItems;
325
+ $[53] = threads;
326
326
  $[54] = t22;
327
327
  } else t22 = $[54];
328
328
  let t23;
329
- if ($[55] !== handleSwitchToNewThread || $[56] !== handleSwitchToThread || $[57] !== t19 || $[58] !== t20 || $[59] !== t21 || $[60] !== t22) {
330
- t23 = {
331
- getState: t19,
329
+ if ($[55] !== mainThreadClient.methods) {
330
+ t23 = () => mainThreadClient.methods;
331
+ $[55] = mainThreadClient.methods;
332
+ $[56] = t23;
333
+ } else t23 = $[56];
334
+ let t24;
335
+ if ($[57] !== handleSwitchToNewThread || $[58] !== handleSwitchToThread || $[59] !== t20 || $[60] !== t21 || $[61] !== t22 || $[62] !== t23) {
336
+ t24 = {
337
+ getState: t20,
332
338
  switchToThread: handleSwitchToThread,
333
339
  switchToNewThread: handleSwitchToNewThread,
334
340
  getLoadThreadsPromise: _temp9,
335
341
  reload: _temp0,
336
- reloadMainThread: t20,
342
+ reloadMainThread: t21,
337
343
  loadMore: _temp1,
338
- item: t21,
339
- thread: t22
344
+ item: t22,
345
+ thread: t23
340
346
  };
341
- $[55] = handleSwitchToNewThread;
342
- $[56] = handleSwitchToThread;
343
- $[57] = t19;
344
- $[58] = t20;
345
- $[59] = t21;
346
- $[60] = t22;
347
- $[61] = t23;
348
- } else t23 = $[61];
349
- return t23;
347
+ $[57] = handleSwitchToNewThread;
348
+ $[58] = handleSwitchToThread;
349
+ $[59] = t20;
350
+ $[60] = t21;
351
+ $[61] = t22;
352
+ $[62] = t23;
353
+ $[63] = t24;
354
+ } else t24 = $[63];
355
+ return t24;
350
356
  };
351
357
  const InMemoryThreadList = resource(useInMemoryThreadList);
352
358
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryThreadList.js","names":["useState","useMemo","resource","withKey","ResourceElement","AssistantClient","ClientOutput","ScopesConfig","useClientLookup","Derived","attachTransformScopes","useClientResource","useThreadSelectionEvents","generateId","ModelContext","Tools","DataRenderers","RESOLVED_PROMISE","Promise","resolve","InMemoryThreadListProps","thread","threadId","onSwitchToThread","onSwitchToNewThread","onDelete","ThreadData","id","title","status","custom","Record","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","t0","remoteId","undefined","externalId","state","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","_temp","initialize","detach","_temp2","ThreadListItemClient","useInMemoryThreadList","threadFactory","setListState","_temp3","threads","mainThreadId","Symbol","for","update","prev","setThreads","prev_0","handleSwitchToThread","threadId_0","prev_1","map","t","handleRename","t4","threadId_1","prev_2","t_0","const","handleArchive","t5","threadId_2","prev_3","t_1","handleUnarchive","t6","threadId_3","prev_4","t_2","handleUpdateCustom","t7","threadId_4","fallbackId","prev_5","remaining","filter","t_3","length","find","_temp4","handleDelete","t8","newId","prev_6","handleSwitchToNewThread","t9","mainThreadClient","t10","t11","t_5","title_0","custom_0","threadListItems","t12","t13","t14","t15","t16","t17","regularThreads","_temp5","archivedThreads","_temp6","_temp7","_temp8","t18","newThreadId","isLoading","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t19","t20","methods","unstable_refetchThread","t21","selector","index","findIndex","t_10","get","index_0","t_11","ids","archived","index_1","t_12","t22","t23","switchToThread","switchToNewThread","getLoadThreadsPromise","_temp9","reload","_temp0","reloadMainThread","loadMore","_temp1","item","InMemoryThreadList","inMemoryThreadListTransformScopes","scopes","parent","source","query","type","aui","threadListItem","composer","modelContext","tools","dataRenderers","suggestions","t_4","t_6","t_7","t_8","t_9"],"sources":["../../../src/react/client/InMemoryThreadList.ts"],"sourcesContent":["import { useState, useMemo } from \"react\";\nimport { resource, withKey, type ResourceElement } from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n ClientOutput,\n ScopesConfig,\n} from \"@assistant-ui/store\";\nimport {\n useClientLookup,\n Derived,\n attachTransformScopes,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { useThreadSelectionEvents } from \"../../store/internal\";\nimport { generateId } from \"../../utils/id\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport { Tools } from \"./Tools\";\nimport { DataRenderers } from \"./DataRenderers\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type InMemoryThreadListProps = {\n thread: (threadId: string) => ResourceElement<ClientOutput<\"thread\">>;\n onSwitchToThread?: (threadId: string) => void;\n onSwitchToNewThread?: () => void;\n onDelete?: (threadId: string) => void;\n};\n\ntype ThreadData = {\n id: string;\n title?: string;\n status: \"regular\" | \"archived\";\n custom?: Record<string, unknown> | undefined;\n};\n\n// ThreadListItem Client\nconst useThreadListItemClient = (props: {\n data: ThreadData;\n isRunning: boolean;\n onSwitchTo: () => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: undefined,\n externalId: undefined,\n title: data.title,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data.id, data.title, data.status, data.custom, isRunning],\n );\n\n return {\n getState: () => state,\n switchTo: onSwitchTo,\n rename: onRename,\n updateCustom: onUpdateCustom,\n archive: onArchive,\n unarchive: onUnarchive,\n delete: onDelete,\n generateTitle: () => {},\n initialize: async () => ({ remoteId: data.id, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\n// InMemoryThreadList Client\nconst useInMemoryThreadList = (\n props: InMemoryThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n thread: threadFactory,\n onSwitchToThread,\n onSwitchToNewThread,\n onDelete,\n } = props;\n\n const [{ threads, mainThreadId }, setListState] = useState<{\n threads: readonly ThreadData[];\n mainThreadId: string;\n }>(() => ({\n threads: [{ id: \"main\", title: \"Main Thread\", status: \"regular\" }],\n mainThreadId: \"main\",\n }));\n const setThreads = (\n update: (prev: readonly ThreadData[]) => readonly ThreadData[],\n ) => setListState((prev) => ({ ...prev, threads: update(prev.threads) }));\n\n useThreadSelectionEvents(mainThreadId);\n\n const handleSwitchToThread = (threadId: string) => {\n setListState((prev) => ({ ...prev, mainThreadId: threadId }));\n onSwitchToThread?.(threadId);\n };\n\n const handleRename = (threadId: string, title: string) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title } : t)),\n );\n };\n\n const handleArchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"archived\" as const } : t,\n ),\n );\n };\n\n const handleUnarchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"regular\" as const } : t,\n ),\n );\n };\n\n const handleUpdateCustom = (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, custom } : t)),\n );\n };\n\n const handleDelete = (threadId: string) => {\n // Deleting the last thread starts a fresh one; the removed id must not\n // stay selected. The fallback id is minted eagerly so the updater stays\n // pure under batched deletes.\n const fallbackId = `thread-${generateId()}`;\n setListState((prev) => {\n const remaining = prev.threads.filter((t) => t.id !== threadId);\n if (remaining.length === 0) {\n return {\n threads: [{ id: fallbackId, title: \"New Thread\", status: \"regular\" }],\n mainThreadId: fallbackId,\n };\n }\n return {\n threads: remaining,\n mainThreadId:\n prev.mainThreadId === threadId\n ? (remaining.find((t) => t.status === \"regular\") ?? remaining[0]!)\n .id\n : prev.mainThreadId,\n };\n });\n onDelete?.(threadId);\n };\n\n const handleSwitchToNewThread = () => {\n const newId = `thread-${generateId()}`;\n setListState((prev) => ({\n threads: [\n ...prev.threads,\n { id: newId, title: \"New Thread\", status: \"regular\" },\n ],\n mainThreadId: newId,\n }));\n onSwitchToNewThread?.();\n };\n\n // Only the main thread is mounted, so it is the only thread that can run.\n const mainThreadClient = useClientResource(threadFactory(mainThreadId));\n\n const threadListItems = useClientLookup(\n threads.map((t) =>\n withKey(\n t.id,\n ThreadListItemClient({\n data: t,\n isRunning: t.id === mainThreadId && mainThreadClient.state.isRunning,\n onSwitchTo: () => handleSwitchToThread(t.id),\n onRename: (title) => handleRename(t.id, title),\n onUpdateCustom: (custom) => handleUpdateCustom(t.id, custom),\n onArchive: () => handleArchive(t.id),\n onUnarchive: () => handleUnarchive(t.id),\n onDelete: () => handleDelete(t.id),\n }),\n ),\n ),\n );\n\n const state = useMemo(() => {\n const regularThreads = threads.filter((t) => t.status === \"regular\");\n const archivedThreads = threads.filter((t) => t.status === \"archived\");\n\n return {\n mainThreadId,\n newThreadId: null,\n isLoading: false,\n isLoadingMore: false,\n hasMore: false,\n threadIds: regularThreads.map((t) => t.id),\n archivedThreadIds: archivedThreads.map((t) => t.id),\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n };\n }, [mainThreadId, threads, threadListItems.state, mainThreadClient.state]);\n\n return {\n getState: () => state,\n switchToThread: handleSwitchToThread,\n switchToNewThread: handleSwitchToNewThread,\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n reloadMainThread: () =>\n mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (selector === \"main\") {\n const index = threads.findIndex((t) => t.id === mainThreadId);\n return threadListItems.get({ index: index === -1 ? 0 : index });\n }\n if (\"id\" in selector) {\n const index = threads.findIndex((t) => t.id === selector.id);\n return threadListItems.get({ index });\n }\n // The lookup is keyed over the combined thread array, while index\n // selectors address the regular/archived subset the primitives render.\n const ids = selector.archived ? state.archivedThreadIds : state.threadIds;\n const id = ids[selector.index];\n if (id === undefined) return threadListItems.get({ index: -1 });\n const index = threads.findIndex((t) => t.id === id);\n return threadListItems.get({ index });\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\nexport const InMemoryThreadList = resource(useInMemoryThreadList);\n\n/**\n * The scope defaults `InMemoryThreadList` installs when it is used as the\n * `threads` config entry. Adapter packages that wrap it in their own config\n * entry attach this to the wrapping resource for scope parity.\n */\nexport const inMemoryThreadListTransformScopes = (\n scopes: ScopesConfig,\n parent: AssistantClient,\n): void => {\n scopes.thread ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.thread(\"main\"),\n });\n scopes.threadListItem ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.item(\"main\"),\n });\n scopes.composer ??= Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.threads.thread(\"main\").composer(),\n });\n\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n if (!scopes.suggestions && parent.suggestions.source === null) {\n scopes.suggestions = Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.thread.suggestions(),\n });\n }\n};\n\nattachTransformScopes(useInMemoryThreadList, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
1
+ {"version":3,"file":"InMemoryThreadList.js","names":["useState","useMemo","resource","withKey","ResourceElement","AssistantClient","ClientOutput","ScopesConfig","useClientLookup","Derived","attachTransformScopes","useClientResource","useThreadSelectionEvents","generateId","ModelContext","Tools","DataRenderers","RESOLVED_PROMISE","Promise","resolve","InMemoryThreadListProps","thread","threadId","onSwitchToThread","onSwitchToNewThread","onDelete","ThreadData","id","title","status","custom","Record","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","t0","remoteId","undefined","externalId","state","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","_temp","initialize","detach","_temp2","ThreadListItemClient","useInMemoryThreadList","threadFactory","setListState","_temp3","threads","mainThreadId","Symbol","for","update","prev","setThreads","prev_0","handleSwitchToThread","threadId_0","prev_1","map","t","handleRename","t4","threadId_1","prev_2","t_0","const","handleArchive","t5","threadId_2","prev_3","t_1","handleUnarchive","t6","threadId_3","prev_4","t_2","handleUpdateCustom","t7","threadId_4","fallbackId","prev_5","remaining","filter","t_3","length","find","_temp4","handleDelete","t8","newId","prev_6","handleSwitchToNewThread","t9","mainThreadClient","t10","t11","t_5","title_0","custom_0","threadListItems","t12","t13","t14","t15","t16","t17","t18","regularThreads","_temp5","archivedThreads","_temp6","_temp7","_temp8","t19","newThreadId","isLoading","loadError","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t20","t21","methods","unstable_refetchThread","t22","selector","index","findIndex","t_10","get","index_0","t_11","ids","archived","index_1","t_12","t23","t24","switchToThread","switchToNewThread","getLoadThreadsPromise","_temp9","reload","_temp0","reloadMainThread","loadMore","_temp1","item","InMemoryThreadList","inMemoryThreadListTransformScopes","scopes","parent","source","query","type","aui","threadListItem","composer","modelContext","tools","dataRenderers","suggestions","t_4","t_6","t_7","t_8","t_9"],"sources":["../../../src/react/client/InMemoryThreadList.ts"],"sourcesContent":["import { useState, useMemo } from \"react\";\nimport { resource, withKey, type ResourceElement } from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n ClientOutput,\n ScopesConfig,\n} from \"@assistant-ui/store\";\nimport {\n useClientLookup,\n Derived,\n attachTransformScopes,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { useThreadSelectionEvents } from \"../../store/internal\";\nimport { generateId } from \"../../utils/id\";\nimport { ModelContext } from \"../../store/clients/model-context-client\";\nimport { Tools } from \"./Tools\";\nimport { DataRenderers } from \"./DataRenderers\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type InMemoryThreadListProps = {\n thread: (threadId: string) => ResourceElement<ClientOutput<\"thread\">>;\n onSwitchToThread?: (threadId: string) => void;\n onSwitchToNewThread?: () => void;\n onDelete?: (threadId: string) => void;\n};\n\ntype ThreadData = {\n id: string;\n title?: string;\n status: \"regular\" | \"archived\";\n custom?: Record<string, unknown> | undefined;\n};\n\n// ThreadListItem Client\nconst useThreadListItemClient = (props: {\n data: ThreadData;\n isRunning: boolean;\n onSwitchTo: () => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: undefined,\n externalId: undefined,\n title: data.title,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data.id, data.title, data.status, data.custom, isRunning],\n );\n\n return {\n getState: () => state,\n switchTo: onSwitchTo,\n rename: onRename,\n updateCustom: onUpdateCustom,\n archive: onArchive,\n unarchive: onUnarchive,\n delete: onDelete,\n generateTitle: () => {},\n initialize: async () => ({ remoteId: data.id, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\n// InMemoryThreadList Client\nconst useInMemoryThreadList = (\n props: InMemoryThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n thread: threadFactory,\n onSwitchToThread,\n onSwitchToNewThread,\n onDelete,\n } = props;\n\n const [{ threads, mainThreadId }, setListState] = useState<{\n threads: readonly ThreadData[];\n mainThreadId: string;\n }>(() => ({\n threads: [{ id: \"main\", title: \"Main Thread\", status: \"regular\" }],\n mainThreadId: \"main\",\n }));\n const setThreads = (\n update: (prev: readonly ThreadData[]) => readonly ThreadData[],\n ) => setListState((prev) => ({ ...prev, threads: update(prev.threads) }));\n\n useThreadSelectionEvents(mainThreadId);\n\n const handleSwitchToThread = (threadId: string) => {\n setListState((prev) => ({ ...prev, mainThreadId: threadId }));\n onSwitchToThread?.(threadId);\n };\n\n const handleRename = (threadId: string, title: string) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title } : t)),\n );\n };\n\n const handleArchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"archived\" as const } : t,\n ),\n );\n };\n\n const handleUnarchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"regular\" as const } : t,\n ),\n );\n };\n\n const handleUpdateCustom = (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, custom } : t)),\n );\n };\n\n const handleDelete = (threadId: string) => {\n // Deleting the last thread starts a fresh one; the removed id must not\n // stay selected. The fallback id is minted eagerly so the updater stays\n // pure under batched deletes.\n const fallbackId = `thread-${generateId()}`;\n setListState((prev) => {\n const remaining = prev.threads.filter((t) => t.id !== threadId);\n if (remaining.length === 0) {\n return {\n threads: [{ id: fallbackId, title: \"New Thread\", status: \"regular\" }],\n mainThreadId: fallbackId,\n };\n }\n return {\n threads: remaining,\n mainThreadId:\n prev.mainThreadId === threadId\n ? (remaining.find((t) => t.status === \"regular\") ?? remaining[0]!)\n .id\n : prev.mainThreadId,\n };\n });\n onDelete?.(threadId);\n };\n\n const handleSwitchToNewThread = () => {\n const newId = `thread-${generateId()}`;\n setListState((prev) => ({\n threads: [\n ...prev.threads,\n { id: newId, title: \"New Thread\", status: \"regular\" },\n ],\n mainThreadId: newId,\n }));\n onSwitchToNewThread?.();\n };\n\n // Only the main thread is mounted, so it is the only thread that can run.\n const mainThreadClient = useClientResource(threadFactory(mainThreadId));\n\n const threadListItems = useClientLookup(\n threads.map((t) =>\n withKey(\n t.id,\n ThreadListItemClient({\n data: t,\n isRunning: t.id === mainThreadId && mainThreadClient.state.isRunning,\n onSwitchTo: () => handleSwitchToThread(t.id),\n onRename: (title) => handleRename(t.id, title),\n onUpdateCustom: (custom) => handleUpdateCustom(t.id, custom),\n onArchive: () => handleArchive(t.id),\n onUnarchive: () => handleUnarchive(t.id),\n onDelete: () => handleDelete(t.id),\n }),\n ),\n ),\n );\n\n const state = useMemo(() => {\n const regularThreads = threads.filter((t) => t.status === \"regular\");\n const archivedThreads = threads.filter((t) => t.status === \"archived\");\n\n return {\n mainThreadId,\n newThreadId: null,\n isLoading: false,\n loadError: undefined,\n isLoadingMore: false,\n hasMore: false,\n threadIds: regularThreads.map((t) => t.id),\n archivedThreadIds: archivedThreads.map((t) => t.id),\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n };\n }, [mainThreadId, threads, threadListItems.state, mainThreadClient.state]);\n\n return {\n getState: () => state,\n switchToThread: handleSwitchToThread,\n switchToNewThread: handleSwitchToNewThread,\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n reloadMainThread: () =>\n mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (selector === \"main\") {\n const index = threads.findIndex((t) => t.id === mainThreadId);\n return threadListItems.get({ index: index === -1 ? 0 : index });\n }\n if (\"id\" in selector) {\n const index = threads.findIndex((t) => t.id === selector.id);\n return threadListItems.get({ index });\n }\n // The lookup is keyed over the combined thread array, while index\n // selectors address the regular/archived subset the primitives render.\n const ids = selector.archived ? state.archivedThreadIds : state.threadIds;\n const id = ids[selector.index];\n if (id === undefined) return threadListItems.get({ index: -1 });\n const index = threads.findIndex((t) => t.id === id);\n return threadListItems.get({ index });\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\nexport const InMemoryThreadList = resource(useInMemoryThreadList);\n\n/**\n * The scope defaults `InMemoryThreadList` installs when it is used as the\n * `threads` config entry. Adapter packages that wrap it in their own config\n * entry attach this to the wrapping resource for scope parity.\n */\nexport const inMemoryThreadListTransformScopes = (\n scopes: ScopesConfig,\n parent: AssistantClient,\n): void => {\n scopes.thread ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.thread(\"main\"),\n });\n scopes.threadListItem ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.item(\"main\"),\n });\n scopes.composer ??= Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.threads.thread(\"main\").composer(),\n });\n\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n if (!scopes.suggestions && parent.suggestions.source === null) {\n scopes.suggestions = Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.thread.suggestions(),\n });\n }\n};\n\nattachTransformScopes(useInMemoryThreadList, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Interactables.d.ts","names":[],"sources":["../../../src/react/client/Interactables.ts"],"mappings":";;;;;;;;cAmhBa,oDAAsB,SAAA,0CAAA"}
1
+ {"version":3,"file":"Interactables.d.ts","names":[],"sources":["../../../src/react/client/Interactables.ts"],"mappings":";;;;;;;;cAqhBa,oDAAsB,SAAA,0CAAA"}