@assistant-ui/core 0.3.15 → 0.3.16

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 (251) hide show
  1. package/dist/internal.d.ts +7 -2
  2. package/dist/internal.js +8 -3
  3. package/dist/model-context/frame/host.d.ts.map +1 -1
  4. package/dist/model-context/frame/host.js +3 -2
  5. package/dist/model-context/frame/host.js.map +1 -1
  6. package/dist/model-context/frame/provider.d.ts +2 -0
  7. package/dist/model-context/frame/provider.d.ts.map +1 -1
  8. package/dist/model-context/frame/provider.js +88 -25
  9. package/dist/model-context/frame/provider.js.map +1 -1
  10. package/dist/model-context/interactable-composer-metadata.d.ts +1 -1
  11. package/dist/model-context/interactable-composer-metadata.js +1 -1
  12. package/dist/model-context/interactable-composer-metadata.js.map +1 -1
  13. package/dist/model-context/registry.d.ts +2 -2
  14. package/dist/model-context/registry.d.ts.map +1 -1
  15. package/dist/model-context/registry.js +9 -28
  16. package/dist/model-context/registry.js.map +1 -1
  17. package/dist/react/client/InMemoryThreadList.d.ts.map +1 -1
  18. package/dist/react/client/InMemoryThreadList.js +24 -20
  19. package/dist/react/client/InMemoryThreadList.js.map +1 -1
  20. package/dist/react/client/Interactables.d.ts.map +1 -1
  21. package/dist/react/client/Interactables.js +59 -177
  22. package/dist/react/client/Interactables.js.map +1 -1
  23. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  24. package/dist/react/client/RemoteThreadList.js +23 -56
  25. package/dist/react/client/RemoteThreadList.js.map +1 -1
  26. package/dist/react/index.d.ts +2 -1
  27. package/dist/react/interactables-legacy/Interactables.d.ts.map +1 -1
  28. package/dist/react/interactables-legacy/Interactables.js +56 -174
  29. package/dist/react/interactables-legacy/Interactables.js.map +1 -1
  30. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts +24 -0
  31. package/dist/react/interactables-shared/useInteractablePersistenceQueue.d.ts.map +1 -0
  32. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js +138 -0
  33. package/dist/react/interactables-shared/useInteractablePersistenceQueue.js.map +1 -0
  34. package/dist/react/primitives/composer/ComposerIf.js.map +1 -1
  35. package/dist/react/primitives/composer/ComposerQueue.d.ts +2 -1
  36. package/dist/react/primitives/composer/ComposerQueue.d.ts.map +1 -1
  37. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  38. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +1 -1
  39. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -1
  40. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  41. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +23 -55
  42. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  43. package/dist/react/runtimes/assistant-transport/runManager.d.ts.map +1 -1
  44. package/dist/react/runtimes/assistant-transport/runManager.js +2 -12
  45. package/dist/react/runtimes/assistant-transport/runManager.js.map +1 -1
  46. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts +3 -10
  47. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.d.ts.map +1 -1
  48. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js +20 -67
  49. package/dist/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.js.map +1 -1
  50. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts +12 -0
  51. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.d.ts.map +1 -0
  52. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js +10 -0
  53. package/dist/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.js.map +1 -0
  54. package/dist/react/runtimes/cloud/useCloudThreadListRuntime.js.map +1 -1
  55. package/dist/react/runtimes/createMessageConverter.d.ts +2 -1
  56. package/dist/react/runtimes/createMessageConverter.d.ts.map +1 -1
  57. package/dist/react/runtimes/external-message-converter.d.ts +6 -25
  58. package/dist/react/runtimes/external-message-converter.d.ts.map +1 -1
  59. package/dist/react/runtimes/external-message-converter.js +33 -233
  60. package/dist/react/runtimes/external-message-converter.js.map +1 -1
  61. package/dist/runtime/api/composer-runtime.d.ts +1 -1
  62. package/dist/runtime/api/composer-runtime.js.map +1 -1
  63. package/dist/runtime/api/thread-runtime.d.ts +1 -2
  64. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  65. package/dist/runtime/base/base-composer-runtime-core.d.ts +1 -1
  66. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  67. package/dist/runtime/base/base-composer-runtime-core.js +14 -29
  68. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  69. package/dist/runtime/base/base-thread-runtime-core.d.ts +2 -4
  70. package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
  71. package/dist/runtime/base/base-thread-runtime-core.js +3 -9
  72. package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
  73. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts +1 -1
  74. package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
  75. package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -1
  76. package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
  77. package/dist/runtime/interfaces/composer-runtime-core.d.ts +1 -1
  78. package/dist/runtime/interfaces/thread-runtime-core.d.ts +1 -1
  79. package/dist/runtime/internal.d.ts +2 -1
  80. package/dist/runtime/internal.js +2 -1
  81. package/dist/runtime/queue/external-thread-queue-adapter.d.ts +1 -1
  82. package/dist/runtime/queue/message-queue.d.ts.map +1 -1
  83. package/dist/runtime/queue/message-queue.js +1 -1
  84. package/dist/runtime/queue/message-queue.js.map +1 -1
  85. package/dist/runtime/queue/queue-item.d.ts +12 -0
  86. package/dist/runtime/queue/queue-item.d.ts.map +1 -0
  87. package/dist/runtime/queue/queue-item.js +6 -0
  88. package/dist/runtime/queue/queue-item.js.map +1 -0
  89. package/dist/runtime/utils/abortable-thread-load.d.ts +15 -0
  90. package/dist/runtime/utils/abortable-thread-load.d.ts.map +1 -0
  91. package/dist/runtime/utils/abortable-thread-load.js +35 -0
  92. package/dist/runtime/utils/abortable-thread-load.js.map +1 -0
  93. package/dist/runtime/utils/attachment-add-operations.d.ts +18 -0
  94. package/dist/runtime/utils/attachment-add-operations.d.ts.map +1 -0
  95. package/dist/runtime/utils/attachment-add-operations.js +43 -0
  96. package/dist/runtime/utils/attachment-add-operations.js.map +1 -0
  97. package/dist/runtime/utils/auto-status.d.ts +6 -1
  98. package/dist/runtime/utils/auto-status.d.ts.map +1 -1
  99. package/dist/runtime/utils/auto-status.js +7 -1
  100. package/dist/runtime/utils/auto-status.js.map +1 -1
  101. package/dist/runtime/utils/external-message-conversion.d.ts +47 -0
  102. package/dist/runtime/utils/external-message-conversion.d.ts.map +1 -0
  103. package/dist/runtime/utils/external-message-conversion.js +221 -0
  104. package/dist/runtime/utils/external-message-conversion.js.map +1 -0
  105. package/dist/runtime/utils/external-store-message.d.ts +2 -1
  106. package/dist/runtime/utils/external-store-message.d.ts.map +1 -1
  107. package/dist/runtime/utils/external-store-message.js +2 -1
  108. package/dist/runtime/utils/external-store-message.js.map +1 -1
  109. package/dist/runtime/utils/message-repository-session.d.ts +30 -0
  110. package/dist/runtime/utils/message-repository-session.d.ts.map +1 -0
  111. package/dist/runtime/utils/message-repository-session.js +130 -0
  112. package/dist/runtime/utils/message-repository-session.js.map +1 -0
  113. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  114. package/dist/runtime/utils/message-repository.js +3 -4
  115. package/dist/runtime/utils/message-repository.js.map +1 -1
  116. package/dist/runtime/utils/pending-tool-calls.d.ts +20 -0
  117. package/dist/runtime/utils/pending-tool-calls.d.ts.map +1 -0
  118. package/dist/runtime/utils/pending-tool-calls.js +22 -0
  119. package/dist/runtime/utils/pending-tool-calls.js.map +1 -0
  120. package/dist/runtime/utils/thread-message-like.d.ts +2 -1
  121. package/dist/runtime/utils/thread-message-like.d.ts.map +1 -1
  122. package/dist/runtime/utils/thread-message-like.js.map +1 -1
  123. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +2 -5
  124. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  125. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +3 -10
  126. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  127. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +19 -1
  128. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  129. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +122 -20
  130. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  131. package/dist/runtimes/local/local-thread-runtime-core.d.ts +3 -1
  132. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  133. package/dist/runtimes/local/local-thread-runtime-core.js +20 -2
  134. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  135. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts +12 -1
  136. package/dist/runtimes/remote-thread-list/remote-thread-state.d.ts.map +1 -1
  137. package/dist/runtimes/remote-thread-list/remote-thread-state.js +77 -1
  138. package/dist/runtimes/remote-thread-list/remote-thread-state.js.map +1 -1
  139. package/dist/runtimes/tool-invocations/ToolInvocationTracker.d.ts.map +1 -1
  140. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js +2 -0
  141. package/dist/runtimes/tool-invocations/ToolInvocationTracker.js.map +1 -1
  142. package/dist/store/clients/external-thread.d.ts.map +1 -1
  143. package/dist/store/clients/external-thread.js +74 -99
  144. package/dist/store/clients/external-thread.js.map +1 -1
  145. package/dist/store/clients/single-thread-list.d.ts.map +1 -1
  146. package/dist/store/clients/single-thread-list.js +1 -1
  147. package/dist/store/clients/single-thread-list.js.map +1 -1
  148. package/dist/store/clients/suggestions.d.ts.map +1 -1
  149. package/dist/store/clients/suggestions.js +16 -7
  150. package/dist/store/clients/suggestions.js.map +1 -1
  151. package/dist/store/index.d.ts +4 -2
  152. package/dist/store/scope-registration.d.ts +1 -1
  153. package/dist/store/scopes/composer.d.ts +2 -1
  154. package/dist/store/scopes/composer.d.ts.map +1 -1
  155. package/dist/store/scopes/message.d.ts +1 -1
  156. package/dist/store/scopes/queue-item.d.ts +2 -9
  157. package/dist/store/scopes/queue-item.d.ts.map +1 -1
  158. package/dist/store/scopes/queue-item.js +0 -6
  159. package/dist/types/message.d.ts +7 -3
  160. package/dist/types/message.d.ts.map +1 -1
  161. package/dist/types/message.js.map +1 -1
  162. package/dist/utils/data-url.d.ts +14 -1
  163. package/dist/utils/data-url.d.ts.map +1 -1
  164. package/dist/utils/data-url.js +13 -1
  165. package/dist/utils/data-url.js.map +1 -1
  166. package/dist/utils/invoke-user-callback.d.ts +5 -0
  167. package/dist/utils/invoke-user-callback.d.ts.map +1 -0
  168. package/dist/utils/invoke-user-callback.js +19 -0
  169. package/dist/utils/invoke-user-callback.js.map +1 -0
  170. package/dist/utils/normalizePartStatus.js.map +1 -1
  171. package/package.json +10 -10
  172. package/src/internal.ts +12 -0
  173. package/src/model-context/frame/host.test.ts +91 -7
  174. package/src/model-context/frame/host.ts +7 -2
  175. package/src/model-context/frame/provider.test.ts +267 -12
  176. package/src/model-context/frame/provider.ts +113 -31
  177. package/src/model-context/interactable-composer-metadata.ts +1 -1
  178. package/src/model-context/registry.test.ts +44 -0
  179. package/src/model-context/registry.ts +13 -35
  180. package/src/react/client/InMemoryThreadList.test.tsx +49 -0
  181. package/src/react/client/InMemoryThreadList.ts +7 -1
  182. package/src/react/client/Interactables.ts +19 -178
  183. package/src/react/client/RemoteThreadList.test.ts +96 -0
  184. package/src/react/client/RemoteThreadList.ts +27 -59
  185. package/src/react/interactables-legacy/Interactables.ts +20 -177
  186. package/src/react/interactables-shared/useInteractablePersistenceQueue.test.tsx +161 -0
  187. package/src/react/interactables-shared/useInteractablePersistenceQueue.ts +206 -0
  188. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +26 -56
  189. package/src/react/runtimes/assistant-transport/runManager.ts +4 -17
  190. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.test.tsx +92 -0
  191. package/src/react/runtimes/cloud/AssistantCloudThreadHistoryAdapter.ts +40 -141
  192. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.test.ts +37 -0
  193. package/src/react/runtimes/cloud/createCloudThreadListAdapterCreateFallback.ts +18 -0
  194. package/src/react/runtimes/external-message-converter.test.ts +0 -14
  195. package/src/react/runtimes/external-message-converter.test.tsx +77 -0
  196. package/src/react/runtimes/external-message-converter.ts +58 -481
  197. package/src/runtime/api/composer-runtime.ts +1 -1
  198. package/src/runtime/api/message-runtime.test.ts +28 -1
  199. package/src/runtime/base/base-composer-runtime-core.ts +20 -40
  200. package/src/runtime/base/base-thread-runtime-core.test.ts +16 -0
  201. package/src/runtime/base/base-thread-runtime-core.ts +6 -11
  202. package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -4
  203. package/src/runtime/interfaces/composer-runtime-core.ts +1 -1
  204. package/src/runtime/interfaces/thread-runtime-core.ts +1 -1
  205. package/src/runtime/internal.ts +5 -0
  206. package/src/runtime/queue/external-thread-queue-adapter.ts +1 -1
  207. package/src/runtime/queue/message-queue.ts +1 -4
  208. package/src/runtime/queue/queue-item.ts +10 -0
  209. package/src/runtime/utils/abortable-thread-load.test.ts +87 -0
  210. package/src/runtime/utils/abortable-thread-load.ts +53 -0
  211. package/src/runtime/utils/attachment-add-operations.ts +59 -0
  212. package/src/runtime/utils/auto-status.ts +33 -0
  213. package/src/runtime/utils/external-message-conversion.test.ts +113 -0
  214. package/src/runtime/utils/external-message-conversion.ts +494 -0
  215. package/src/runtime/utils/external-store-message.ts +2 -0
  216. package/src/runtime/utils/message-repository-session.test.ts +195 -0
  217. package/src/runtime/utils/message-repository-session.ts +176 -0
  218. package/src/runtime/utils/message-repository.ts +7 -4
  219. package/src/runtime/utils/pending-tool-calls.test.ts +57 -0
  220. package/src/runtime/utils/pending-tool-calls.ts +35 -0
  221. package/src/runtime/utils/thread-message-like.ts +2 -0
  222. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +6 -14
  223. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +175 -28
  224. package/src/runtimes/local/local-thread-runtime-core.test.ts +172 -1
  225. package/src/runtimes/local/local-thread-runtime-core.ts +48 -3
  226. package/src/runtimes/remote-thread-list/remote-thread-state.test.ts +37 -0
  227. package/src/runtimes/remote-thread-list/remote-thread-state.ts +123 -0
  228. package/src/runtimes/tool-invocations/EDGE_CASES.md +17 -0
  229. package/src/runtimes/tool-invocations/ToolInvocationTracker.test.ts +140 -0
  230. package/src/runtimes/tool-invocations/ToolInvocationTracker.ts +3 -0
  231. package/src/store/clients/external-thread.ts +16 -61
  232. package/src/store/clients/single-thread-list.ts +4 -1
  233. package/src/store/clients/suggestions.test.ts +31 -0
  234. package/src/store/clients/suggestions.ts +18 -19
  235. package/src/store/scopes/message.ts +1 -1
  236. package/src/store/scopes/queue-item.ts +2 -9
  237. package/src/tests/MessageRepository.test.ts +77 -0
  238. package/src/tests/RemoteThreadListThreadListRuntimeCore-load-race.test.ts +194 -0
  239. package/src/tests/RemoteThreadListThreadListRuntimeCore-title-race.test.ts +158 -0
  240. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +164 -0
  241. package/src/tests/external-store-thread-runtime-core.test.ts +642 -0
  242. package/src/tests/external-thread-attachments.test.tsx +173 -0
  243. package/src/tests/single-thread-list-item.test.tsx +47 -0
  244. package/src/tests/thread-message-like.test.ts +39 -1
  245. package/src/types/message.ts +8 -3
  246. package/src/utils/data-url.test.ts +52 -1
  247. package/src/utils/data-url.ts +21 -0
  248. package/src/utils/invoke-user-callback.test.ts +82 -0
  249. package/src/utils/invoke-user-callback.ts +31 -0
  250. package/src/utils/normalizePartStatus.ts +1 -1
  251. package/dist/store/scopes/queue-item.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/model-context/registry.ts"],"mappings":";;;;cAgBa,gCAAgC;UACnC;UACA;UACA;UACA;UACA;EAER,mBAAmB;EAiDnB,UAAU,uBAAuB;UAKzB;EAIR,QAAQ,cAAc,yBAAyB,SAC7C,MAAM,mBAAmB,OAAO,WAC/B,+BAA+B,OAAO;EAoBzC,eACE,iBAAiB,8BAChB;EAiCH,YACE,UAAU,uBACT"}
