@assistant-ui/react 0.7.38 → 0.7.39

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. package/dist/primitives/actionBar/ActionBarRoot.d.ts +2 -2
  2. package/dist/primitives/actionBar/ActionBarRoot.d.ts.map +1 -1
  3. package/dist/primitives/actionBar/ActionBarRoot.js.map +1 -1
  4. package/dist/primitives/actionBar/ActionBarRoot.mjs.map +1 -1
  5. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts +2 -2
  6. package/dist/primitives/assistantModal/AssistantModalAnchor.d.ts.map +1 -1
  7. package/dist/primitives/assistantModal/AssistantModalAnchor.js.map +1 -1
  8. package/dist/primitives/assistantModal/AssistantModalAnchor.mjs.map +1 -1
  9. package/dist/primitives/assistantModal/AssistantModalContent.d.ts +2 -2
  10. package/dist/primitives/assistantModal/AssistantModalContent.d.ts.map +1 -1
  11. package/dist/primitives/assistantModal/AssistantModalContent.js.map +1 -1
  12. package/dist/primitives/assistantModal/AssistantModalContent.mjs.map +1 -1
  13. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts +2 -2
  14. package/dist/primitives/assistantModal/AssistantModalTrigger.d.ts.map +1 -1
  15. package/dist/primitives/assistantModal/AssistantModalTrigger.js.map +1 -1
  16. package/dist/primitives/assistantModal/AssistantModalTrigger.mjs.map +1 -1
  17. package/dist/primitives/assistantModal/scope.d.ts +3 -3
  18. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  19. package/dist/primitives/assistantModal/scope.js.map +1 -1
  20. package/dist/primitives/assistantModal/scope.mjs.map +1 -1
  21. package/dist/primitives/attachment/AttachmentRoot.d.ts +2 -2
  22. package/dist/primitives/attachment/AttachmentRoot.d.ts.map +1 -1
  23. package/dist/primitives/attachment/AttachmentRoot.js.map +1 -1
  24. package/dist/primitives/attachment/AttachmentRoot.mjs.map +1 -1
  25. package/dist/primitives/attachment/AttachmentThumb.d.ts +2 -2
  26. package/dist/primitives/attachment/AttachmentThumb.d.ts.map +1 -1
  27. package/dist/primitives/attachment/AttachmentThumb.js.map +1 -1
  28. package/dist/primitives/attachment/AttachmentThumb.mjs.map +1 -1
  29. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts +2 -2
  30. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  31. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  32. package/dist/primitives/branchPicker/BranchPickerRoot.mjs.map +1 -1
  33. package/dist/primitives/composer/ComposerRoot.d.ts +2 -2
  34. package/dist/primitives/composer/ComposerRoot.d.ts.map +1 -1
  35. package/dist/primitives/composer/ComposerRoot.js.map +1 -1
  36. package/dist/primitives/composer/ComposerRoot.mjs.map +1 -1
  37. package/dist/primitives/contentPart/ContentPartImage.d.ts +2 -2
  38. package/dist/primitives/contentPart/ContentPartImage.d.ts.map +1 -1
  39. package/dist/primitives/contentPart/ContentPartImage.js.map +1 -1
  40. package/dist/primitives/contentPart/ContentPartImage.mjs.map +1 -1
  41. package/dist/primitives/contentPart/ContentPartText.d.ts +2 -2
  42. package/dist/primitives/contentPart/ContentPartText.d.ts.map +1 -1
  43. package/dist/primitives/contentPart/ContentPartText.js.map +1 -1
  44. package/dist/primitives/contentPart/ContentPartText.mjs.map +1 -1
  45. package/dist/primitives/message/MessageRoot.d.ts +2 -2
  46. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  47. package/dist/primitives/message/MessageRoot.js.map +1 -1
  48. package/dist/primitives/message/MessageRoot.mjs.map +1 -1
  49. package/dist/primitives/thread/ThreadRoot.d.ts +2 -2
  50. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  51. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  52. package/dist/primitives/thread/ThreadRoot.mjs.map +1 -1
  53. package/dist/primitives/thread/ThreadViewport.d.ts +2 -2
  54. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  55. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  56. package/dist/primitives/thread/ThreadViewport.mjs.map +1 -1
  57. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts +2 -2
  58. package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
  59. package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
  60. package/dist/primitives/threadListItem/ThreadListItemRoot.mjs.map +1 -1
  61. package/dist/runtimes/local/LocalThreadListRuntimeCore.js +2 -2
  62. package/dist/runtimes/local/LocalThreadListRuntimeCore.js.map +1 -1
  63. package/dist/runtimes/local/LocalThreadListRuntimeCore.mjs +2 -2
  64. package/dist/runtimes/local/LocalThreadListRuntimeCore.mjs.map +1 -1
  65. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts +4 -2
  66. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  67. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.js +17 -14
  68. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.js.map +1 -1
  69. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.mjs +24 -15
  70. package/dist/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.mjs.map +1 -1
  71. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts +3 -2
  72. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  73. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js +94 -64
  74. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  75. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.mjs +95 -65
  76. package/dist/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.mjs.map +1 -1
  77. package/dist/runtimes/remote-thread-list/cloud/AssistantCloud.d.ts +2 -0
  78. package/dist/runtimes/remote-thread-list/cloud/AssistantCloud.d.ts.map +1 -1
  79. package/dist/runtimes/remote-thread-list/cloud/AssistantCloud.js +3 -0
  80. package/dist/runtimes/remote-thread-list/cloud/AssistantCloud.js.map +1 -1
  81. package/dist/runtimes/remote-thread-list/cloud/AssistantCloud.mjs +3 -0
  82. package/dist/runtimes/remote-thread-list/cloud/AssistantCloud.mjs.map +1 -1
  83. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAPI.d.ts +10 -6
  84. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAPI.d.ts.map +1 -1
  85. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAPI.js +25 -8
  86. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAPI.js.map +1 -1
  87. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAPI.mjs +25 -8
  88. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAPI.mjs.map +1 -1
  89. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.d.ts +2 -2
  90. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.d.ts.map +1 -1
  91. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.js +7 -8
  92. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.js.map +1 -1
  93. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.mjs +7 -8
  94. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.mjs.map +1 -1
  95. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudRuns.d.ts +15 -0
  96. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudRuns.d.ts.map +1 -0
  97. package/dist/runtimes/remote-thread-list/cloud/{CloudContext.js → AssistantCloudRuns.js} +23 -9
  98. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudRuns.js.map +1 -0
  99. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudRuns.mjs +21 -0
  100. package/dist/runtimes/remote-thread-list/cloud/AssistantCloudRuns.mjs.map +1 -0
  101. package/dist/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.d.ts +22 -0
  102. package/dist/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.d.ts.map +1 -0
  103. package/dist/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.js +85 -0
  104. package/dist/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.js.map +1 -0
  105. package/dist/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.mjs +60 -0
  106. package/dist/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.mjs.map +1 -0
  107. package/dist/runtimes/remote-thread-list/cloud/index.d.ts +1 -1
  108. package/dist/runtimes/remote-thread-list/cloud/index.d.ts.map +1 -1
  109. package/dist/runtimes/remote-thread-list/cloud/index.js +3 -3
  110. package/dist/runtimes/remote-thread-list/cloud/index.js.map +1 -1
  111. package/dist/runtimes/remote-thread-list/cloud/index.mjs +2 -2
  112. package/dist/runtimes/remote-thread-list/cloud/index.mjs.map +1 -1
  113. package/dist/runtimes/remote-thread-list/cloud/useCloudThreadListRuntime.d.ts.map +1 -1
  114. package/dist/runtimes/remote-thread-list/cloud/useCloudThreadListRuntime.js +47 -19
  115. package/dist/runtimes/remote-thread-list/cloud/useCloudThreadListRuntime.js.map +1 -1
  116. package/dist/runtimes/remote-thread-list/cloud/useCloudThreadListRuntime.mjs +54 -20
  117. package/dist/runtimes/remote-thread-list/cloud/useCloudThreadListRuntime.mjs.map +1 -1
  118. package/dist/runtimes/remote-thread-list/types.d.ts +10 -2
  119. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  120. package/dist/runtimes/remote-thread-list/types.js.map +1 -1
  121. package/dist/runtimes/remote-thread-list/useRemoteThreadListRuntime.d.ts.map +1 -1
  122. package/dist/runtimes/remote-thread-list/useRemoteThreadListRuntime.js +1 -0
  123. package/dist/runtimes/remote-thread-list/useRemoteThreadListRuntime.js.map +1 -1
  124. package/dist/runtimes/remote-thread-list/useRemoteThreadListRuntime.mjs +1 -0
  125. package/dist/runtimes/remote-thread-list/useRemoteThreadListRuntime.mjs.map +1 -1
  126. package/dist/styles/index.css.map +1 -1
  127. package/dist/ui/base/button.d.ts.map +1 -1
  128. package/dist/ui/base/button.js.map +1 -1
  129. package/dist/ui/base/button.mjs.map +1 -1
  130. package/dist/ui/base/dialog.js.map +1 -1
  131. package/dist/ui/base/dialog.mjs.map +1 -1
  132. package/dist/utils/createActionButton.d.ts +2 -2
  133. package/dist/utils/createActionButton.d.ts.map +1 -1
  134. package/dist/utils/createActionButton.js.map +1 -1
  135. package/dist/utils/createActionButton.mjs.map +1 -1
  136. package/package.json +7 -10
  137. package/src/primitives/actionBar/ActionBarRoot.tsx +2 -2
  138. package/src/primitives/assistantModal/AssistantModalAnchor.tsx +2 -2
  139. package/src/primitives/assistantModal/AssistantModalContent.tsx +2 -2
  140. package/src/primitives/assistantModal/AssistantModalTrigger.tsx +2 -2
  141. package/src/primitives/assistantModal/scope.tsx +1 -1
  142. package/src/primitives/attachment/AttachmentRoot.tsx +2 -2
  143. package/src/primitives/attachment/AttachmentThumb.tsx +2 -2
  144. package/src/primitives/branchPicker/BranchPickerRoot.tsx +2 -2
  145. package/src/primitives/composer/ComposerRoot.tsx +2 -2
  146. package/src/primitives/contentPart/ContentPartImage.tsx +2 -2
  147. package/src/primitives/contentPart/ContentPartText.tsx +2 -2
  148. package/src/primitives/message/MessageRoot.tsx +2 -2
  149. package/src/primitives/thread/ThreadRoot.tsx +2 -2
  150. package/src/primitives/thread/ThreadViewport.tsx +2 -2
  151. package/src/primitives/threadListItem/ThreadListItemRoot.tsx +2 -2
  152. package/src/runtimes/local/LocalThreadListRuntimeCore.tsx +2 -2
  153. package/src/runtimes/remote-thread-list/RemoteThreadListHookInstanceManager.tsx +40 -24
  154. package/src/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx +119 -80
  155. package/src/runtimes/remote-thread-list/cloud/AssistantCloud.tsx +3 -0
  156. package/src/runtimes/remote-thread-list/cloud/AssistantCloudAPI.tsx +36 -16
  157. package/src/runtimes/remote-thread-list/cloud/AssistantCloudAuthStrategy.tsx +5 -6
  158. package/src/runtimes/remote-thread-list/cloud/AssistantCloudRuns.tsx +26 -0
  159. package/src/runtimes/remote-thread-list/cloud/CloudThreadListItemRuntime.tsx +89 -0
  160. package/src/runtimes/remote-thread-list/cloud/index.ts +1 -1
  161. package/src/runtimes/remote-thread-list/cloud/useCloudThreadListRuntime.tsx +63 -28
  162. package/src/runtimes/remote-thread-list/types.tsx +18 -4
  163. package/src/runtimes/remote-thread-list/useRemoteThreadListRuntime.tsx +1 -0
  164. package/src/ui/base/button.tsx +2 -2
  165. package/src/ui/base/dialog.tsx +5 -5
  166. package/src/utils/createActionButton.tsx +2 -2
  167. package/dist/runtimes/remote-thread-list/cloud/CloudContext.d.ts +0 -10
  168. package/dist/runtimes/remote-thread-list/cloud/CloudContext.d.ts.map +0 -1
  169. package/dist/runtimes/remote-thread-list/cloud/CloudContext.js.map +0 -1
  170. package/dist/runtimes/remote-thread-list/cloud/CloudContext.mjs +0 -7
  171. package/dist/runtimes/remote-thread-list/cloud/CloudContext.mjs.map +0 -1
  172. package/dist/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.d.ts +0 -4
  173. package/dist/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.d.ts.map +0 -1
  174. package/dist/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.js +0 -46
  175. package/dist/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.js.map +0 -1
  176. package/dist/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.mjs +0 -22
  177. package/dist/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.mjs.map +0 -1
  178. package/src/runtimes/remote-thread-list/cloud/CloudContext.tsx +0 -12
  179. package/src/runtimes/remote-thread-list/cloud/useCloudGetOrCreateThread.tsx +0 -19
