@assistant-ui/core 0.3.3 → 0.3.5

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 (128) hide show
  1. package/dist/internal.d.ts +4 -2
  2. package/dist/internal.js +4 -2
  3. package/dist/react/primitive-hooks/useSuggestionTrigger.js +29 -25
  4. package/dist/react/primitive-hooks/useSuggestionTrigger.js.map +1 -1
  5. package/dist/react/primitives/message/MessageParts.d.ts +6 -1
  6. package/dist/react/primitives/message/MessageParts.d.ts.map +1 -1
  7. package/dist/react/primitives/message/MessageParts.js.map +1 -1
  8. package/dist/react/providers/ReadonlyThreadProvider.d.ts.map +1 -1
  9. package/dist/react/providers/ReadonlyThreadProvider.js +1 -0
  10. package/dist/react/providers/ReadonlyThreadProvider.js.map +1 -1
  11. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts +67 -0
  12. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  13. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js +76 -15
  14. package/dist/react/runtimes/RemoteThreadListHookInstanceManager.js.map +1 -1
  15. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +4 -0
  16. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  17. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +22 -1
  18. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  19. package/dist/react/runtimes/cloud/auiV0.d.ts +2 -0
  20. package/dist/react/runtimes/cloud/auiV0.d.ts.map +1 -1
  21. package/dist/react/runtimes/cloud/auiV0.js +6 -4
  22. package/dist/react/runtimes/cloud/auiV0.js.map +1 -1
  23. package/dist/react/types/MessagePartComponentTypes.d.ts +8 -0
  24. package/dist/react/types/MessagePartComponentTypes.d.ts.map +1 -1
  25. package/dist/runtime/api/bindings.d.ts +5 -0
  26. package/dist/runtime/api/bindings.d.ts.map +1 -1
  27. package/dist/runtime/api/thread-list-runtime.d.ts +14 -1
  28. package/dist/runtime/api/thread-list-runtime.d.ts.map +1 -1
  29. package/dist/runtime/api/thread-list-runtime.js +6 -1
  30. package/dist/runtime/api/thread-list-runtime.js.map +1 -1
  31. package/dist/runtime/api/thread-runtime.d.ts +7 -1
  32. package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
  33. package/dist/runtime/api/thread-runtime.js +11 -3
  34. package/dist/runtime/api/thread-runtime.js.map +1 -1
  35. package/dist/runtime/base/base-composer-runtime-core.d.ts +3 -0
  36. package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
  37. package/dist/runtime/base/base-composer-runtime-core.js +54 -12
  38. package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
  39. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +10 -0
  40. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  41. package/dist/runtime/interfaces/thread-runtime-core.d.ts +14 -0
  42. package/dist/runtime/interfaces/thread-runtime-core.d.ts.map +1 -1
  43. package/dist/runtimes/external-store/external-store-adapter.d.ts +9 -0
  44. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  45. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -0
  46. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  47. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +4 -0
  48. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  49. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +1 -0
  50. package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
  51. package/dist/runtimes/external-store/external-store-thread-runtime-core.js +6 -0
  52. package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
  53. package/dist/runtimes/local/local-thread-runtime-core.d.ts +1 -0
  54. package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
  55. package/dist/runtimes/local/local-thread-runtime-core.js +1 -0
  56. package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
  57. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts +1 -0
  58. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.d.ts.map +1 -1
  59. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js +1 -0
  60. package/dist/runtimes/readonly/ReadonlyThreadRuntimeCore.js.map +1 -1
  61. package/dist/runtimes/remote-thread-list/empty-thread-core.js +1 -0
  62. package/dist/runtimes/remote-thread-list/empty-thread-core.js.map +1 -1
  63. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts +1 -0
  64. package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
  65. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +66 -45
  66. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  67. package/dist/store/runtime-clients/thread-list-runtime-client.d.ts.map +1 -1
  68. package/dist/store/runtime-clients/thread-list-runtime-client.js +91 -75
  69. package/dist/store/runtime-clients/thread-list-runtime-client.js.map +1 -1
  70. package/dist/store/scopes/thread-list-item.d.ts +7 -0
  71. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  72. package/dist/store/scopes/threads.d.ts +1 -0
  73. package/dist/store/scopes/threads.d.ts.map +1 -1
  74. package/dist/types/message.d.ts +11 -0
  75. package/dist/types/message.d.ts.map +1 -1
  76. package/dist/types/message.js.map +1 -1
  77. package/dist/utils/data-url.d.ts +14 -1
  78. package/dist/utils/data-url.d.ts.map +1 -1
  79. package/dist/utils/data-url.js +23 -1
  80. package/dist/utils/data-url.js.map +1 -1
  81. package/dist/utils/image-media-type.d.ts +13 -0
  82. package/dist/utils/image-media-type.d.ts.map +1 -0
  83. package/dist/utils/image-media-type.js +141 -0
  84. package/dist/utils/image-media-type.js.map +1 -0
  85. package/dist/utils/wire-media.d.ts +35 -0
  86. package/dist/utils/wire-media.d.ts.map +1 -0
  87. package/dist/utils/wire-media.js +55 -0
  88. package/dist/utils/wire-media.js.map +1 -0
  89. package/package.json +4 -4
  90. package/src/internal.ts +12 -1
  91. package/src/react/primitive-hooks/useSuggestionTrigger.test.ts +148 -0
  92. package/src/react/primitive-hooks/useSuggestionTrigger.ts +10 -4
  93. package/src/react/primitives/message/MessageParts.tsx +6 -1
  94. package/src/react/providers/ReadonlyThreadProvider.tsx +1 -0
  95. package/src/react/runtimes/RemoteThreadListHookInstanceManager.running.test.tsx +157 -0
  96. package/src/react/runtimes/RemoteThreadListHookInstanceManager.test.tsx +160 -0
  97. package/src/react/runtimes/RemoteThreadListHookInstanceManager.tsx +135 -32
  98. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +41 -1
  99. package/src/react/runtimes/cloud/auiV0.ts +8 -2
  100. package/src/react/types/MessagePartComponentTypes.ts +8 -0
  101. package/src/runtime/api/bindings.ts +5 -0
  102. package/src/runtime/api/thread-list-runtime.ts +22 -1
  103. package/src/runtime/api/thread-runtime.ts +15 -6
  104. package/src/runtime/base/base-composer-runtime-core.ts +72 -19
  105. package/src/runtime/interfaces/thread-list-runtime-core.ts +11 -0
  106. package/src/runtime/interfaces/thread-runtime-core.ts +15 -0
  107. package/src/runtimes/external-store/external-store-adapter.ts +9 -0
  108. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +9 -0
  109. package/src/runtimes/external-store/external-store-thread-runtime-core.ts +8 -0
  110. package/src/runtimes/local/local-thread-runtime-core.ts +1 -0
  111. package/src/runtimes/readonly/ReadonlyThreadRuntimeCore.ts +1 -0
  112. package/src/runtimes/remote-thread-list/empty-thread-core.ts +1 -0
  113. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +13 -2
  114. package/src/store/runtime-clients/thread-list-runtime-client.ts +13 -1
  115. package/src/store/scopes/thread-list-item.ts +7 -0
  116. package/src/store/scopes/threads.ts +1 -0
  117. package/src/tests/RemoteThreadListThreadListRuntimeCore-reloadMainThread.test.ts +257 -0
  118. package/src/tests/RemoteThreadListThreadListRuntimeCore-switchToThread-order.test.ts +31 -0
  119. package/src/tests/auiV0Encode.test.ts +125 -1
  120. package/src/tests/base-composer-runtime-core-addAttachment.test.ts +296 -0
  121. package/src/tests/event-subscription-listener-errors.test.ts +1 -0
  122. package/src/tests/external-store-thread-list-runtime-core.test.ts +39 -1
  123. package/src/types/message.ts +11 -0
  124. package/src/utils/data-url.ts +24 -0
  125. package/src/utils/image-media-type.test.ts +96 -0
  126. package/src/utils/image-media-type.ts +118 -0
  127. package/src/utils/wire-media.test.ts +96 -0
  128. package/src/utils/wire-media.ts +70 -0
@@ -1,4 +1,5 @@
1
1
  import { BaseSubscribable } from "../../subscribable/subscribable.js";
2
+ import { getThreadRuntimeCoreIsRunning } from "../../runtime/api/thread-runtime.js";
2
3
  import { ThreadListRuntimeImpl } from "../../runtime/api/thread-list-runtime.js";
3
4
  import { ThreadListItemRuntimeProvider } from "../providers/ThreadListItemRuntimeProvider.js";
4
5
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
@@ -30,6 +31,7 @@ const ProviderRenderDetector = (t0) => {
30
31
  var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
31
32
  useRuntimeHook;
32
33
  instances = /* @__PURE__ */ new Map();
34
+ nextGeneration = 0;
33
35
  useAliveThreadsKeysChanged = create(() => ({}));
34
36
  parent;
35
37
  constructor(runtimeHook, parent) {
@@ -37,18 +39,14 @@ var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
37
39
  this.parent = parent;
38
40
  this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));
39
41
  }
