@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,146 +1,236 @@
1
+ import { nullProtoRecord } from "../../utils/record.js";
1
2
  import { notifySubscribers } from "../../subscribable/subscribable.js";
2
3
  import { ModelContext } from "../../store/clients/model-context-client.js";
3
4
  import { buildInteractableModelContext } from "./interactable-model-context.js";
4
5
  import { useInteractablePersistenceQueue } from "../interactables-shared/useInteractablePersistenceQueue.js";
5
6
  import { useAssistantScopeEffect } from "@assistant-ui/store/client";
6
7
  import { toJSONSchema, toPartialJSONSchema } from "assistant-stream";
7
- import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
8
+ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
9
+ import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
8
10
  import { attachTransformScopes as attachTransformScopes$1, useAssistantClientRef as useAssistantClientRef$1 } from "@assistant-ui/store";
9
11
  import { resource } from "@assistant-ui/tap";
10
12
  //#region src/react/interactables-legacy/Interactables.ts
11
13
  const useInteractables = () => {
12
- const [state, setState] = useState(() => ({
13
- definitions: {},
14
- persistence: {}
15
- }));
14
+ const $ = c(36);
15
+ const [state, setState] = useState(_temp);
16
16
  const clientRef = useAssistantClientRef$1();
17
17
  const stateRef = useRef(state);
18
- const setStateAndRef = useCallback((updater) => {
19
- const next = updater(stateRef.current);
20
- stateRef.current = next;
21
- setState(next);
22
- }, []);
23
- const subscribersRef = useRef(/* @__PURE__ */ new Set());
24
- const partialSchemaCacheRef = useRef(/* @__PURE__ */ new Map());
25
- const detachedStateRef = useRef(/* @__PURE__ */ new Map());
26
- const adapterRef = useRef(void 0);
27
- const exportState = useCallback(() => {
28
- const result = {};
29
- for (const [id, def] of Object.entries(stateRef.current.definitions)) result[id] = {
30
- name: def.name,
31
- state: def.state
18
+ let t0;
19
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
20
+ t0 = (updater) => {
21
+ const next = updater(stateRef.current);
22
+ stateRef.current = next;
23
+ setState(next);
32
24
  };
33
- return result;
34
- }, []);
35
- const updatePersistenceStatus = useCallback((updater_0) => {
36
- setStateAndRef((prev) => {
37
- const persistence = updater_0(prev.persistence);
38
- return persistence === prev.persistence ? prev : {
39
- ...prev,
40
- persistence
25
+ $[0] = t0;
26
+ } else t0 = $[0];
27
+ const setStateAndRef = t0;
28
+ let t1;
29
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
30
+ t1 = /* @__PURE__ */ new Set();
31
+ $[1] = t1;
32
+ } else t1 = $[1];
33
+ const subscribersRef = useRef(t1);
34
+ let t2;
35
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
36
+ t2 = /* @__PURE__ */ new Map();
37
+ $[2] = t2;
38
+ } else t2 = $[2];
39
+ const partialSchemaCacheRef = useRef(t2);
40
+ let t3;
41
+ if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
42
+ t3 = /* @__PURE__ */ new Map();
43
+ $[3] = t3;
44
+ } else t3 = $[3];
45
+ const detachedStateRef = useRef(t3);
46
+ const adapterRef = useRef(void 0);
47
+ let t4;
48
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
49
+ t4 = () => {
50
+ const result = nullProtoRecord();
51
+ for (const [id, def] of Object.entries(stateRef.current.definitions)) result[id] = {
52
+ name: def.name,
53
+ state: def.state
41
54
  };
42
- });
43
- }, [setStateAndRef]);
44
- const { flushIfPending, schedulePersistence, flush } = useInteractablePersistenceQueue({
45
- adapterRef,
46
- snapshot: exportState,
47
- updatePersistenceStatus
48
- });
49
- const importState = useCallback((saved) => {
50
- for (const [id_0, entry] of Object.entries(saved)) detachedStateRef.current.set(id_0, entry.state);
51
- setStateAndRef((prev_0) => {
52
- let changed = false;
53
- const definitions = { ...prev_0.definitions };
54
- for (const [id_1, entry_0] of Object.entries(saved)) if (definitions[id_1]) {
55
- definitions[id_1] = {
56
- ...definitions[id_1],
57
- state: entry_0.state
55
+ return result;
56
+ };
57
+ $[4] = t4;
58
+ } else t4 = $[4];
59
+ const exportState = t4;
60
+ let t5;
61
+ if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
62
+ t5 = (updater_0) => {
63
+ setStateAndRef((prev) => {
64
+ const persistence = updater_0(prev.persistence);
65
+ return persistence === prev.persistence ? prev : {
66
+ ...prev,
67
+ persistence
58
68
  };
59
- changed = true;
60
- }
61
- return changed ? {
62
- ...prev_0,
63
- definitions
64
- } : prev_0;
65
- });
66
- }, [setStateAndRef]);
67
- const setPersistenceAdapter = useCallback((adapter) => {
68
- if (adapterRef.current !== adapter) flushIfPending();
69
- adapterRef.current = adapter;
70
- }, [flushIfPending]);
71
- const setDefState = useCallback((id_2, updater_1) => {
72
- setStateAndRef((prev_1) => {
73
- const existing = prev_1.definitions[id_2];
74
- if (!existing) return prev_1;
75
- return {
76
- ...prev_1,
77
- definitions: {
78
- ...prev_1.definitions,
79
- [id_2]: {
69
+ });
70
+ };
71
+ $[5] = t5;
72
+ } else t5 = $[5];
73
+ const updatePersistenceStatus = t5;
74
+ let t6;
75
+ if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
76
+ t6 = {
77
+ adapterRef,
78
+ snapshot: exportState,
79
+ updatePersistenceStatus
80
+ };
81
+ $[6] = t6;
82
+ } else t6 = $[6];
83
+ const { flushIfPending, schedulePersistence, flush } = useInteractablePersistenceQueue(t6);
84
+ let t7;
85
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
86
+ t7 = (saved) => {
87
+ for (const [id_0, entry] of Object.entries(saved)) detachedStateRef.current.set(id_0, entry.state);
88
+ setStateAndRef((prev_0) => {
89
+ let changed = false;
90
+ const definitions = nullProtoRecord(prev_0.definitions);
91
+ for (const [id_1, entry_0] of Object.entries(saved)) if (definitions[id_1]) {
92
+ definitions[id_1] = {
93
+ ...definitions[id_1],
94
+ state: entry_0.state
95
+ };
96
+ changed = true;
97
+ }
98
+ return changed ? {
99
+ ...prev_0,
100
+ definitions
101
+ } : prev_0;
102
+ });
103
+ };
104
+ $[7] = t7;
105
+ } else t7 = $[7];
106
+ const importState = t7;
107
+ let t8;
108
+ if ($[8] !== flushIfPending) {
109
+ t8 = (adapter) => {
110
+ if (adapterRef.current !== adapter) flushIfPending();
111
+ adapterRef.current = adapter;
112
+ };
113
+ $[8] = flushIfPending;
114
+ $[9] = t8;
115
+ } else t8 = $[9];
116
+ const setPersistenceAdapter = t8;
117
+ let t9;
118
+ if ($[10] !== schedulePersistence) {
119
+ t9 = (id_2, updater_1) => {
120
+ setStateAndRef((prev_1) => {
121
+ const existing = prev_1.definitions[id_2];
122
+ if (!existing) return prev_1;
123
+ return {
124
+ ...prev_1,
125
+ definitions: nullProtoRecord(prev_1.definitions, { [id_2]: {
80
126
  ...existing,
81
127
  state: updater_1(existing.state)
82
- }
83
- }
84
- };
85
- });
86
- if (stateRef.current.definitions[id_2]) schedulePersistence(id_2);
87
- }, [schedulePersistence, setStateAndRef]);
88
- const setDefSelected = useCallback((id_3, selected) => {
89
- setStateAndRef((prev_2) => {
90
- const existing_0 = prev_2.definitions[id_3];
91
- if (!existing_0) return prev_2;
92
- return {
93
- ...prev_2,
94
- definitions: {
95
- ...prev_2.definitions,
96
- [id_3]: {
128
+ } })
129
+ };
130
+ });
131
+ if (stateRef.current.definitions[id_2]) schedulePersistence(id_2);
132
+ };
133
+ $[10] = schedulePersistence;
134
+ $[11] = t9;
135
+ } else t9 = $[11];
136
+ const setDefState = t9;
137
+ let t10;
138
+ if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
139
+ t10 = (id_3, selected) => {
140
+ setStateAndRef((prev_2) => {
141
+ const existing_0 = prev_2.definitions[id_3];
142
+ if (!existing_0) return prev_2;
143
+ return {
144
+ ...prev_2,
145
+ definitions: nullProtoRecord(prev_2.definitions, { [id_3]: {
97
146
  ...existing_0,
98
147
  selected
99
- }
100
- }
101
- };
102
- });
103
- }, [setStateAndRef]);
104
- const provider = useMemo(() => ({
105
- getModelContext: () => {
148
+ } })
149
+ };
150
+ });
151
+ };
152
+ $[12] = t10;
153
+ } else t10 = $[12];
154
+ const setDefSelected = t10;
155
+ let t11;
156
+ if ($[13] !== setDefState) {
157
+ t11 = () => {
106
158
  const defs = stateRef.current.definitions;
107
159
  return buildInteractableModelContext(defs, partialSchemaCacheRef.current, setDefState) ?? {};
108
- },
109
- subscribe: (callback) => {
160
+ };
161
+ $[13] = setDefState;
162
+ $[14] = t11;
163
+ } else t11 = $[14];
164
+ let t12;
165
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
166
+ t12 = (callback) => {
110
167
  subscribersRef.current.add(callback);
111
168
  return () => {
112
169
  subscribersRef.current.delete(callback);
113
170
  };
114
- }
115
- }), [setDefState]);
116
- useEffect(() => {
117
- notifySubscribers(subscribersRef.current);
118
- }, [state]);
119
- useAssistantScopeEffect("modelContext", () => clientRef.current.modelContext().register(provider), [provider]);
120
- return {
121
- getState: () => state,
122
- register: useCallback((def_0) => {
171
+ };
172
+ $[15] = t12;
173
+ } else t12 = $[15];
174
+ let t13;
175
+ if ($[16] !== t11) {
176
+ t13 = {
177
+ getModelContext: t11,
178
+ subscribe: t12
179
+ };
180
+ $[16] = t11;
181
+ $[17] = t13;
182
+ } else t13 = $[17];
183
+ const provider = t13;
184
+ let t14;
185
+ if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
186
+ t14 = () => {
187
+ notifySubscribers(subscribersRef.current);
188
+ };
189
+ $[18] = t14;
190
+ } else t14 = $[18];
191
+ let t15;
192
+ if ($[19] !== state) {
193
+ t15 = [state];
194
+ $[19] = state;
195
+ $[20] = t15;
196
+ } else t15 = $[20];
197
+ useEffect(t14, t15);
198
+ let t16;
199
+ if ($[21] !== clientRef || $[22] !== provider) {
200
+ t16 = () => clientRef.current.modelContext().register(provider);
201
+ $[21] = clientRef;
202
+ $[22] = provider;
203
+ $[23] = t16;
204
+ } else t16 = $[23];
205
+ let t17;
206
+ if ($[24] !== provider) {
207
+ t17 = [provider];
208
+ $[24] = provider;
209
+ $[25] = t17;
210
+ } else t17 = $[25];
211
+ useAssistantScopeEffect("modelContext", t16, t17);
212
+ let t18;
213
+ if ($[26] !== flushIfPending) {
214
+ t18 = (def_0) => {
123
215
  try {
124
216
  const jsonSchema = toJSONSchema(def_0.stateSchema);
125
217
  partialSchemaCacheRef.current.set(def_0.id, toPartialJSONSchema(jsonSchema));
126
- } catch (e) {
218
+ } catch (t19) {
219
+ const e = t19;
127
220
  console.warn(`[Interactables] Failed to create partial schema for "${def_0.name}". The update tool will require all fields.`, e);
128
221
  }
129
222
  const detached = detachedStateRef.current.get(def_0.id);
130
223
  detachedStateRef.current.delete(def_0.id);
131
224
  setStateAndRef((prev_3) => ({
132
225
  ...prev_3,
133
- definitions: {
134
- ...prev_3.definitions,
135
- [def_0.id]: {
136
- id: def_0.id,
137
- name: def_0.name,
138
- description: def_0.description,
139
- stateSchema: def_0.stateSchema,
140
- state: prev_3.definitions[def_0.id]?.state ?? detached ?? def_0.initialState,
141
- selected: def_0.selected
142
- }
143
- }
226
+ definitions: nullProtoRecord(prev_3.definitions, { [def_0.id]: {
227
+ id: def_0.id,
228
+ name: def_0.name,
229
+ description: def_0.description,
230
+ stateSchema: def_0.stateSchema,
231
+ state: prev_3.definitions[def_0.id]?.state ?? detached ?? def_0.initialState,
232
+ selected: def_0.selected
233
+ } })
144
234
  }));
145
235
  return () => {
146
236
  flushIfPending();
@@ -148,23 +238,48 @@ const useInteractables = () => {
148
238
  const existing_1 = prev_4.definitions[def_0.id];
149
239
  if (existing_1) detachedStateRef.current.set(def_0.id, existing_1.state);
150
240
  partialSchemaCacheRef.current.delete(def_0.id);
151
- const { [def_0.id]: _, ...rest } = prev_4.definitions;
152
- const { [def_0.id]: __, ...restPersistence } = prev_4.persistence;
241
+ const definitions_0 = nullProtoRecord(prev_4.definitions);
242
+ const persistence_0 = nullProtoRecord(prev_4.persistence);
243
+ delete definitions_0[def_0.id];
244
+ delete persistence_0[def_0.id];
153
245
  return {
154
246
  ...prev_4,
155
- definitions: rest,
156
- persistence: restPersistence
247
+ definitions: definitions_0,
248
+ persistence: persistence_0
157
249
  };
158
250
  });
159
251
  };
160
- }, [flushIfPending, setStateAndRef]),
161
- setState: setDefState,
162
- setSelected: setDefSelected,
163
- exportState,
164
- importState,
165
- setPersistenceAdapter,
166
- flush
167
- };
252
+ };
253
+ $[26] = flushIfPending;
254
+ $[27] = t18;
255
+ } else t18 = $[27];
256
+ const register = t18;
257
+ let t19;
258
+ if ($[28] !== state) {
259
+ t19 = () => state;
260
+ $[28] = state;
261
+ $[29] = t19;
262
+ } else t19 = $[29];
263
+ let t20;
264
+ if ($[30] !== flush || $[31] !== register || $[32] !== setDefState || $[33] !== setPersistenceAdapter || $[34] !== t19) {
265
+ t20 = {
266
+ getState: t19,
267
+ register,
268
+ setState: setDefState,
269
+ setSelected: setDefSelected,
270
+ exportState,
271
+ importState,
272
+ setPersistenceAdapter,
273
+ flush
274
+ };
275
+ $[30] = flush;
276
+ $[31] = register;
277
+ $[32] = setDefState;
278
+ $[33] = setPersistenceAdapter;
279
+ $[34] = t19;
280
+ $[35] = t20;
281
+ } else t20 = $[35];
282
+ return t20;
168
283
  };