@@ -31,6 +31,7 @@ var import_EMPTY_THREAD_CORE = require("./EMPTY_THREAD_CORE.js");
31
31
  var import_OptimisticState = require("./OptimisticState.js");
32
32
  var import_react = require("react");
33
33
  var import_zustand = require("zustand");
34
+ var import_assistant_stream = require("assistant-stream");
34
35
  var import_jsx_runtime = (
35
36
  // only render if the component is the first one mounted
36
37
  require("react/jsx-runtime")
@@ -101,7 +102,6 @@ var updateStatusReducer = (state, threadIdOrRemoteId, newStatus) => {
101
102
  };
102
103
  var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribable.BaseSubscribable {
103
104
  _adapter;
104
- _disposeOldAdapter;
105
105
  _hookManager;
106
106
  _loadThreadsPromise;
107
107
  _mainThreadId;
@@ -114,6 +114,60 @@ var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribabl
114
114
  threadData: {}
115
115
  });
116
116
  getLoadThreadsPromise() {
117
+ if (!this._loadThreadsPromise) {
118
+ this._loadThreadsPromise = this._state.optimisticUpdate({
119
+ execute: () => this._adapter.list(),
120
+ loading: (state) => {
121
+ return {
122
+ ...state,
123
+ isLoading: true
124
+ };
125
+ },
126
+ then: (state, l) => {
127
+ const newThreadIds = [];
128
+ const newArchivedThreadIds = [];
129
+ const newThreadIdMap = {};
130
+ const newThreadData = {};
131
+ for (const thread of l.threads) {
132
+ switch (thread.status) {
133
+ case "regular":
134
+ newThreadIds.push(thread.remoteId);
135
+ break;
136
+ case "archived":
137
+ newArchivedThreadIds.push(thread.remoteId);
138
+ break;
139
+ default: {
140
+ const _exhaustiveCheck = thread.status;
141
+ throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
142
+ }
143
+ }
144
+ const mappingId = createThreadMappingId(thread.remoteId);
145
+ newThreadIdMap[thread.remoteId] = mappingId;
146
+ newThreadData[mappingId] = {
147
+ threadId: thread.remoteId,
148
+ remoteId: thread.remoteId,
149
+ externalId: thread.externalId,
150
+ status: thread.status,
151
+ title: thread.title
152
+ };
153
+ }
154
+ return {
155
+ ...state,
156
+ threadIds: newThreadIds,
157
+ archivedThreadIds: newArchivedThreadIds,
158
+ threadIdMap: {
159
+ ...state.threadIdMap,
160
+ ...newThreadIdMap
161
+ },
162
+ threadData: {
163
+ ...state.threadData,
164
+ ...newThreadData
165
+ }
166
+ };
167
+ }
168
+ }).then(() => {
169
+ });
170
+ }
117
171
  return this._loadThreadsPromise;
118
172
  }