40
- startThreadRuntime(threadId) {
41
- if (!this.instances.has(threadId)) {
42
- this.instances.set(threadId, {});
43
- this.useAliveThreadsKeysChanged.setState({}, true);
44
- }
42
+ _whenRuntimeAttached(threadId) {
45
43
  return new Promise((resolve, reject) => {
46
44
  const callback = () => {
47
45
  const instance = this.instances.get(threadId);
48
46
  if (!instance) {
49
47
  dispose();
50
48
  reject(/* @__PURE__ */ new Error("Thread was deleted before runtime was started"));
51
- } else if (!instance.runtime) return;
49
+ } else if (!instance.runtime || instance.publishedGeneration !== instance.generation) return;
52
50
  else {
53
51
  dispose();
54
52
  resolve(instance.runtime);
@@ -58,12 +56,72 @@ var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
58
56
  callback();
59
57
  });
60
58
  }
59
+ startThreadRuntime(threadId) {
60
+ if (!this.instances.has(threadId)) {
61
+ this.instances.set(threadId, {
62
+ generation: this.nextGeneration++,
63
+ isRunning: false
64
+ });
65
+ this.useAliveThreadsKeysChanged.setState({}, true);
66
+ }
67
+ return this._whenRuntimeAttached(threadId);
68
+ }
69
+ __internal_restartThreadRuntime(threadId) {
70
+ const instance = this.instances.get(threadId);
71
+ if (!instance) return this.startThreadRuntime(threadId);
72
+ instance.generation = this.nextGeneration++;
73
+ this.useAliveThreadsKeysChanged.setState({}, true);
74
+ this._notifySubscribers();
75
+ return this._whenRuntimeAttached(threadId);
76
+ }
61
77
  getThreadRuntimeCore(threadId) {
62
78
  const instance = this.instances.get(threadId);
63
79
  if (!instance) return void 0;
64
80
  return instance.runtime;
65
81
  }
82
+ __internal_isThreadRunning(threadId) {
83
+ return this.instances.get(threadId)?.isRunning ?? false;
84
+ }
85
+ runningSubscribers = /* @__PURE__ */ new Set();
86
+ /**
87
+ * Fires when any thread crosses the running boundary. Separate from the
88
+ * general subscription so a run does not push the thread list through the
89
+ * channel that resolves pending runtime attachments.
90
+ */
91
+ __internal_subscribeRunningChanged(callback) {
92
+ this.runningSubscribers.add(callback);
93
+ return () => this.runningSubscribers.delete(callback);
94
+ }
95
+ _publishThreadRuntime(threadId, runtime, generation) {
96
+ const instance = this.instances.get(threadId);
97
+ if (!instance) throw new Error(`Thread "${threadId}" runtime binding not found. This is a bug in assistant-ui.`);
98
+ if (instance.generation !== generation) return;
99
+ const previousRuntime = instance.runtime;
100
+ instance.runtime = runtime;
101
+ instance.publishedGeneration = generation;
102
+ if (previousRuntime !== runtime) this._trackRunning(instance);
103
+ this._notifySubscribers();
104
+ }
105
+ _trackRunning(instance) {
106
+ instance.unsubscribeRunning?.();
107
+ const runtime = instance.runtime;
108
+ if (!runtime) {
109
+ instance.unsubscribeRunning = void 0;
110
+ this._setRunning(instance, false);
111
+ return;
112
+ }
113
+ this._setRunning(instance, getThreadRuntimeCoreIsRunning(runtime));
114
+ instance.unsubscribeRunning = runtime.subscribe(() => {
115
+ this._setRunning(instance, getThreadRuntimeCoreIsRunning(runtime));
116
+ });
117
+ }
118
+ _setRunning(instance, isRunning) {
119
+ if (instance.isRunning === isRunning) return;
120
+ instance.isRunning = isRunning;
121
+ for (const callback of this.runningSubscribers) callback();
122
+ }
66
123
  stopThreadRuntime(threadId) {
124
+ this.instances.get(threadId)?.unsubscribeRunning?.();
67
125
  this.instances.delete(threadId);
68
126
  this.useAliveThreadsKeysChanged.setState({}, true);
69
127
  this._notifySubscribers();
@@ -71,16 +129,17 @@ var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
71
129
  setRuntimeHook(newRuntimeHook) {
72
130
  if (this.useRuntimeHook.getState().useRuntime !== newRuntimeHook) this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);
73
131
  }
74
- _RuntimeBinder = ({ threadId, children }) => {
132
+ _RuntimeBinder = ({ threadId, generation, children }) => {
75
133
  const { useRuntime } = this.useRuntimeHook();
76
134
  const runtime = useRuntime();
77
135
  const threadBinding = runtime.thread.__internal_threadBinding;
78
136
  const updateRuntime = useCallback(() => {
79
- const aliveThread = this.instances.get(threadId);
80
- if (!aliveThread) throw new Error(`Thread "${threadId}" runtime binding not found. This is a bug in assistant-ui.`);
81
- aliveThread.runtime = threadBinding.getState();
82
- this._notifySubscribers();
83
- }, [threadId, threadBinding]);
137
+ this._publishThreadRuntime(threadId, threadBinding.getState(), generation);
138
+ }, [
139
+ threadId,
140
+ generation,
141
+ threadBinding
142
+ ]);
84
143
  const isMounted = useRef(false);
85
144
  if (!isMounted.current) updateRuntime();
86
145
  useEffect(() => {
@@ -112,7 +171,7 @@ var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
112
171
  }, [runtime]);
113
172
  return /* @__PURE__ */ jsx(Fragment$1, { children });
114
173
  };
115
- _OuterActiveThreadProvider = memo(({ threadId, provider: Provider }) => {
174
+ _OuterActiveThreadProvider = memo(({ threadId, generation, provider: Provider }) => {
116
175
  const runtime = useMemo(() => new ThreadListRuntimeImpl(this.parent).getItemById(threadId), [threadId]);
117
176
  const detectorRef = useRef(false);
118
177
  useEffect(() => {
@@ -127,16 +186,18 @@ var RemoteThreadListHookInstanceManager = class extends BaseSubscribable {
127
186
  runtime,
128
187
  children: /* @__PURE__ */ jsx(Provider, { children: /* @__PURE__ */ jsx(this._RuntimeBinder, {
129
188
  threadId,
189
+ generation,
130
190
  children: /* @__PURE__ */ jsx(ProviderRenderDetector, { detectorRef })
131
191
  }) })
132
192
  });
133
193
  });
134
194
  __internal_RenderThreadRuntimes = ({ provider }) => {
135
195
  this.useAliveThreadsKeysChanged();
136
- return Array.from(this.instances.keys()).map((threadId) => /* @__PURE__ */ jsx(this._OuterActiveThreadProvider, {
196
+ return Array.from(this.instances.entries()).map(([threadId, { generation }]) => /* @__PURE__ */ jsx(this._OuterActiveThreadProvider, {
137
197
  threadId,
198
+ generation,
138
199
  provider
139
- }, threadId));
200
+ }, `${threadId}:${generation}`));
140
201
  };
141
202
  };
142
203
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListHookInstanceManager.js","names":["FC","RefObject","useCallback","useRef","useEffect","useEffectEvent","useLayoutEffect","memo","PropsWithChildren","ComponentType","useMemo","Fragment","UseBoundStore","StoreApi","create","useAui","ThreadListItemRuntimeProvider","ThreadRuntimeCore","ThreadListRuntimeCore","AssistantRuntime","BaseSubscribable","ThreadRuntimeImpl","ThreadListRuntimeImpl","RemoteThreadListHook","RemoteThreadListHookInstance","runtime","ProviderRenderDetector","detectorRef","t0","$","_c","t1","t2","current","RemoteThreadListHookInstanceManager","useRuntimeHook","useRuntime","instances","Map","useAliveThreadsKeysChanged","parent","constructor","runtimeHook","startThreadRuntime","threadId","has","set","setState","Promise","resolve","reject","callback","instance","get","dispose","Error","subscribe","getThreadRuntimeCore","undefined","stopThreadRuntime","delete","_notifySubscribers","setRuntimeHook","newRuntimeHook","prevRuntimeHook","getState","_RuntimeBinder","children","threadBinding","thread","__internal_threadBinding","updateRuntime","aliveThread","isMounted","outerSubscribe","aui","initPromiseRef","hasInitializedRef","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","handleInitialize","state","threadListItem","status","initialize","unstable_on","generateTitle","threads","main","_OuterActiveThreadProvider","provider","Provider","getItemById","process","env","NODE_ENV","id","setTimeout","console","warn","clearTimeout","__internal_RenderThreadRuntimes","Array","from","keys","map"],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"sourcesContent":["import {\n type FC,\n type RefObject,\n useCallback,\n useRef,\n useEffect,\n useEffectEvent,\n useLayoutEffect,\n memo,\n type PropsWithChildren,\n type ComponentType,\n useMemo,\n Fragment,\n} from \"react\";\nimport { type UseBoundStore, type StoreApi, create } from \"zustand\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { ThreadListItemRuntimeProvider } from \"../providers/ThreadListItemRuntimeProvider\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport type { ThreadRuntimeImpl } from \"../../runtime/api/thread-runtime\";\nimport { ThreadListRuntimeImpl } from \"../../runtime/api/thread-list-runtime\";\n\ntype RemoteThreadListHook = () => AssistantRuntime;\n\ntype RemoteThreadListHookInstance = {\n runtime?: ThreadRuntimeCore;\n};\n\nconst ProviderRenderDetector: FC<{\n detectorRef: RefObject<boolean>;\n}> = ({ detectorRef }) => {\n useLayoutEffect(() => {\n detectorRef.current = true;\n }, [detectorRef]);\n return null;\n};\nexport class RemoteThreadListHookInstanceManager extends BaseSubscribable {\n private useRuntimeHook: UseBoundStore<\n StoreApi<{ useRuntime: RemoteThreadListHook }>\n >;\n private instances = new Map<string, RemoteThreadListHookInstance>();\n private useAliveThreadsKeysChanged = create(() => ({}));\n private parent: ThreadListRuntimeCore;\n\n constructor(\n runtimeHook: RemoteThreadListHook,\n parent: ThreadListRuntimeCore,\n ) {\n super();\n this.parent = parent;\n this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));\n }\n\n public startThreadRuntime(threadId: string) {\n if (!this.instances.has(threadId)) {\n this.instances.set(threadId, {});\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n return new Promise<ThreadRuntimeCore>((resolve, reject) => {\n const callback = () => {\n const instance = this.instances.get(threadId);\n if (!instance) {\n dispose();\n reject(new Error(\"Thread was deleted before runtime was started\"));\n } else if (!instance.runtime) {\n return; // misc update\n } else {\n dispose();\n resolve(instance.runtime);\n }\n };\n const dispose = this.subscribe(callback);\n callback();\n });\n }\n\n public getThreadRuntimeCore(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return undefined;\n return instance.runtime;\n }\n\n public stopThreadRuntime(threadId: string) {\n this.instances.delete(threadId);\n this.useAliveThreadsKeysChanged.setState({}, true);\n this._notifySubscribers();\n }\n\n public setRuntimeHook(newRuntimeHook: RemoteThreadListHook) {\n const prevRuntimeHook = this.useRuntimeHook.getState().useRuntime;\n if (prevRuntimeHook !== newRuntimeHook) {\n this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);\n }\n }\n\n // Rendered as a child of the user's Provider so the runtime hook can\n // read context the Provider injects (e.g. RuntimeAdapterProvider).\n private _RuntimeBinder: FC<PropsWithChildren<{ threadId: string }>> = ({\n threadId,\n children,\n }) => {\n const { useRuntime } = this.useRuntimeHook();\n const runtime = useRuntime();\n\n const threadBinding = (runtime.thread as ThreadRuntimeImpl)\n .__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n const aliveThread = this.instances.get(threadId);\n if (!aliveThread)\n throw new Error(\n `Thread \"${threadId}\" runtime binding not found. This is a bug in assistant-ui.`,\n );\n\n aliveThread.runtime = threadBinding.getState();\n this._notifySubscribers();\n }, [threadId, threadBinding]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const aui = useAui();\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n\n useEffect(() => {\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);\n }\n }, [threadBinding]);\n\n const handleInitialize = useEffectEvent(() => {\n if (hasInitializedRef.current) return;\n\n const state = aui.threadListItem.getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n initPromiseRef.current = aui.threadListItem.initialize();\n\n const dispose = runtime.thread.unstable_on(\"runEnd\", () => {\n dispose();\n aui.threadListItem.generateTitle();\n });\n });\n\n useEffect(() => {\n hasInitializedRef.current = false;\n return runtime.threads.main.unstable_on(\"initialize\", handleInitialize);\n }, [runtime]);\n\n return <>{children}</>;\n };\n\n private _OuterActiveThreadProvider: FC<{\n threadId: string;\n provider: ComponentType<PropsWithChildren>;\n }> = memo(({ threadId, provider: Provider }) => {\n const runtime = useMemo(\n () => new ThreadListRuntimeImpl(this.parent).getItemById(threadId),\n [threadId],\n );\n\n const detectorRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && Provider !== Fragment) {\n const id = setTimeout(() => {\n if (!detectorRef.current) {\n console.warn(\n \"RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. \" +\n \"Render `children` on first commit; deferring them behind a loading state, Suspense boundary, \" +\n \"or `useEffect` gate strands the runtime binder and leaves the thread without context.\",\n );\n }\n }, 100);\n return () => clearTimeout(id);\n }\n return undefined;\n }, [Provider]);\n\n return (\n <ThreadListItemRuntimeProvider runtime={runtime}>\n <Provider>\n <this._RuntimeBinder threadId={threadId}>\n <ProviderRenderDetector detectorRef={detectorRef} />\n </this._RuntimeBinder>\n </Provider>\n </ThreadListItemRuntimeProvider>\n );\n });\n\n public __internal_RenderThreadRuntimes: FC<{\n provider: ComponentType<PropsWithChildren>;\n }> = ({ provider }) => {\n this.useAliveThreadsKeysChanged(); // trigger re-render on alive threads change\n\n return Array.from(this.instances.keys()).map((threadId) => (\n <this._OuterActiveThreadProvider\n key={threadId}\n threadId={threadId}\n provider={provider}\n />\n ));\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListHookInstanceManager.js","names":["FC","RefObject","useCallback","useRef","useEffect","useEffectEvent","useLayoutEffect","memo","PropsWithChildren","ComponentType","useMemo","Fragment","UseBoundStore","StoreApi","create","useAui","ThreadListItemRuntimeProvider","ThreadRuntimeCore","ThreadListRuntimeCore","AssistantRuntime","Unsubscribe","BaseSubscribable","getThreadRuntimeCoreIsRunning","ThreadRuntimeImpl","ThreadListRuntimeImpl","RemoteThreadListHook","RemoteThreadListHookInstance","runtime","publishedGeneration","generation","isRunning","unsubscribeRunning","ProviderRenderDetector","detectorRef","t0","$","_c","t1","t2","current","RemoteThreadListHookInstanceManager","useRuntimeHook","useRuntime","instances","Map","nextGeneration","useAliveThreadsKeysChanged","parent","constructor","runtimeHook","_whenRuntimeAttached","threadId","Promise","resolve","reject","callback","instance","get","dispose","Error","subscribe","startThreadRuntime","has","set","setState","__internal_restartThreadRuntime","_notifySubscribers","getThreadRuntimeCore","undefined","__internal_isThreadRunning","runningSubscribers","Set","__internal_subscribeRunningChanged","add","delete","_publishThreadRuntime","previousRuntime","_trackRunning","_setRunning","stopThreadRuntime","setRuntimeHook","newRuntimeHook","prevRuntimeHook","getState","_RuntimeBinder","children","threadBinding","thread","__internal_threadBinding","updateRuntime","isMounted","outerSubscribe","aui","initPromiseRef","hasInitializedRef","runtimeCore","setGetInitializePromise","Record","__internal_setGetInitializePromise","call","handleInitialize","state","threadListItem","status","initialize","unstable_on","generateTitle","threads","main","_OuterActiveThreadProvider","provider","Provider","getItemById","process","env","NODE_ENV","id","setTimeout","console","warn","clearTimeout","__internal_RenderThreadRuntimes","Array","from","entries","map"],"sources":["../../../src/react/runtimes/RemoteThreadListHookInstanceManager.tsx"],"sourcesContent":["import {\n type FC,\n type RefObject,\n useCallback,\n useRef,\n useEffect,\n useEffectEvent,\n useLayoutEffect,\n memo,\n type PropsWithChildren,\n type ComponentType,\n useMemo,\n Fragment,\n} from \"react\";\nimport { type UseBoundStore, type StoreApi, create } from \"zustand\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { ThreadListItemRuntimeProvider } from \"../providers/ThreadListItemRuntimeProvider\";\nimport type { ThreadRuntimeCore } from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { AssistantRuntime } from \"../../runtime/api/assistant-runtime\";\nimport type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport {\n getThreadRuntimeCoreIsRunning,\n type ThreadRuntimeImpl,\n} from \"../../runtime/api/thread-runtime\";\nimport { ThreadListRuntimeImpl } from \"../../runtime/api/thread-list-runtime\";\n\ntype RemoteThreadListHook = () => AssistantRuntime;\n\ntype RemoteThreadListHookInstance = {\n runtime?: ThreadRuntimeCore | undefined;\n // A runtime riding across a restart stays readable, but only counts as\n // attached once a binder of the current generation re-publishes it.\n publishedGeneration?: number | undefined;\n // Part of the binder's React key, so only a bump remounts the hook.\n generation: number;\n isRunning: boolean;\n unsubscribeRunning?: Unsubscribe | undefined;\n};\n\nconst ProviderRenderDetector: FC<{\n detectorRef: RefObject<boolean>;\n}> = ({ detectorRef }) => {\n useLayoutEffect(() => {\n detectorRef.current = true;\n }, [detectorRef]);\n return null;\n};\nexport class RemoteThreadListHookInstanceManager extends BaseSubscribable {\n private useRuntimeHook: UseBoundStore<\n StoreApi<{ useRuntime: RemoteThreadListHook }>\n >;\n private instances = new Map<string, RemoteThreadListHookInstance>();\n // Manager-wide so it survives instance deletion: a stop and start within one\n // React commit must not reuse a binder key.\n private nextGeneration = 0;\n private useAliveThreadsKeysChanged = create(() => ({}));\n private parent: ThreadListRuntimeCore;\n\n constructor(\n runtimeHook: RemoteThreadListHook,\n parent: ThreadListRuntimeCore,\n ) {\n super();\n this.parent = parent;\n this.useRuntimeHook = create(() => ({ useRuntime: runtimeHook }));\n }\n\n private _whenRuntimeAttached(threadId: string) {\n return new Promise<ThreadRuntimeCore>((resolve, reject) => {\n const callback = () => {\n const instance = this.instances.get(threadId);\n if (!instance) {\n dispose();\n reject(new Error(\"Thread was deleted before runtime was started\"));\n } else if (\n !instance.runtime ||\n instance.publishedGeneration !== instance.generation\n ) {\n return; // not yet published by the current generation's binder\n } else {\n dispose();\n resolve(instance.runtime);\n }\n };\n const dispose = this.subscribe(callback);\n callback();\n });\n }\n\n public startThreadRuntime(threadId: string) {\n if (!this.instances.has(threadId)) {\n this.instances.set(threadId, {\n generation: this.nextGeneration++,\n isRunning: false,\n });\n this.useAliveThreadsKeysChanged.setState({}, true);\n }\n\n return this._whenRuntimeAttached(threadId);\n }\n\n public __internal_restartThreadRuntime(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return this.startThreadRuntime(threadId);\n\n instance.generation = this.nextGeneration++;\n this.useAliveThreadsKeysChanged.setState({}, true);\n this._notifySubscribers();\n\n return this._whenRuntimeAttached(threadId);\n }\n\n public getThreadRuntimeCore(threadId: string) {\n const instance = this.instances.get(threadId);\n if (!instance) return undefined;\n return instance.runtime;\n }\n\n public __internal_isThreadRunning(threadId: string) {\n return this.instances.get(threadId)?.isRunning ?? false;\n }\n\n private runningSubscribers = new Set<() => void>();\n\n /**\n * Fires when any thread crosses the running boundary. Separate from the\n * general subscription so a run does not push the thread list through the\n * channel that resolves pending runtime attachments.\n */\n public __internal_subscribeRunningChanged(callback: () => void): Unsubscribe {\n this.runningSubscribers.add(callback);\n return () => this.runningSubscribers.delete(callback);\n }\n\n private _publishThreadRuntime(\n threadId: string,\n runtime: ThreadRuntimeCore,\n generation: number,\n ) {\n const instance = this.instances.get(threadId);\n if (!instance)\n throw new Error(\n `Thread \"${threadId}\" runtime binding not found. This is a bug in assistant-ui.`,\n );\n\n // An outgoing binder outlives its generation until React commits the key\n // change, and must not publish over the incoming one.\n if (instance.generation !== generation) return;\n\n const previousRuntime = instance.runtime;\n instance.runtime = runtime;\n instance.publishedGeneration = generation;\n if (previousRuntime !== runtime) {\n this._trackRunning(instance);\n }\n this._notifySubscribers();\n }\n\n // Run state changes far more often than the thread list does, so the list is\n // only notified when a thread crosses the running boundary.\n private _trackRunning(instance: RemoteThreadListHookInstance) {\n instance.unsubscribeRunning?.();\n\n const runtime = instance.runtime;\n if (!runtime) {\n instance.unsubscribeRunning = undefined;\n this._setRunning(instance, false);\n return;\n }\n\n this._setRunning(instance, getThreadRuntimeCoreIsRunning(runtime));\n instance.unsubscribeRunning = runtime.subscribe(() => {\n this._setRunning(instance, getThreadRuntimeCoreIsRunning(runtime));\n });\n }\n\n private _setRunning(\n instance: RemoteThreadListHookInstance,\n isRunning: boolean,\n ) {\n if (instance.isRunning === isRunning) return;\n instance.isRunning = isRunning;\n for (const callback of this.runningSubscribers) callback();\n }\n\n public stopThreadRuntime(threadId: string) {\n this.instances.get(threadId)?.unsubscribeRunning?.();\n this.instances.delete(threadId);\n this.useAliveThreadsKeysChanged.setState({}, true);\n this._notifySubscribers();\n }\n\n public setRuntimeHook(newRuntimeHook: RemoteThreadListHook) {\n const prevRuntimeHook = this.useRuntimeHook.getState().useRuntime;\n if (prevRuntimeHook !== newRuntimeHook) {\n this.useRuntimeHook.setState({ useRuntime: newRuntimeHook }, true);\n }\n }\n\n // Rendered as a child of the user's Provider so the runtime hook can\n // read context the Provider injects (e.g. RuntimeAdapterProvider).\n private _RuntimeBinder: FC<\n PropsWithChildren<{ threadId: string; generation: number }>\n > = ({ threadId, generation, children }) => {\n const { useRuntime } = this.useRuntimeHook();\n const runtime = useRuntime();\n\n const threadBinding = (runtime.thread as ThreadRuntimeImpl)\n .__internal_threadBinding;\n\n const updateRuntime = useCallback(() => {\n this._publishThreadRuntime(\n threadId,\n threadBinding.getState(),\n generation,\n );\n }, [threadId, generation, threadBinding]);\n\n const isMounted = useRef(false);\n if (!isMounted.current) {\n updateRuntime();\n }\n\n useEffect(() => {\n isMounted.current = true;\n updateRuntime();\n return threadBinding.outerSubscribe(updateRuntime);\n }, [threadBinding, updateRuntime]);\n\n const aui = useAui();\n const initPromiseRef = useRef<Promise<unknown> | undefined>(undefined);\n const hasInitializedRef = useRef(false);\n\n useEffect(() => {\n const runtimeCore = threadBinding.getState();\n const setGetInitializePromise = (runtimeCore as Record<string, unknown>)\n .__internal_setGetInitializePromise;\n if (typeof setGetInitializePromise === \"function\") {\n setGetInitializePromise.call(runtimeCore, () => initPromiseRef.current);\n }\n }, [threadBinding]);\n\n const handleInitialize = useEffectEvent(() => {\n if (hasInitializedRef.current) return;\n\n const state = aui.threadListItem.getState();\n if (state.status !== \"new\") return;\n hasInitializedRef.current = true;\n\n initPromiseRef.current = aui.threadListItem.initialize();\n\n const dispose = runtime.thread.unstable_on(\"runEnd\", () => {\n dispose();\n aui.threadListItem.generateTitle();\n });\n });\n\n useEffect(() => {\n hasInitializedRef.current = false;\n return runtime.threads.main.unstable_on(\"initialize\", handleInitialize);\n }, [runtime]);\n\n return <>{children}</>;\n };\n\n private _OuterActiveThreadProvider: FC<{\n threadId: string;\n generation: number;\n provider: ComponentType<PropsWithChildren>;\n }> = memo(({ threadId, generation, provider: Provider }) => {\n const runtime = useMemo(\n () => new ThreadListRuntimeImpl(this.parent).getItemById(threadId),\n [threadId],\n );\n\n const detectorRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && Provider !== Fragment) {\n const id = setTimeout(() => {\n if (!detectorRef.current) {\n console.warn(\n \"RemoteThreadListAdapter.unstable_Provider did not render its `children` synchronously. \" +\n \"Render `children` on first commit; deferring them behind a loading state, Suspense boundary, \" +\n \"or `useEffect` gate strands the runtime binder and leaves the thread without context.\",\n );\n }\n }, 100);\n return () => clearTimeout(id);\n }\n return undefined;\n }, [Provider]);\n\n return (\n <ThreadListItemRuntimeProvider runtime={runtime}>\n <Provider>\n <this._RuntimeBinder threadId={threadId} generation={generation}>\n <ProviderRenderDetector detectorRef={detectorRef} />\n </this._RuntimeBinder>\n </Provider>\n </ThreadListItemRuntimeProvider>\n );\n });\n\n public __internal_RenderThreadRuntimes: FC<{\n provider: ComponentType<PropsWithChildren>;\n }> = ({ provider }) => {\n this.useAliveThreadsKeysChanged(); // trigger re-render on alive threads change\n\n return Array.from(this.instances.entries()).map(\n ([threadId, { generation }]) => (\n <this._OuterActiveThreadProvider\n key={`${threadId}:${generation}`}\n threadId={threadId}\n generation={generation}\n provider={provider}\n />\n ),\n );\n };\n}\n"],"mappings":"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"}
@@ -34,6 +34,7 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
34
34
  private useProvider;
35
35
  __internal_setOptions(options: RemoteThreadListOptions): void;
36
36
  __internal_load(): void;
37
+ reloadMainThread(): Promise<void>;
37
38
  reload(): Promise<void>;
38
39
  get isLoading(): boolean;
39
40
  get isLoadingMore(): boolean;
@@ -94,6 +95,7 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
94
95
  exportExternalState(): any;
95
96
  importExternalState(state: any): void;
96
97
  reset(initialMessages?: readonly ThreadMessageLike[]): void;
98
+ unstable_refetchThread?: (() => Promise<void>) | undefined;
97
99
  unstable_on<E extends ThreadRuntimeEventType>(event: E, callback: ThreadRuntimeEventCallback<E>): Unsubscribe;
98
100
  }>;
99
101
  getThreadRuntimeCore(threadIdOrRemoteId: string): Readonly<{
@@ -145,8 +147,10 @@ declare class RemoteThreadListThreadListRuntimeCore extends BaseSubscribable imp
145
147
  exportExternalState(): any;
146
148
  importExternalState(state: any): void;
147
149
  reset(initialMessages?: readonly ThreadMessageLike[]): void;
150
+ unstable_refetchThread?: (() => Promise<void>) | undefined;
148
151
  unstable_on<E extends ThreadRuntimeEventType>(event: E, callback: ThreadRuntimeEventCallback<E>): Unsubscribe;
149
152
  }>;
153
+ unstable_isThreadRunning(threadIdOrRemoteId: string): boolean;
150
154
  getItemById(threadIdOrRemoteId: string): RemoteThreadData | undefined;
151
155
  switchToThread(threadIdOrRemoteId: string, options?: {
152
156
  unarchive?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"mappings":";;;;;;;;;;;;;;;;;cAoCa,8CACH,4BACG;UAEH;mBACS;UAET;UACA;UACA;UACA;UACA;UAEA;mBACS;MAWN,eAAW,SAAA,OAzBX,mBAyBW;EAIf,yBAAqB;EAsDrB,YAAY;mBAmDF;EAGf,YAAA,SAAS,yBACT,iBAAiB;UAoBX;UACA;EAED,sBAAsB,SAAS;EAkC/B;EAgBA,UAAM;MAWF;MAIA;MAIA;MAIA;MAIA;MAIA;MAIA;cAMC;UAKJ;UAEA;EASD,4BAAwB;;;eAzDlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DN,qBAAqB,6BAA0B;;;eANvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBxB,YAAY,6BAA0B;EAItC,eACL,4BACA;IAAY;MACX;UAIK;UAgBM;EAuGP,qBAAqB;UAIpB;UAMA;UAOM;EA6CP,aAAoB,qBAAgB;;;;EAwDpC,gBAAuB,qBAAgB;EAmCvC,OAAO,4BAA4B,mBAAmB;EA6BtD,aACL,4BACA,QAAQ,sCACP;UAiDW;EAsBD,QAAQ,6BAA0B;EAmBxC,UAAU,6BAA6B;EAsBjC,OAAO,6BAA0B;EAoBjC,OAAO,6BAA6B;UAUzC;EAED,4BAA4B"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.d.ts","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"mappings":";;;;;;;;;;;;;;;;;cAoCa,8CACH,4BACG;UAEH;mBACS;UAET;UACA;UACA;UACA;UACA;UAEA;mBACS;MAWN,eAAW,SAAA,OAzBX,mBAyBW;EAIf,yBAAqB;EAsDrB,YAAY;mBAmDF;EAGf,YAAA,SAAS,yBACT,iBAAiB;UAuBX;UACA;EAED,sBAAsB,SAAS;EAkC/B;EAgBM,oBAAoB;EA4B1B,UAAM;MAWF;MAIA;MAIA;MAIA;MAIA;MAIA;MAIA;cAMC;UAKJ;UAEA;EASD,4BAAwB;;;eAzDlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DN,qBAAqB,6BAA0B;;;eANvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBxB,yBAAyB;EAMzB,YAAY,6BAA0B;EAItC,eACL,4BACA;IAAY;MACX;UAIK;UAgBM;EA0GP,qBAAqB;UAIpB;UAMA;UAOM;EA6CP,aAAoB,qBAAgB;;;;EAwDpC,gBAAuB,qBAAgB;EAmCvC,OAAO,4BAA4B,mBAAmB;EA6BtD,aACL,4BACA,QAAQ,sCACP;UAiDW;EAsBD,QAAQ,6BAA0B;EAmBxC,UAAU,6BAA6B;EAsBjC,OAAO,6BAA0B;EAoBjC,OAAO,6BAA6B;UAUzC;EAED,4BAA4B"}
@@ -130,6 +130,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
130
130
  this._notifyThreadIdChange();
131
131
  });