1
+ {"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,12 +1,16 @@
1
- import { mergeModelContexts } from "./types.js";
2
1
  import { notifySubscribers } from "../subscribable/subscribable.js";
2
+ import { CompositeContextProvider } from "../utils/composite-context-provider.js";
3
3
  //#region src/model-context/registry.ts
4
4
  var ModelContextRegistry = class {
5
5
  _tools = /* @__PURE__ */ new Map();
6
6
  _instructions = /* @__PURE__ */ new Map();
7
- _providers = /* @__PURE__ */ new Map();
7
+ _contextProviders = new CompositeContextProvider();
8
8
  _subscribers = /* @__PURE__ */ new Set();
9
- _providerUnsubscribes = /* @__PURE__ */ new Map();
9
+ constructor() {
10
+ this._contextProviders.subscribe(() => {
11
+ this.notifySubscribers();
12
+ });
13
+ }
10
14
  getModelContext() {
11
15
  const instructions = Array.from(this._instructions.values()).filter(Boolean);
12
16
  const system = instructions.length > 0 ? instructions.join("\n\n") : void 0;
@@ -15,7 +19,7 @@ var ModelContextRegistry = class {
15
19
  const { toolName, render, ...tool } = toolProps;
16
20
  tools[toolName] = tool;
17
21
  }
18
- const providerContexts = mergeModelContexts(new Set(this._providers.values()));
22
+ const providerContexts = this._contextProviders.getModelContext();
19
23
  const context = {
20
24
  system,
21
25
  tools: Object.keys(tools).length > 0 ? tools : void 0
@@ -75,30 +79,7 @@ var ModelContextRegistry = class {
75
79
  };
76
80
  }
77
81
  addProvider(provider) {
78
- const id = Symbol();
79
- this._providers.set(id, provider);
80
- let unsubscribe;
81
- try {
82
- unsubscribe = provider.subscribe?.(() => {
83
- this.notifySubscribers();
84
- });
85
- } catch (error) {
86
- this._providers.delete(id);
87
- try {
88
- this.notifySubscribers();
89
- } catch (notifyError) {
90
- console.error(notifyError);
91
- }
92
- throw error;
93
- }
94
- this._providerUnsubscribes.set(id, unsubscribe);
95
- this.notifySubscribers();
96
- return { remove: () => {
97
- this._providers.delete(id);
98
- this._providerUnsubscribes.get(id)?.();
99
- this._providerUnsubscribes.delete(id);
100
- this.notifySubscribers();
101
- } };
82
+ return { remove: this._contextProviders.registerModelContextProvider(provider) };
102
83
  }
103
84
  };
104
85
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":["Tool","ModelContext","ModelContextProvider","mergeModelContexts","AssistantToolProps","AssistantInstructionsConfig","Unsubscribe","notifySubscribers","notifyStateSubscribers","ModelContextRegistryToolHandle","ModelContextRegistryInstructionHandle","ModelContextRegistryProviderHandle","ModelContextRegistry","_tools","Map","_instructions","_providers","_subscribers","Set","_providerUnsubscribes","getModelContext","instructions","Array","from","values","filter","Boolean","system","length","join","undefined","tools","Record","toolProps","toolName","render","tool","providerContexts","context","Object","keys","callSettings","config","unstable_composerMetadata","subscribe","callback","add","delete","addTool","TArgs","TResult","id","Symbol","set","update","newTool","has","remove","addInstruction","instruction","disabled","newConfig","newInstruction","newDisabled","addProvider","provider","unsubscribe","error","notifyError","console","get"],"sources":["../../src/model-context/registry.ts"],"sourcesContent":["import type { Tool } from \"assistant-stream\";\nimport {\n type ModelContext,\n type ModelContextProvider,\n mergeModelContexts,\n type AssistantToolProps,\n type AssistantInstructionsConfig,\n} from \"./types\";\nimport type { Unsubscribe } from \"../types/unsubscribe\";\nimport { notifySubscribers as notifyStateSubscribers } from \"../subscribable/subscribable\";\nimport type {\n ModelContextRegistryToolHandle,\n ModelContextRegistryInstructionHandle,\n ModelContextRegistryProviderHandle,\n} from \"./registry-handles\";\n\nexport class ModelContextRegistry implements ModelContextProvider {\n private _tools = new Map<symbol, AssistantToolProps<any, any>>();\n private _instructions = new Map<symbol, string>();\n private _providers = new Map<symbol, ModelContextProvider>();\n private _subscribers = new Set<() => void>();\n private _providerUnsubscribes = new Map<symbol, Unsubscribe | undefined>();\n\n getModelContext(): ModelContext {\n const instructions = Array.from(this._instructions.values()).filter(\n Boolean,\n );\n\n const system =\n instructions.length > 0 ? instructions.join(\"\\n\\n\") : undefined;\n\n const tools: Record<string, Tool<any, any>> = {};\n for (const toolProps of this._tools.values()) {\n const { toolName, render, ...tool } = toolProps;\n tools[toolName] = tool;\n }\n\n const providerContexts = mergeModelContexts(\n new Set(this._providers.values()),\n );\n\n const context: ModelContext = {\n system,\n tools: Object.keys(tools).length > 0 ? tools : undefined,\n };\n\n if (providerContexts.system) {\n context.system = context.system\n ? `${context.system}\\n\\n${providerContexts.system}`\n : providerContexts.system;\n }\n\n if (providerContexts.tools) {\n context.tools = { ...(context.tools || {}), ...providerContexts.tools };\n }\n\n if (providerContexts.callSettings) {\n context.callSettings = providerContexts.callSettings;\n }\n\n if (providerContexts.config) {\n context.config = providerContexts.config;\n }\n\n if (providerContexts.unstable_composerMetadata) {\n context.unstable_composerMetadata =\n providerContexts.unstable_composerMetadata;\n }\n\n return context;\n }\n\n subscribe(callback: () => void): Unsubscribe {\n this._subscribers.add(callback);\n return () => this._subscribers.delete(callback);\n }\n\n private notifySubscribers(): void {\n notifyStateSubscribers(this._subscribers);\n }\n\n addTool<TArgs extends Record<string, unknown>, TResult>(\n tool: AssistantToolProps<TArgs, TResult>,\n ): ModelContextRegistryToolHandle<TArgs, TResult> {\n const id = Symbol();\n\n this._tools.set(id, tool);\n this.notifySubscribers();\n\n return {\n update: (newTool: AssistantToolProps<TArgs, TResult>) => {\n if (this._tools.has(id)) {\n this._tools.set(id, newTool);\n this.notifySubscribers();\n }\n },\n remove: () => {\n this._tools.delete(id);\n this.notifySubscribers();\n },\n };\n }\n\n addInstruction(\n config: string | AssistantInstructionsConfig,\n ): ModelContextRegistryInstructionHandle {\n const id = Symbol();\n\n const instruction =\n typeof config === \"string\" ? config : config.instruction;\n const disabled = typeof config === \"object\" ? config.disabled : false;\n\n if (!disabled) {\n this._instructions.set(id, instruction);\n this.notifySubscribers();\n }\n\n return {\n update: (newConfig: string | AssistantInstructionsConfig) => {\n const newInstruction =\n typeof newConfig === \"string\" ? newConfig : newConfig.instruction;\n const newDisabled =\n typeof newConfig === \"object\" ? newConfig.disabled : false;\n\n if (newDisabled) {\n this._instructions.delete(id);\n } else {\n this._instructions.set(id, newInstruction);\n }\n this.notifySubscribers();\n },\n remove: () => {\n this._instructions.delete(id);\n this.notifySubscribers();\n },\n };\n }\n\n addProvider(\n provider: ModelContextProvider,\n ): ModelContextRegistryProviderHandle {\n const id = Symbol();\n\n this._providers.set(id, provider);\n\n let unsubscribe: Unsubscribe | undefined;\n try {\n unsubscribe = provider.subscribe?.(() => {\n this.notifySubscribers();\n });\n } catch (error) {\n this._providers.delete(id);\n try {\n this.notifySubscribers();\n } catch (notifyError) {\n console.error(notifyError);\n }\n throw error;\n }\n this._providerUnsubscribes.set(id, unsubscribe);\n\n this.notifySubscribers();\n\n return {\n remove: () => {\n this._providers.delete(id);\n const unsubscribe = this._providerUnsubscribes.get(id);\n unsubscribe?.();\n this._providerUnsubscribes.delete(id);\n this.notifySubscribers();\n },\n };\n }\n}\n"],"mappings":"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"}
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 +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;;cA2ND,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;;cAiOD,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(61);
77
+ const $ = c(62);
78
78
  const { thread: threadFactory, onSwitchToThread, onSwitchToNewThread, onDelete } = props;