119
173
  constructor(adapter) {
@@ -126,72 +180,25 @@ var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribabl
126
180
  Provider: adapter.unstable_Provider ?? import_react.Fragment
127
181
  }));
128
182
  this.__internal_setAdapter(adapter);
129
- this._loadThreadsPromise = this._state.optimisticUpdate({
130
- execute: () => adapter.list(),
131
- loading: (state) => {
132
- return {
133
- ...state,
134
- isLoading: true
135
- };
136
- },
137
- then: (state, l) => {
138
- const newThreadIds = [];
139
- const newArchivedThreadIds = [];
140
- const newThreadIdMap = {};
141
- const newThreadData = {};
142
- for (const thread of l.threads) {
143
- switch (thread.status) {
144
- case "regular":
145
- newThreadIds.push(thread.remoteId);
146
- break;
147
- case "archived":
148
- newArchivedThreadIds.push(thread.remoteId);
149
- break;
150
- default: {
151
- const _exhaustiveCheck = thread.status;
152
- throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
153
- }
154
- }
155
- const mappingId = createThreadMappingId(thread.remoteId);
156
- newThreadIdMap[thread.remoteId] = mappingId;
157
- newThreadData[mappingId] = {
158
- threadId: thread.remoteId,
159
- remoteId: thread.remoteId,
160
- externalId: thread.externalId,
161
- status: thread.status,
162
- title: thread.title
163
- };
164
- }
165
- return {
166
- ...state,
167
- threadIds: newThreadIds,
168
- archivedThreadIds: newArchivedThreadIds,
169
- threadIdMap: {
170
- ...state.threadIdMap,
171
- ...newThreadIdMap
172
- },
173
- threadData: {
174
- ...state.threadData,
175
- ...newThreadData
176
- }
177
- };
178
- }
179
- }).then(() => {
180
- });
181
183
  this.switchToNewThread();