132
132
  this._hookManager = new RemoteThreadListHookInstanceManager(options.runtimeHook, this);
133
+ this._hookManager.__internal_subscribeRunningChanged(() => this._notifySubscribers());
133
134
  this.useProvider = create(() => ({ Provider: options.adapter.unstable_Provider ?? Fragment }));
134
135
  this.__internal_setOptions(options);
135
136
  this.switchToNewThread();
@@ -162,6 +163,21 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
162
163
  const startThreadId = this._options.threadId ?? this._options.initialThreadId;
163
164
  if (startThreadId !== void 0) (this._options.threadId !== void 0 ? this._switchToThreadFromProp(startThreadId) : this.switchToThread(startThreadId)).catch(() => {});
164
165
  }
166
+ async reloadMainThread() {
167
+ const threadId = this._mainThreadId;
168
+ if (threadId === void 0) return;
169
+ if (this.getItemById(threadId)?.status === "new") return;
170
+ const runtimeCore = this._hookManager.getThreadRuntimeCore(threadId);
171
+ try {
172
+ if (runtimeCore?.unstable_refetchThread) await runtimeCore.unstable_refetchThread();
173
+ else await this._hookManager.__internal_restartThreadRuntime(threadId);
174
+ } catch (error) {
175
+ if (threadId !== this._mainThreadId) return;
176
+ throw error;
177
+ }
178
+ if (threadId !== this._mainThreadId) return;
179
+ this._notifySubscribers();
180
+ }
165
181
  reload() {
166
182
  this._loadGeneration++;
167
183
  this._loadThreadsPromise = void 0;
@@ -216,6 +232,11 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
216
232
  if (!result) throw new Error(`Runtime for thread "${threadIdOrRemoteId}" not found while getting its runtime.`);
217
233
  return result;
218
234
  }
