@assistant-ui/core 0.3.14 → 0.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/adapters/voice.js +11 -0
  2. package/dist/adapters/voice.js.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/internal.d.ts +2 -1
  5. package/dist/internal.js +2 -1
  6. package/dist/model-context/frame/host.d.ts +1 -1
  7. package/dist/model-context/frame/host.d.ts.map +1 -1
  8. package/dist/model-context/frame/host.js +17 -3
  9. package/dist/model-context/frame/host.js.map +1 -1
  10. package/dist/model-context/frame/provider.d.ts +4 -0
  11. package/dist/model-context/frame/provider.d.ts.map +1 -1
  12. package/dist/model-context/frame/provider.js +50 -3
  13. package/dist/model-context/frame/provider.js.map +1 -1
  14. package/dist/model-context/frame/types.d.ts +4 -1
  15. package/dist/model-context/frame/types.d.ts.map +1 -1
  16. package/dist/model-context/frame/types.js.map +1 -1
  17. package/dist/react/client/RemoteThreadList.d.ts +1 -1
  18. package/dist/react/client/RemoteThreadList.d.ts.map +1 -1
  19. package/dist/react/client/RemoteThreadList.js +95 -23
  20. package/dist/react/client/RemoteThreadList.js.map +1 -1
  21. package/dist/react/primitive-hooks/useActionBarCopy.js +7 -1
  22. package/dist/react/primitive-hooks/useActionBarCopy.js.map +1 -1
  23. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts +3 -0
  24. package/dist/react/primitive-hooks/useThreadIsEmpty.d.ts.map +1 -1
  25. package/dist/react/primitive-hooks/useThreadIsEmpty.js +3 -0
  26. package/dist/react/primitive-hooks/useThreadIsEmpty.js.map +1 -1
  27. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts +3 -0
  28. package/dist/react/primitive-hooks/useThreadIsRunning.d.ts.map +1 -1
  29. package/dist/react/primitive-hooks/useThreadIsRunning.js +3 -0
  30. package/dist/react/primitive-hooks/useThreadIsRunning.js.map +1 -1
  31. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +2 -0
  32. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  33. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +6 -0
  34. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  35. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +6 -0
  36. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  37. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +192 -50
  38. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  39. package/dist/react/runtimes/RemoteThreadResource.d.ts.map +1 -1
  40. package/dist/react/runtimes/RemoteThreadResource.js +2 -0
  41. package/dist/react/runtimes/RemoteThreadResource.js.map +1 -1
  42. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  43. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js +1 -1
  44. package/dist/react/runtimes/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  45. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  46. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +38 -5
  47. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  48. package/dist/runtime/utils/message-repository.d.ts.map +1 -1
  49. package/dist/runtime/utils/message-repository.js +27 -18
  50. package/dist/runtime/utils/message-repository.js.map +1 -1
  51. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  52. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +2 -0
  53. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  54. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts +102 -0
  55. package/dist/runtimes/inert/InertThreadRuntimeCore.d.ts.map +1 -0
  56. package/dist/runtimes/inert/InertThreadRuntimeCore.js +156 -0
  57. package/dist/runtimes/inert/InertThreadRuntimeCore.js.map +1 -0
  58. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  59. package/dist/runtimes/local/local-thread-runtime-core.js +25 -6
  60. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  61. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +12 -60
  62. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  63. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +10 -145
  64. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  65. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts +9 -0
  66. package/dist/runtimes/remote-thread-list/adapter-changed.d.ts.map +1 -0
  67. package/dist/runtimes/remote-thread-list/adapter-changed.js +13 -0
  68. package/dist/runtimes/remote-thread-list/adapter-changed.js.map +1 -0
  69. package/dist/runtimes/remote-thread-list/empty-thread-core.d.ts.map +1 -1
  70. package/dist/runtimes/remote-thread-list/empty-thread-core.js +16 -155
  71. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  72. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts +2 -0
  73. package/dist/runtimes/remote-thread-list/optimistic-state.d.ts.map +1 -1
  74. package/dist/runtimes/remote-thread-list/optimistic-state.js +11 -0
  75. package/dist/runtimes/remote-thread-list/optimistic-state.js.map +1 -1
  76. package/dist/runtimes/remote-thread-list/types.d.ts +3 -0
  77. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  78. package/dist/store/clients/external-thread.js +1 -1
  79. package/dist/store/clients/external-thread.js.map +1 -1
  80. package/dist/store/runtime-clients/handle-runtime-action.d.ts.map +1 -1
  81. package/dist/store/runtime-clients/handle-runtime-action.js +2 -0
  82. package/dist/store/runtime-clients/handle-runtime-action.js.map +1 -1
  83. package/dist/types/message.d.ts +1 -1
  84. package/dist/types/message.js.map +1 -1
  85. package/dist/utils/silent-runtime-action.d.ts +6 -0
  86. package/dist/utils/silent-runtime-action.d.ts.map +1 -0
  87. package/dist/utils/silent-runtime-action.js +7 -0
  88. package/dist/utils/silent-runtime-action.js.map +1 -0
  89. package/package.json +4 -4
  90. package/src/adapters/voice.test.ts +66 -1
  91. package/src/adapters/voice.ts +8 -0
  92. package/src/internal.ts +1 -0
  93. package/src/model-context/frame/host.test.ts +64 -5
  94. package/src/model-context/frame/host.ts +16 -3
  95. package/src/model-context/frame/provider.test.ts +347 -20
  96. package/src/model-context/frame/provider.ts +58 -2
  97. package/src/model-context/frame/types.ts +5 -0
  98. package/src/react/client/RemoteThreadList.test.ts +196 -0
  99. package/src/react/client/RemoteThreadList.ts +93 -24
  100. package/src/react/primitive-hooks/useActionBarCopy.test.ts +15 -0
  101. package/src/react/primitive-hooks/useActionBarCopy.ts +13 -3
  102. package/src/react/primitive-hooks/useThreadIsEmpty.ts +3 -0
  103. package/src/react/primitive-hooks/useThreadIsRunning.ts +3 -0
  104. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +12 -0
  105. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.republish.test.ts +87 -0
  106. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +268 -63
  107. package/src/react/runtimes/RemoteThreadResource.ts +2 -0
  108. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.test.tsx +58 -0
  109. package/src/react/runtimes/assistant-transport/useAssistantTransportRuntime.ts +3 -1
  110. package/src/react/runtimes/cloud/useCloudThreadListAdapter.test.tsx +98 -3
  111. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +68 -6
  112. package/src/react/runtimes/useLocalRuntime.test.tsx +5 -5
  113. package/src/runtime/utils/message-repository.ts +26 -18
  114. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +4 -0
  115. package/src/runtimes/inert/InertThreadRuntimeCore.test.ts +253 -0
  116. package/src/runtimes/inert/InertThreadRuntimeCore.ts +232 -0
  117. package/src/runtimes/local/local-thread-runtime-core.test.ts +319 -0
  118. package/src/runtimes/local/local-thread-runtime-core.ts +38 -8
  119. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +17 -209
  120. package/src/runtimes/remote-thread-list/adapter-changed.ts +10 -0
  121. package/src/runtimes/remote-thread-list/empty-thread-core.ts +28 -221
  122. package/src/runtimes/remote-thread-list/optimistic-state.test.ts +18 -0
  123. package/src/runtimes/remote-thread-list/optimistic-state.ts +13 -0
  124. package/src/runtimes/remote-thread-list/types.ts +4 -0
  125. package/src/store/clients/external-thread.ts +1 -1
  126. package/src/store/runtime-clients/handle-runtime-action.test.ts +40 -0
  127. package/src/store/runtime-clients/handle-runtime-action.ts +3 -0
  128. package/src/tests/MessageRepository.test.ts +48 -0
  129. package/src/tests/RemoteThreadListThreadListRuntimeCore-errors.test.ts +2 -2
  130. package/src/tests/RemoteThreadListThreadListRuntimeCore-loadMore.test.ts +8 -6
  131. package/src/tests/empty-thread-core.test.ts +6 -0
  132. package/src/tests/external-store-thread-runtime-core-adapter.test.ts +20 -0
  133. package/src/tests/external-thread-isEmpty.test.tsx +100 -0
  134. package/src/tests/remote-thread-list-adapter-switch.test.ts +383 -0
  135. package/src/tests/useRemoteThreadListRuntime-controlled.test.tsx +67 -0
  136. package/src/types/message.ts +1 -1
  137. package/src/utils/silent-runtime-action.ts +6 -0
@@ -5,6 +5,7 @@ import { handleThreadListAction } from "../../store/runtime-clients/handle-threa
5
5
  import { useThreadSelectionEvents } from "../../store/clients/thread-selection-events.js";
6
6
  import { isDevelopment } from "../../store/env.js";
7
7
  import { inMemoryThreadListTransformScopes } from "./InMemoryThreadList.js";
8
+ import { ThreadListAdapterChangedError } from "../../runtimes/remote-thread-list/adapter-changed.js";
8
9
  import { AdaptedRemoteThread } from "./AdaptedRemoteThread.js";
9
10
  import { AssistantMessageStream } from "assistant-stream";