182
184
  }
183
185
  useProvider;
184
186
  __internal_setAdapter(adapter) {
185
187
  if (this._adapter === adapter) return;
186
188
  this._adapter = adapter;
187
- this._disposeOldAdapter?.();
188
- this._disposeOldAdapter = this._adapter.onInitialize(this._onInitialize);
189
189
  const Provider = adapter.unstable_Provider ?? import_react.Fragment;
190
190
  if (Provider !== this.useProvider.getState().Provider) {
191
191
  this.useProvider.setState({ Provider }, true);
192
192
  }
193
193
  this._hookManager.setRuntimeHook(adapter.runtimeHook);
194
194
  }
195
+ __internal_bindAdapter() {
196
+ this.getLoadThreadsPromise();
197
+ return this._adapter.subscribe({
198
+ onInitialize: this._onInitialize,
199
+ onGenerateTitle: this._onGenerateTitle
200
+ });
201
+ }
195
202
  get threadIds() {
196
203
  return this._state.value.threadIds;
197
204
  }
@@ -255,15 +262,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribabl
255
262
  }
256
263
  return this.switchToThread(threadId);
257
264
  }
258
- _onInitialize = async (task) => {
259
- const threadId = this._state.value.newThreadId;
260
- if (!threadId)
261
- throw new Error(
262
- "ThreadListAdapter called onInitialize before switching to new thread"
263
- );
265
+ _onInitialize = async (threadId, begin) => {
266
+ if (this._state.value.newThreadId !== threadId)
267
+ throw new Error("The provided thread is already initialized");
264
268
  await this._state.optimisticUpdate({
265
269
  execute: () => {
266
- return task;
270
+ return begin();
267
271
  },
268
272
  optimistic: (state) => {
269
273
  return updateStatusReducer(state, threadId, "regular");
@@ -271,7 +275,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribabl
271
275
  then: (state, { remoteId, externalId }) => {
272
276
  const data = getThreadData(state, threadId);
273
277
  if (!data) return state;
274
- const mappingId = createThreadMappingId(remoteId);
278
+ const mappingId = createThreadMappingId(threadId);
275
279
  return {
276
280
  ...state,
277
281
  threadIdMap: {
@@ -290,6 +294,27 @@ var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribabl
290
294
  }
291
295
  });
292
296
  };
297
+ _onGenerateTitle = async (remoteId, begin) => {
298
+ const data = this.getItemById(remoteId);
299
+ if (!data) throw new Error("Thread not found");
300
+ if (data.status === "new") throw new Error("Thread is not yet initialized");
301
+ const stream = await begin();
302
+ const messageStream = import_assistant_stream.AssistantMessageStream.fromAssistantStream(stream);
303
+ for await (const result of messageStream) {
304
+ const newTitle = result.content.filter((c) => c.type === "text")[0]?.text ?? "New Thread";
305
+ const state = this._state.baseValue;
306
+ this._state.update({
307
+ ...state,
308
+ threadData: {
309
+ ...state.threadData,
310
+ [data.threadId]: {
311
+ ...data,
312
+ title: newTitle
313
+ }
314
+ }
315
+ });
316
+ }
317
+ };
293
318
  rename(threadIdOrRemoteId, newTitle) {
294
319
  const data = this.getItemById(threadIdOrRemoteId);
295
320
  if (!data) throw new Error("Thread not found");
@@ -383,7 +408,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends import_BaseSubscribabl
383
408
  }, []);
384
409
  const boundIds = this.useBoundIds();
385
410
  const { Provider } = this.useProvider();
386
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Provider, { children: (boundIds.length === 0 || boundIds[0] === id) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(this._hookManager.__internal_RenderThreadRuntimes, {}) });
411
+ return (boundIds.length === 0 || boundIds[0] === id) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
412
+ this._hookManager.__internal_RenderThreadRuntimes,
413
+ {
414
+ provider: Provider
415
+ }
416
+ );
387
417
  };
388
418
  };