235
+ unstable_isThreadRunning(threadIdOrRemoteId) {
236
+ const data = this.getItemById(threadIdOrRemoteId);
237
+ if (!data) return false;
238
+ return this._hookManager.__internal_isThreadRunning(data.id);
239
+ }
219
240
  getItemById(threadIdOrRemoteId) {
220
241
  return getThreadData(this._state.value, threadIdOrRemoteId);
221
242
  }
@@ -274,7 +295,7 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
274
295
  if (this._mainThreadId === data.id) return;
275
296
  const task = this._hookManager.startThreadRuntime(data.id);
276
297
  if (this.mainThreadId !== void 0) await task;
277
- else task.then(() => this._notifySubscribers());
298
+ else task.then(() => this._notifySubscribers(), () => void 0);
278
299
  if (generation !== this._switchGeneration) return;
279
300
  if (data.status === "archived" && options?.unarchive !== false) {
280
301
  await this.unarchive(data.id);
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListOptions","RemoteThreadListHookInstanceManager","FC","Fragment","useEffect","useId","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","adapter","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","contextProvider","constructor","options","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","useProvider","Provider","unstable_Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","controlledThreadIdChanged","threadId","getState","setState","setRuntimeHook","_switchToThreadFromProp","__internal_load","startThreadId","initialThreadId","switchTask","switchToThread","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","emit","onThreadIdChange","getMainThreadRuntimeCore","result","getThreadRuntimeCore","data","getItemById","id","unarchive","_startSwitchToThread","emitThreadIdChange","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","includes","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_startSwitchToNewThread","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","runtimeCore","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","startedFallback","archive","delete","stopThreadRuntime","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","adapters","modelContext","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" 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\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.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 !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.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 (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n const controlledThreadIdChanged =\n this._initialThreadLoaded &&\n this._options !== undefined &&\n this._options.threadId !== options.threadId;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n\n if (controlledThreadIdChanged) {\n this._switchToThreadFromProp(options.threadId).catch(() => {});\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n if (this._initialThreadLoaded) return;\n this._initialThreadLoaded = true;\n\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (startThreadId !== undefined) {\n const switchTask =\n this._options.threadId !== undefined\n ? this._switchToThreadFromProp(startThreadId)\n : this.switchToThread(startThreadId);\n switchTask.catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange(emit = true) {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n if (emit) {\n this._options.onThreadIdChange?.(threadId);\n }\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._startSwitchToThread(threadIdOrRemoteId, options, true);\n }\n\n private _startSwitchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(\n threadIdOrRemoteId,\n options,\n generation,\n emitThreadIdChange,\n );\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\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 } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange(emitThreadIdChange);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._startSwitchToNewThread(true);\n }\n\n private _switchToThreadFromProp(threadId: string | undefined): Promise<void> {\n return threadId !== undefined\n ? this._startSwitchToThread(threadId, undefined, false)\n : this._startSwitchToNewThread(false);\n }\n\n private _startSwitchToNewThread(emitThreadIdChange: boolean): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation, emitThreadIdChange);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\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 } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation, emitThreadIdChange);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\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\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 return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(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 this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(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 this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":["ThreadListRuntimeCore","generateId","BaseSubscribable","OptimisticState","EMPTY_THREAD_CORE","RemoteThreadData","RemoteThreadState","classifyThreads","createThreadMappingId","getThreadData","normalizeCursor","updateStatusReducer","RemoteThreadListOptions","RemoteThreadListHookInstanceManager","FC","Fragment","useEffect","useId","create","AssistantMessageStream","ModelContextProvider","RuntimeAdapterProvider","threadNotFoundError","threadIdOrRemoteId","action","Error","threadStatusError","status","RemoteThreadListThreadListRuntimeCore","_options","_hookManager","_loadThreadsPromise","Promise","_loadMorePromise","_loadGeneration","_switchGeneration","_switchTask","_mainThreadId","_state","isLoading","isLoadingMore","cursor","undefined","newThreadId","threadIds","archivedThreadIds","threadIdMap","threadData","threadItems","value","getLoadThreadsPromise","generation","optimisticUpdate","execute","adapter","list","loading","state","then","l","fresh","threads","nextCursor","catch","error","console","update","baseValue","loadMore","initialState","resolve","dedup","after","appended","contextProvider","constructor","options","subscribe","_notifySubscribers","_notifyThreadIdChange","runtimeHook","__internal_subscribeRunningChanged","useProvider","Provider","unstable_Provider","__internal_setOptions","switchToNewThread","_initialThreadLoaded","adapterChanged","controlledThreadIdChanged","threadId","getState","setState","setRuntimeHook","_switchToThreadFromProp","__internal_load","startThreadId","initialThreadId","switchTask","switchToThread","reloadMainThread","getItemById","runtimeCore","getThreadRuntimeCore","unstable_refetchThread","__internal_restartThreadRuntime","reload","hasMore","mainThreadId","_mainThreadRemoteId","remoteId","_lastNotifiedThreadId","emit","onThreadIdChange","getMainThreadRuntimeCore","result","data","id","unstable_isThreadRunning","__internal_isThreadRunning","unarchive","_startSwitchToThread","emitThreadIdChange","task","_switchToThread","remoteMetadata","fetch","mappingId","newThreadData","initializeTask","externalId","title","lastMessageAt","custom","newThreadIdMap","wasInTarget","includes","threadIdsWithoutRemote","filter","archivedThreadIdsWithoutRemote","newThreadIds","newArchivedThreadIds","startThreadRuntime","_startSwitchToNewThread","_switchToNewThread","waitForUpdate","initialize","optimistic","generateTitle","messages","stream","messageStream","fromAssistantStream","newTitle","parts","c","type","text","currentData","rename","updateCustom","Record","_ensureThreadIsNotMain","lastAwaitedTask","startedFallback","archive","delete","stopThreadRuntime","detach","useBoundIds","__internal_RenderComponent","s","i","boundIds","adapters","modelContext","length"],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nconst threadNotFoundError = (threadIdOrRemoteId: string, action: string) =>\n new Error(`Thread \"${threadIdOrRemoteId}\" 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\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n private _switchGeneration = 0;\n private _switchTask: Promise<void> | undefined;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.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 !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.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 (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => {\n this._notifySubscribers();\n this._notifyThreadIdChange();\n });\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this._hookManager.__internal_subscribeRunningChanged(() =>\n this._notifySubscribers(),\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n const controlledThreadIdChanged =\n this._initialThreadLoaded &&\n this._options !== undefined &&\n this._options.threadId !== options.threadId;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n\n if (controlledThreadIdChanged) {\n this._switchToThreadFromProp(options.threadId).catch(() => {});\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n if (this._initialThreadLoaded) return;\n this._initialThreadLoaded = true;\n\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (startThreadId !== undefined) {\n const switchTask =\n this._options.threadId !== undefined\n ? this._switchToThreadFromProp(startThreadId)\n : this.switchToThread(startThreadId);\n switchTask.catch(() => {});\n }\n }\n\n public async reloadMainThread(): Promise<void> {\n const threadId = this._mainThreadId;\n if (threadId === undefined) return;\n\n // An unsent thread holds no remote state, so a refetch would only discard\n // what the user has typed.\n if (this.getItemById(threadId)?.status === \"new\") return;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(threadId);\n\n try {\n if (runtimeCore?.unstable_refetchThread) {\n // Called on the core so class-method implementations keep `this`.\n await runtimeCore.unstable_refetchThread();\n } else {\n await this._hookManager.__internal_restartThreadRuntime(threadId);\n }\n } catch (error) {\n // delete and detach switch the main thread away before stopping the\n // runtime, so a rejection once that has happened belongs to them.\n if (threadId !== this._mainThreadId) return;\n throw error;\n }\n\n if (threadId !== this._mainThreadId) return;\n this._notifySubscribers();\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n // The settled remote ID of the active thread, or undefined while it is still\n // a new/optimistic thread. This is the value surfaced to `onThreadIdChange`.\n private get _mainThreadRemoteId(): string | undefined {\n if (this._mainThreadId === undefined) return undefined;\n return getThreadData(this._state.value, this._mainThreadId)?.remoteId;\n }\n\n private _lastNotifiedThreadId: string | undefined = undefined;\n\n private _notifyThreadIdChange(emit = true) {\n const threadId = this._mainThreadRemoteId;\n if (this._lastNotifiedThreadId === threadId) return;\n this._lastNotifiedThreadId = threadId;\n if (emit) {\n this._options.onThreadIdChange?.(threadId);\n }\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(threadIdOrRemoteId, \"getting its runtime\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result)\n throw new Error(\n `Runtime for thread \"${threadIdOrRemoteId}\" not found while getting its runtime.`,\n );\n return result;\n }\n\n public unstable_isThreadRunning(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) return false;\n return this._hookManager.__internal_isThreadRunning(data.id);\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n return this._startSwitchToThread(threadIdOrRemoteId, options, true);\n }\n\n private _startSwitchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToThread(\n threadIdOrRemoteId,\n options,\n generation,\n emitThreadIdChange,\n );\n this._switchTask = task;\n return task;\n }\n\n private async _switchToThread(\n threadIdOrRemoteId: string,\n options: { unarchive?: boolean } | undefined,\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n if (generation !== this._switchGeneration) return;\n\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\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 } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // A concurrent `list()` may already have placed this thread; keep that\n // position and only merge metadata. A genuinely absent thread stays\n // appended: it may live on an unloaded page, and a prepend would pin it\n // above newer threads permanently since `classifyThreads` skips ids it\n // has already seen. Filtering both arrays first still prevents\n // duplication or a wrong-status entry from `list()`.\n const remoteId = remoteMetadata.remoteId;\n const wasInTarget =\n remoteMetadata.status === \"regular\"\n ? state.threadIds.includes(remoteId)\n : state.archivedThreadIds.includes(remoteId);\n\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? wasInTarget\n ? state.threadIds\n : [...threadIdsWithoutRemote, remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? wasInTarget\n ? state.archivedThreadIds\n : [...archivedThreadIdsWithoutRemote, remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"switching to it\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n void task.then(\n () => this._notifySubscribers(),\n () => undefined,\n );\n }\n\n if (generation !== this._switchGeneration) return;\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n if (generation !== this._switchGeneration) return;\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n this._notifyThreadIdChange(emitThreadIdChange);\n }\n\n public switchToNewThread(): Promise<void> {\n return this._startSwitchToNewThread(true);\n }\n\n private _switchToThreadFromProp(threadId: string | undefined): Promise<void> {\n return threadId !== undefined\n ? this._startSwitchToThread(threadId, undefined, false)\n : this._startSwitchToNewThread(false);\n }\n\n private _startSwitchToNewThread(emitThreadIdChange: boolean): Promise<void> {\n const generation = ++this._switchGeneration;\n const task = this._switchToNewThread(generation, emitThreadIdChange);\n this._switchTask = task;\n return task;\n }\n\n private async _switchToNewThread(\n generation: number,\n emitThreadIdChange: boolean,\n ): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n if (generation !== this._switchGeneration) return;\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\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 } satisfies RemoteThreadData,\n },\n });\n }\n\n return this._switchToThread(id, undefined, generation, emitThreadIdChange);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"initializing it\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"be initialized here\");\n const { remoteId, externalId } = await data.initializeTask;\n return { remoteId, externalId };\n }\n\n const { remoteId, externalId } = await this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\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\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 return { remoteId, externalId };\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw threadNotFoundError(threadId, \"generating its title\");\n if (data.status === \"new\")\n throw threadStatusError(threadId, data.status, \"generate a title\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"renaming it\");\n if (data.status === \"new\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be renamed\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data)\n throw threadNotFoundError(\n threadIdOrRemoteId,\n \"updating its custom metadata\",\n );\n if (data.status === \"new\")\n throw threadStatusError(\n threadIdOrRemoteId,\n data.status,\n \"update custom metadata\",\n );\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n let lastAwaitedTask: Promise<void> | undefined;\n\n while (threadId === this._mainThreadId) {\n let switchTask = this._switchTask;\n const startedFallback = !switchTask || switchTask === lastAwaitedTask;\n if (startedFallback) switchTask = this.switchToNewThread();\n lastAwaitedTask = switchTask;\n\n try {\n await switchTask;\n } catch (error) {\n if (startedFallback && this._switchTask === switchTask) {\n throw error;\n }\n }\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(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 this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"unarchiving it\");\n if (data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be unarchived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(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 this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw threadNotFoundError(threadIdOrRemoteId, \"detaching it\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw threadStatusError(threadIdOrRemoteId, data.status, \"be detached\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,MAAMsB,uBAAuBC,oBAA4BC,2BACvD,IAAIC,MAAM,WAAWF,mBAAkB,oBAAqBC,OAAM,EAAG;AAEvE,MAAME,qBACJH,oBACAI,QACAH,2BAEA,IAAIC,MACF,WAAWF,mBAAkB,gBAAiBI,OAAM,kBAAmBH,OAAM,EAC/E;AAEF,IAAaI,wCAAb,cACU1B,iBAEV;CACE;CACA;CAEA;CACA;CACA,kBAA0B;CAC1B,oBAA4B;CAC5B;CAEA;CACA,SAA0B,IAAIC,gBAAmC;EAC/DoC,WAAW;EACXC,eAAe;EACfC,QAAQC,KAAAA;EACRC,aAAaD,KAAAA;EACbE,WAAW,CAAA;EACXC,mBAAmB,CAAA;EACnBC,aAAa,CAAC;EACdC,YAAY,CAAC;CACf,CAAC;CAED,IAAWC,cAAc;EACvB,OAAO,KAAKV,OAAOW,MAAMF;CAC3B;CAEA,wBAA+B;EAE7B,IAAI,CAAC,KAAKhB,qBAAqB;GAC7B,MAAMoB,aAAa,KAAKjB;GACxB,KAAKH,sBAAsB,KAAKO,OAC7Bc,iBAAiB;IAChBC,eAAe,KAAKxB,SAASyB,QAAQC,KAAK;IAC1CC,UAAUC,UAAU;KAClB,OAAO;MACL,GAAGA;MACHlB,WAAW;KACb;IACF;IACAmB,OAAOD,OAAOE,MAAM;KAClB,IAAIR,eAAe,KAAKjB,iBAAiB,OAAOuB;KAChD,MAAMG,QAAQrD,gBAAgBoD,EAAEE,SAAS;MACvCjB,WAAW,CAAA;MACXC,mBAAmB,CAAA;MACnBC,aAAa,CAAC;MACdC,YAAY,CAAC;KACf,CAAC;KAED,OAAO;MACL,GAAGU;MACHlB,WAAW;MACXE,QAAQ/B,gBAAgBiD,EAAEG,UAAU;MACpClB,WAAWgB,MAAMhB;MACjBC,mBAAmBe,MAAMf;MACzBC,aAAa;OACX,GAAGW,MAAMX;OACT,GAAGc,MAAMd;MACX;MACAC,YAAY;OACV,GAAGU,MAAMV;OACT,GAAGa,MAAMb;MACX;KACF;IACF;GACF,CAAC,CAAC,CACDgB,OAAOC,UAAmB;IACzB,IAAIb,eAAe,KAAKjB,iBAAiB;IACzC+B,QAAQD,MAAM,2CAA2CA,KAAK;IAC9D,KAAKjC,sBAAsBW,KAAAA;IAC3B,KAAKJ,OAAO4B,OAAO;KACjB,GAAG,KAAK5B,OAAO6B;KACf5B,WAAW;IACb,CAAC;GACH,CAAC,CAAC,CACDmB,WAAW,CAAC,CAAC;EAClB;EAEA,OAAO,KAAK3B;CACd;CAEA,WAAiC;EAC/B,IAAI,KAAKE,kBAAkB,OAAO,KAAKA;EAEvC,MAAMoC,eAAe,KAAK/B,OAAOW;EACjC,IAAIoB,aAAa5B,WAAWC,KAAAA,KAAa2B,aAAa9B,WACpD,OAAOP,QAAQsC,QAAQ;EAGzB,MAAMnB,aAAa,KAAKjB;EACxB,MAAMoB,UAAU,KAAKzB,SAASyB;EAC9B,MAAMb,SAAS4B,aAAa5B;EAE5B,MAAM8B,QAAQ,KAAKjC,OAChBc,iBAAiB;GAChBC,eAAeC,QAAQC,KAAK,EAAEiB,OAAO/B,OAAO,CAAC;GAC7Ce,UAAUC,WAAW;IAAE,GAAGA;IAAOjB,eAAe;GAAK;GACrDkB,OAAOD,OAAOE,MAAM;IAClB,IAAIR,eAAe,KAAKjB,iBAAiB,OAAOuB;IAChD,IAAIH,YAAY,KAAKzB,SAASyB,SAAS,OAAOG;IAE9C,MAAMgB,WAAWlE,gBAAgBoD,EAAEE,SAAS;KAC1CjB,WAAW,CAAC,GAAGa,MAAMb,SAAS;KAC9BC,mBAAmB,CAAC,GAAGY,MAAMZ,iBAAiB;KAC9CC,aAAa,EAAE,GAAGW,MAAMX,YAAY;KACpCC,YAAY,EAAE,GAAGU,MAAMV,WAAW;IACpC,CAAC;IAED,OAAO;KACL,GAAGU;KACHjB,eAAe;KACfC,QAAQ/B,gBAAgBiD,EAAEG,UAAU;KACpClB,WAAW6B,SAAS7B;KACpBC,mBAAmB4B,SAAS5B;KAC5BC,aAAa2B,SAAS3B;KACtBC,YAAY0B,SAAS1B;IACvB;GACF;EACF,CAAC,CAAC,CACDgB,OAAOC,UAAmB;GACzBC,QAAQD,MAAM,+CAA+CA,KAAK;EACpE,CAAC,CAAC,CACDN,WAAW;GACV,IAAI,KAAKzB,qBAAqBsC,OAC5B,KAAKtC,mBAAmBS,KAAAA;EAE5B,CAAC;EAEH,KAAKT,mBAAmBsC;EACxB,OAAOA;CACT;CAEA;CAEAI,YACEC,SACAF,iBACA;EACA,MAAM;EACN,KAAKA,kBAAkBA;EAEvB,KAAKpC,OAAOuC,gBAAgB;GAC1B,KAAKC,mBAAmB;GACxB,KAAKC,sBAAsB;EAC7B,CAAC;EACD,KAAKjD,eAAe,IAAIjB,oCACtB+D,QAAQI,aACR,IACF;EACA,KAAKlD,aAAamD,yCAChB,KAAKH,mBAAmB,CAC1B;EACA,KAAKI,cAAchE,cAAc,EAC/BiE,UAAUP,QAAQtB,QAAQ8B,qBAAqBrE,SACjD,EAAE;EACF,KAAKsE,sBAAsBT,OAAO;EAClC,KAAKU,kBAAkB;CACzB;CAEA,uBAA+B;CAC/B;CAEA,sBAA6BV,SAAkC;EAC7D,IAAI,KAAK/C,aAAa+C,SAAS;EAE/B,MAAMY,iBACJ,KAAK3D,aAAaa,KAAAA,KAAa,KAAKb,SAASyB,YAAYsB,QAAQtB;EACnE,MAAMmC,4BACJ,KAAKF,wBACL,KAAK1D,aAAaa,KAAAA,KAClB,KAAKb,SAAS6D,aAAad,QAAQc;EAErC,KAAK7D,WAAW+C;EAEhB,MAAMO,WAAWP,QAAQtB,QAAQ8B,qBAAqBrE;EACtD,IAAIoE,aAAa,KAAKD,YAAYS,SAAS,CAAC,CAACR,UAC3C,KAAKD,YAAYU,SAAS,EAAET,SAAS,GAAG,IAAI;EAG9C,KAAKrD,aAAa+D,eAAejB,QAAQI,WAAW;EAEpD,IAAIQ,gBAAgB;GAClB,KAAKtD;GACL,KAAKH,sBAAsBW,KAAAA;GAC3B,KAAKT,mBAAmBS,KAAAA;GACxB,KAAKJ,OAAO4B,OAAO;IACjB,GAAG,KAAK5B,OAAO6B;IACf1B,QAAQC,KAAAA;GACV,CAAC;EACH;EAEA,IAAI+C,2BACF,KAAKK,wBAAwBlB,QAAQc,QAAQ,CAAC,CAAC3B,YAAY,CAAC,CAAC;CAEjE;CAEA,kBAAyB;EACvB,KAAKb,sBAAsB;EAC3B,IAAI,KAAKqC,sBAAsB;EAC/B,KAAKA,uBAAuB;EAE5B,MAAMS,gBACJ,KAAKnE,SAAS6D,YAAY,KAAK7D,SAASoE;EAC1C,IAAID,kBAAkBtD,KAAAA,GAKpBwD,CAHE,KAAKrE,SAAS6D,aAAahD,KAAAA,IACvB,KAAKoD,wBAAwBE,aAAa,IAC1C,KAAKG,eAAeH,aAAa,EAAA,CAC5BjC,YAAY,CAAC,CAAC;CAE7B;CAEA,MAAaqC,mBAAkC;EAC7C,MAAMV,WAAW,KAAKrD;EACtB,IAAIqD,aAAahD,KAAAA,GAAW;EAI5B,IAAI,KAAK2D,YAAYX,QAAQ,CAAC,EAAE/D,WAAW,OAAO;EAElD,MAAM2E,cAAc,KAAKxE,aAAayE,qBAAqBb,QAAQ;EAEnE,IAAI;GACF,IAAIY,aAAaE,wBAEf,MAAMF,YAAYE,uBAAuB;QAEzC,MAAM,KAAK1E,aAAa2E,gCAAgCf,QAAQ;EAEpE,SAAS1B,OAAO;GAGd,IAAI0B,aAAa,KAAKrD,eAAe;GACrC,MAAM2B;EACR;EAEA,IAAI0B,aAAa,KAAKrD,eAAe;EACrC,KAAKyC,mBAAmB;CAC1B;CAEA,SAAgB;EACd,KAAK5C;EACL,KAAKH,sBAAsBW,KAAAA;EAC3B,KAAKT,mBAAmBS,KAAAA;EACxB,KAAKJ,OAAO4B,OAAO;GACjB,GAAG,KAAK5B,OAAO6B;GACf1B,QAAQC,KAAAA;EACV,CAAC;EACD,OAAO,KAAKQ,sBAAsB;CACpC;CAEA,IAAWX,YAAY;EACrB,OAAO,KAAKD,OAAOW,MAAMV;CAC3B;CAEA,IAAWC,gBAAgB;EACzB,OAAO,KAAKF,OAAOW,MAAMT;CAC3B;CAEA,IAAWmE,UAAU;EACnB,OAAO,KAAKrE,OAAOW,MAAMR,WAAWC,KAAAA;CACtC;CAEA,IAAWE,YAAY;EACrB,OAAO,KAAKN,OAAOW,MAAML;CAC3B;CAEA,IAAWC,oBAAoB;EAC7B,OAAO,KAAKP,OAAOW,MAAMJ;CAC3B;CAEA,IAAWF,cAAc;EACvB,OAAO,KAAKL,OAAOW,MAAMN;CAC3B;CAEA,IAAWiE,eAAuB;EAChC,OAAO,KAAKvE;CACd;CAIA,IAAYwE,sBAA0C;EACpD,IAAI,KAAKxE,kBAAkBK,KAAAA,GAAW,OAAOA,KAAAA;EAC7C,OAAOjC,cAAc,KAAK6B,OAAOW,OAAO,KAAKZ,aAAa,CAAC,EAAEyE;CAC/D;CAEA,wBAAoDpE,KAAAA;CAEpD,sBAA8BsE,OAAO,MAAM;EACzC,MAAMtB,WAAW,KAAKmB;EACtB,IAAI,KAAKE,0BAA0BrB,UAAU;EAC7C,KAAKqB,wBAAwBrB;EAC7B,IAAIsB,MACF,KAAKnF,SAASoF,mBAAmBvB,QAAQ;CAE7C;CAEA,2BAAkC;EAChC,MAAMyB,SAAS,KAAKrF,aAAayE,qBAAqB,KAAKlE,aAAa;EACxE,IAAI,CAAC8E,QAAQ,OAAO/G;EACpB,OAAO+G;CACT;CAEA,qBAA4B5F,oBAA4B;EACtD,MAAM6F,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MACH,MAAM9F,oBAAoBC,oBAAoB,qBAAqB;EAErE,MAAM4F,SAAS,KAAKrF,aAAayE,qBAAqBa,KAAKC,EAAE;EAC7D,IAAI,CAACF,QACH,MAAM,IAAI1F,MACR,uBAAuBF,mBAAkB,uCAC3C;EACF,OAAO4F;CACT;CAEA,yBAAgC5F,oBAA4B;EAC1D,MAAM6F,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MAAM,OAAO;EAClB,OAAO,KAAKtF,aAAayF,2BAA2BH,KAAKC,EAAE;CAC7D;CAEA,YAAmB9F,oBAA4B;EAC7C,OAAOd,cAAc,KAAK6B,OAAOW,OAAO1B,kBAAkB;CAC5D;CAEA,eACEA,oBACAqD,SACe;EACf,OAAO,KAAK6C,qBAAqBlG,oBAAoBqD,SAAS,IAAI;CACpE;CAEA,qBACErD,oBACAqD,SACA8C,oBACe;EACf,MAAMvE,aAAa,EAAE,KAAKhB;EAC1B,MAAMwF,OAAO,KAAKC,gBAChBrG,oBACAqD,SACAzB,YACAuE,kBACF;EACA,KAAKtF,cAAcuF;EACnB,OAAOA;CACT;CAEA,MAAcC,gBACZrG,oBACAqD,SACAzB,YACAuE,oBACe;EACf,IAAIN,OAAO,KAAKf,YAAY9E,kBAAkB;EAE9C,IAAI,CAAC6F,MAAM;GACT,MAAMS,iBACJ,MAAM,KAAKhG,SAASyB,QAAQwE,MAAMvG,kBAAkB;GACtD,IAAI4B,eAAe,KAAKhB,mBAAmB;GAE3C,MAAMsB,QAAQ,KAAKnB,OAAOW;GAC1B,MAAM8E,YAAYvH,sBAAsBqH,eAAef,QAAQ;GAE/D,MAAMkB,gBAAgB;IACpB,GAAGvE,MAAMV;KACRgF,YAAY;KACXV,IAAIU;KACJE,gBAAgBjG,QAAQsC,QAAQ;MAC9BwC,UAAUe,eAAef;MACzBoB,YAAYL,eAAeK;KAC7B,CAAC;KACDpB,UAAUe,eAAef;KACzBoB,YAAYL,eAAeK;KAC3BvG,QAAQkG,eAAelG;KACvBwG,OAAON,eAAeM;KACtBC,eAAeP,eAAeO;KAC9BC,QAAQR,eAAeQ;IACzB;GACF;GAEA,MAAMC,iBAAiB;IACrB,GAAG7E,MAAMX;KACR+E,eAAef,WAAWiB;GAC7B;GAQA,MAAMjB,WAAWe,eAAef;GAChC,MAAMyB,cACJV,eAAelG,WAAW,YACtB8B,MAAMb,UAAU4F,SAAS1B,QAAQ,IACjCrD,MAAMZ,kBAAkB2F,SAAS1B,QAAQ;GAE/C,MAAM2B,yBAAyBhF,MAAMb,UAAU8F,QAC5CrB,OAAOA,OAAOP,QACjB;GACA,MAAM6B,iCAAiClF,MAAMZ,kBAAkB6F,QAC5DrB,OAAOA,OAAOP,QACjB;GAEA,MAAM8B,eACJf,eAAelG,WAAW,YACtB4G,cACE9E,MAAMb,YACN,CAAC,GAAG6F,wBAAwB3B,QAAQ,IACtC2B;GACN,MAAMI,uBACJhB,eAAelG,WAAW,aACtB4G,cACE9E,MAAMZ,oBACN,CAAC,GAAG8F,gCAAgC7B,QAAQ,IAC9C6B;GAEN,KAAKrG,OAAO4B,OAAO;IACjB,GAAGT;IACHb,WAAWgG;IACX/F,mBAAmBgG;IACnB/F,aAAawF;IACbvF,YAAYiF;GACd,CAAC;GAEDZ,OAAO,KAAKf,YAAY9E,kBAAkB;EAC5C;EAEA,IAAI,CAAC6F,MAAM,MAAM9F,oBAAoBC,oBAAoB,iBAAiB;EAC1E,IAAI,KAAKc,kBAAkB+E,KAAKC,IAAI;EAEpC,MAAMM,OAAO,KAAK7F,aAAagH,mBAAmB1B,KAAKC,EAAE;EACzD,IAAI,KAAKT,iBAAiBlE,KAAAA,GACxB,MAAMiF;OAEN,KAAUjE,WACF,KAAKoB,mBAAmB,SACxBpC,KAAAA,CACR;EAGF,IAAIS,eAAe,KAAKhB,mBAAmB;EAE3C,IAAIiF,KAAKzF,WAAW,cAAciD,SAAS4C,cAAc,OAAO;GAC9D,MAAM,KAAKA,UAAUJ,KAAKC,EAAE;GAC5B,IAAIlE,eAAe,KAAKhB,mBAAmB;EAC7C;EACA,KAAKE,gBAAgB+E,KAAKC;EAE1B,KAAKvC,mBAAmB;EACxB,KAAKC,sBAAsB2C,kBAAkB;CAC/C;CAEA,oBAA0C;EACxC,OAAO,KAAKqB,wBAAwB,IAAI;CAC1C;CAEA,wBAAgCrD,UAA6C;EAC3E,OAAOA,aAAahD,KAAAA,IAChB,KAAK+E,qBAAqB/B,UAAUhD,KAAAA,GAAW,KAAK,IACpD,KAAKqG,wBAAwB,KAAK;CACxC;CAEA,wBAAgCrB,oBAA4C;EAC1E,MAAMvE,aAAa,EAAE,KAAKhB;EAC1B,MAAMwF,OAAO,KAAKqB,mBAAmB7F,YAAYuE,kBAAkB;EACnE,KAAKtF,cAAcuF;EACnB,OAAOA;CACT;CAEA,MAAcqB,mBACZ7F,YACAuE,oBACe;EAEf,OACE,KAAKpF,OAAO6B,UAAUxB,gBAAgBD,KAAAA,KACtC,KAAKJ,OAAOW,MAAMN,gBAAgBD,KAAAA,GAClC;GACA,MAAM,KAAKJ,OAAO2G,cAAc;GAChC,IAAI9F,eAAe,KAAKhB,mBAAmB;EAC7C;EAEA,MAAMsB,QAAQ,KAAKnB,OAAOW;EAC1B,IAAIoE,KAAyB,KAAK/E,OAAOW,MAAMN;EAC/C,IAAI0E,OAAO3E,KAAAA,GAAW;GACpB;IACE2E,KAAK,aAAapH,WAAW;UACtBwD,MAAMX,YAAYuE;GAE3B,MAAMU,YAAYvH,sBAAsB6G,EAAE;GAC1C,KAAK/E,OAAO4B,OAAO;IACjB,GAAGT;IACHd,aAAa0E;IACbvE,aAAa;KACX,GAAGW,MAAMX;MACRuE,KAAKU;IACR;IACAhF,YAAY;KACV,GAAGU,MAAMV;MACRgF,YAAY;MACXpG,QAAQ;MACR0F;MACAP,UAAUpE,KAAAA;MACVwF,YAAYxF,KAAAA;MACZyF,OAAOzF,KAAAA;MACP2F,QAAQ3F,KAAAA;KACV;IACF;GACF,CAAC;EACH;EAEA,OAAO,KAAKkF,gBAAgBP,IAAI3E,KAAAA,GAAWS,YAAYuE,kBAAkB;CAC3E;CAEA,aAAoB,OAAOhC,aAAqB;EAC9C,IAAI,KAAKpD,OAAOW,MAAMN,gBAAgB+C,UAAU;GAC9C,MAAM0B,OAAO,KAAKf,YAAYX,QAAQ;GACtC,IAAI,CAAC0B,MAAM,MAAM9F,oBAAoBoE,UAAU,iBAAiB;GAChE,IAAI0B,KAAKzF,WAAW,OAClB,MAAMD,kBAAkBgE,UAAU0B,KAAKzF,QAAQ,qBAAqB;GACtE,MAAM,EAAEmF,UAAUoB,eAAe,MAAMd,KAAKa;GAC5C,OAAO;IAAEnB;IAAUoB;GAAW;EAChC;EAEA,MAAM,EAAEpB,UAAUoB,eAAe,MAAM,KAAK5F,OAAOc,iBAAiB;GAClEC,eAAe;IACb,OAAO,KAAKxB,SAASyB,QAAQ4F,WAAWxD,QAAQ;GAClD;GACAyD,aAAa1F,UAAU;IACrB,OAAO9C,oBAAoB8C,OAAOiC,UAAU,SAAS;GACvD;GACAlC,UAAUC,OAAOkE,SAAS;IACxB,MAAMI,YAAYvH,sBAAsBkF,QAAQ;IAChD,OAAO;KACL,GAAGjC;KACHV,YAAY;MACV,GAAGU,MAAMV;OACRgF,YAAY;OACX,GAAGtE,MAAMV,WAAWgF;OACpBE,gBAAgBN;MAClB;KACF;IACF;GACF;GACAjE,OAAOD,OAAO,EAAEqD,UAAUoB,iBAAiB;IACzC,MAAMd,OAAO3G,cAAcgD,OAAOiC,QAAQ;IAC1C,IAAI,CAAC0B,MAAM,OAAO3D;IAElB,MAAMsE,YAAYvH,sBAAsBkF,QAAQ;IAChD,OAAO;KACL,GAAGjC;KACHX,aAAa;MACX,GAAGW,MAAMX;OACRgE,WAAWiB;KACd;KACAhF,YAAY;MACV,GAAGU,MAAMV;OACRgF,YAAY;OACX,GAAGX;OACHa,gBAAgBjG,QAAQsC,QAAQ;QAAEwC;QAAUoB;OAAW,CAAC;OACxDpB;OACAoB;MACF;KACF;IACF;GACF;EACF,CAAC;EACD,OAAO;GAAEpB;GAAUoB;EAAW;CAChC;CAEA,gBAAuB,OAAOxC,aAAqB;EACjD,MAAM0B,OAAO,KAAKf,YAAYX,QAAQ;EACtC,IAAI,CAAC0B,MAAM,MAAM9F,oBAAoBoE,UAAU,sBAAsB;EACrE,IAAI0B,KAAKzF,WAAW,OAClB,MAAMD,kBAAkBgE,UAAU0B,KAAKzF,QAAQ,kBAAkB;EAEnE,MAAM,EAAEmF,aAAa,MAAMM,KAAKa;EAEhC,MAAM3B,cAAc,KAAKxE,aAAayE,qBAAqBa,KAAKC,EAAE;EAClE,IAAI,CAACf,aAAa;EAElB,MAAM+C,WAAW/C,YAAY+C;EAC7B,MAAMC,SAAS,MAAM,KAAKzH,SAASyB,QAAQ8F,cACzCtC,UACAuC,QACF;EACA,MAAME,gBAAgBpI,uBAAuBqI,oBAAoBF,MAAM;EACvE,WAAW,MAAMnC,UAAUoC,eAAe;GACxC,MAAME,WAAWtC,OAAOuC,MAAMhB,QAAQiB,MAAMA,EAAEC,SAAS,MAAM,CAAC,CAAC,EAAE,EAAEC;GACnE,MAAMpG,QAAQ,KAAKnB,OAAO6B;GAC1B,MAAM2F,cAAcrJ,cAAcgD,OAAO2D,KAAKC,EAAE;GAChD,IAAI,CAACyC,aAAa;GAClB,KAAKxH,OAAO4B,OAAO;IACjB,GAAGT;IACHV,YAAY;KACV,GAAGU,MAAMV;MACR+G,YAAYzC,KAAK;MAChB,GAAGyC;MACH3B,OAAOsB;KACT;IACF;GACF,CAAC;EACH;CACF;CAEA,OAAclI,oBAA4BkI,UAAiC;EACzE,MAAMrC,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MAAM,MAAM9F,oBAAoBC,oBAAoB,aAAa;EACtE,IAAI6F,KAAKzF,WAAW,OAClB,MAAMD,kBAAkBH,oBAAoB6F,KAAKzF,QAAQ,YAAY;EAEvE,OAAO,KAAKW,OAAOc,iBAAiB;GAClCC,SAAS,YAAY;IACnB,MAAM,EAAEyD,aAAa,MAAMM,KAAKa;IAChC,OAAO,KAAKpG,SAASyB,QAAQyG,OAAOjD,UAAU2C,QAAQ;GACxD;GACAN,aAAa1F,UAAU;IACrB,MAAM2D,OAAO3G,cAAcgD,OAAOlC,kBAAkB;IACpD,IAAI,CAAC6F,MAAM,OAAO3D;IAElB,OAAO;KACL,GAAGA;KACHV,YAAY;MACV,GAAGU,MAAMV;OACRqE,KAAKC,KAAK;OACT,GAAGD;OACHe,OAAOsB;MACT;KACF;IACF;GACF;EACF,CAAC;CACH;CAEA,aACElI,oBACA8G,QACe;EACf,MAAMjB,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MACH,MAAM9F,oBACJC,oBACA,8BACF;EACF,IAAI6F,KAAKzF,WAAW,OAClB,MAAMD,kBACJH,oBACA6F,KAAKzF,QACL,wBACF;EAEF,IAAI,CAAC,KAAKE,SAASyB,QAAQ0G,cACzB,MAAM,IAAIvI,MACR,sEACF;EAGF,OAAO,KAAKa,OAAOc,iBAAiB;GAClCC,SAAS,YAAY;IACnB,MAAM,EAAEyD,aAAa,MAAMM,KAAKa;IAChC,MAAM3E,UAAU,KAAKzB,SAASyB;IAC9B,IAAI,CAACA,QAAQ0G,cACX,MAAM,IAAIvI,MACR,sEACF;IAEF,OAAO6B,QAAQ0G,aAAalD,UAAUuB,MAAM;GAC9C;GACAc,aAAa1F,UAAU;IACrB,MAAM2D,OAAO3G,cAAcgD,OAAOlC,kBAAkB;IACpD,IAAI,CAAC6F,MAAM,OAAO3D;IAElB,OAAO;KACL,GAAGA;KACHV,YAAY;MACV,GAAGU,MAAMV;OACRqE,KAAKC,KAAK;OACT,GAAGD;OACHiB;MACF;KACF;IACF;GACF;EACF,CAAC;CACH;CAEA,MAAc6B,uBAAuBxE,UAAkB;EACrD,IAAIA,aAAa,KAAK/C,aACpB,MAAM,IAAIlB,MAAM,sCAAsC;EAExD,IAAI0I;EAEJ,OAAOzE,aAAa,KAAKrD,eAAe;GACtC,IAAI6D,aAAa,KAAK9D;GACtB,MAAMgI,kBAAkB,CAAClE,cAAcA,eAAeiE;GACtD,IAAIC,iBAAiBlE,aAAa,KAAKZ,kBAAkB;GACzD6E,kBAAkBjE;GAElB,IAAI;IACF,MAAMA;GACR,SAASlC,OAAO;IACd,IAAIoG,mBAAmB,KAAKhI,gBAAgB8D,YAC1C,MAAMlC;GAEV;EACF;CACF;CAEA,MAAaqG,QAAQ9I,oBAA4B;EAC/C,MAAM6F,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MAAM,MAAM9F,oBAAoBC,oBAAoB,cAAc;EACvE,IAAI6F,KAAKzF,WAAW,WAClB,MAAMD,kBAAkBH,oBAAoB6F,KAAKzF,QAAQ,aAAa;EAExE,MAAM,KAAKuI,uBAAuB9C,KAAKC,EAAE;EAEzC,OAAO,KAAK/E,OAAOc,iBAAiB;GAClCC,SAAS,YAAY;IACnB,MAAM,EAAEyD,aAAa,MAAMM,KAAKa;IAChC,OAAO,KAAKpG,SAASyB,QAAQ+G,QAAQvD,QAAQ;GAC/C;GACAqC,aAAa1F,UAAU;IACrB,OAAO9C,oBAAoB8C,OAAO2D,KAAKC,IAAI,UAAU;GACvD;EACF,CAAC;CACH;CAEA,UAAiB9F,oBAA2C;EAC1D,MAAM6F,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MAAM,MAAM9F,oBAAoBC,oBAAoB,gBAAgB;EACzE,IAAI6F,KAAKzF,WAAW,YAClB,MAAMD,kBAAkBH,oBAAoB6F,KAAKzF,QAAQ,eAAe;EAE1E,OAAO,KAAKW,OAAOc,iBAAiB;GAClCC,SAAS,YAAY;IACnB,IAAI;KACF,MAAM,EAAEyD,aAAa,MAAMM,KAAKa;KAChC,OAAO,MAAM,KAAKpG,SAASyB,QAAQkE,UAAUV,QAAQ;IACvD,SAAS9C,OAAO;KACd,MAAM,KAAKkG,uBAAuB9C,KAAKC,EAAE;KACzC,MAAMrD;IACR;GACF;GACAmF,aAAa1F,UAAU;IACrB,OAAO9C,oBAAoB8C,OAAO2D,KAAKC,IAAI,SAAS;GACtD;EACF,CAAC;CACH;CAEA,MAAaiD,OAAO/I,oBAA4B;EAC9C,MAAM6F,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MAAM,MAAM9F,oBAAoBC,oBAAoB,aAAa;EACtE,IAAI6F,KAAKzF,WAAW,aAAayF,KAAKzF,WAAW,YAC/C,MAAMD,kBAAkBH,oBAAoB6F,KAAKzF,QAAQ,YAAY;EAEvE,MAAM,KAAKuI,uBAAuB9C,KAAKC,EAAE;EACzC,KAAKvF,aAAayI,kBAAkBnD,KAAKC,EAAE;EAE3C,OAAO,KAAK/E,OAAOc,iBAAiB;GAClCC,SAAS,YAAY;IACnB,MAAM,EAAEyD,aAAa,MAAMM,KAAKa;IAChC,OAAO,MAAM,KAAKpG,SAASyB,QAAQgH,OAAOxD,QAAQ;GACpD;GACAqC,aAAa1F,UAAU;IACrB,OAAO9C,oBAAoB8C,OAAO2D,KAAKC,IAAI,SAAS;GACtD;EACF,CAAC;CACH;CAEA,MAAamD,OAAOjJ,oBAA2C;EAC7D,MAAM6F,OAAO,KAAKf,YAAY9E,kBAAkB;EAChD,IAAI,CAAC6F,MAAM,MAAM9F,oBAAoBC,oBAAoB,cAAc;EACvE,IAAI6F,KAAKzF,WAAW,aAAayF,KAAKzF,WAAW,YAC/C,MAAMD,kBAAkBH,oBAAoB6F,KAAKzF,QAAQ,aAAa;EAExE,MAAM,KAAKuI,uBAAuB9C,KAAKC,EAAE;EACzC,KAAKvF,aAAayI,kBAAkBnD,KAAKC,EAAE;CAC7C;CAEA,cAAsBnG,aAAuB,CAAA,CAAE;CAE/C,mCAA8C;EAC5C,MAAMmG,KAAKpG,MAAM;EACjBD,gBAAgB;GACd,KAAKyJ,YAAY7E,UAAU+E,MAAM,CAAC,GAAGA,GAAGtD,EAAE,GAAG,IAAI;GACjD,aAAa;IACX,KAAKoD,YAAY7E,UAAU+E,MAAMA,EAAEjC,QAAQkC,MAAMA,MAAMvD,EAAE,GAAG,IAAI;GAClE;EACF,GAAG,CAACA,EAAE,CAAC;EAEP,MAAMwD,WAAW,KAAKJ,YAAY;EAClC,MAAM,EAAEtF,aAAa,KAAKD,YAAY;EAEtC,MAAM4F,WAAW,EACfC,cAAc,KAAKrG,gBACrB;EAEA,QACGmG,SAASG,WAAW,KAAKH,SAAS,OAAOxD,OAExC,oBAAC,wBAAD;GAAkCyD;GAChC,UAAA,oBAAC,KAAK,aAAa,iCAAnB,EACE,UAAU3F,SAAS,CAAA;EAEC,CAAA;CAG9B;AACF"}
@@ -58,6 +58,7 @@ type AuiV0MessagePart = {
58
58
  readonly data: string;
59
59
  readonly mimeType: string;
60
60
  readonly filename?: string;
61
+ readonly sourceType?: "url" | "id";
61
62
  };