169
284
  /**
170
285
  * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.
@@ -175,6 +290,12 @@ const Interactables = resource(useInteractables);
175
290
  attachTransformScopes$1(useInteractables, (scopes, parent) => {
176
291
  if (!scopes.modelContext && parent.modelContext.source === null) scopes.modelContext = ModelContext();
177
292
  });
293
+ function _temp() {
294
+ return {
295
+ definitions: nullProtoRecord(),
296
+ persistence: nullProtoRecord()
297
+ };
298
+ }
178
299
  //#endregion
179
300
  export { Interactables };
180
301
 
@@ -1 +1 @@
1
- {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","useAssistantClientRef","ClientOutput","attachTransformScopes","useAssistantScopeEffect","InteractablesState","InteractableRegistration","InteractableStateSchema","InteractablePersistedState","InteractablePersistenceAdapter","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","useInteractables","state","setState","definitions","persistence","clientRef","stateRef","setStateAndRef","updater","prev","next","current","subscribersRef","Set","partialSchemaCacheRef","Map","detachedStateRef","adapterRef","undefined","exportState","result","id","def","Object","entries","name","updatePersistenceStatus","flushIfPending","schedulePersistence","flush","snapshot","importState","saved","entry","set","changed","setPersistenceAdapter","adapter","setDefState","existing","setDefSelected","selected","provider","getModelContext","defs","subscribe","callback","add","delete","modelContext","register","jsonSchema","stateSchema","e","console","warn","detached","get","description","initialState","_","rest","__","restPersistence","getState","setSelected","Interactables","scopes","parent","source"],"sources":["../../../src/react/interactables-legacy/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport { useAssistantScopeEffect } from \"@assistant-ui/store/client\";\nimport type {\n InteractablesState,\n InteractableRegistration,\n InteractableStateSchema,\n InteractablePersistedState,\n InteractablePersistenceAdapter,\n} from \"./scopes\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store\";\nimport { buildInteractableModelContext } from \"./interactable-model-context\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\n\nconst useInteractables = (): ClientOutput<\"interactables\"> => {\n const [state, setState] = useState<InteractablesState>(() => ({\n definitions: {},\n persistence: {},\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const setStateAndRef = useCallback(\n (updater: (prev: InteractablesState) => InteractablesState) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(\n new Map<string, InteractableStateSchema>(),\n );\n const detachedStateRef = useRef(new Map<string, unknown>());\n\n const adapterRef = useRef<InteractablePersistenceAdapter | undefined>(\n undefined,\n );\n\n const exportState = useCallback((): InteractablePersistedState => {\n const result: InteractablePersistedState = {};\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: InteractablesState[\"persistence\"],\n ) => InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const importState = useCallback(\n (saved: InteractablePersistedState) => {\n for (const [id, entry] of Object.entries(saved)) {\n detachedStateRef.current.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = { ...prev.definitions };\n for (const [id, entry] of Object.entries(saved)) {\n if (definitions[id]) {\n definitions[id] = { ...definitions[id], state: entry.state };\n changed = true;\n }\n }\n return changed ? { ...prev, definitions } : prev;\n });\n },\n [setStateAndRef],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n },\n [flushIfPending],\n );\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, state: updater(existing.state) },\n },\n };\n });\n if (stateRef.current.definitions[id]) schedulePersistence(id);\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const setDefSelected = useCallback(\n (id: string, selected: boolean) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: {\n ...prev.definitions,\n [id]: { ...existing, selected },\n },\n };\n });\n },\n [setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const register = useCallback(\n (def: InteractableRegistration) => {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will require all fields.`,\n e,\n );\n }\n\n const detached = detachedStateRef.current.get(def.id);\n detachedStateRef.current.delete(def.id);\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: {\n ...prev.definitions,\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n state:\n prev.definitions[def.id]?.state ?? detached ?? def.initialState,\n selected: def.selected,\n },\n },\n }));\n\n return () => {\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n detachedStateRef.current.set(def.id, existing.state);\n }\n partialSchemaCacheRef.current.delete(def.id);\n const { [def.id]: _, ...rest } = prev.definitions;\n const { [def.id]: __, ...restPersistence } = prev.persistence;\n return { ...prev, definitions: rest, persistence: restPersistence };\n });\n };\n },\n [flushIfPending, setStateAndRef],\n );\n\n return {\n getState: () => state,\n register,\n setState: setDefState,\n setSelected: setDefSelected,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport const Interactables = resource(useInteractables);\n\nattachTransformScopes(useInteractables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Interactables.js","names":["useState","useEffect","useCallback","useRef","useMemo","resource","useAssistantClientRef","ClientOutput","attachTransformScopes","useAssistantScopeEffect","InteractablesState","InteractableRegistration","InteractableStateSchema","InteractablePersistedState","InteractablePersistenceAdapter","toJSONSchema","toPartialJSONSchema","ModelContext","buildInteractableModelContext","notifySubscribers","notifyStateSubscribers","useInteractablePersistenceQueue","nullProtoRecord","useInteractables","$","_c","state","setState","_temp","clientRef","stateRef","t0","Symbol","for","updater","next","current","setStateAndRef","t1","Set","subscribersRef","t2","Map","partialSchemaCacheRef","t3","detachedStateRef","adapterRef","undefined","t4","result","id","def","Object","entries","definitions","name","exportState","t5","updater_0","prev","persistence","updatePersistenceStatus","t6","snapshot","flushIfPending","schedulePersistence","flush","t7","saved","id_0","entry","set","prev_0","changed","id_1","entry_0","importState","t8","adapter","setPersistenceAdapter","t9","id_2","updater_1","prev_1","existing","setDefState","t10","id_3","selected","prev_2","existing_0","setDefSelected","t11","defs","t12","callback","add","delete","t13","getModelContext","subscribe","provider","t14","t15","t16","modelContext","register","t17","t18","def_0","jsonSchema","stateSchema","t19","e","console","warn","detached","get","prev_3","description","initialState","prev_4","existing_1","definitions_0","persistence_0","t20","getState","setSelected","Interactables","scopes","parent","source"],"sources":["../../../src/react/interactables-legacy/Interactables.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n useAssistantClientRef,\n type ClientOutput,\n attachTransformScopes,\n} from \"@assistant-ui/store\";\nimport { useAssistantScopeEffect } from \"@assistant-ui/store/client\";\nimport type {\n InteractablesState,\n InteractableRegistration,\n InteractableStateSchema,\n InteractablePersistedState,\n InteractablePersistenceAdapter,\n} from \"./scopes\";\nimport { toJSONSchema, toPartialJSONSchema } from \"assistant-stream\";\nimport { ModelContext } from \"../../store\";\nimport { buildInteractableModelContext } from \"./interactable-model-context\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../../subscribable/subscribable\";\nimport { useInteractablePersistenceQueue } from \"../interactables-shared/useInteractablePersistenceQueue\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\nconst useInteractables = (): ClientOutput<\"interactables\"> => {\n const [state, setState] = useState<InteractablesState>(() => ({\n definitions: nullProtoRecord(),\n persistence: nullProtoRecord(),\n }));\n\n const clientRef = useAssistantClientRef();\n\n const stateRef = useRef(state);\n\n const setStateAndRef = useCallback(\n (updater: (prev: InteractablesState) => InteractablesState) => {\n const next = updater(stateRef.current);\n stateRef.current = next;\n setState(next);\n },\n [],\n );\n\n const subscribersRef = useRef(new Set<() => void>());\n const partialSchemaCacheRef = useRef(\n new Map<string, InteractableStateSchema>(),\n );\n const detachedStateRef = useRef(new Map<string, unknown>());\n\n const adapterRef = useRef<InteractablePersistenceAdapter | undefined>(\n undefined,\n );\n\n const exportState = useCallback((): InteractablePersistedState => {\n const result = nullProtoRecord<InteractablePersistedState[string]>();\n for (const [id, def] of Object.entries(stateRef.current.definitions)) {\n result[id] = { name: def.name, state: def.state };\n }\n return result;\n }, []);\n\n const updatePersistenceStatus = useCallback(\n (\n updater: (\n prev: InteractablesState[\"persistence\"],\n ) => InteractablesState[\"persistence\"],\n ) => {\n setStateAndRef((prev) => {\n const persistence = updater(prev.persistence);\n return persistence === prev.persistence\n ? prev\n : { ...prev, persistence };\n });\n },\n [setStateAndRef],\n );\n\n const { flushIfPending, schedulePersistence, flush } =\n useInteractablePersistenceQueue({\n adapterRef,\n snapshot: exportState,\n updatePersistenceStatus,\n });\n\n const importState = useCallback(\n (saved: InteractablePersistedState) => {\n for (const [id, entry] of Object.entries(saved)) {\n detachedStateRef.current.set(id, entry.state);\n }\n setStateAndRef((prev) => {\n let changed = false;\n const definitions = nullProtoRecord(prev.definitions);\n for (const [id, entry] of Object.entries(saved)) {\n if (definitions[id]) {\n definitions[id] = { ...definitions[id], state: entry.state };\n changed = true;\n }\n }\n return changed ? { ...prev, definitions } : prev;\n });\n },\n [setStateAndRef],\n );\n\n const setPersistenceAdapter = useCallback(\n (adapter: InteractablePersistenceAdapter | undefined) => {\n if (adapterRef.current !== adapter) flushIfPending();\n adapterRef.current = adapter;\n },\n [flushIfPending],\n );\n\n const setDefState = useCallback(\n (id: string, updater: (prev: unknown) => unknown) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [id]: { ...existing, state: updater(existing.state) },\n }),\n };\n });\n if (stateRef.current.definitions[id]) schedulePersistence(id);\n },\n [schedulePersistence, setStateAndRef],\n );\n\n const setDefSelected = useCallback(\n (id: string, selected: boolean) => {\n setStateAndRef((prev) => {\n const existing = prev.definitions[id];\n if (!existing) return prev;\n return {\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [id]: { ...existing, selected },\n }),\n };\n });\n },\n [setStateAndRef],\n );\n\n const provider = useMemo(\n () => ({\n getModelContext: () => {\n const defs = stateRef.current.definitions;\n return (\n buildInteractableModelContext(\n defs,\n partialSchemaCacheRef.current,\n setDefState,\n ) ?? {}\n );\n },\n subscribe: (callback: () => void) => {\n subscribersRef.current.add(callback);\n return () => {\n subscribersRef.current.delete(callback);\n };\n },\n }),\n [setDefState],\n );\n\n useEffect(() => {\n notifyStateSubscribers(subscribersRef.current);\n }, [state]);\n\n useAssistantScopeEffect(\n \"modelContext\",\n () => clientRef.current!.modelContext().register(provider),\n [provider],\n );\n\n const register = useCallback(\n (def: InteractableRegistration) => {\n try {\n const jsonSchema = toJSONSchema(def.stateSchema);\n partialSchemaCacheRef.current.set(\n def.id,\n toPartialJSONSchema(jsonSchema),\n );\n } catch (e) {\n console.warn(\n `[Interactables] Failed to create partial schema for \"${def.name}\". The update tool will require all fields.`,\n e,\n );\n }\n\n const detached = detachedStateRef.current.get(def.id);\n detachedStateRef.current.delete(def.id);\n\n setStateAndRef((prev) => ({\n ...prev,\n definitions: nullProtoRecord(prev.definitions, {\n [def.id]: {\n id: def.id,\n name: def.name,\n description: def.description,\n stateSchema: def.stateSchema,\n state:\n prev.definitions[def.id]?.state ?? detached ?? def.initialState,\n selected: def.selected,\n },\n }),\n }));\n\n return () => {\n flushIfPending();\n setStateAndRef((prev) => {\n const existing = prev.definitions[def.id];\n if (existing) {\n detachedStateRef.current.set(def.id, existing.state);\n }\n partialSchemaCacheRef.current.delete(def.id);\n const definitions = nullProtoRecord(prev.definitions);\n const persistence = nullProtoRecord(prev.persistence);\n delete definitions[def.id];\n delete persistence[def.id];\n return { ...prev, definitions, persistence };\n });\n };\n },\n [flushIfPending, setStateAndRef],\n );\n\n return {\n getState: () => state,\n register,\n setState: setDefState,\n setSelected: setDefSelected,\n exportState,\n importState,\n setPersistenceAdapter,\n flush,\n };\n};\n\n/**\n * @deprecated Since 2026-06-14 — migrate to the Unstable / Experimental API.\n * Scheduled for removal on/after 2026-09-14. See\n * {@link https://www.assistant-ui.com/docs/tools/interactables#migrating-from-the-previous-api | Interactables migration guide}.\n */\nexport const Interactables = resource(useInteractables);\n\nattachTransformScopes(useInteractables, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useInteractablePersistenceQueue.d.ts","names":[],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"mappings":";;KAIK,mBAAmB;EACtB,KAAK,OAAO,eAAe;;KAGxB;EACH;EACA;;KAGG,uBAAuB,eAAe;KAEtC,4BACH,UAAU,MAAM,yBAAyB;KAGtC,uCAAuC;EAC1C,YAAY,UAAU,mBAAmB;EACzC,gBAAgB;EAChB,yBAAyB;;cAGd,kCAAmC,SAAO,YAAA,UAAA,2BAIpD,uCAAuC;;EAyIjC,sBAAA"}
1
+ {"version":3,"file":"useInteractablePersistenceQueue.d.ts","names":[],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"mappings":";;KAKK,mBAAmB;EACtB,KAAK,OAAO,eAAe;;KAGxB;EACH;EACA;;KAGG,uBAAuB,eAAe;KAEtC,4BACH,UAAU,MAAM,yBAAyB;KAGtC,uCAAuC;EAC1C,YAAY,UAAU,mBAAmB;EACzC,gBAAgB;EAChB,yBAAyB;;cAGd,kCAAmC,SAAO,YAAA,UAAA,2BAIpD,uCAAuC;;EAuIjC,sBAAA"}
@@ -1,3 +1,4 @@
1
+ import { nullProtoRecord } from "../../utils/record.js";
1
2
  import { useCallback, useRef } from "@assistant-ui/tap/react-shim";
2
3
  //#region src/react/interactables-shared/useInteractablePersistenceQueue.ts
3
4
  const PERSISTENCE_DEBOUNCE_MS = 500;
@@ -40,13 +41,14 @@ const useInteractablePersistenceQueue = ({ adapterRef, snapshot, updatePersisten
40
41
  }
41
42
  const { adapter: adapter_1, payload, dirtyIds: dirtyIds_0, seq: seq_0 } = resolved;
42
43
  inFlightPersistenceRef.current += 1;
43
- updatePersistenceStatus((prev) => ({
44
- ...prev,
45
- ...Object.fromEntries([...dirtyIds_0].map((id_0) => [id_0, {
44
+ updatePersistenceStatus((prev) => {
45
+ const persistence = nullProtoRecord(prev);
46
+ for (const id_0 of dirtyIds_0) persistence[id_0] = {
46
47
  isPending: true,
47
48
  error: void 0
48
- }]))
49
- }));
49
+ };
50
+ return persistence;
51
+ });
50
52
  const settleBatch = (status) => {
51
53
  const settledIds = [];
52
54
  for (const id_1 of dirtyIds_0) {
@@ -57,14 +59,14 @@ const useInteractablePersistenceQueue = ({ adapterRef, snapshot, updatePersisten
57
59
  if (settledIds.length === 0) return;
58
60
  updatePersistenceStatus((prev_0) => {
59
61
  let changed = false;
60
- const persistence = { ...prev_0 };
62
+ const persistence_0 = nullProtoRecord(prev_0);
61
63
  for (const id_2 of settledIds) {
62
64
  if (prev_0[id_2] === void 0) continue;
63
- if (status === void 0) delete persistence[id_2];
64
- else persistence[id_2] = status;
65
+ if (status === void 0) delete persistence_0[id_2];
66
+ else persistence_0[id_2] = status;
65
67
  changed = true;
66
68
  }
67
- return changed ? persistence : prev_0;
69
+ return changed ? persistence_0 : prev_0;
68
70
  });
69
71
  };
70
72
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"useInteractablePersistenceQueue.js","names":["useCallback","useRef","RefObject","PERSISTENCE_DEBOUNCE_MS","PersistenceAdapter","save","state","State","Promise","PersistenceStatus","isPending","error","PersistenceStatusMap","Record","PersistenceStatusUpdater","updater","prev","UseInteractablePersistenceQueueOptions","adapterRef","snapshot","updatePersistenceStatus","useInteractablePersistenceQueue","debounceTimerRef","ReturnType","setTimeout","undefined","syncSeqRef","latestSyncSeqByIdRef","Map","inFlightPersistenceRef","flushResolversRef","Array","dirtyIdsRef","Set","PersistenceBatch","adapter","payload","dirtyIds","seq","outgoingQueueRef","runPersistenceRef","batch","takeDirtyBatch","current","size","clear","id","set","enqueuePersistence","push","runPersistence","resolved","resolve","Object","fromEntries","map","settleBatch","status","settledIds","get","has","delete","length","changed","persistence","e","next","shift","clearTimeout","nextBatch","flushIfPending","schedulePersistence","add","flush","hasWork","p"],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"sourcesContent":["import { useCallback, useRef, type RefObject } from \"react\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\ntype PersistenceAdapter<State> = {\n save(state: State): void | Promise<void>;\n};\n\ntype PersistenceStatus = {\n isPending: boolean;\n error: unknown;\n};\n\ntype PersistenceStatusMap = Record<string, PersistenceStatus>;\n\ntype PersistenceStatusUpdater = (\n updater: (prev: PersistenceStatusMap) => PersistenceStatusMap,\n) => void;\n\ntype UseInteractablePersistenceQueueOptions<State> = {\n adapterRef: RefObject<PersistenceAdapter<State> | undefined>;\n snapshot: () => State;\n updatePersistenceStatus: PersistenceStatusUpdater;\n};\n\nexport const useInteractablePersistenceQueue = <State>({\n adapterRef,\n snapshot,\n updatePersistenceStatus,\n}: UseInteractablePersistenceQueueOptions<State>) => {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = useRef(0);\n const latestSyncSeqByIdRef = useRef(new Map<string, number>());\n const inFlightPersistenceRef = useRef(0);\n const flushResolversRef = useRef<Array<() => void>>([]);\n const dirtyIdsRef = useRef(new Set<string>());\n\n type PersistenceBatch = {\n adapter: PersistenceAdapter<State>;\n payload: State;\n dirtyIds: Set<string>;\n seq: number;\n };\n\n const outgoingQueueRef = useRef<PersistenceBatch[]>([]);\n const runPersistenceRef = useRef<(batch?: PersistenceBatch) => void>(\n () => {},\n );\n\n const takeDirtyBatch = useCallback(\n (adapter: PersistenceAdapter<State>): PersistenceBatch | undefined => {\n if (dirtyIdsRef.current.size === 0) return;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n const seq = ++syncSeqRef.current;\n for (const id of dirtyIds) latestSyncSeqByIdRef.current.set(id, seq);\n return { adapter, payload: snapshot(), dirtyIds, seq };\n },\n [snapshot],\n );\n\n const enqueuePersistence = useCallback(\n (adapter: PersistenceAdapter<State>) => {\n const batch = takeDirtyBatch(adapter);\n if (!batch) return;\n if (inFlightPersistenceRef.current === 0) {\n runPersistenceRef.current(batch);\n } else {\n outgoingQueueRef.current.push(batch);\n }\n },\n [takeDirtyBatch],\n );\n\n const runPersistence = useCallback(\n async (batch?: PersistenceBatch) => {\n const resolved =\n batch ??\n (adapterRef.current ? takeDirtyBatch(adapterRef.current) : undefined);\n if (!resolved) {\n if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n return;\n }\n\n const { adapter, payload, dirtyIds, seq } = resolved;\n inFlightPersistenceRef.current += 1;\n\n updatePersistenceStatus((prev) => ({\n ...prev,\n ...Object.fromEntries(\n [...dirtyIds].map((id) => [\n id,\n { isPending: true, error: undefined },\n ]),\n ),\n }));\n\n const settleBatch = (status: PersistenceStatus | undefined) => {\n const settledIds: string[] = [];\n for (const id of dirtyIds) {\n if (\n latestSyncSeqByIdRef.current.get(id) !== seq ||\n dirtyIdsRef.current.has(id)\n )\n continue;\n latestSyncSeqByIdRef.current.delete(id);\n settledIds.push(id);\n }\n if (settledIds.length === 0) return;\n updatePersistenceStatus((prev) => {\n let changed = false;\n const persistence = { ...prev };\n for (const id of settledIds) {\n if (prev[id] === undefined) continue;\n if (status === undefined) delete persistence[id];\n else persistence[id] = status;\n changed = true;\n }\n return changed ? persistence : prev;\n });\n };\n\n try {\n await adapter.save(payload);\n settleBatch(undefined);\n } catch (e) {\n settleBatch({ isPending: false, error: e });\n } finally {\n inFlightPersistenceRef.current -= 1;\n const next =\n outgoingQueueRef.current.shift() ??\n (adapterRef.current && dirtyIdsRef.current.size > 0\n ? takeDirtyBatch(adapterRef.current)\n : undefined);\n if (next) {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n runPersistenceRef.current(next);\n } else if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n },\n [adapterRef, takeDirtyBatch, updatePersistenceStatus],\n );\n runPersistenceRef.current = (nextBatch) => {\n void runPersistence(nextBatch);\n };\n\n const flushIfPending = useCallback(() => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, [adapterRef, enqueuePersistence]);\n\n const schedulePersistence = useCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (inFlightPersistenceRef.current === 0 && adapterRef.current) {\n enqueuePersistence(adapterRef.current);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [adapterRef, enqueuePersistence],\n );\n\n const flush = useCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n const hasWork =\n inFlightPersistenceRef.current > 0 ||\n dirtyIdsRef.current.size > 0 ||\n outgoingQueueRef.current.length > 0;\n if (!hasWork) return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n return p;\n }, [adapterRef, enqueuePersistence]);\n\n return { flushIfPending, schedulePersistence, flush };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useInteractablePersistenceQueue.js","names":["useCallback","useRef","RefObject","nullProtoRecord","PERSISTENCE_DEBOUNCE_MS","PersistenceAdapter","save","state","State","Promise","PersistenceStatus","isPending","error","PersistenceStatusMap","Record","PersistenceStatusUpdater","updater","prev","UseInteractablePersistenceQueueOptions","adapterRef","snapshot","updatePersistenceStatus","useInteractablePersistenceQueue","debounceTimerRef","ReturnType","setTimeout","undefined","syncSeqRef","latestSyncSeqByIdRef","Map","inFlightPersistenceRef","flushResolversRef","Array","dirtyIdsRef","Set","PersistenceBatch","adapter","payload","dirtyIds","seq","outgoingQueueRef","runPersistenceRef","batch","takeDirtyBatch","current","size","clear","id","set","enqueuePersistence","push","runPersistence","resolved","resolve","persistence","settleBatch","status","settledIds","get","has","delete","length","changed","e","next","shift","clearTimeout","nextBatch","flushIfPending","schedulePersistence","add","flush","hasWork","p"],"sources":["../../../src/react/interactables-shared/useInteractablePersistenceQueue.ts"],"sourcesContent":["import { useCallback, useRef, type RefObject } from \"react\";\nimport { nullProtoRecord } from \"../../utils/record\";\n\nconst PERSISTENCE_DEBOUNCE_MS = 500;\n\ntype PersistenceAdapter<State> = {\n save(state: State): void | Promise<void>;\n};\n\ntype PersistenceStatus = {\n isPending: boolean;\n error: unknown;\n};\n\ntype PersistenceStatusMap = Record<string, PersistenceStatus>;\n\ntype PersistenceStatusUpdater = (\n updater: (prev: PersistenceStatusMap) => PersistenceStatusMap,\n) => void;\n\ntype UseInteractablePersistenceQueueOptions<State> = {\n adapterRef: RefObject<PersistenceAdapter<State> | undefined>;\n snapshot: () => State;\n updatePersistenceStatus: PersistenceStatusUpdater;\n};\n\nexport const useInteractablePersistenceQueue = <State>({\n adapterRef,\n snapshot,\n updatePersistenceStatus,\n}: UseInteractablePersistenceQueueOptions<State>) => {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined,\n );\n const syncSeqRef = useRef(0);\n const latestSyncSeqByIdRef = useRef(new Map<string, number>());\n const inFlightPersistenceRef = useRef(0);\n const flushResolversRef = useRef<Array<() => void>>([]);\n const dirtyIdsRef = useRef(new Set<string>());\n\n type PersistenceBatch = {\n adapter: PersistenceAdapter<State>;\n payload: State;\n dirtyIds: Set<string>;\n seq: number;\n };\n\n const outgoingQueueRef = useRef<PersistenceBatch[]>([]);\n const runPersistenceRef = useRef<(batch?: PersistenceBatch) => void>(\n () => {},\n );\n\n const takeDirtyBatch = useCallback(\n (adapter: PersistenceAdapter<State>): PersistenceBatch | undefined => {\n if (dirtyIdsRef.current.size === 0) return;\n const dirtyIds = new Set(dirtyIdsRef.current);\n dirtyIdsRef.current.clear();\n const seq = ++syncSeqRef.current;\n for (const id of dirtyIds) latestSyncSeqByIdRef.current.set(id, seq);\n return { adapter, payload: snapshot(), dirtyIds, seq };\n },\n [snapshot],\n );\n\n const enqueuePersistence = useCallback(\n (adapter: PersistenceAdapter<State>) => {\n const batch = takeDirtyBatch(adapter);\n if (!batch) return;\n if (inFlightPersistenceRef.current === 0) {\n runPersistenceRef.current(batch);\n } else {\n outgoingQueueRef.current.push(batch);\n }\n },\n [takeDirtyBatch],\n );\n\n const runPersistence = useCallback(\n async (batch?: PersistenceBatch) => {\n const resolved =\n batch ??\n (adapterRef.current ? takeDirtyBatch(adapterRef.current) : undefined);\n if (!resolved) {\n if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n return;\n }\n\n const { adapter, payload, dirtyIds, seq } = resolved;\n inFlightPersistenceRef.current += 1;\n\n updatePersistenceStatus((prev) => {\n const persistence = nullProtoRecord(prev);\n for (const id of dirtyIds) {\n persistence[id] = { isPending: true, error: undefined };\n }\n return persistence;\n });\n\n const settleBatch = (status: PersistenceStatus | undefined) => {\n const settledIds: string[] = [];\n for (const id of dirtyIds) {\n if (\n latestSyncSeqByIdRef.current.get(id) !== seq ||\n dirtyIdsRef.current.has(id)\n )\n continue;\n latestSyncSeqByIdRef.current.delete(id);\n settledIds.push(id);\n }\n if (settledIds.length === 0) return;\n updatePersistenceStatus((prev) => {\n let changed = false;\n const persistence = nullProtoRecord(prev);\n for (const id of settledIds) {\n if (prev[id] === undefined) continue;\n if (status === undefined) delete persistence[id];\n else persistence[id] = status;\n changed = true;\n }\n return changed ? persistence : prev;\n });\n };\n\n try {\n await adapter.save(payload);\n settleBatch(undefined);\n } catch (e) {\n settleBatch({ isPending: false, error: e });\n } finally {\n inFlightPersistenceRef.current -= 1;\n const next =\n outgoingQueueRef.current.shift() ??\n (adapterRef.current && dirtyIdsRef.current.size > 0\n ? takeDirtyBatch(adapterRef.current)\n : undefined);\n if (next) {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n runPersistenceRef.current(next);\n } else if (inFlightPersistenceRef.current === 0) {\n for (const resolve of flushResolversRef.current) resolve();\n flushResolversRef.current = [];\n }\n }\n },\n [adapterRef, takeDirtyBatch, updatePersistenceStatus],\n );\n runPersistenceRef.current = (nextBatch) => {\n void runPersistence(nextBatch);\n };\n\n const flushIfPending = useCallback(() => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, [adapterRef, enqueuePersistence]);\n\n const schedulePersistence = useCallback(\n (id: string) => {\n if (!adapterRef.current) return;\n dirtyIdsRef.current.add(id);\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (inFlightPersistenceRef.current === 0 && adapterRef.current) {\n enqueuePersistence(adapterRef.current);\n } else {\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = undefined;\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n }, PERSISTENCE_DEBOUNCE_MS);\n }\n }, PERSISTENCE_DEBOUNCE_MS);\n },\n [adapterRef, enqueuePersistence],\n );\n\n const flush = useCallback(async () => {\n if (debounceTimerRef.current !== undefined) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = undefined;\n }\n const hasWork =\n inFlightPersistenceRef.current > 0 ||\n dirtyIdsRef.current.size > 0 ||\n outgoingQueueRef.current.length > 0;\n if (!hasWork) return;\n const p = new Promise<void>((resolve) => {\n flushResolversRef.current.push(resolve);\n });\n if (adapterRef.current) enqueuePersistence(adapterRef.current);\n return p;\n }, [adapterRef, enqueuePersistence]);\n\n return { flushIfPending, schedulePersistence, flush };\n};\n"],"mappings":"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"}
@@ -8,7 +8,7 @@ import { FC } from "react";
8
8
  * subtree.
9
9
  *
10
10
  * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
11
- * `useAui({ tools: Tools({ toolkit }) })` instead. See
11
+ * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
12
12
  * https://assistant-ui.com/docs/migrations/toolkit-tools.
13
13
  */
14
14
  type AssistantTool = FC & {
@@ -24,7 +24,7 @@ type AssistantTool = FC & {
24
24
  * @param tool - Tool definition and name to register.
25
25
  *
26
26
  * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
27
- * `useAui({ tools: Tools({ toolkit }) })` instead. See
27
+ * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
28
28
  * https://assistant-ui.com/docs/migrations/toolkit-tools.
29
29
  */
30
30
  declare const makeAssistantTool: <TArgs extends Record<string, unknown>, TResult>(tool: AssistantToolProps<TArgs, TResult>) => AssistantTool;
@@ -9,7 +9,7 @@ import { useAssistantTool } from "./useAssistantTool.js";
9
9
  * @param tool - Tool definition and name to register.
10
10
  *
11
11
  * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via
12
- * `useAui({ tools: Tools({ toolkit }) })` instead. See
12
+ * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See
13
13
  * https://assistant-ui.com/docs/migrations/toolkit-tools.
14
14
  */
15
15
  const makeAssistantTool = (tool) => {
@@ -1 +1 @@
1
- {"version":3,"file":"makeAssistantTool.js","names":["FC","AssistantToolProps","useAssistantTool","AssistantTool","unstable_tool","makeAssistantTool","Record","tool","TArgs","TResult","Tool"],"sources":["../../../src/react/model-context/makeAssistantTool.ts"],"sourcesContent":["import type { FC } from \"react\";\nimport { type AssistantToolProps, useAssistantTool } from \"./useAssistantTool\";\n\n/**\n * Component returned by {@link makeAssistantTool}.\n *\n * Rendering the component registers its tool for the lifetime of that render\n * subtree.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `useAui({ tools: Tools({ toolkit }) })` instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport type AssistantTool = FC & {\n /** Tool definition registered by this component. */\n unstable_tool: AssistantToolProps<any, any>;\n};\n\n/**\n * Creates a React component that registers an assistant tool when rendered.\n *\n * Use this when exporting reusable tool modules that can be included in JSX\n * rather than calling {@link useAssistantTool} directly.\n *\n * @param tool - Tool definition and name to register.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `useAui({ tools: Tools({ toolkit }) })` instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport const makeAssistantTool = <\n TArgs extends Record<string, unknown>,\n TResult,\n>(\n tool: AssistantToolProps<TArgs, TResult>,\n) => {\n const Tool: AssistantTool = () => {\n useAssistantTool(tool);\n return null;\n };\n Tool.unstable_tool = tool;\n return Tool;\n};\n"],"mappings":";;;;;;;;;;;;;;AA8BA,MAAaK,qBAIXE,SACG;CACH,MAAMG,aAAsB;EAC1BR,iBAAiBK,IAAI;EAAC,OACf;CAAI;CAEbG,KAAKN,gBAAgBG;CACrB,OAAOG;AACT"}
1
+ {"version":3,"file":"makeAssistantTool.js","names":["FC","AssistantToolProps","useAssistantTool","AssistantTool","unstable_tool","makeAssistantTool","Record","tool","TArgs","TResult","Tool"],"sources":["../../../src/react/model-context/makeAssistantTool.ts"],"sourcesContent":["import type { FC } from \"react\";\nimport { type AssistantToolProps, useAssistantTool } from \"./useAssistantTool\";\n\n/**\n * Component returned by {@link makeAssistantTool}.\n *\n * Rendering the component registers its tool for the lifetime of that render\n * subtree.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport type AssistantTool = FC & {\n /** Tool definition registered by this component. */\n unstable_tool: AssistantToolProps<any, any>;\n};\n\n/**\n * Creates a React component that registers an assistant tool when rendered.\n *\n * Use this when exporting reusable tool modules that can be included in JSX\n * rather than calling {@link useAssistantTool} directly.\n *\n * @param tool - Tool definition and name to register.\n *\n * @deprecated Use a toolkit with `Tools({ toolkit })` and register it via\n * `AuiConfig({ tools: Tools({ toolkit }) })` on the provider's `config` prop instead. See\n * https://assistant-ui.com/docs/migrations/toolkit-tools.\n */\nexport const makeAssistantTool = <\n TArgs extends Record<string, unknown>,\n TResult,\n>(\n tool: AssistantToolProps<TArgs, TResult>,\n) => {\n const Tool: AssistantTool = () => {\n useAssistantTool(tool);\n return null;\n };\n Tool.unstable_tool = tool;\n return Tool;\n};\n"],"mappings":";;;;;;;;;;;;;;AA8BA,MAAaK,qBAIXE,SACG;CACH,MAAMG,aAAsB;EAC1BR,iBAAiBK,IAAI;EAAC,OACf;CAAI;CAEbG,KAAKN,gBAAgBG;CACrB,OAAOG;AACT"}