389
419
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["\"use client\";\n\nimport { ThreadListRuntimeCore } from \"../core/ThreadListRuntimeCore\";\nimport { generateId } from \"../../internal\";\nimport { RemoteThreadListAdapter } from \"./types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { BaseSubscribable } from \"./BaseSubscribable\";\nimport { EMPTY_THREAD_CORE } from \"./EMPTY_THREAD_CORE\";\nimport { OptimisticState } from \"./OptimisticState\";\nimport { FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { CloudInitializeResponse } from \"./cloud/CloudContext\";\n\ntype RemoteThreadData =\n | {\n readonly threadId: string;\n readonly remoteId?: undefined;\n readonly externalId?: undefined;\n readonly status: \"new\";\n readonly title: undefined;\n }\n | {\n readonly threadId: string;\n readonly remoteId: string;\n readonly externalId: string | undefined;\n readonly status: \"regular\" | \"archived\";\n readonly title?: string | undefined;\n };\n\ntype THREAD_MAPPING_ID = string & { __brand: \"THREAD_MAPPING_ID\" };\nfunction createThreadMappingId(id: string): THREAD_MAPPING_ID {\n return id as THREAD_MAPPING_ID;\n}\n\ntype RemoteThreadState = {\n readonly isLoading: boolean;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly threadIdMap: Readonly<Record<string, THREAD_MAPPING_ID>>;\n readonly threadData: Readonly<Record<THREAD_MAPPING_ID, RemoteThreadData>>;\n};\n\nconst getThreadData = (\n state: RemoteThreadState,\n threadIdOrRemoteId: string,\n) => {\n const idx = state.threadIdMap[threadIdOrRemoteId];\n if (idx === undefined) return undefined;\n return state.threadData[idx];\n};\n\nconst updateStatusReducer = (\n state: RemoteThreadState,\n threadIdOrRemoteId: string,\n newStatus: \"regular\" | \"archived\" | \"deleted\",\n) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n const { threadId, remoteId, status: lastStatus } = data;\n if (lastStatus === newStatus) return state;\n\n const newState = { ...state };\n\n // lastStatus\n switch (lastStatus) {\n case \"new\":\n newState.newThreadId = undefined;\n break;\n case \"regular\":\n newState.threadIds = newState.threadIds.filter((t) => t !== threadId);\n break;\n case \"archived\":\n newState.archivedThreadIds = newState.archivedThreadIds.filter(\n (t) => t !== threadId,\n );\n break;\n\n default: {\n const _exhaustiveCheck: never = lastStatus;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n // newStatus\n switch (newStatus) {\n case \"regular\":\n newState.threadIds = [...newState.threadIds, threadId];\n break;\n\n case \"archived\":\n newState.archivedThreadIds = [...newState.archivedThreadIds, threadId];\n break;\n\n case \"deleted\":\n newState.threadData = Object.fromEntries(\n Object.entries(newState.threadData).filter(([key]) => key !== threadId),\n );\n newState.threadIdMap = Object.fromEntries(\n Object.entries(newState.threadIdMap).filter(\n ([key]) => key !== threadId && key !== remoteId,\n ),\n );\n break;\n\n default: {\n const _exhaustiveCheck: never = newStatus;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n if (newStatus !== \"deleted\") {\n newState.threadData = {\n ...newState.threadData,\n [threadId]: {\n ...data,\n status: newStatus,\n },\n };\n }\n\n return newState;\n};\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _adapter!: RemoteThreadListAdapter;\n private _disposeOldAdapter?: () => void;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private readonly _loadThreadsPromise: Promise<void>;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: false,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public getLoadThreadsPromise() {\n return this._loadThreadsPromise;\n }\n\n constructor(adapter: RemoteThreadListAdapter) {\n super();\n\n this._state.subscribe(() => this._notifySubscribers());\n this._hookManager = new RemoteThreadListHookInstanceManager(\n adapter.runtimeHook,\n );\n this.useProvider = create(() => ({\n Provider: adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setAdapter(adapter);\n\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n const newThreadIds = [];\n const newArchivedThreadIds = [];\n const newThreadIdMap = {} as Record<string, THREAD_MAPPING_ID>;\n const newThreadData = {} as Record<\n THREAD_MAPPING_ID,\n RemoteThreadData\n >;\n\n for (const thread of l.threads) {\n switch (thread.status) {\n case \"regular\":\n newThreadIds.push(thread.remoteId);\n break;\n case \"archived\":\n newArchivedThreadIds.push(thread.remoteId);\n break;\n default: {\n const _exhaustiveCheck: never = thread.status;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n const mappingId = createThreadMappingId(thread.remoteId);\n newThreadIdMap[thread.remoteId] = mappingId;\n newThreadData[mappingId] = {\n threadId: thread.remoteId,\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n };\n }\n\n return {\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...newThreadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...newThreadData,\n },\n };\n },\n })\n .then(() => {});\n\n this.switchToNewThread();\n }\n\n private useProvider;\n\n public __internal_setAdapter(adapter: RemoteThreadListAdapter) {\n if (this._adapter === adapter) return;\n\n this._adapter = adapter;\n this._disposeOldAdapter?.();\n this._disposeOldAdapter = this._adapter.onInitialize(this._onInitialize);\n\n const Provider = adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(adapter.runtimeHook);\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public async switchToThread(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n\n if (this._mainThreadId === data.threadId) return;\n\n const task = this._hookManager.startThreadRuntime(data.threadId);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (data.status === \"archived\") await this.unarchive(data.threadId);\n this._mainThreadId = data.threadId;\n\n this._notifySubscribers();\n }\n\n public async switchToNewThread(): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n }\n\n const state = this._state.value;\n let threadId: string | undefined = this._state.value.newThreadId;\n if (threadId === undefined) {\n do {\n threadId = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[threadId]);\n\n const mappingId = createThreadMappingId(threadId);\n this._state.update({\n ...state,\n newThreadId: threadId,\n threadIdMap: {\n ...state.threadIdMap,\n [threadId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [threadId]: {\n status: \"new\",\n threadId,\n },\n },\n });\n }\n\n return this.switchToThread(threadId);\n }\n\n private _onInitialize = async (task: Promise<CloudInitializeResponse>) => {\n const threadId = this._state.value.newThreadId;\n if (!threadId)\n throw new Error(\n \"ThreadListAdapter called onInitialize before switching to new thread\",\n );\n\n await this._state.optimisticUpdate({\n execute: () => {\n return task;\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(remoteId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [threadId]: {\n ...data,\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: () => {\n return this._adapter.rename(data.remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.threadId]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n // if thread is main thread, switch to another thread\n if (threadId === this._mainThreadId) {\n const lastThreadId = this._state.value.threadIds[0];\n if (lastThreadId) {\n await this.switchToThread(lastThreadId);\n } else {\n await this.switchToNewThread();\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n await this._ensureThreadIsNotMain(data.threadId);\n return this._adapter.archive(data.remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.threadId, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"archived\") throw new Error(\"Thread is not archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n return await this._adapter.unarchive(data.remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.threadId);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.threadId, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n await this._ensureThreadIsNotMain(data.threadId);\n return await this._adapter.delete(data.remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.threadId, \"deleted\");\n },\n });\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, []);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n return (\n <Provider>\n {(boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <this._hookManager.__internal_RenderThreadRuntimes />\n )}\n </Provider>\n );\n };\n}\n"],"mappings":"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","names":["data"]}
1
+ {"version":3,"sources":["../../../src/runtimes/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["\"use client\";\n\nimport { ThreadListRuntimeCore } from \"../core/ThreadListRuntimeCore\";\nimport { generateId } from \"../../internal\";\nimport {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n} from \"./types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { BaseSubscribable } from \"./BaseSubscribable\";\nimport { EMPTY_THREAD_CORE } from \"./EMPTY_THREAD_CORE\";\nimport { OptimisticState } from \"./OptimisticState\";\nimport { FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantStream, AssistantMessageStream } from \"assistant-stream\";\n\ntype RemoteThreadData =\n | {\n readonly threadId: string;\n readonly remoteId?: undefined;\n readonly externalId?: undefined;\n readonly status: \"new\";\n readonly title: undefined;\n }\n | {\n readonly threadId: string;\n readonly remoteId: string;\n readonly externalId: string | undefined;\n readonly status: \"regular\" | \"archived\";\n readonly title?: string | undefined;\n };\n\ntype THREAD_MAPPING_ID = string & { __brand: \"THREAD_MAPPING_ID\" };\nfunction createThreadMappingId(id: string): THREAD_MAPPING_ID {\n return id as THREAD_MAPPING_ID;\n}\n\ntype RemoteThreadState = {\n readonly isLoading: boolean;\n readonly newThreadId: string | undefined;\n readonly threadIds: readonly string[];\n readonly archivedThreadIds: readonly string[];\n readonly threadIdMap: Readonly<Record<string, THREAD_MAPPING_ID>>;\n readonly threadData: Readonly<Record<THREAD_MAPPING_ID, RemoteThreadData>>;\n};\n\nconst getThreadData = (\n state: RemoteThreadState,\n threadIdOrRemoteId: string,\n) => {\n const idx = state.threadIdMap[threadIdOrRemoteId];\n if (idx === undefined) return undefined;\n return state.threadData[idx];\n};\n\nconst updateStatusReducer = (\n state: RemoteThreadState,\n threadIdOrRemoteId: string,\n newStatus: \"regular\" | \"archived\" | \"deleted\",\n) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n const { threadId, remoteId, status: lastStatus } = data;\n if (lastStatus === newStatus) return state;\n\n const newState = { ...state };\n\n // lastStatus\n switch (lastStatus) {\n case \"new\":\n newState.newThreadId = undefined;\n break;\n case \"regular\":\n newState.threadIds = newState.threadIds.filter((t) => t !== threadId);\n break;\n case \"archived\":\n newState.archivedThreadIds = newState.archivedThreadIds.filter(\n (t) => t !== threadId,\n );\n break;\n\n default: {\n const _exhaustiveCheck: never = lastStatus;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n // newStatus\n switch (newStatus) {\n case \"regular\":\n newState.threadIds = [...newState.threadIds, threadId];\n break;\n\n case \"archived\":\n newState.archivedThreadIds = [...newState.archivedThreadIds, threadId];\n break;\n\n case \"deleted\":\n newState.threadData = Object.fromEntries(\n Object.entries(newState.threadData).filter(([key]) => key !== threadId),\n );\n newState.threadIdMap = Object.fromEntries(\n Object.entries(newState.threadIdMap).filter(\n ([key]) => key !== threadId && key !== remoteId,\n ),\n );\n break;\n\n default: {\n const _exhaustiveCheck: never = newStatus;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n if (newStatus !== \"deleted\") {\n newState.threadData = {\n ...newState.threadData,\n [threadId]: {\n ...data,\n status: newStatus,\n },\n };\n }\n\n return newState;\n};\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _adapter!: RemoteThreadListAdapter;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: false,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n const newThreadIds = [];\n const newArchivedThreadIds = [];\n const newThreadIdMap = {} as Record<string, THREAD_MAPPING_ID>;\n const newThreadData = {} as Record<\n THREAD_MAPPING_ID,\n RemoteThreadData\n >;\n\n for (const thread of l.threads) {\n switch (thread.status) {\n case \"regular\":\n newThreadIds.push(thread.remoteId);\n break;\n case \"archived\":\n newArchivedThreadIds.push(thread.remoteId);\n break;\n default: {\n const _exhaustiveCheck: never = thread.status;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n const mappingId = createThreadMappingId(thread.remoteId);\n newThreadIdMap[thread.remoteId] = mappingId;\n newThreadData[mappingId] = {\n threadId: thread.remoteId,\n remoteId: thread.remoteId,\n externalId: thread.externalId,\n status: thread.status,\n title: thread.title,\n };\n }\n\n return {\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...newThreadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...newThreadData,\n },\n };\n },\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n constructor(adapter: RemoteThreadListAdapter) {\n super();\n\n this._state.subscribe(() => this._notifySubscribers());\n this._hookManager = new RemoteThreadListHookInstanceManager(\n adapter.runtimeHook,\n );\n this.useProvider = create(() => ({\n Provider: adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setAdapter(adapter);\n\n this.switchToNewThread();\n }\n\n private useProvider;\n\n public __internal_setAdapter(adapter: RemoteThreadListAdapter) {\n if (this._adapter === adapter) return;\n\n this._adapter = adapter;\n\n const Provider = adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(adapter.runtimeHook);\n }\n\n public __internal_bindAdapter() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n return this._adapter.subscribe({\n onInitialize: this._onInitialize,\n onGenerateTitle: this._onGenerateTitle,\n });\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public async switchToThread(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n\n if (this._mainThreadId === data.threadId) return;\n\n const task = this._hookManager.startThreadRuntime(data.threadId);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (data.status === \"archived\") await this.unarchive(data.threadId);\n this._mainThreadId = data.threadId;\n\n this._notifySubscribers();\n }\n\n public async switchToNewThread(): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n }\n\n const state = this._state.value;\n let threadId: string | undefined = this._state.value.newThreadId;\n if (threadId === undefined) {\n do {\n threadId = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[threadId]);\n\n const mappingId = createThreadMappingId(threadId);\n this._state.update({\n ...state,\n newThreadId: threadId,\n threadIdMap: {\n ...state.threadIdMap,\n [threadId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [threadId]: {\n status: \"new\",\n threadId,\n },\n },\n });\n }\n\n return this.switchToThread(threadId);\n }\n\n private _onInitialize = async (\n threadId: string,\n begin: () => Promise<RemoteThreadInitializeResponse>,\n ) => {\n if (this._state.value.newThreadId !== threadId)\n throw new Error(\"The provided thread is already initialized\");\n\n await this._state.optimisticUpdate({\n execute: () => {\n return begin();\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [threadId]: {\n ...data,\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n };\n\n private _onGenerateTitle = async (\n remoteId: string,\n begin: () => Promise<AssistantStream>,\n ) => {\n const data = this.getItemById(remoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n const stream = await begin();\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle =\n result.content.filter((c) => c.type === \"text\")[0]?.text ??\n \"New Thread\";\n const state = this._state.baseValue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [data.threadId]: {\n ...data,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: () => {\n return this._adapter.rename(data.remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.threadId]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n // if thread is main thread, switch to another thread\n if (threadId === this._mainThreadId) {\n const lastThreadId = this._state.value.threadIds[0];\n if (lastThreadId) {\n await this.switchToThread(lastThreadId);\n } else {\n await this.switchToNewThread();\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n await this._ensureThreadIsNotMain(data.threadId);\n return this._adapter.archive(data.remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.threadId, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"archived\") throw new Error(\"Thread is not archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n return await this._adapter.unarchive(data.remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.threadId);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.threadId, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n await this._ensureThreadIsNotMain(data.threadId);\n return await this._adapter.delete(data.remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.threadId, \"deleted\");\n },\n });\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, []);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n )\n );\n };\n}\n"],"mappings":"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","names":["data"]}
@@ -8,6 +8,7 @@ import { EMPTY_THREAD_CORE } from "./EMPTY_THREAD_CORE.mjs";
8
8
  import { OptimisticState } from "./OptimisticState.mjs";