62
63
  type AuiV0AttachmentPart = {
63
64
  readonly type: "text";
@@ -71,6 +72,7 @@ type AuiV0AttachmentPart = {
71
72
  readonly data: string;
72
73
  readonly mimeType: string;
73
74
  readonly filename?: string;
75
+ readonly sourceType?: "url" | "id";
74
76
  } | {
75
77
  readonly type: "audio";
76
78
  readonly audio: {
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;;KAGV;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBAwEL,YAAY,SAAS,gBAAgB;iBA6FrC,YACd,cAAc;EAAiB;IAC9B"}
1
+ {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/auiV0.ts"],"mappings":";;;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;WACA;;KAGV;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBA2EL,YAAY,SAAS,gBAAgB;iBA8FrC,YACd,cAAc;EAAiB;IAC9B"}
@@ -17,7 +17,8 @@ const encodeAttachmentPart = (part) => {
17
17
  type: "file",
18
18
  data: part.data,
19
19
  mimeType: part.mimeType,
20
- ...part.filename != null ? { filename: part.filename } : void 0
20
+ ...part.filename != null ? { filename: part.filename } : void 0,
21
+ ...part.sourceType != null ? { sourceType: part.sourceType } : void 0
21
22
  };
22
23
  case "audio": return {
23
24
  type: "audio",
@@ -85,13 +86,13 @@ function auiV0Encode(message) {
85
86
  ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0
86
87
  };
87
88
  case "tool-call":
88
- if (!isJSONValue(part.result)) console.warn(`tool-call result is not JSON! ${JSON.stringify(part)}`);
89
+ if (part.result !== void 0 && !isJSONValue(part.result)) console.warn(`tool-call result is not JSON! ${JSON.stringify(part)}`);
89
90
  return {
90
91
  type: "tool-call",
91
92
  toolCallId: part.toolCallId,
92
93
  toolName: part.toolName,
93
94
  ...JSON.stringify(part.args) === part.argsText ? { args: part.args } : { argsText: part.argsText },
94
- ...part.result ? { result: part.result } : void 0,
95
+ ...part.result !== void 0 ? { result: part.result } : void 0,
95
96
  ...part.isError ? { isError: true } : void 0,
96
97
  ...part.approval ? { approval: part.approval } : void 0
97
98
  };
@@ -103,7 +104,8 @@ function auiV0Encode(message) {
103
104
  type: "file",
104
105
  data: part.data,
105
106
  mimeType: part.mimeType,
106
- ...part.filename ? { filename: part.filename } : void 0
107
+ ...part.filename ? { filename: part.filename } : void 0,
108
+ ...part.sourceType ? { sourceType: part.sourceType } : void 0
107
109
  };
108
110
  default: throw new Error(`Message part type not supported by aui/v0: ${type}`);
109
111
  }