10
11
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
@@ -255,6 +256,8 @@ const useRemoteThreadList = (props) => {
255
256
  initialMainId: seeded.id,
256
257
  session: {
257
258
  adapter,
259
+ adapterAtLoad: adapter,
260
+ adapterGeneration: 0,
258
261
  loadGeneration: 0,
259
262
  switchGeneration: 0,
260
263
  loadPromise: void 0,
@@ -270,6 +273,7 @@ const useRemoteThreadList = (props) => {
270
273
  }
271
274
  };
272
275
  });
276
+ session.adapter = adapter;
273
277
  const listState = useSyncExternalStore((onStoreChange) => store.subscribe(onStoreChange), () => store.value, () => store.value);
274
278
  const [mainThreadId, setMainThreadId] = useState(initialMainId);
275
279
  const assignMainThreadId = useCallback((id) => {
@@ -299,14 +303,16 @@ const useRemoteThreadList = (props) => {
299
303
  const getLoadThreadsPromise = useCallback(() => {
300
304
  if (session.loadPromise) return session.loadPromise;
301
305
  const generation = session.loadGeneration;
306
+ const adapter_0 = session.adapter;
302
307
  session.loadPromise = store.optimisticUpdate({
303
- execute: () => session.adapter.list(),
308
+ execute: () => adapter_0.list(),
304
309
  loading: (state) => ({
305
310
  ...state,
306
311
  isLoading: true
307
312
  }),
308
313
  then: (state_0, page) => {
309
314
  if (generation !== session.loadGeneration) return state_0;
315
+ session.adapterAtLoad = adapter_0;
310
316
  const fresh = classifyThreads(page.threads, {
311
317
  threadIds: [],
312
318
  archivedThreadIds: [],
@@ -341,16 +347,32 @@ const useRemoteThreadList = (props) => {
341
347
  return session.loadPromise;
342
348
  }, [session, store]);
343
349
  const reload = useCallback(() => {
350
+ const adapterChanged = adapter !== session.adapterAtLoad;
344
351
  session.loadGeneration++;
345
352
  session.loadPromise = void 0;
346
353
  session.loadMorePromise = void 0;
347
- store.update({
354
+ if (adapterChanged) {
355
+ session.adapterGeneration++;
356
+ session.switchGeneration++;
357
+ session.switchTask = void 0;
358
+ session.adapterAtLoad = adapter;
359
+ const seeded_0 = seedNewThread(EMPTY_LIST);
360
+ store.reset({
361
+ ...seeded_0.state,
362
+ isLoading: true
363
+ });
364
+ assignMainThreadId(seeded_0.id);
365
+ notifyRemoteId(void 0, true);
366
+ } else store.update({
348
367
  ...store.baseValue,
349
368
  cursor: void 0
350
369
  });
351
370
  return getLoadThreadsPromise();
352
371
  }, [
372
+ adapter,
373
+ assignMainThreadId,
353
374
  getLoadThreadsPromise,
375
+ notifyRemoteId,
354
376
  session,
355
377
  store
356
378
  ]);
@@ -395,6 +417,7 @@ const useRemoteThreadList = (props) => {
395
417
  };
396
418
  }
397
419
  }).catch((error_0) => {
420
+ if (generation_0 !== session.loadGeneration) return;
398
421
  console.error("[assistant-ui] thread list loadMore failed:", error_0);
399
422
  }).then(() => {
400
423
  if (session.loadMorePromise === task) session.loadMorePromise = void 0;
@@ -490,10 +513,10 @@ const useRemoteThreadList = (props) => {
490
513
  session.onSwitchToNewThread?.();
491
514
  return;
492
515
  }
493
- const seeded_0 = seedNewThread(store.baseValue);
494
- store.update(seeded_0.state);
516
+ const seeded_1 = seedNewThread(store.baseValue);
517
+ store.update(seeded_1.state);
495
518
  if (generation_3 !== session.switchGeneration) return;
496
- assignMainThreadId(seeded_0.id);
519
+ assignMainThreadId(seeded_1.id);
497
520
  notifyRemoteId(void 0, emitThreadIdChange_0);
498
521
  session.onSwitchToNewThread?.();
499
522
  }), [
@@ -522,15 +545,25 @@ const useRemoteThreadList = (props) => {
522
545
  store,
523
546
  switchToNewThread
524
547
  ]);
548
+ const requireAdapterGeneration = useCallback((generation_4) => {
549
+ if (generation_4 !== session.adapterGeneration) throw new ThreadListAdapterChangedError();
550
+ }, [session]);
525
551
  const initialize = useCallback(async (threadId_1) => {
552
+ const currentAdapter_0 = session.adapter;
553
+ const adapterGeneration = session.adapterGeneration;
526
554
  if (store.value.newThreadId !== threadId_1) {
527
555
  const data_0 = getThreadData(store.value, threadId_1);
528
556
  if (!data_0) throw threadNotFoundError(threadId_1, "initializing it");
529
557
  if (data_0.status === "new") throw threadStatusError(threadId_1, data_0.status, "be initialized here");
530
- return toInitializeResult(await data_0.initializeTask);
558
+ const result = toInitializeResult(await data_0.initializeTask);
559
+ requireAdapterGeneration(adapterGeneration);
560
+ return result;
531
561
  }
532
- const result = await store.optimisticUpdate({
533
- execute: () => session.adapter.initialize(threadId_1),
562
+ const result_0 = await store.optimisticUpdate({
563
+ execute: () => {
564
+ requireAdapterGeneration(adapterGeneration);
565
+ return currentAdapter_0.initialize(threadId_1);
566
+ },
534
567
  optimistic: (state_5) => updateStatusReducer(state_5, threadId_1, "regular"),
535
568
  loading: (state_6, task_1) => {
536
569
  const mappingId_0 = createThreadMappingId(threadId_1);
@@ -546,6 +579,7 @@ const useRemoteThreadList = (props) => {
546
579
  };
547
580
  },
548
581
  then: (state_7, { remoteId: remoteId_1, externalId }) => {
582
+ if (adapterGeneration !== session.adapterGeneration) return state_7;
549
583
  const data_1 = getThreadData(state_7, threadId_1);
550
584
  if (!data_1) return state_7;
551
585
  const mappingId_1 = createThreadMappingId(threadId_1);
@@ -570,21 +604,26 @@ const useRemoteThreadList = (props) => {
570
604
  };
571
605
  }
572
606
  });
573
- if (threadId_1 === session.mainThreadId) notifyRemoteId(result.remoteId, true);
574
- return toInitializeResult(result);
607
+ requireAdapterGeneration(adapterGeneration);
608
+ if (threadId_1 === session.mainThreadId) notifyRemoteId(result_0.remoteId, true);
609
+ return toInitializeResult(result_0);
575
610
  }, [
576
611
  notifyRemoteId,
612
+ requireAdapterGeneration,
577
613
  session,
578
614
  store
579
615
  ]);
580
616
  const rename = useCallback((threadIdOrRemoteId_0, newTitle) => {
617
+ const currentAdapter_1 = session.adapter;
618
+ const adapterGeneration_0 = session.adapterGeneration;
581
619
  const data_2 = getThreadData(store.value, threadIdOrRemoteId_0);
582
620
  if (!data_2) throw threadNotFoundError(threadIdOrRemoteId_0, "renaming it");
583
621
  if (data_2.status === "new") throw threadStatusError(threadIdOrRemoteId_0, data_2.status, "be renamed");
584
622
  return store.optimisticUpdate({
585
623
  execute: async () => {
586
624
  const { remoteId: remoteId_2 } = await data_2.initializeTask;
587
- return session.adapter.rename(remoteId_2, newTitle);
625
+ requireAdapterGeneration(adapterGeneration_0);
626
+ return currentAdapter_1.rename(remoteId_2, newTitle);
588
627
  },
589
628
  optimistic: (state_8) => {
590
629
  const current_0 = getThreadData(state_8, threadIdOrRemoteId_0);
@@ -601,18 +640,24 @@ const useRemoteThreadList = (props) => {
601
640
  };
602
641
  }
603
642
  });
604
- }, [session, store]);
643
+ }, [
644
+ requireAdapterGeneration,
645
+ session,
646
+ store
647
+ ]);
605
648
  const updateCustom = useCallback((threadIdOrRemoteId_1, custom) => {
649
+ const currentAdapter_2 = session.adapter;
650
+ const adapterGeneration_1 = session.adapterGeneration;
606
651
  const data_3 = getThreadData(store.value, threadIdOrRemoteId_1);
607
652
  if (!data_3) throw threadNotFoundError(threadIdOrRemoteId_1, "updating its custom metadata");
608
653
  if (data_3.status === "new") throw threadStatusError(threadIdOrRemoteId_1, data_3.status, "update custom metadata");
609
- if (!session.adapter.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
654
+ if (!currentAdapter_2.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
610
655
  return store.optimisticUpdate({
611
656
  execute: async () => {
612
657
  const { remoteId: remoteId_3 } = await data_3.initializeTask;
613
- const currentAdapter_0 = session.adapter;
614
- if (!currentAdapter_0.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
615
- return currentAdapter_0.updateCustom(remoteId_3, custom);
658
+ requireAdapterGeneration(adapterGeneration_1);
659
+ if (!currentAdapter_2.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
660
+ return currentAdapter_2.updateCustom(remoteId_3, custom);
616
661
  },
617
662
  optimistic: (state_9) => {
618
663
  const current_1 = getThreadData(state_9, threadIdOrRemoteId_1);
@@ -629,25 +674,36 @@ const useRemoteThreadList = (props) => {
629
674
  };
630
675
  }
631
676
  });
632
- }, [session, store]);
677
+ }, [
678
+ requireAdapterGeneration,
679
+ session,
680
+ store
681
+ ]);
633
682
  const archive = useCallback(async (threadIdOrRemoteId_2) => {
683
+ const currentAdapter_3 = session.adapter;
684
+ const adapterGeneration_2 = session.adapterGeneration;
634
685
  const data_4 = getThreadData(store.value, threadIdOrRemoteId_2);
635
686
  if (!data_4) throw threadNotFoundError(threadIdOrRemoteId_2, "archiving it");
636
687
  if (data_4.status !== "regular") throw threadStatusError(threadIdOrRemoteId_2, data_4.status, "be archived");
637
688
  await ensureNotMain(data_4.id);
689
+ requireAdapterGeneration(adapterGeneration_2);
638
690
  return store.optimisticUpdate({
639
691
  execute: async () => {
640
692
  const { remoteId: remoteId_4 } = await data_4.initializeTask;
641
- return session.adapter.archive(remoteId_4);
693
+ requireAdapterGeneration(adapterGeneration_2);
694
+ return currentAdapter_3.archive(remoteId_4);
642
695
  },
643
696
  optimistic: (state_10) => updateStatusReducer(state_10, data_4.id, "archived")
644
697
  });
645
698
  }, [
646
699
  ensureNotMain,
700
+ requireAdapterGeneration,
647
701
  session,
648
702
  store
649
703
  ]);
650
704
  const unarchive = useCallback((threadIdOrRemoteId_3) => {
705
+ const currentAdapter_4 = session.adapter;
706
+ const adapterGeneration_3 = session.adapterGeneration;
651
707
  const data_5 = getThreadData(store.value, threadIdOrRemoteId_3);
652
708
  if (!data_5) throw threadNotFoundError(threadIdOrRemoteId_3, "unarchiving it");
653
709
  if (data_5.status !== "archived") throw threadStatusError(threadIdOrRemoteId_3, data_5.status, "be unarchived");
@@ -655,9 +711,10 @@ const useRemoteThreadList = (props) => {
655
711
  execute: async () => {
656
712
  try {
657
713
  const { remoteId: remoteId_5 } = await data_5.initializeTask;
658
- return await session.adapter.unarchive(remoteId_5);
714
+ requireAdapterGeneration(adapterGeneration_3);
715
+ return await currentAdapter_4.unarchive(remoteId_5);
659
716
  } catch (error_4) {
660
- await ensureNotMain(data_5.id);
717
+ if (adapterGeneration_3 === session.adapterGeneration) await ensureNotMain(data_5.id);
661
718
  throw error_4;
662
719
  }
663
720
  },
@@ -665,37 +722,48 @@ const useRemoteThreadList = (props) => {
665
722
  });
666
723
  }, [
667
724
  ensureNotMain,
725
+ requireAdapterGeneration,
668
726
  session,
669
727
  store
670
728
  ]);
671
729
  const deleteThread = useCallback(async (threadIdOrRemoteId_4) => {
730
+ const currentAdapter_5 = session.adapter;
731
+ const adapterGeneration_4 = session.adapterGeneration;
672
732
  const data_6 = getThreadData(store.value, threadIdOrRemoteId_4);
673
733
  if (!data_6) throw threadNotFoundError(threadIdOrRemoteId_4, "deleting it");
674
734
  if (data_6.status !== "regular" && data_6.status !== "archived") throw threadStatusError(threadIdOrRemoteId_4, data_6.status, "be deleted");
675
735
  await ensureNotMain(data_6.id);
736
+ requireAdapterGeneration(adapterGeneration_4);
676
737
  onDelete?.(data_6.id);
677
738
  return store.optimisticUpdate({
678
739
  execute: async () => {
679
740
  const { remoteId: remoteId_6 } = await data_6.initializeTask;
680
- return session.adapter.delete(remoteId_6);
741
+ requireAdapterGeneration(adapterGeneration_4);
742
+ return currentAdapter_5.delete(remoteId_6);
681
743
  },
682
744
  optimistic: (state_12) => updateStatusReducer(state_12, data_6.id, "deleted")
683
745
  });
684
746
  }, [
685
747
  ensureNotMain,
686
748
  onDelete,
749
+ requireAdapterGeneration,
687
750
  session,
688
751
  store
689
752
  ]);
690
753
  const generateTitle = useCallback(async (threadIdOrRemoteId_5, messages) => {
754
+ const currentAdapter_6 = session.adapter;
755
+ const adapterGeneration_5 = session.adapterGeneration;
691
756
  const data_7 = getThreadData(store.value, threadIdOrRemoteId_5);
692
757
  if (!data_7) throw threadNotFoundError(threadIdOrRemoteId_5, "generating its title");
693
758
  if (data_7.status === "new") throw threadStatusError(threadIdOrRemoteId_5, data_7.status, "generate a title");
694
759
  const { remoteId: remoteId_7 } = await data_7.initializeTask;
760
+ requireAdapterGeneration(adapterGeneration_5);
695
761
  if (!isSameThread(store.value, data_7.id, session.mainThreadId)) return;
696
762
  if (!messages) return;
697
- const stream = await session.adapter.generateTitle(remoteId_7, messages);
763
+ const stream = await currentAdapter_6.generateTitle(remoteId_7, messages);
764
+ requireAdapterGeneration(adapterGeneration_5);
698
765
  await applyTitleStream(stream, (newTitle_0) => {
766
+ if (adapterGeneration_5 !== session.adapterGeneration) return;
699
767
  const state_13 = store.baseValue;
700
768
  const current_2 = getThreadData(state_13, data_7.id);
701
769
  if (!current_2) return;
@@ -710,7 +778,11 @@ const useRemoteThreadList = (props) => {
710
778
  }
711
779
  });
712
780
  });
713
- }, [session, store]);
781
+ }, [
782
+ requireAdapterGeneration,
783
+ session,
784
+ store
785
+ ]);
714
786
  const { mainThreadClient, itemOrder, threadListItems } = useRemoteThreadListView({
715
787
  listState,
716
788
  mainThreadId,
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadList.js","names":["useCallback","useEffect","useMemo","useState","useSyncExternalStore","resource","withKey","ClientOutput","attachTransformScopes","useClientLookup","useClientResource","isDevelopment","useThreadSelectionEvents","generateId","OptimisticState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadData","RemoteThreadState","RemoteThreadInitializeResponse","RemoteThreadListAdapter","ThreadMessage","AssistantMessageStream","handleThreadListAction","inMemoryThreadListTransformScopes","InMemoryThreadListProps","AdaptedRemoteThread","RESOLVED_PROMISE","Promise","resolve","EMPTY_LIST","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","RemoteThreadListProps","adapter","thread","threadId","onThreadIdChange","onSwitchToThread","onSwitchToNewThread","onDelete","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","toInitializeResult","result","remoteId","externalId","applyTitleStream","stream","Parameters","fromAssistantStream","onTitle","title","messageStream","parts","filter","part","type","text","seedNewThread","state","id","mappingId","custom","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","onGenerateTitle","onInitialize","onDetach","t0","lastMessageAt","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","initialize","detach","ThreadListItemClient","collectItemOrder","listState","mainThreadId","ids","seenIds","Set","seenRemoteIds","items","has","add","push","itemMatchesId","item","isSameThread","left","right","useRemoteThreadListView","threadFactory","useAdapters","wrapped","key","mainThreadClient","itemOrder","t4","t5","options","messages","map","threadListItems","useRemoteThreadList","store","initialMainId","session","seeded","loadGeneration","switchGeneration","loadPromise","loadMorePromise","lastNotifiedRemoteId","lastControlledThreadId","switchTask","isFirstThreadIdEffect","onStoreChange","subscribe","value","setMainThreadId","assignMainThreadId","notifyRemoteId","emit","getLoadThreadsPromise","generation","optimisticUpdate","execute","list","loading","then","page","fresh","threads","nextCursor","catch","error","console","update","baseValue","reload","unstable_useAdapters","unstable_Provider","warn","loadMore","snapshot","currentAdapter","task","after","appended","startSwitch","run","settle","reject","switchToThread","emitThreadIdChange","remoteMetadata","fetch","wasInTarget","includes","threadIdsWithoutRemote","archivedThreadIdsWithoutRemote","initializeTask","current","optimistic","switchToNewThread","waitForUpdate","existing","existingId","ensureNotMain","lastAwaitedTask","startedFallback","newTitle","Record","deleteThread","mainRemoteId","Object","is","hasMore","threadItems","main","reloadMainThread","methods","unstable_refetchThread","selector","index","findIndex","get","archived","RemoteThreadList"],"sources":["../../../src/react/client/RemoteThreadList.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useClientLookup,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { isDevelopment, useThreadSelectionEvents } from \"../../store/internal\";\nimport { generateId } from \"../../utils/id\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n type RemoteThreadData,\n type RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n} from \"../../runtimes/remote-thread-list/types\";\nimport type { ThreadMessage } from \"../../types/message\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport { handleThreadListAction } from \"../../store/runtime-clients/handle-thread-list-action\";\nimport {\n inMemoryThreadListTransformScopes,\n type InMemoryThreadListProps,\n} from \"./InMemoryThreadList\";\nimport { AdaptedRemoteThread } from \"./AdaptedRemoteThread\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nconst EMPTY_LIST: RemoteThreadState = {\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n};\n\nexport type RemoteThreadListProps = {\n /**\n * Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op.\n */\n adapter: RemoteThreadListAdapter;\n /**\n * Factory for the visible thread. Per-thread history reload requires a\n * resource keyed by thread id (`withKey(id, thread(...))`). An unkeyed\n * factory keeps one instance across switches, so a mount-once history\n * loader will not fetch the next thread.\n */\n thread: InMemoryThreadListProps[\"thread\"];\n threadId?: string | undefined;\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n onSwitchToThread?: ((threadId: string) => void) | undefined;\n onSwitchToNewThread?: (() => void) | undefined;\n onDelete?: ((threadId: string) => void) | undefined;\n};\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" was not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nconst toInitializeResult = (\n result: RemoteThreadInitializeResponse,\n): { remoteId: string; externalId: string | undefined } => ({\n remoteId: result.remoteId,\n externalId: result.externalId,\n});\n\nconst applyTitleStream = async (\n stream: Parameters<typeof AssistantMessageStream.fromAssistantStream>[0],\n onTitle: (title: string | undefined) => void,\n) => {\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n onTitle(result.parts.filter((part) => part.type === \"text\")[0]?.text);\n }\n};\n\nconst seedNewThread = (\n state: RemoteThreadState,\n): { id: string; state: RemoteThreadState } => {\n let id: string;\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n const mappingId = createThreadMappingId(id);\n return {\n id,\n state: {\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n },\n },\n },\n };\n};\n\nconst useThreadListItemClient = (props: {\n data: RemoteThreadData;\n isRunning: boolean;\n onSwitchTo: (options?: { unarchive?: boolean }) => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n onGenerateTitle: () => void;\n onInitialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: \"lastMessageAt\" in data ? data.lastMessageAt : undefined,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data, 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: onGenerateTitle,\n initialize: onInitialize,\n detach: onDetach,\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\nconst collectItemOrder = (\n listState: RemoteThreadState,\n mainThreadId: string,\n): RemoteThreadData[] => {\n const ids = [\n listState.newThreadId,\n ...listState.threadIds,\n ...listState.archivedThreadIds,\n mainThreadId,\n ].filter((id): id is string => id !== undefined);\n const seenIds = new Set<string>();\n const seenRemoteIds = new Set<string>();\n const items: RemoteThreadData[] = [];\n for (const id of ids) {\n const data = getThreadData(listState, id);\n if (!data || seenIds.has(data.id)) continue;\n if (data.remoteId !== undefined && seenRemoteIds.has(data.remoteId)) {\n continue;\n }\n seenIds.add(data.id);\n if (data.remoteId !== undefined) seenRemoteIds.add(data.remoteId);\n items.push(data);\n }\n return items;\n};\n\nconst itemMatchesId = (\n item: RemoteThreadData,\n listState: RemoteThreadState,\n id: string,\n) => {\n const data = getThreadData(listState, id);\n return (\n item.id === id ||\n item.id === data?.id ||\n (data?.remoteId !== undefined &&\n (item.id === data.remoteId || item.remoteId === data.remoteId))\n );\n};\n\nconst isSameThread = (\n listState: RemoteThreadState,\n left: string,\n right: string,\n) => {\n if (left === right) return true;\n const data = getThreadData(listState, left);\n return data !== undefined && itemMatchesId(data, listState, right);\n};\n\nconst useRemoteThreadListView = ({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n}: {\n listState: RemoteThreadState;\n mainThreadId: string;\n threadFactory: RemoteThreadListProps[\"thread\"];\n useAdapters: RemoteThreadListAdapter[\"unstable_useAdapters\"];\n onSwitchTo: (\n threadId: string,\n options?: { unarchive?: boolean },\n ) => Promise<void>;\n onRename: (threadId: string, title: string) => Promise<void>;\n onUpdateCustom: (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => Promise<void>;\n onArchive: (threadId: string) => Promise<void>;\n onUnarchive: (threadId: string) => Promise<void>;\n onDelete: (threadId: string) => Promise<void>;\n onGenerateTitle: (\n threadId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => Promise<void>;\n onInitialize: (threadId: string) => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: (threadId: string) => Promise<void>;\n}) => {\n const thread = threadFactory(mainThreadId);\n const wrapped =\n useAdapters === undefined\n ? thread\n : AdaptedRemoteThread({\n useAdapters,\n thread,\n });\n const mainThreadClient = useClientResource(\n thread.key === undefined ? wrapped : withKey(thread.key, wrapped),\n );\n const itemOrder = useMemo(\n () => collectItemOrder(listState, mainThreadId),\n [listState, mainThreadId],\n );\n const threadListItems = useClientLookup(\n itemOrder.map((data) =>\n withKey(\n data.id,\n ThreadListItemClient({\n data,\n isRunning:\n itemMatchesId(data, listState, mainThreadId) &&\n mainThreadClient.state.isRunning,\n onSwitchTo: (options) =>\n handleThreadListAction(\"switch\", () =>\n onSwitchTo(data.id, options),\n ),\n onRename: (title) =>\n handleThreadListAction(\"rename\", () => onRename(data.id, title)),\n onUpdateCustom: (custom) =>\n handleThreadListAction(\"update custom metadata\", () =>\n onUpdateCustom(data.id, custom),\n ),\n onArchive: () =>\n handleThreadListAction(\"archive\", () => onArchive(data.id)),\n onUnarchive: () =>\n handleThreadListAction(\"unarchive\", () => onUnarchive(data.id)),\n onDelete: () =>\n handleThreadListAction(\"delete\", () => onDelete(data.id)),\n onGenerateTitle: () =>\n handleThreadListAction(\"generate title\", () =>\n onGenerateTitle(\n data.id,\n mainThreadClient.state.messages as\n | readonly ThreadMessage[]\n | undefined,\n ),\n ),\n onInitialize: () => onInitialize(data.id),\n onDetach: () =>\n handleThreadListAction(\"detach\", () => onDetach(data.id)),\n }),\n ),\n ),\n );\n return { mainThreadClient, itemOrder, threadListItems };\n};\n\nconst useRemoteThreadList = (\n props: RemoteThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n adapter,\n thread: threadFactory,\n threadId,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n onDelete,\n } = props;\n\n const [{ store, initialMainId, session }] = useState(() => {\n const seeded = seedNewThread(EMPTY_LIST);\n return {\n store: new OptimisticState(seeded.state),\n initialMainId: seeded.id,\n session: {\n adapter,\n loadGeneration: 0,\n switchGeneration: 0,\n loadPromise: undefined as Promise<void> | undefined,\n loadMorePromise: undefined as Promise<void> | undefined,\n lastNotifiedRemoteId: undefined as string | undefined,\n lastControlledThreadId: undefined as string | undefined,\n switchTask: undefined as Promise<void> | undefined,\n mainThreadId: seeded.id,\n isFirstThreadIdEffect: true,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n },\n };\n });\n\n const listState = useSyncExternalStore(\n (onStoreChange) => store.subscribe(onStoreChange),\n () => store.value,\n () => store.value,\n );\n\n const [mainThreadId, setMainThreadId] = useState(initialMainId);\n const assignMainThreadId = useCallback(\n (id: string) => {\n session.mainThreadId = id;\n setMainThreadId(id);\n },\n [session],\n );\n useThreadSelectionEvents(mainThreadId);\n useEffect(() => {\n session.adapter = adapter;\n session.mainThreadId = mainThreadId;\n session.onThreadIdChange = onThreadIdChange;\n session.onSwitchToThread = onSwitchToThread;\n session.onSwitchToNewThread = onSwitchToNewThread;\n }, [\n adapter,\n mainThreadId,\n onSwitchToNewThread,\n onSwitchToThread,\n onThreadIdChange,\n session,\n ]);\n\n const notifyRemoteId = useCallback(\n (remoteId: string | undefined, emit: boolean) => {\n if (session.lastNotifiedRemoteId === remoteId) return;\n session.lastNotifiedRemoteId = remoteId;\n if (emit) session.onThreadIdChange?.(remoteId);\n },\n [session],\n );\n\n const getLoadThreadsPromise = useCallback(() => {\n if (session.loadPromise) return session.loadPromise;\n const generation = session.loadGeneration;\n session.loadPromise = store\n .optimisticUpdate({\n execute: () => session.adapter.list(),\n loading: (state) => ({ ...state, isLoading: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n const fresh = classifyThreads(page.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n session.loadPromise = undefined;\n store.update({\n ...store.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n return session.loadPromise;\n }, [session, store]);\n\n const reload = useCallback(() => {\n session.loadGeneration++;\n session.loadPromise = undefined;\n session.loadMorePromise = undefined;\n store.update({\n ...store.baseValue,\n cursor: undefined,\n });\n return getLoadThreadsPromise();\n }, [getLoadThreadsPromise, session, store]);\n\n useEffect(() => {\n void getLoadThreadsPromise();\n }, [getLoadThreadsPromise]);\n\n useEffect(() => {\n if (!isDevelopment) return;\n if (adapter.unstable_useAdapters !== undefined) return;\n if (adapter.unstable_Provider === undefined) return;\n console.warn(\n \"[assistant-ui] RemoteThreadList ignores RemoteThreadListAdapter.unstable_Provider. Expose unstable_useAdapters so per-thread history loads on this entry. useRemoteThreadListRuntime still honors unstable_Provider.\",\n );\n }, [adapter]);\n\n const loadMore = useCallback(() => {\n if (session.loadMorePromise) return session.loadMorePromise;\n const snapshot = store.value;\n if (snapshot.cursor === undefined || snapshot.isLoading) {\n return RESOLVED_PROMISE;\n }\n const generation = session.loadGeneration;\n const cursor = snapshot.cursor;\n const currentAdapter = session.adapter;\n const task = store\n .optimisticUpdate({\n execute: () => currentAdapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n const appended = classifyThreads(page.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (session.loadMorePromise === task) {\n session.loadMorePromise = undefined;\n }\n });\n session.loadMorePromise = task;\n return task;\n }, [session, store]);\n\n const startSwitch = useCallback(\n (run: (generation: number) => Promise<void>) => {\n const generation = ++session.switchGeneration;\n let settle!: (error?: unknown) => void;\n const task = new Promise<void>((resolve, reject) => {\n settle = (error) => {\n if (error === undefined) resolve();\n else reject(error);\n };\n });\n session.switchTask = task;\n void run(generation).then(\n () => settle(),\n (error: unknown) => settle(error),\n );\n return task;\n },\n [session],\n );\n\n const switchToThread = useCallback(\n (\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n emitThreadIdChange = true,\n ) =>\n startSwitch(async (generation) => {\n let data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n const remoteMetadata =\n await session.adapter.fetch(threadIdOrRemoteId);\n if (generation !== session.switchGeneration) return;\n const state = store.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteMetadata.remoteId)\n : state.archivedThreadIds.includes(remoteMetadata.remoteId);\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n store.update({\n ...state,\n threadIds:\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote,\n archivedThreadIds:\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n },\n },\n });\n data = getThreadData(store.value, threadIdOrRemoteId);\n }\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n }\n if (isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (data.status === \"archived\" && options?.unarchive !== false) {\n const current = data;\n const { remoteId } = await current.initializeTask;\n if (generation !== session.switchGeneration) return;\n await store.optimisticUpdate({\n execute: () => session.adapter.unarchive(remoteId),\n optimistic: (state) =>\n updateStatusReducer(state, current.id, \"regular\"),\n });\n if (generation !== session.switchGeneration) return;\n data = getThreadData(store.value, current.id) ?? current;\n }\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(data.id);\n notifyRemoteId(data.remoteId, emitThreadIdChange);\n session.onSwitchToThread?.(data.id);\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const switchToNewThread = useCallback(\n (emitThreadIdChange = true) =>\n startSwitch(async (generation) => {\n while (\n store.baseValue.newThreadId !== undefined &&\n store.value.newThreadId === undefined\n ) {\n await store.waitForUpdate();\n if (generation !== session.switchGeneration) return;\n }\n const existing = store.value.newThreadId;\n if (existing !== undefined) {\n const existingId =\n getThreadData(store.value, existing)?.id ?? existing;\n if (isSameThread(store.value, existingId, session.mainThreadId)) {\n return;\n }\n assignMainThreadId(existingId);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n return;\n }\n const seeded = seedNewThread(store.baseValue);\n store.update(seeded.state);\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const ensureNotMain = useCallback(\n async (threadId: string) => {\n if (threadId === store.value.newThreadId) {\n throw new Error(\"Cannot ensure new thread is not main\");\n }\n let lastAwaitedTask: Promise<void> | undefined;\n while (isSameThread(store.value, threadId, session.mainThreadId)) {\n let switchTask = session.switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) {\n switchTask = switchToNewThread();\n }\n lastAwaitedTask = switchTask;\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && session.switchTask === switchTask) {\n throw error;\n }\n }\n }\n },\n [session, store, switchToNewThread],\n );\n\n const initialize = useCallback(\n async (threadId: string) => {\n if (store.value.newThreadId !== threadId) {\n const data = getThreadData(store.value, threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n }\n return toInitializeResult(await data.initializeTask);\n }\n const result = await store.optimisticUpdate({\n execute: () => session.adapter.initialize(threadId),\n optimistic: (state) => updateStatusReducer(state, threadId, \"regular\"),\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n if (threadId === session.mainThreadId) {\n notifyRemoteId(result.remoteId, true);\n }\n return toInitializeResult(result);\n },\n [notifyRemoteId, session, store],\n );\n\n const rename = useCallback(\n (threadIdOrRemoteId: string, newTitle: string) => {\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return session.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n };\n },\n });\n },\n [session, store],\n );\n\n const updateCustom = useCallback(\n (\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n }\n if (!session.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const currentAdapter = session.adapter;\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return currentAdapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n custom,\n },\n },\n };\n },\n });\n },\n [session, store],\n );\n\n const archive = useCallback(\n async (threadIdOrRemoteId: string) => {\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n }\n await ensureNotMain(data.id);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return session.adapter.archive(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"archived\"),\n });\n },\n [ensureNotMain, session, store],\n );\n\n const unarchive = useCallback(\n (threadIdOrRemoteId: string) => {\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"be unarchived\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await session.adapter.unarchive(remoteId);\n } catch (error) {\n await ensureNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"regular\"),\n });\n },\n [ensureNotMain, session, store],\n );\n\n const deleteThread = useCallback(\n async (threadIdOrRemoteId: string) => {\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n }\n await ensureNotMain(data.id);\n onDelete?.(data.id);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return session.adapter.delete(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"deleted\"),\n });\n },\n [ensureNotMain, onDelete, session, store],\n );\n\n const generateTitle = useCallback(\n async (\n threadIdOrRemoteId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => {\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"generating its title\");\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"generate a title\",\n );\n }\n const { remoteId } = await data.initializeTask;\n if (!isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (!messages) return;\n const stream = await session.adapter.generateTitle(remoteId, messages);\n await applyTitleStream(stream, (newTitle) => {\n const state = store.baseValue;\n const current = getThreadData(state, data.id);\n if (!current) return;\n store.update({\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n });\n });\n },\n [session, store],\n );\n\n const { mainThreadClient, itemOrder, threadListItems } =\n useRemoteThreadListView({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters: adapter.unstable_useAdapters,\n onSwitchTo: (id, options) => switchToThread(id, options),\n onRename: (id, title) => rename(id, title),\n onUpdateCustom: (id, custom) => updateCustom(id, custom),\n onArchive: (id) => archive(id),\n onUnarchive: (id) => unarchive(id),\n onDelete: (id) => deleteThread(id),\n onGenerateTitle: (id, messages) => generateTitle(id, messages),\n onInitialize: async (id) => toInitializeResult(await initialize(id)),\n onDetach: (id) => ensureNotMain(id),\n });\n\n const mainRemoteId = getThreadData(listState, mainThreadId)?.remoteId;\n useEffect(() => {\n if (session.lastNotifiedRemoteId === mainRemoteId) return;\n session.lastNotifiedRemoteId = mainRemoteId;\n onThreadIdChange?.(mainRemoteId);\n }, [mainRemoteId, onThreadIdChange, session]);\n\n useEffect(() => {\n if (session.isFirstThreadIdEffect) {\n session.isFirstThreadIdEffect = false;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) return;\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n return;\n }\n if (Object.is(session.lastControlledThreadId, threadId)) return;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) {\n handleThreadListAction(\"create\", () => switchToNewThread(false));\n return;\n }\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n }, [session, switchToNewThread, switchToThread, threadId]);\n\n const state = useMemo(\n () => ({\n mainThreadId,\n newThreadId: listState.newThreadId ?? null,\n isLoading: listState.isLoading,\n isLoadingMore: listState.isLoadingMore,\n hasMore: listState.cursor !== undefined,\n threadIds: listState.threadIds,\n archivedThreadIds: listState.archivedThreadIds,\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n }),\n [\n listState.archivedThreadIds,\n listState.cursor,\n listState.isLoading,\n listState.isLoadingMore,\n listState.newThreadId,\n listState.threadIds,\n mainThreadClient.state,\n mainThreadId,\n threadListItems.state,\n ],\n );\n\n return {\n getState: () => state,\n switchToThread: (id, options) => {\n handleThreadListAction(\"switch\", () => switchToThread(id, options));\n },\n switchToNewThread: () => {\n handleThreadListAction(\"create\", () => switchToNewThread());\n },\n getLoadThreadsPromise,\n reload,\n reloadMainThread: () => {\n if (getThreadData(store.value, mainThreadId)?.status === \"new\") {\n return RESOLVED_PROMISE;\n }\n return (\n mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE\n );\n },\n loadMore,\n item: (selector) => {\n if (selector === \"main\") {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, mainThreadId),\n );\n return threadListItems.get({ index });\n }\n if (\"id\" in selector) {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, selector.id),\n );\n return threadListItems.get({ index });\n }\n const ids = selector.archived\n ? listState.archivedThreadIds\n : listState.threadIds;\n const id = ids[selector.index];\n if (id === undefined) {\n return threadListItems.get({ index: -1 });\n }\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, id),\n );\n return threadListItems.get({ index });\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\n/**\n * `AuiConfig` `threads` entry backed by a `RemoteThreadListAdapter`. Thread\n * bodies are born from the `thread` factory inside the client tree, so any\n * `AssistantClient` host can run a remote or cloud list. Per-thread history\n * and attachments come from `unstable_useAdapters`. `useRemoteThreadListRuntime`\n * uses the same hook when `unstable_Provider` is omitted. Key the factory\n * with `withKey` so history reloads when the visible thread changes.\n */\nexport const RemoteThreadList = resource(useRemoteThreadList);\n\nattachTransformScopes(useRemoteThreadList, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadList.js","names":["useCallback","useEffect","useMemo","useState","useSyncExternalStore","resource","withKey","ClientOutput","attachTransformScopes","useClientLookup","useClientResource","isDevelopment","useThreadSelectionEvents","generateId","OptimisticState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadData","RemoteThreadState","RemoteThreadInitializeResponse","RemoteThreadListAdapter","ThreadListAdapterChangedError","ThreadMessage","AssistantMessageStream","handleThreadListAction","inMemoryThreadListTransformScopes","InMemoryThreadListProps","AdaptedRemoteThread","RESOLVED_PROMISE","Promise","resolve","EMPTY_LIST","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","RemoteThreadListProps","adapter","thread","threadId","onThreadIdChange","onSwitchToThread","onSwitchToNewThread","onDelete","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","toInitializeResult","result","remoteId","externalId","applyTitleStream","stream","Parameters","fromAssistantStream","onTitle","title","messageStream","parts","filter","part","type","text","seedNewThread","state","id","mappingId","custom","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","onGenerateTitle","onInitialize","onDetach","t0","lastMessageAt","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","initialize","detach","ThreadListItemClient","collectItemOrder","listState","mainThreadId","ids","seenIds","Set","seenRemoteIds","items","has","add","push","itemMatchesId","item","isSameThread","left","right","useRemoteThreadListView","threadFactory","useAdapters","wrapped","key","mainThreadClient","itemOrder","t4","t5","options","messages","map","threadListItems","useRemoteThreadList","store","initialMainId","session","seeded","adapterAtLoad","adapterGeneration","loadGeneration","switchGeneration","loadPromise","loadMorePromise","lastNotifiedRemoteId","lastControlledThreadId","switchTask","isFirstThreadIdEffect","onStoreChange","subscribe","value","setMainThreadId","assignMainThreadId","notifyRemoteId","emit","getLoadThreadsPromise","generation","optimisticUpdate","execute","list","loading","then","page","fresh","threads","nextCursor","catch","error","console","update","baseValue","reload","adapterChanged","reset","unstable_useAdapters","unstable_Provider","warn","loadMore","snapshot","currentAdapter","task","after","appended","startSwitch","run","settle","reject","switchToThread","emitThreadIdChange","remoteMetadata","fetch","wasInTarget","includes","threadIdsWithoutRemote","archivedThreadIdsWithoutRemote","initializeTask","current","optimistic","switchToNewThread","waitForUpdate","existing","existingId","ensureNotMain","lastAwaitedTask","startedFallback","requireAdapterGeneration","newTitle","Record","deleteThread","mainRemoteId","Object","is","hasMore","threadItems","main","reloadMainThread","methods","unstable_refetchThread","selector","index","findIndex","get","archived","RemoteThreadList"],"sources":["../../../src/react/client/RemoteThreadList.ts"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { resource, withKey } from \"@assistant-ui/tap\";\nimport type { ClientOutput } from \"@assistant-ui/store\";\nimport {\n attachTransformScopes,\n useClientLookup,\n useClientResource,\n} from \"@assistant-ui/store/client\";\nimport { isDevelopment, useThreadSelectionEvents } from \"../../store/internal\";\nimport { generateId } from \"../../utils/id\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n type RemoteThreadData,\n type RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n} from \"../../runtimes/remote-thread-list/types\";\nimport { ThreadListAdapterChangedError } from \"../../runtimes/remote-thread-list/adapter-changed\";\nimport type { ThreadMessage } from \"../../types/message\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport { handleThreadListAction } from \"../../store/runtime-clients/handle-thread-list-action\";\nimport {\n inMemoryThreadListTransformScopes,\n type InMemoryThreadListProps,\n} from \"./InMemoryThreadList\";\nimport { AdaptedRemoteThread } from \"./AdaptedRemoteThread\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nconst EMPTY_LIST: RemoteThreadState = {\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n};\n\nexport type RemoteThreadListProps = {\n /**\n * Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op. `reload()` after a different adapter instance resets selection and cached records before loading.\n */\n adapter: RemoteThreadListAdapter;\n /**\n * Factory for the visible thread. Per-thread history reload requires a\n * resource keyed by thread id (`withKey(id, thread(...))`). An unkeyed\n * factory keeps one instance across switches, so a mount-once history\n * loader will not fetch the next thread.\n */\n thread: InMemoryThreadListProps[\"thread\"];\n threadId?: string | undefined;\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n onSwitchToThread?: ((threadId: string) => void) | undefined;\n onSwitchToNewThread?: (() => void) | undefined;\n onDelete?: ((threadId: string) => void) | undefined;\n};\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" was not found while ${action}.`);\n\nconst threadStatusError = (\n threadIdOrRemoteId: string,\n status: RemoteThreadData[\"status\"],\n action: string,\n) =>\n new Error(\n `Thread \"${threadIdOrRemoteId}\" has status \"${status}\", so it cannot ${action}.`,\n );\n\nconst toInitializeResult = (\n result: RemoteThreadInitializeResponse,\n): { remoteId: string; externalId: string | undefined } => ({\n remoteId: result.remoteId,\n externalId: result.externalId,\n});\n\nconst applyTitleStream = async (\n stream: Parameters<typeof AssistantMessageStream.fromAssistantStream>[0],\n onTitle: (title: string | undefined) => void,\n) => {\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n onTitle(result.parts.filter((part) => part.type === \"text\")[0]?.text);\n }\n};\n\nconst seedNewThread = (\n state: RemoteThreadState,\n): { id: string; state: RemoteThreadState } => {\n let id: string;\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n const mappingId = createThreadMappingId(id);\n return {\n id,\n state: {\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n },\n },\n },\n };\n};\n\nconst useThreadListItemClient = (props: {\n data: RemoteThreadData;\n isRunning: boolean;\n onSwitchTo: (options?: { unarchive?: boolean }) => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n onGenerateTitle: () => void;\n onInitialize: () => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: data.remoteId,\n externalId: data.externalId,\n title: data.title,\n lastMessageAt: \"lastMessageAt\" in data ? data.lastMessageAt : undefined,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data, 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: onGenerateTitle,\n initialize: onInitialize,\n detach: onDetach,\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\nconst collectItemOrder = (\n listState: RemoteThreadState,\n mainThreadId: string,\n): RemoteThreadData[] => {\n const ids = [\n listState.newThreadId,\n ...listState.threadIds,\n ...listState.archivedThreadIds,\n mainThreadId,\n ].filter((id): id is string => id !== undefined);\n const seenIds = new Set<string>();\n const seenRemoteIds = new Set<string>();\n const items: RemoteThreadData[] = [];\n for (const id of ids) {\n const data = getThreadData(listState, id);\n if (!data || seenIds.has(data.id)) continue;\n if (data.remoteId !== undefined && seenRemoteIds.has(data.remoteId)) {\n continue;\n }\n seenIds.add(data.id);\n if (data.remoteId !== undefined) seenRemoteIds.add(data.remoteId);\n items.push(data);\n }\n return items;\n};\n\nconst itemMatchesId = (\n item: RemoteThreadData,\n listState: RemoteThreadState,\n id: string,\n) => {\n const data = getThreadData(listState, id);\n return (\n item.id === id ||\n item.id === data?.id ||\n (data?.remoteId !== undefined &&\n (item.id === data.remoteId || item.remoteId === data.remoteId))\n );\n};\n\nconst isSameThread = (\n listState: RemoteThreadState,\n left: string,\n right: string,\n) => {\n if (left === right) return true;\n const data = getThreadData(listState, left);\n return data !== undefined && itemMatchesId(data, listState, right);\n};\n\nconst useRemoteThreadListView = ({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n onGenerateTitle,\n onInitialize,\n onDetach,\n}: {\n listState: RemoteThreadState;\n mainThreadId: string;\n threadFactory: RemoteThreadListProps[\"thread\"];\n useAdapters: RemoteThreadListAdapter[\"unstable_useAdapters\"];\n onSwitchTo: (\n threadId: string,\n options?: { unarchive?: boolean },\n ) => Promise<void>;\n onRename: (threadId: string, title: string) => Promise<void>;\n onUpdateCustom: (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => Promise<void>;\n onArchive: (threadId: string) => Promise<void>;\n onUnarchive: (threadId: string) => Promise<void>;\n onDelete: (threadId: string) => Promise<void>;\n onGenerateTitle: (\n threadId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => Promise<void>;\n onInitialize: (threadId: string) => Promise<{\n remoteId: string;\n externalId: string | undefined;\n }>;\n onDetach: (threadId: string) => Promise<void>;\n}) => {\n const thread = threadFactory(mainThreadId);\n const wrapped =\n useAdapters === undefined\n ? thread\n : AdaptedRemoteThread({\n useAdapters,\n thread,\n });\n const mainThreadClient = useClientResource(\n thread.key === undefined ? wrapped : withKey(thread.key, wrapped),\n );\n const itemOrder = useMemo(\n () => collectItemOrder(listState, mainThreadId),\n [listState, mainThreadId],\n );\n const threadListItems = useClientLookup(\n itemOrder.map((data) =>\n withKey(\n data.id,\n ThreadListItemClient({\n data,\n isRunning:\n itemMatchesId(data, listState, mainThreadId) &&\n mainThreadClient.state.isRunning,\n onSwitchTo: (options) =>\n handleThreadListAction(\"switch\", () =>\n onSwitchTo(data.id, options),\n ),\n onRename: (title) =>\n handleThreadListAction(\"rename\", () => onRename(data.id, title)),\n onUpdateCustom: (custom) =>\n handleThreadListAction(\"update custom metadata\", () =>\n onUpdateCustom(data.id, custom),\n ),\n onArchive: () =>\n handleThreadListAction(\"archive\", () => onArchive(data.id)),\n onUnarchive: () =>\n handleThreadListAction(\"unarchive\", () => onUnarchive(data.id)),\n onDelete: () =>\n handleThreadListAction(\"delete\", () => onDelete(data.id)),\n onGenerateTitle: () =>\n handleThreadListAction(\"generate title\", () =>\n onGenerateTitle(\n data.id,\n mainThreadClient.state.messages as\n | readonly ThreadMessage[]\n | undefined,\n ),\n ),\n onInitialize: () => onInitialize(data.id),\n onDetach: () =>\n handleThreadListAction(\"detach\", () => onDetach(data.id)),\n }),\n ),\n ),\n );\n return { mainThreadClient, itemOrder, threadListItems };\n};\n\nconst useRemoteThreadList = (\n props: RemoteThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n adapter,\n thread: threadFactory,\n threadId,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n onDelete,\n } = props;\n\n const [{ store, initialMainId, session }] = useState(() => {\n const seeded = seedNewThread(EMPTY_LIST);\n return {\n store: new OptimisticState(seeded.state),\n initialMainId: seeded.id,\n session: {\n adapter,\n adapterAtLoad: adapter,\n adapterGeneration: 0,\n loadGeneration: 0,\n switchGeneration: 0,\n loadPromise: undefined as Promise<void> | undefined,\n loadMorePromise: undefined as Promise<void> | undefined,\n lastNotifiedRemoteId: undefined as string | undefined,\n lastControlledThreadId: undefined as string | undefined,\n switchTask: undefined as Promise<void> | undefined,\n mainThreadId: seeded.id,\n isFirstThreadIdEffect: true,\n onThreadIdChange,\n onSwitchToThread,\n onSwitchToNewThread,\n },\n };\n });\n\n // Config updates can invoke `reload()` in the same turn as the re-render, before the effect below runs.\n session.adapter = adapter;\n\n const listState = useSyncExternalStore(\n (onStoreChange) => store.subscribe(onStoreChange),\n () => store.value,\n () => store.value,\n );\n\n const [mainThreadId, setMainThreadId] = useState(initialMainId);\n const assignMainThreadId = useCallback(\n (id: string) => {\n session.mainThreadId = id;\n setMainThreadId(id);\n },\n [session],\n );\n useThreadSelectionEvents(mainThreadId);\n useEffect(() => {\n session.adapter = adapter;\n session.mainThreadId = mainThreadId;\n session.onThreadIdChange = onThreadIdChange;\n session.onSwitchToThread = onSwitchToThread;\n session.onSwitchToNewThread = onSwitchToNewThread;\n }, [\n adapter,\n mainThreadId,\n onSwitchToNewThread,\n onSwitchToThread,\n onThreadIdChange,\n session,\n ]);\n\n const notifyRemoteId = useCallback(\n (remoteId: string | undefined, emit: boolean) => {\n if (session.lastNotifiedRemoteId === remoteId) return;\n session.lastNotifiedRemoteId = remoteId;\n if (emit) session.onThreadIdChange?.(remoteId);\n },\n [session],\n );\n\n const getLoadThreadsPromise = useCallback(() => {\n if (session.loadPromise) return session.loadPromise;\n const generation = session.loadGeneration;\n const adapter = session.adapter;\n session.loadPromise = store\n .optimisticUpdate({\n execute: () => adapter.list(),\n loading: (state) => ({ ...state, isLoading: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n session.adapterAtLoad = adapter;\n const fresh = classifyThreads(page.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n session.loadPromise = undefined;\n store.update({\n ...store.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n return session.loadPromise;\n }, [session, store]);\n\n const reload = useCallback(() => {\n const adapterChanged = adapter !== session.adapterAtLoad;\n session.loadGeneration++;\n session.loadPromise = undefined;\n session.loadMorePromise = undefined;\n if (adapterChanged) {\n session.adapterGeneration++;\n session.switchGeneration++;\n session.switchTask = undefined;\n session.adapterAtLoad = adapter;\n const seeded = seedNewThread(EMPTY_LIST);\n store.reset({ ...seeded.state, isLoading: true });\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, true);\n } else {\n store.update({\n ...store.baseValue,\n cursor: undefined,\n });\n }\n return getLoadThreadsPromise();\n }, [\n adapter,\n assignMainThreadId,\n getLoadThreadsPromise,\n notifyRemoteId,\n session,\n store,\n ]);\n\n useEffect(() => {\n void getLoadThreadsPromise();\n }, [getLoadThreadsPromise]);\n\n useEffect(() => {\n if (!isDevelopment) return;\n if (adapter.unstable_useAdapters !== undefined) return;\n if (adapter.unstable_Provider === undefined) return;\n console.warn(\n \"[assistant-ui] RemoteThreadList ignores RemoteThreadListAdapter.unstable_Provider. Expose unstable_useAdapters so per-thread history loads on this entry. useRemoteThreadListRuntime still honors unstable_Provider.\",\n );\n }, [adapter]);\n\n const loadMore = useCallback(() => {\n if (session.loadMorePromise) return session.loadMorePromise;\n const snapshot = store.value;\n if (snapshot.cursor === undefined || snapshot.isLoading) {\n return RESOLVED_PROMISE;\n }\n const generation = session.loadGeneration;\n const cursor = snapshot.cursor;\n const currentAdapter = session.adapter;\n const task = store\n .optimisticUpdate({\n execute: () => currentAdapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, page) => {\n if (generation !== session.loadGeneration) return state;\n const appended = classifyThreads(page.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(page.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== session.loadGeneration) return;\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (session.loadMorePromise === task) {\n session.loadMorePromise = undefined;\n }\n });\n session.loadMorePromise = task;\n return task;\n }, [session, store]);\n\n const startSwitch = useCallback(\n (run: (generation: number) => Promise<void>) => {\n const generation = ++session.switchGeneration;\n let settle!: (error?: unknown) => void;\n const task = new Promise<void>((resolve, reject) => {\n settle = (error) => {\n if (error === undefined) resolve();\n else reject(error);\n };\n });\n session.switchTask = task;\n void run(generation).then(\n () => settle(),\n (error: unknown) => settle(error),\n );\n return task;\n },\n [session],\n );\n\n const switchToThread = useCallback(\n (\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n emitThreadIdChange = true,\n ) =>\n startSwitch(async (generation) => {\n let data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n const remoteMetadata =\n await session.adapter.fetch(threadIdOrRemoteId);\n if (generation !== session.switchGeneration) return;\n const state = store.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteMetadata.remoteId)\n : state.archivedThreadIds.includes(remoteMetadata.remoteId);\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n store.update({\n ...state,\n threadIds:\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote,\n archivedThreadIds:\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n lastMessageAt: remoteMetadata.lastMessageAt,\n custom: remoteMetadata.custom,\n },\n },\n });\n data = getThreadData(store.value, threadIdOrRemoteId);\n }\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n }\n if (isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (data.status === \"archived\" && options?.unarchive !== false) {\n const current = data;\n const { remoteId } = await current.initializeTask;\n if (generation !== session.switchGeneration) return;\n await store.optimisticUpdate({\n execute: () => session.adapter.unarchive(remoteId),\n optimistic: (state) =>\n updateStatusReducer(state, current.id, \"regular\"),\n });\n if (generation !== session.switchGeneration) return;\n data = getThreadData(store.value, current.id) ?? current;\n }\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(data.id);\n notifyRemoteId(data.remoteId, emitThreadIdChange);\n session.onSwitchToThread?.(data.id);\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const switchToNewThread = useCallback(\n (emitThreadIdChange = true) =>\n startSwitch(async (generation) => {\n while (\n store.baseValue.newThreadId !== undefined &&\n store.value.newThreadId === undefined\n ) {\n await store.waitForUpdate();\n if (generation !== session.switchGeneration) return;\n }\n const existing = store.value.newThreadId;\n if (existing !== undefined) {\n const existingId =\n getThreadData(store.value, existing)?.id ?? existing;\n if (isSameThread(store.value, existingId, session.mainThreadId)) {\n return;\n }\n assignMainThreadId(existingId);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n return;\n }\n const seeded = seedNewThread(store.baseValue);\n store.update(seeded.state);\n if (generation !== session.switchGeneration) return;\n assignMainThreadId(seeded.id);\n notifyRemoteId(undefined, emitThreadIdChange);\n session.onSwitchToNewThread?.();\n }),\n [assignMainThreadId, notifyRemoteId, session, startSwitch, store],\n );\n\n const ensureNotMain = useCallback(\n async (threadId: string) => {\n if (threadId === store.value.newThreadId) {\n throw new Error(\"Cannot ensure new thread is not main\");\n }\n let lastAwaitedTask: Promise<void> | undefined;\n while (isSameThread(store.value, threadId, session.mainThreadId)) {\n let switchTask = session.switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) {\n switchTask = switchToNewThread();\n }\n lastAwaitedTask = switchTask;\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && session.switchTask === switchTask) {\n throw error;\n }\n }\n }\n },\n [session, store, switchToNewThread],\n );\n\n const requireAdapterGeneration = useCallback(\n (generation: number) => {\n if (generation !== session.adapterGeneration) {\n throw new ThreadListAdapterChangedError();\n }\n },\n [session],\n );\n\n const initialize = useCallback(\n async (threadId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n if (store.value.newThreadId !== threadId) {\n const data = getThreadData(store.value, threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n }\n const result = toInitializeResult(await data.initializeTask);\n requireAdapterGeneration(adapterGeneration);\n return result;\n }\n const result = await store.optimisticUpdate({\n execute: () => {\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.initialize(threadId);\n },\n optimistic: (state) => updateStatusReducer(state, threadId, \"regular\"),\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n if (adapterGeneration !== session.adapterGeneration) return state;\n const data = getThreadData(state, threadId);\n if (!data) return state;\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n requireAdapterGeneration(adapterGeneration);\n if (threadId === session.mainThreadId) {\n notifyRemoteId(result.remoteId, true);\n }\n return toInitializeResult(result);\n },\n [notifyRemoteId, requireAdapterGeneration, session, store],\n );\n\n const rename = useCallback(\n (threadIdOrRemoteId: string, newTitle: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n };\n },\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const updateCustom = useCallback(\n (\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n }\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n if (!currentAdapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return currentAdapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const current = getThreadData(state, threadIdOrRemoteId);\n if (!current) return state;\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n custom,\n },\n },\n };\n },\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const archive = useCallback(\n async (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"archiving it\");\n if (data.status !== \"regular\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be archived\");\n }\n await ensureNotMain(data.id);\n requireAdapterGeneration(adapterGeneration);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.archive(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"archived\"),\n });\n },\n [ensureNotMain, requireAdapterGeneration, session, store],\n );\n\n const unarchive = useCallback(\n (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"be unarchived\",\n );\n }\n return store.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return await currentAdapter.unarchive(remoteId);\n } catch (error) {\n if (adapterGeneration === session.adapterGeneration) {\n await ensureNotMain(data.id);\n }\n throw error;\n }\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"regular\"),\n });\n },\n [ensureNotMain, requireAdapterGeneration, session, store],\n );\n\n const deleteThread = useCallback(\n async (threadIdOrRemoteId: string) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"deleting it\");\n if (data.status !== \"regular\" && data.status !== \"archived\") {\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be deleted\");\n }\n await ensureNotMain(data.id);\n requireAdapterGeneration(adapterGeneration);\n onDelete?.(data.id);\n return store.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n return currentAdapter.delete(remoteId);\n },\n optimistic: (state) => updateStatusReducer(state, data.id, \"deleted\"),\n });\n },\n [ensureNotMain, onDelete, requireAdapterGeneration, session, store],\n );\n\n const generateTitle = useCallback(\n async (\n threadIdOrRemoteId: string,\n messages: readonly ThreadMessage[] | undefined,\n ) => {\n const currentAdapter = session.adapter;\n const adapterGeneration = session.adapterGeneration;\n const data = getThreadData(store.value, threadIdOrRemoteId);\n if (!data) {\n throw threadNotFoundError(threadIdOrRemoteId, \"generating its title\");\n }\n if (data.status === \"new\") {\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"generate a title\",\n );\n }\n const { remoteId } = await data.initializeTask;\n requireAdapterGeneration(adapterGeneration);\n if (!isSameThread(store.value, data.id, session.mainThreadId)) return;\n if (!messages) return;\n const stream = await currentAdapter.generateTitle(remoteId, messages);\n requireAdapterGeneration(adapterGeneration);\n await applyTitleStream(stream, (newTitle) => {\n if (adapterGeneration !== session.adapterGeneration) return;\n const state = store.baseValue;\n const current = getThreadData(state, data.id);\n if (!current) return;\n store.update({\n ...state,\n threadData: {\n ...state.threadData,\n [current.id]: {\n ...current,\n title: newTitle,\n },\n },\n });\n });\n },\n [requireAdapterGeneration, session, store],\n );\n\n const { mainThreadClient, itemOrder, threadListItems } =\n useRemoteThreadListView({\n listState,\n mainThreadId,\n threadFactory,\n useAdapters: adapter.unstable_useAdapters,\n onSwitchTo: (id, options) => switchToThread(id, options),\n onRename: (id, title) => rename(id, title),\n onUpdateCustom: (id, custom) => updateCustom(id, custom),\n onArchive: (id) => archive(id),\n onUnarchive: (id) => unarchive(id),\n onDelete: (id) => deleteThread(id),\n onGenerateTitle: (id, messages) => generateTitle(id, messages),\n onInitialize: async (id) => toInitializeResult(await initialize(id)),\n onDetach: (id) => ensureNotMain(id),\n });\n\n const mainRemoteId = getThreadData(listState, mainThreadId)?.remoteId;\n useEffect(() => {\n if (session.lastNotifiedRemoteId === mainRemoteId) return;\n session.lastNotifiedRemoteId = mainRemoteId;\n onThreadIdChange?.(mainRemoteId);\n }, [mainRemoteId, onThreadIdChange, session]);\n\n useEffect(() => {\n if (session.isFirstThreadIdEffect) {\n session.isFirstThreadIdEffect = false;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) return;\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n return;\n }\n if (Object.is(session.lastControlledThreadId, threadId)) return;\n session.lastControlledThreadId = threadId;\n if (threadId === undefined) {\n handleThreadListAction(\"create\", () => switchToNewThread(false));\n return;\n }\n handleThreadListAction(\"switch\", () =>\n switchToThread(threadId, undefined, false),\n );\n }, [session, switchToNewThread, switchToThread, threadId]);\n\n const state = useMemo(\n () => ({\n mainThreadId,\n newThreadId: listState.newThreadId ?? null,\n isLoading: listState.isLoading,\n isLoadingMore: listState.isLoadingMore,\n hasMore: listState.cursor !== undefined,\n threadIds: listState.threadIds,\n archivedThreadIds: listState.archivedThreadIds,\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n }),\n [\n listState.archivedThreadIds,\n listState.cursor,\n listState.isLoading,\n listState.isLoadingMore,\n listState.newThreadId,\n listState.threadIds,\n mainThreadClient.state,\n mainThreadId,\n threadListItems.state,\n ],\n );\n\n return {\n getState: () => state,\n switchToThread: (id, options) => {\n handleThreadListAction(\"switch\", () => switchToThread(id, options));\n },\n switchToNewThread: () => {\n handleThreadListAction(\"create\", () => switchToNewThread());\n },\n getLoadThreadsPromise,\n reload,\n reloadMainThread: () => {\n if (getThreadData(store.value, mainThreadId)?.status === \"new\") {\n return RESOLVED_PROMISE;\n }\n return (\n mainThreadClient.methods.unstable_refetchThread?.() ?? RESOLVED_PROMISE\n );\n },\n loadMore,\n item: (selector) => {\n if (selector === \"main\") {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, mainThreadId),\n );\n return threadListItems.get({ index });\n }\n if (\"id\" in selector) {\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, selector.id),\n );\n return threadListItems.get({ index });\n }\n const ids = selector.archived\n ? listState.archivedThreadIds\n : listState.threadIds;\n const id = ids[selector.index];\n if (id === undefined) {\n return threadListItems.get({ index: -1 });\n }\n const index = itemOrder.findIndex((item) =>\n itemMatchesId(item, listState, id),\n );\n return threadListItems.get({ index });\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\n/**\n * `AuiConfig` `threads` entry backed by a `RemoteThreadListAdapter`. Thread\n * bodies are born from the `thread` factory inside the client tree, so any\n * `AssistantClient` host can run a remote or cloud list. Per-thread history\n * and attachments come from `unstable_useAdapters`. `useRemoteThreadListRuntime`\n * uses the same hook when `unstable_Provider` is omitted. Key the factory\n * with `withKey` so history reloads when the visible thread changes.\n */\nexport const RemoteThreadList = resource(useRemoteThreadList);\n\nattachTransformScopes(useRemoteThreadList, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
@@ -46,7 +46,13 @@ const useActionBarCopy = (t0) => {
46
46
  const valueToCopy = isEditing ? composerValue : aui.message.getCopyText();
47
47
  if (!valueToCopy) return;
48
48
  const scopeGeneration = scopeGenerationRef.current;
49
- Promise.resolve(copyToClipboard(valueToCopy)).then(() => {
49
+ let write;
50
+ try {
51
+ write = copyToClipboard(valueToCopy);
52
+ } catch {
53
+ return;
54
+ }
55
+ Promise.resolve(write).then(() => {
50
56
  if (scopeGeneration !== scopeGenerationRef.current) return;
51
57
  if (copiedTimerRef.current !== void 0) clearTimeout(copiedTimerRef.current);
52
58
  aui.message.setIsCopied(true);