9
9
  import { Fragment, useEffect, useId } from "react";
10
10
  import { create } from "zustand";
11
+ import { AssistantMessageStream } from "assistant-stream";
11
12
  import { jsx } from "react/jsx-runtime";
12
13
  function createThreadMappingId(id) {
13
14
  return id;
@@ -75,7 +76,6 @@ var updateStatusReducer = (state, threadIdOrRemoteId, newStatus) => {
75
76
  };
76
77
  var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
77
78
  _adapter;
78
- _disposeOldAdapter;
79
79
  _hookManager;
80
80
  _loadThreadsPromise;
81
81
  _mainThreadId;
@@ -88,6 +88,60 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
88
88
  threadData: {}
89
89
  });
90
90
  getLoadThreadsPromise() {
91
+ if (!this._loadThreadsPromise) {
92
+ this._loadThreadsPromise = this._state.optimisticUpdate({
93
+ execute: () => this._adapter.list(),
94
+ loading: (state) => {
95
+ return {
96
+ ...state,
97
+ isLoading: true
98
+ };
99
+ },
100
+ then: (state, l) => {
101
+ const newThreadIds = [];
102
+ const newArchivedThreadIds = [];
103
+ const newThreadIdMap = {};
104
+ const newThreadData = {};
105
+ for (const thread of l.threads) {
106
+ switch (thread.status) {
107
+ case "regular":
108
+ newThreadIds.push(thread.remoteId);
109
+ break;
110
+ case "archived":
111
+ newArchivedThreadIds.push(thread.remoteId);
112
+ break;
113
+ default: {
114
+ const _exhaustiveCheck = thread.status;
115
+ throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
116
+ }
117
+ }
118
+ const mappingId = createThreadMappingId(thread.remoteId);
119
+ newThreadIdMap[thread.remoteId] = mappingId;
120
+ newThreadData[mappingId] = {
121
+ threadId: thread.remoteId,
122
+ remoteId: thread.remoteId,
123
+ externalId: thread.externalId,
124
+ status: thread.status,
125
+ title: thread.title
126
+ };
127
+ }
128
+ return {
129
+ ...state,
130
+ threadIds: newThreadIds,
131
+ archivedThreadIds: newArchivedThreadIds,
132
+ threadIdMap: {
133
+ ...state.threadIdMap,
134
+ ...newThreadIdMap
135
+ },
136
+ threadData: {
137
+ ...state.threadData,
138
+ ...newThreadData
139
+ }
140
+ };
141
+ }
142
+ }).then(() => {
143
+ });
144
+ }
91
145
  return this._loadThreadsPromise;
92
146
  }