79
79
  const [t0, setListState] = useState(_temp3);
80
80
  const { threads, mainThreadId } = t0;
@@ -298,7 +298,7 @@ const useInMemoryThreadList = (props) => {
298
298
  $[47] = t20;
299
299
  } else t20 = $[47];
300
300
  let t21;
301
- if ($[48] !== mainThreadId || $[49] !== threadListItems || $[50] !== threads) {
301
+ if ($[48] !== mainThreadId || $[49] !== state || $[50] !== threadListItems || $[51] !== threads) {
302
302
  t21 = (selector) => {
303
303
  if (selector === "main") {
304
304
  const index = threads.findIndex((t_10) => t_10.id === mainThreadId);
@@ -308,21 +308,25 @@ const useInMemoryThreadList = (props) => {
308
308
  const index_0 = threads.findIndex((t_11) => t_11.id === selector.id);
309
309
  return threadListItems.get({ index: index_0 });
310
310
  }
311
- return threadListItems.get(selector);
311
+ const id = (selector.archived ? state.archivedThreadIds : state.threadIds)[selector.index];
312
+ if (id === void 0) return threadListItems.get({ index: -1 });
313
+ const index_1 = threads.findIndex((t_12) => t_12.id === id);
314
+ return threadListItems.get({ index: index_1 });
312
315
  };
313
316
  $[48] = mainThreadId;
314
- $[49] = threadListItems;
315
- $[50] = threads;
316
- $[51] = t21;
317
- } else t21 = $[51];
317
+ $[49] = state;
318
+ $[50] = threadListItems;
319
+ $[51] = threads;
320
+ $[52] = t21;
321
+ } else t21 = $[52];
318
322
  let t22;
319
- if ($[52] !== mainThreadClient.methods) {
323
+ if ($[53] !== mainThreadClient.methods) {
320
324
  t22 = () => mainThreadClient.methods;
321
- $[52] = mainThreadClient.methods;
322
- $[53] = t22;
323
- } else t22 = $[53];
325
+ $[53] = mainThreadClient.methods;
326
+ $[54] = t22;
327
+ } else t22 = $[54];
324
328
  let t23;
325
- if ($[54] !== handleSwitchToNewThread || $[55] !== handleSwitchToThread || $[56] !== t19 || $[57] !== t20 || $[58] !== t21 || $[59] !== t22) {
329
+ if ($[55] !== handleSwitchToNewThread || $[56] !== handleSwitchToThread || $[57] !== t19 || $[58] !== t20 || $[59] !== t21 || $[60] !== t22) {
326
330
  t23 = {
327
331
  getState: t19,
328
332
  switchToThread: handleSwitchToThread,
@@ -334,14 +338,14 @@ const useInMemoryThreadList = (props) => {
334
338
  item: t21,
335
339
  thread: t22
336
340
  };
337
- $[54] = handleSwitchToNewThread;
338
- $[55] = handleSwitchToThread;
339
- $[56] = t19;
340
- $[57] = t20;
341
- $[58] = t21;
342
- $[59] = t22;
343
- $[60] = t23;
344
- } else t23 = $[60];
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];
345
349
  return t23;
346
350
  };
347
351
  const InMemoryThreadList = resource(useInMemoryThreadList);
@@ -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","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 return threadListItems.get(selector);\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","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 +1 @@
1
- {"version":3,"file":"Interactables.d.ts","names":[],"sources":["../../../src/react/client/Interactables.ts"],"mappings":";;;;;;;;cAkrBa,oDAAsB,SAAA,0CAAA"}
1
+ {"version":3,"file":"Interactables.d.ts","names":[],"sources":["../../../src/react/client/Interactables.ts"],"mappings":";;;;;;;;cAmhBa,oDAAsB,SAAA,0CAAA"}
@@ -1,13 +1,13 @@
1
1
  import { findModelKnownState, interactableToolName } from "../../model-context/interactable-composer-metadata.js";
2
2
  import { notifySubscribers } from "../../subscribable/subscribable.js";
3
3
  import { ModelContext } from "../../store/clients/model-context-client.js";
4
+ import { useInteractablePersistenceQueue } from "../interactables-shared/useInteractablePersistenceQueue.js";
4
5
  import { buildInteractableModelContext } from "./interactable-model-context.js";
5
6
  import { toJSONSchema, toPartialJSONSchema } from "assistant-stream";
6
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
7
8
  import { resource } from "@assistant-ui/tap";
8
9
  import { attachTransformScopes, useAssistantClientRef, useAssistantScopeEffect } from "@assistant-ui/store/client";
9
10
  //#region src/react/client/Interactables.ts
10
- const PERSISTENCE_DEBOUNCE_MS = 500;
11
11
  const hasInteractableCreateCall = (messages, id, name) => messages.some((message) => message.role === "assistant" && message.content?.some((part) => {
12
12
  if (!part || typeof part !== "object") return false;
13
13
  const p = part;
@@ -30,14 +30,6 @@ const useInteractablesResource = ({ persistence } = {}) => {
30
30
  const loadedStateRef = useRef(/* @__PURE__ */ new Map());
31
31
  const touchedIdsRef = useRef(/* @__PURE__ */ new Set());
32
32
  const adapterRef = useRef(void 0);
33
- const debounceTimerRef = useRef(void 0);
34
- const syncSeqRef = useRef(0);
35
- const latestSyncSeqByIdRef = useRef(/* @__PURE__ */ new Map());
36
- const inFlightPersistenceRef = useRef(0);
37
- const flushResolversRef = useRef([]);
38
- const dirtyIdsRef = useRef(/* @__PURE__ */ new Set());
39
- const outgoingQueueRef = useRef([]);
40
- const runPersistenceRef = useRef(() => {});
41
33
  const setStateAndRef = useCallback((updater) => {
42
34
  const next = updater(stateRef.current);
43
35
  stateRef.current = next;
@@ -54,137 +46,39 @@ const useInteractablesResource = ({ persistence } = {}) => {
54
46
  }
55
47
  return result;
56
48
  }, []);
57
- const takeDirtyBatch = useCallback((adapter) => {
58
- if (dirtyIdsRef.current.size === 0) return;
59
- const dirtyIds = new Set(dirtyIdsRef.current);
60
- dirtyIdsRef.current.clear();
61
- const seq = ++syncSeqRef.current;
62
- for (const id_0 of dirtyIds) latestSyncSeqByIdRef.current.set(id_0, seq);
63
- return {
64
- adapter,
65
- payload: exportState(),
66
- dirtyIds,
67
- seq
68
- };
69
- }, [exportState]);
70
- const enqueuePersistence = useCallback((adapter_0) => {
71
- const batch = takeDirtyBatch(adapter_0);
72
- if (!batch) return;
73
- if (inFlightPersistenceRef.current === 0) runPersistenceRef.current(batch);
74
- else outgoingQueueRef.current.push(batch);
75
- }, [takeDirtyBatch]);
76
- const runPersistence = useCallback(async (batch_0) => {
77
- const resolved = batch_0 ?? (adapterRef.current ? takeDirtyBatch(adapterRef.current) : void 0);
78
- if (!resolved) {
79
- if (inFlightPersistenceRef.current === 0) {
80
- for (const resolve of flushResolversRef.current) resolve();
81
- flushResolversRef.current = [];
82
- }
83
- return;
84
- }
85
- const { adapter: adapter_1, payload, dirtyIds: dirtyIds_0, seq: seq_0 } = resolved;
86
- inFlightPersistenceRef.current += 1;
87
- setStateAndRef((prev) => ({
88
- ...prev,
89
- persistence: {
90
- ...prev.persistence,
91
- ...Object.fromEntries([...dirtyIds_0].map((id_1) => [id_1, {
92
- isPending: true,
93
- error: void 0
94
- }]))
95
- }
96
- }));
97
- try {
98
- await adapter_1.save(payload);
99
- setStateAndRef((prev_1) => {
100
- let changed_0 = false;
101
- const persistence_1 = { ...prev_1.persistence };
102
- for (const id_3 of dirtyIds_0) {
103
- if (latestSyncSeqByIdRef.current.get(id_3) !== seq_0 || dirtyIdsRef.current.has(id_3)) continue;
104
- latestSyncSeqByIdRef.current.delete(id_3);
105
- delete persistence_1[id_3];
106
- changed_0 = true;
107
- }
108
- return changed_0 ? {
109
- ...prev_1,
110
- persistence: persistence_1
111
- } : prev_1;
112
- });
113
- } catch (e) {
114
- setStateAndRef((prev_0) => {
115
- let changed = false;
116
- const persistence_0 = { ...prev_0.persistence };
117
- for (const id_2 of dirtyIds_0) {
118
- if (latestSyncSeqByIdRef.current.get(id_2) !== seq_0 || dirtyIdsRef.current.has(id_2)) continue;
119
- latestSyncSeqByIdRef.current.delete(id_2);
120
- persistence_0[id_2] = {
121
- isPending: false,
122
- error: e
123
- };
124
- changed = true;
125
- }
126
- return changed ? {
127
- ...prev_0,
128
- persistence: persistence_0
129
- } : prev_0;
130
- });
131
- } finally {
132
- inFlightPersistenceRef.current -= 1;
133
- const next = outgoingQueueRef.current.shift() ?? (adapterRef.current && dirtyIdsRef.current.size > 0 ? takeDirtyBatch(adapterRef.current) : void 0);
134
- if (next) {
135
- if (debounceTimerRef.current !== void 0) {
136
- clearTimeout(debounceTimerRef.current);
137
- debounceTimerRef.current = void 0;
138
- }
139
- runPersistenceRef.current(next);
140
- } else if (inFlightPersistenceRef.current === 0) {
141
- for (const resolve of flushResolversRef.current) resolve();
142
- flushResolversRef.current = [];
143
- }
144
- }
145
- }, [setStateAndRef, takeDirtyBatch]);
146
- runPersistenceRef.current = (nextBatch) => {
147
- runPersistence(nextBatch);
148
- };
149
- const flushIfPending = useCallback(() => {
150
- if (debounceTimerRef.current !== void 0) {
151
- clearTimeout(debounceTimerRef.current);
152
- debounceTimerRef.current = void 0;
153
- }
154
- if (adapterRef.current) enqueuePersistence(adapterRef.current);
155
- }, [enqueuePersistence]);
156
- const schedulePersistence = useCallback((id_4) => {
157
- if (!adapterRef.current) return;
158
- dirtyIdsRef.current.add(id_4);
159
- if (debounceTimerRef.current !== void 0) clearTimeout(debounceTimerRef.current);
160
- debounceTimerRef.current = setTimeout(() => {
161
- debounceTimerRef.current = void 0;
162
- if (inFlightPersistenceRef.current === 0 && adapterRef.current) enqueuePersistence(adapterRef.current);
163
- else debounceTimerRef.current = setTimeout(() => {
164
- debounceTimerRef.current = void 0;
165
- if (adapterRef.current) enqueuePersistence(adapterRef.current);
166
- }, PERSISTENCE_DEBOUNCE_MS);
167
- }, PERSISTENCE_DEBOUNCE_MS);
168
- }, [enqueuePersistence]);
49
+ const updatePersistenceStatus = useCallback((updater_0) => {
50
+ setStateAndRef((prev) => {
51
+ const persistence_0 = updater_0(prev.persistence);
52
+ return persistence_0 === prev.persistence ? prev : {
53
+ ...prev,
54
+ persistence: persistence_0
55
+ };
56
+ });
57
+ }, [setStateAndRef]);
58
+ const { flushIfPending, schedulePersistence, flush } = useInteractablePersistenceQueue({
59
+ adapterRef,
60
+ snapshot: exportState,
61
+ updatePersistenceStatus
62
+ });
169
63
  const restorePersistedState = useCallback((saved, options) => {
170
64
  const shouldStash = options.shouldStash ?? (() => true);
171
65
  const shouldApply = options.shouldApply ?? (() => true);
172
- for (const [id_5, entry] of Object.entries(saved)) if (shouldStash(id_5)) options.stash.set(id_5, entry.state);
173
- setStateAndRef((prev_2) => {
174
- let changed_1 = false;
175
- const definitions = { ...prev_2.definitions };
176
- for (const [id_6, entry_0] of Object.entries(saved)) {
177
- const def_0 = definitions[id_6];
178
- if (!def_0 || !shouldApply(id_6, def_0)) continue;
179
- definitions[id_6] = {
66
+ for (const [id_0, entry] of Object.entries(saved)) if (shouldStash(id_0)) options.stash.set(id_0, entry.state);
67
+ setStateAndRef((prev_0) => {
68
+ let changed = false;
69
+ const definitions = { ...prev_0.definitions };
70
+ for (const [id_1, entry_0] of Object.entries(saved)) {
71
+ const def_0 = definitions[id_1];
72
+ if (!def_0 || !shouldApply(id_1, def_0)) continue;
73
+ definitions[id_1] = {
180
74
  ...def_0,
181
75
  state: entry_0.state
182
76
  };
183
- changed_1 = true;
77
+ changed = true;
184
78
  }
185
- if (!changed_1) return prev_2;
79
+ if (!changed) return prev_0;
186
80
  return {
187
- ...prev_2,
81
+ ...prev_0,
188
82
  definitions
189
83
  };
190
84
  });
@@ -195,24 +89,24 @@ const useInteractablesResource = ({ persistence } = {}) => {
195
89
  const applyLoadedState = useCallback((saved_1) => {
196
90
  restorePersistedState(saved_1, {
197
91
  stash: loadedStateRef.current,
198
- shouldStash: (id_7) => !touchedIdsRef.current.has(id_7),
199
- shouldApply: (id_8, def_1) => !touchedIdsRef.current.has(id_8) && def_1.scope !== "thread"
92
+ shouldStash: (id_2) => !touchedIdsRef.current.has(id_2),
93
+ shouldApply: (id_3, def_1) => !touchedIdsRef.current.has(id_3) && def_1.scope !== "thread"
200
94
  });
201
95
  }, [restorePersistedState]);
202
- const loadFromAdapter = useCallback(async (adapter_2) => {
203
- if (!adapter_2.load) return;
96
+ const loadFromAdapter = useCallback(async (adapter) => {
97
+ if (!adapter.load) return;
204
98
  try {
205
- const saved_2 = await adapter_2.load();
206
- if (!saved_2 || adapterRef.current !== adapter_2) return;
99
+ const saved_2 = await adapter.load();
100
+ if (!saved_2 || adapterRef.current !== adapter) return;
207
101
  applyLoadedState(saved_2);
208
- } catch (e_0) {
209
- console.warn("[Interactables] Persistence load failed.", e_0);
102
+ } catch (e) {
103
+ console.warn("[Interactables] Persistence load failed.", e);
210
104
  }
211
105
  }, [applyLoadedState]);
212
- const setPersistenceAdapter = useCallback((adapter_3) => {
213
- if (adapterRef.current !== adapter_3) flushIfPending();
214
- adapterRef.current = adapter_3;
215
- if (adapter_3) loadFromAdapter(adapter_3);
106
+ const setPersistenceAdapter = useCallback((adapter_0) => {
107
+ if (adapterRef.current !== adapter_0) flushIfPending();
108
+ adapterRef.current = adapter_0;
109
+ if (adapter_0) loadFromAdapter(adapter_0);
216
110
  }, [flushIfPending, loadFromAdapter]);
217
111
  const getCurrentThreadId = useCallback(() => {
218
112
  const client = clientRef.current;
@@ -229,35 +123,23 @@ const useInteractablesResource = ({ persistence } = {}) => {
229
123
  if (adapterRef.current === persistence) setPersistenceAdapter(void 0);
230
124
  };
231
125
  }, [persistence, setPersistenceAdapter]);
232
- const flush = useCallback(async () => {
233
- if (debounceTimerRef.current !== void 0) {
234
- clearTimeout(debounceTimerRef.current);
235
- debounceTimerRef.current = void 0;
236
- }
237
- if (!(inFlightPersistenceRef.current > 0 || dirtyIdsRef.current.size > 0 || outgoingQueueRef.current.length > 0)) return;
238
- const p = new Promise((resolve_0) => {
239
- flushResolversRef.current.push(resolve_0);
240
- });
241
- if (adapterRef.current) enqueuePersistence(adapterRef.current);
242
- return p;
243
- }, [enqueuePersistence]);
244
- const setDefState = useCallback((id_9, updater_0) => {
245
- touchedIdsRef.current.add(id_9);
246
- setStateAndRef((prev_3) => {
247
- const existing = prev_3.definitions[id_9];
248
- if (!existing) return prev_3;
126
+ const setDefState = useCallback((id_4, updater_1) => {
127
+ touchedIdsRef.current.add(id_4);
128
+ setStateAndRef((prev_1) => {
129
+ const existing = prev_1.definitions[id_4];
130
+ if (!existing) return prev_1;
249
131
  return {
250
- ...prev_3,
132
+ ...prev_1,
251
133
  definitions: {
252
- ...prev_3.definitions,
253
- [id_9]: {
134
+ ...prev_1.definitions,
135
+ [id_4]: {
254
136
  ...existing,
255
- state: updater_0(existing.state)
137
+ state: updater_1(existing.state)
256
138
  }
257
139
  }
258
140
  };
259
141
  });
260
- if (stateRef.current.definitions[id_9]?.scope !== "thread") schedulePersistence(id_9);
142
+ if (stateRef.current.definitions[id_4]?.scope !== "thread") schedulePersistence(id_4);
261
143
  }, [schedulePersistence, setStateAndRef]);
262
144
  const provider = useMemo(() => ({
263
145
  getModelContext: () => {
@@ -326,8 +208,8 @@ const useInteractablesResource = ({ persistence } = {}) => {
326
208
  if (!partialSchemaCacheRef.current.has(def_2.id)) try {
327
209
  const jsonSchema = toJSONSchema(def_2.stateSchema);
328
210
  partialSchemaCacheRef.current.set(def_2.id, toPartialJSONSchema(jsonSchema));
329
- } catch (e_1) {
330
- console.warn(`[Interactables] Failed to create partial schema for "${def_2.name}". The update tool will accept arbitrary fields without validation.`, e_1);
211
+ } catch (e_0) {
212
+ console.warn(`[Interactables] Failed to create partial schema for "${def_2.name}". The update tool will accept arbitrary fields without validation.`, e_0);
331
213
  }
332
214
  const threadId = scope === "thread" ? getCurrentThreadId() : void 0;
333
215
  const detached = scope === "thread" ? threadId ? detachedThreadStateRef.current.get(threadId)?.get(def_2.id) : void 0 : detachedAppStateRef.current.get(def_2.id);
@@ -336,10 +218,10 @@ const useInteractablesResource = ({ persistence } = {}) => {
336
218
  } else detachedAppStateRef.current.delete(def_2.id);
337
219
  const loaded = scope === "thread" ? void 0 : loadedStateRef.current.get(def_2.id);
338
220
  const known = scope === "thread" ? findModelKnownState(threadMessages, def_2.id, def_2.name) : void 0;
339
- setStateAndRef((prev_4) => ({
340
- ...prev_4,
221
+ setStateAndRef((prev_2) => ({
222
+ ...prev_2,
341
223
  definitions: {
342
- ...prev_4.definitions,
224
+ ...prev_2.definitions,
343
225
  [def_2.id]: {
344
226
  id: def_2.id,
345
227
  name: def_2.name,
@@ -347,7 +229,7 @@ const useInteractablesResource = ({ persistence } = {}) => {
347
229
  stateSchema: def_2.stateSchema,
348
230
  initialState: def_2.initialState,
349
231
  scope,
350
- state: prev_4.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
232
+ state: prev_2.definitions[def_2.id]?.state ?? detached ?? known?.state ?? loaded ?? def_2.initialState
351
233
  }
352
234
  }
353
235
  }));
@@ -360,8 +242,8 @@ const useInteractablesResource = ({ persistence } = {}) => {
360
242
  }
361
243
  registrationCountsRef.current.delete(def_2.id);
362
244
  flushIfPending();
363
- setStateAndRef((prev_5) => {
364
- const existing_1 = prev_5.definitions[def_2.id];
245
+ setStateAndRef((prev_3) => {
246
+ const existing_1 = prev_3.definitions[def_2.id];
365
247
  if (existing_1) {
366
248
  if (existing_1.scope === "thread") {
367
249
  const threadId_0 = getCurrentThreadId();
@@ -376,10 +258,10 @@ const useInteractablesResource = ({ persistence } = {}) => {
376
258
  } else detachedAppStateRef.current.set(def_2.id, existing_1.state);
377
259
  }
378
260
  partialSchemaCacheRef.current.delete(def_2.id);
379
- const { [def_2.id]: _, ...rest } = prev_5.definitions;
380
- const { [def_2.id]: __, ...restPersistence } = prev_5.persistence;
261
+ const { [def_2.id]: _, ...rest } = prev_3.definitions;
262
+ const { [def_2.id]: __, ...restPersistence } = prev_3.persistence;
381
263
  return {
382
- ...prev_5,
264
+ ...prev_3,
383
265
  definitions: rest,
384
266
  persistence: restPersistence
385
267
  };