93
147
  constructor(adapter) {
@@ -100,72 +154,25 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
100
154
  Provider: adapter.unstable_Provider ?? Fragment
101
155
  }));
102
156
  this.__internal_setAdapter(adapter);
103
- this._loadThreadsPromise = this._state.optimisticUpdate({
104
- execute: () => adapter.list(),
105
- loading: (state) => {
106
- return {
107
- ...state,
108
- isLoading: true
109
- };
110
- },
111
- then: (state, l) => {
112
- const newThreadIds = [];
113
- const newArchivedThreadIds = [];
114
- const newThreadIdMap = {};
115
- const newThreadData = {};
116
- for (const thread of l.threads) {
117
- switch (thread.status) {
118
- case "regular":
119
- newThreadIds.push(thread.remoteId);
120
- break;
121
- case "archived":
122
- newArchivedThreadIds.push(thread.remoteId);
123
- break;
124
- default: {
125
- const _exhaustiveCheck = thread.status;
126
- throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
127
- }
128
- }
129
- const mappingId = createThreadMappingId(thread.remoteId);
130
- newThreadIdMap[thread.remoteId] = mappingId;
131
- newThreadData[mappingId] = {
132
- threadId: thread.remoteId,
133
- remoteId: thread.remoteId,
134
- externalId: thread.externalId,
135
- status: thread.status,
136
- title: thread.title
137
- };
138
- }
139
- return {
140
- ...state,
141
- threadIds: newThreadIds,
142
- archivedThreadIds: newArchivedThreadIds,
143
- threadIdMap: {
144
- ...state.threadIdMap,
145
- ...newThreadIdMap
146
- },
147
- threadData: {
148
- ...state.threadData,
149
- ...newThreadData
150
- }
151
- };
152
- }
153
- }).then(() => {
154
- });
155
157
  this.switchToNewThread();
156
158
  }
157
159
  useProvider;
158
160
  __internal_setAdapter(adapter) {
159
161
  if (this._adapter === adapter) return;
160
162
  this._adapter = adapter;
161
- this._disposeOldAdapter?.();
162
- this._disposeOldAdapter = this._adapter.onInitialize(this._onInitialize);
163
163
  const Provider = adapter.unstable_Provider ?? Fragment;
164
164
  if (Provider !== this.useProvider.getState().Provider) {
165
165
  this.useProvider.setState({ Provider }, true);
166
166
  }
167
167
  this._hookManager.setRuntimeHook(adapter.runtimeHook);
168
168
  }
169
+ __internal_bindAdapter() {
170
+ this.getLoadThreadsPromise();
171
+ return this._adapter.subscribe({
172
+ onInitialize: this._onInitialize,
173
+ onGenerateTitle: this._onGenerateTitle
174
+ });
175
+ }
169
176
  get threadIds() {
170
177
  return this._state.value.threadIds;
171
178
  }
@@ -229,15 +236,12 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
229
236
  }
230
237
  return this.switchToThread(threadId);
231
238
  }
232
- _onInitialize = async (task) => {
233
- const threadId = this._state.value.newThreadId;
234
- if (!threadId)
235
- throw new Error(
236
- "ThreadListAdapter called onInitialize before switching to new thread"
237
- );
239
+ _onInitialize = async (threadId, begin) => {
240
+ if (this._state.value.newThreadId !== threadId)
241
+ throw new Error("The provided thread is already initialized");
238
242
  await this._state.optimisticUpdate({
239
243
  execute: () => {
240
- return task;
244
+ return begin();
241
245
  },
242
246
  optimistic: (state) => {
243
247
  return updateStatusReducer(state, threadId, "regular");
@@ -245,7 +249,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
245
249
  then: (state, { remoteId, externalId }) => {
246
250
  const data = getThreadData(state, threadId);
247
251
  if (!data) return state;
248
- const mappingId = createThreadMappingId(remoteId);
252
+ const mappingId = createThreadMappingId(threadId);
249
253
  return {
250
254
  ...state,
251
255
  threadIdMap: {
@@ -264,6 +268,27 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
264
268
  }
265
269
  });
266
270
  };
271
+ _onGenerateTitle = async (remoteId, begin) => {
272
+ const data = this.getItemById(remoteId);
273
+ if (!data) throw new Error("Thread not found");
274
+ if (data.status === "new") throw new Error("Thread is not yet initialized");
275
+ const stream = await begin();
276
+ const messageStream = AssistantMessageStream.fromAssistantStream(stream);
277
+ for await (const result of messageStream) {
278
+ const newTitle = result.content.filter((c) => c.type === "text")[0]?.text ?? "New Thread";
279
+ const state = this._state.baseValue;
280
+ this._state.update({
281
+ ...state,
282
+ threadData: {
283
+ ...state.threadData,
284
+ [data.threadId]: {
285
+ ...data,
286
+ title: newTitle
287
+ }
288
+ }
289
+ });
290
+ }
291
+ };
267
292
  rename(threadIdOrRemoteId, newTitle) {
268
293
  const data = this.getItemById(threadIdOrRemoteId);
269
294
  if (!data) throw new Error("Thread not found");
@@ -357,8 +382,13 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
357
382
  }, []);
358
383
  const boundIds = this.useBoundIds();
359
384
  const { Provider } = this.useProvider();
360
- return /* @__PURE__ */ jsx(Provider, { children: (boundIds.length === 0 || boundIds[0] === id) && // only render if the component is the first one mounted
361
- /* @__PURE__ */ jsx(this._hookManager.__internal_RenderThreadRuntimes, {}) });
385
+ return (boundIds.length === 0 || boundIds[0] === id) && // only render if the component is the first one mounted
386
+ /* @__PURE__ */ jsx(
387
+ this._hookManager.__internal_RenderThreadRuntimes,
388
+ {
389
+ provider: Provider
390
+ }
391
+ );
362
392
  };
363
393
  };
364
394
  export {