@assistant-ui/react 0.15.10 → 0.15.11
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.
- package/dist/client/ExternalThread.d.ts.map +1 -1
- package/dist/client/ExternalThread.js +330 -338
- package/dist/client/ExternalThread.js.map +1 -1
- package/dist/client/InMemoryThreadList.d.ts.map +1 -1
- package/dist/client/InMemoryThreadList.js +82 -86
- package/dist/client/InMemoryThreadList.js.map +1 -1
- package/dist/context/react/ThreadViewportContext.js +2 -1
- package/dist/context/react/ThreadViewportContext.js.map +1 -1
- package/dist/primitives/composer/ComposerInput.js +2 -1
- package/dist/primitives/composer/ComposerInput.js.map +1 -1
- package/dist/primitives/message/MessagePartsGrouped.js +2 -1
- package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
- package/dist/primitives/thread/ThreadViewport.js +4 -2
- package/dist/primitives/thread/ThreadViewport.js.map +1 -1
- package/dist/primitives/thread/ThreadViewportFooter.js +3 -1
- package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js +2 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js.map +1 -1
- package/dist/utils/useToolArgsFieldStatus.d.ts +2 -2
- package/package.json +14 -14
- package/src/client/ExternalThread.ts +26 -43
- package/src/client/InMemoryThreadList.ts +5 -4
- package/src/tests/external-thread-parity.test.tsx +95 -0
- package/src/tests/in-memory-thread-list.test.tsx +55 -0
|
@@ -71,7 +71,7 @@ const useThreadListItemClient = (props) => {
|
|
|
71
71
|
};
|
|
72
72
|
const ThreadListItemClient = resource(useThreadListItemClient);
|
|
73
73
|
const useInMemoryThreadList = (props) => {
|
|
74
|
-
const $ = c(
|
|
74
|
+
const $ = c(57);
|
|
75
75
|
const { thread: threadFactory, onSwitchToThread, onSwitchToNewThread } = props;
|
|
76
76
|
const [mainThreadId, setMainThreadId] = useState("main");
|
|
77
77
|
const [threads, setThreads] = useState(_temp3);
|
|
@@ -130,24 +130,20 @@ const useInMemoryThreadList = (props) => {
|
|
|
130
130
|
} else t4 = $[5];
|
|
131
131
|
const handleUpdateCustom = t4;
|
|
132
132
|
let t5;
|
|
133
|
-
if ($[6] !==
|
|
133
|
+
if ($[6] !== threads) {
|
|
134
134
|
t5 = (threadId_4) => {
|
|
135
135
|
setThreads((prev_3) => prev_3.filter((t_3) => t_3.id !== threadId_4));
|
|
136
|
-
|
|
137
|
-
const remaining = threads.filter((t_4) => t_4.id !== threadId_4);
|
|
138
|
-
setMainThreadId(remaining[0]?.id || "main");
|
|
139
|
-
}
|
|
136
|
+
setMainThreadId((prev_4) => prev_4 === threadId_4 ? threads.find((t_4) => t_4.id !== threadId_4)?.id || "main" : prev_4);
|
|
140
137
|
};
|
|
141
|
-
$[6] =
|
|
142
|
-
$[7] =
|
|
143
|
-
|
|
144
|
-
} else t5 = $[8];
|
|
138
|
+
$[6] = threads;
|
|
139
|
+
$[7] = t5;
|
|
140
|
+
} else t5 = $[7];
|
|
145
141
|
const handleDelete = t5;
|
|
146
142
|
let t6;
|
|
147
|
-
if ($[
|
|
143
|
+
if ($[8] !== onSwitchToNewThread) {
|
|
148
144
|
t6 = () => {
|
|
149
145
|
const newId = `thread-${Date.now()}`;
|
|
150
|
-
setThreads((
|
|
146
|
+
setThreads((prev_5) => [...prev_5, {
|
|
151
147
|
id: newId,
|
|
152
148
|
title: "New Thread",
|
|
153
149
|
status: "regular"
|
|
@@ -155,22 +151,22 @@ const useInMemoryThreadList = (props) => {
|
|
|
155
151
|
setMainThreadId(newId);
|
|
156
152
|
onSwitchToNewThread?.();
|
|
157
153
|
};
|
|
158
|
-
$[
|
|
159
|
-
$[
|
|
160
|
-
} else t6 = $[
|
|
154
|
+
$[8] = onSwitchToNewThread;
|
|
155
|
+
$[9] = t6;
|
|
156
|
+
} else t6 = $[9];
|
|
161
157
|
const handleSwitchToNewThread = t6;
|
|
162
158
|
let t7;
|
|
163
|
-
if ($[
|
|
159
|
+
if ($[10] !== mainThreadId || $[11] !== threadFactory) {
|
|
164
160
|
t7 = threadFactory(mainThreadId);
|
|
165
|
-
$[
|
|
166
|
-
$[
|
|
167
|
-
$[
|
|
168
|
-
} else t7 = $[
|
|
161
|
+
$[10] = mainThreadId;
|
|
162
|
+
$[11] = threadFactory;
|
|
163
|
+
$[12] = t7;
|
|
164
|
+
} else t7 = $[12];
|
|
169
165
|
const mainThreadClient = useClientResource(t7);
|
|
170
166
|
let t8;
|
|
171
|
-
if ($[
|
|
167
|
+
if ($[13] !== handleDelete || $[14] !== handleSwitchToThread || $[15] !== mainThreadClient.state || $[16] !== mainThreadId || $[17] !== threads) {
|
|
172
168
|
let t9;
|
|
173
|
-
if ($[
|
|
169
|
+
if ($[19] !== handleDelete || $[20] !== handleSwitchToThread || $[21] !== mainThreadClient.state || $[22] !== mainThreadId) {
|
|
174
170
|
t9 = (t_5) => withKey(t_5.id, ThreadListItemClient({
|
|
175
171
|
data: t_5,
|
|
176
172
|
isRunning: t_5.id === mainThreadId && mainThreadClient.state.isRunning,
|
|
@@ -181,20 +177,20 @@ const useInMemoryThreadList = (props) => {
|
|
|
181
177
|
onUnarchive: () => handleUnarchive(t_5.id),
|
|
182
178
|
onDelete: () => handleDelete(t_5.id)
|
|
183
179
|
}));
|
|
184
|
-
$[
|
|
185
|
-
$[
|
|
186
|
-
$[
|
|
187
|
-
$[
|
|
188
|
-
$[
|
|
189
|
-
} else t9 = $[
|
|
180
|
+
$[19] = handleDelete;
|
|
181
|
+
$[20] = handleSwitchToThread;
|
|
182
|
+
$[21] = mainThreadClient.state;
|
|
183
|
+
$[22] = mainThreadId;
|
|
184
|
+
$[23] = t9;
|
|
185
|
+
} else t9 = $[23];
|
|
190
186
|
t8 = threads.map(t9);
|
|
191
|
-
$[
|
|
192
|
-
$[
|
|
193
|
-
$[
|
|
194
|
-
$[
|
|
195
|
-
$[
|
|
196
|
-
$[
|
|
197
|
-
} else t8 = $[
|
|
187
|
+
$[13] = handleDelete;
|
|
188
|
+
$[14] = handleSwitchToThread;
|
|
189
|
+
$[15] = mainThreadClient.state;
|
|
190
|
+
$[16] = mainThreadId;
|
|
191
|
+
$[17] = threads;
|
|
192
|
+
$[18] = t8;
|
|
193
|
+
} else t8 = $[18];
|
|
198
194
|
const threadListItems = useClientLookup(t8);
|
|
199
195
|
let t10;
|
|
200
196
|
let t11;
|
|
@@ -203,7 +199,7 @@ const useInMemoryThreadList = (props) => {
|
|
|
203
199
|
let t14;
|
|
204
200
|
let t15;
|
|
205
201
|
let t9;
|
|
206
|
-
if ($[
|
|
202
|
+
if ($[24] !== mainThreadId || $[25] !== threads) {
|
|
207
203
|
const regularThreads = threads.filter(_temp4);
|
|
208
204
|
const archivedThreads = threads.filter(_temp5);
|
|
209
205
|
t9 = mainThreadId;
|
|
@@ -213,26 +209,26 @@ const useInMemoryThreadList = (props) => {
|
|
|
213
209
|
t13 = false;
|
|
214
210
|
t14 = regularThreads.map(_temp6);
|
|
215
211
|
t15 = archivedThreads.map(_temp7);
|
|
216
|
-
$[
|
|
217
|
-
$[
|
|
218
|
-
$[
|
|
219
|
-
$[
|
|
220
|
-
$[
|
|
221
|
-
$[
|
|
222
|
-
$[
|
|
223
|
-
$[
|
|
224
|
-
$[
|
|
212
|
+
$[24] = mainThreadId;
|
|
213
|
+
$[25] = threads;
|
|
214
|
+
$[26] = t10;
|
|
215
|
+
$[27] = t11;
|
|
216
|
+
$[28] = t12;
|
|
217
|
+
$[29] = t13;
|
|
218
|
+
$[30] = t14;
|
|
219
|
+
$[31] = t15;
|
|
220
|
+
$[32] = t9;
|
|
225
221
|
} else {
|
|
226
|
-
t10 = $[
|
|
227
|
-
t11 = $[
|
|
228
|
-
t12 = $[
|
|
229
|
-
t13 = $[
|
|
230
|
-
t14 = $[
|
|
231
|
-
t15 = $[
|
|
232
|
-
t9 = $[
|
|
222
|
+
t10 = $[26];
|
|
223
|
+
t11 = $[27];
|
|
224
|
+
t12 = $[28];
|
|
225
|
+
t13 = $[29];
|
|
226
|
+
t14 = $[30];
|
|
227
|
+
t15 = $[31];
|
|
228
|
+
t9 = $[32];
|
|
233
229
|
}
|
|
234
230
|
let t16;
|
|
235
|
-
if ($[
|
|
231
|
+
if ($[33] !== mainThreadClient.state || $[34] !== t10 || $[35] !== t11 || $[36] !== t12 || $[37] !== t13 || $[38] !== t14 || $[39] !== t15 || $[40] !== t9 || $[41] !== threadListItems.state) {
|
|
236
232
|
t16 = {
|
|
237
233
|
mainThreadId: t9,
|
|
238
234
|
newThreadId: t10,
|
|
@@ -244,26 +240,26 @@ const useInMemoryThreadList = (props) => {
|
|
|
244
240
|
threadItems: threadListItems.state,
|
|
245
241
|
main: mainThreadClient.state
|
|
246
242
|
};
|
|
247
|
-
$[
|
|
248
|
-
$[
|
|
249
|
-
$[
|
|
250
|
-
$[
|
|
251
|
-
$[
|
|
252
|
-
$[
|
|
253
|
-
$[
|
|
254
|
-
$[
|
|
255
|
-
$[
|
|
256
|
-
$[
|
|
257
|
-
} else t16 = $[
|
|
243
|
+
$[33] = mainThreadClient.state;
|
|
244
|
+
$[34] = t10;
|
|
245
|
+
$[35] = t11;
|
|
246
|
+
$[36] = t12;
|
|
247
|
+
$[37] = t13;
|
|
248
|
+
$[38] = t14;
|
|
249
|
+
$[39] = t15;
|
|
250
|
+
$[40] = t9;
|
|
251
|
+
$[41] = threadListItems.state;
|
|
252
|
+
$[42] = t16;
|
|
253
|
+
} else t16 = $[42];
|
|
258
254
|
const state = t16;
|
|
259
255
|
let t17;
|
|
260
|
-
if ($[
|
|
256
|
+
if ($[43] !== state) {
|
|
261
257
|
t17 = () => state;
|
|
262
|
-
$[
|
|
263
|
-
$[
|
|
264
|
-
} else t17 = $[
|
|
258
|
+
$[43] = state;
|
|
259
|
+
$[44] = t17;
|
|
260
|
+
} else t17 = $[44];
|
|
265
261
|
let t18;
|
|
266
|
-
if ($[
|
|
262
|
+
if ($[45] !== mainThreadId || $[46] !== threadListItems || $[47] !== threads) {
|
|
267
263
|
t18 = (selector) => {
|
|
268
264
|
if (selector === "main") {
|
|
269
265
|
const index = threads.findIndex((t_10) => t_10.id === mainThreadId);
|
|
@@ -275,19 +271,19 @@ const useInMemoryThreadList = (props) => {
|
|
|
275
271
|
}
|
|
276
272
|
return threadListItems.get(selector);
|
|
277
273
|
};
|
|
278
|
-
$[
|
|
279
|
-
$[
|
|
280
|
-
$[
|
|
281
|
-
$[
|
|
282
|
-
} else t18 = $[
|
|
274
|
+
$[45] = mainThreadId;
|
|
275
|
+
$[46] = threadListItems;
|
|
276
|
+
$[47] = threads;
|
|
277
|
+
$[48] = t18;
|
|
278
|
+
} else t18 = $[48];
|
|
283
279
|
let t19;
|
|
284
|
-
if ($[
|
|
280
|
+
if ($[49] !== mainThreadClient.methods) {
|
|
285
281
|
t19 = () => mainThreadClient.methods;
|
|
286
|
-
$[
|
|
287
|
-
$[
|
|
288
|
-
} else t19 = $[
|
|
282
|
+
$[49] = mainThreadClient.methods;
|
|
283
|
+
$[50] = t19;
|
|
284
|
+
} else t19 = $[50];
|
|
289
285
|
let t20;
|
|
290
|
-
if ($[
|
|
286
|
+
if ($[51] !== handleSwitchToNewThread || $[52] !== handleSwitchToThread || $[53] !== t17 || $[54] !== t18 || $[55] !== t19) {
|
|
291
287
|
t20 = {
|
|
292
288
|
getState: t17,
|
|
293
289
|
switchToThread: handleSwitchToThread,
|
|
@@ -299,13 +295,13 @@ const useInMemoryThreadList = (props) => {
|
|
|
299
295
|
item: t18,
|
|
300
296
|
thread: t19
|
|
301
297
|
};
|
|
302
|
-
$[
|
|
303
|
-
$[
|
|
304
|
-
$[
|
|
305
|
-
$[
|
|
306
|
-
$[
|
|
307
|
-
$[
|
|
308
|
-
} else t20 = $[
|
|
298
|
+
$[51] = handleSwitchToNewThread;
|
|
299
|
+
$[52] = handleSwitchToThread;
|
|
300
|
+
$[53] = t17;
|
|
301
|
+
$[54] = t18;
|
|
302
|
+
$[55] = t19;
|
|
303
|
+
$[56] = t20;
|
|
304
|
+
} else t20 = $[56];
|
|
309
305
|
return t20;
|
|
310
306
|
};
|
|
311
307
|
const InMemoryThreadList = resource(useInMemoryThreadList);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryThreadList.js","names":["useState","useMemo","resource","withKey","ResourceElement","ClientOutput","useClientLookup","Derived","attachTransformScopes","useClientResource","ModelContext","Suggestions","Tools","DataRenderers","RESOLVED_PROMISE","Promise","resolve","InMemoryThreadListProps","thread","threadId","onSwitchToThread","onSwitchToNewThread","ThreadData","id","title","status","custom","Record","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","onDelete","t0","remoteId","undefined","externalId","state","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","_temp","initialize","detach","_temp2","ThreadListItemClient","useInMemoryThreadList","threadFactory","mainThreadId","setMainThreadId","threads","setThreads","_temp3","handleSwitchToThread","Symbol","for","threadId_0","prev","map","t","handleRename","threadId_1","prev_0","t_0","const","handleArchive","threadId_2","prev_1","t_1","handleUnarchive","t4","threadId_3","prev_2","t_2","handleUpdateCustom","t5","threadId_4","prev_3","filter","t_3","remaining","t_4","handleDelete","t6","newId","Date","now","prev_4","handleSwitchToNewThread","t7","mainThreadClient","t8","t9","t_5","title_0","custom_0","threadListItems","t10","t11","t12","t13","t14","t15","regularThreads","_temp4","archivedThreads","_temp5","_temp6","_temp7","t16","newThreadId","isLoading","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t17","t18","selector","index","findIndex","t_10","get","index_0","t_11","t19","methods","t20","switchToThread","switchToNewThread","getLoadThreadsPromise","_temp8","reload","_temp9","reloadMainThread","_temp0","loadMore","_temp1","item","InMemoryThreadList","scopes","parent","source","query","type","aui","threadListItem","composer","modelContext","tools","dataRenderers","suggestions","t_6","t_7","t_8","t_9"],"sources":["../../src/client/InMemoryThreadList.ts"],"sourcesContent":["import { useState, useMemo } from \"react\";\nimport { resource, withKey, type ResourceElement } from \"@assistant-ui/tap\";\nimport {\n type ClientOutput,\n useClientLookup,\n Derived,\n attachTransformScopes,\n useClientResource,\n} from \"@assistant-ui/store\";\n\nimport { ModelContext, Suggestions } from \"@assistant-ui/core/store\";\nimport { Tools, DataRenderers } from \"@assistant-ui/core/react\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type InMemoryThreadListProps = {\n thread: (threadId: string) => ResourceElement<ClientOutput<\"thread\">>;\n onSwitchToThread?: (threadId: string) => void;\n onSwitchToNewThread?: () => void;\n};\n\ntype ThreadData = {\n id: string;\n title?: string;\n status: \"regular\" | \"archived\";\n custom?: Record<string, unknown> | undefined;\n};\n\n// ThreadListItem Client\nconst useThreadListItemClient = (props: {\n data: ThreadData;\n isRunning: boolean;\n onSwitchTo: () => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: undefined,\n externalId: undefined,\n title: data.title,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data.id, data.title, data.status, data.custom, isRunning],\n );\n\n return {\n getState: () => state,\n switchTo: onSwitchTo,\n rename: onRename,\n updateCustom: onUpdateCustom,\n archive: onArchive,\n unarchive: onUnarchive,\n delete: onDelete,\n generateTitle: () => {},\n initialize: async () => ({ remoteId: data.id, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\n// InMemoryThreadList Client\nconst useInMemoryThreadList = (\n props: InMemoryThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n thread: threadFactory,\n onSwitchToThread,\n onSwitchToNewThread,\n } = props;\n\n const [mainThreadId, setMainThreadId] = useState(\"main\");\n const [threads, setThreads] = useState<readonly ThreadData[]>(() => [\n { id: \"main\", title: \"Main Thread\", status: \"regular\" },\n ]);\n\n const handleSwitchToThread = (threadId: string) => {\n setMainThreadId(threadId);\n onSwitchToThread?.(threadId);\n };\n\n const handleRename = (threadId: string, title: string) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title } : t)),\n );\n };\n\n const handleArchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"archived\" as const } : t,\n ),\n );\n };\n\n const handleUnarchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"regular\" as const } : t,\n ),\n );\n };\n\n const handleUpdateCustom = (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, custom } : t)),\n );\n };\n\n const handleDelete = (threadId: string) => {\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n if (mainThreadId === threadId) {\n const remaining = threads.filter((t) => t.id !== threadId);\n setMainThreadId(remaining[0]?.id || \"main\");\n }\n };\n\n const handleSwitchToNewThread = () => {\n const newId = `thread-${Date.now()}`;\n setThreads((prev) => [\n ...prev,\n { id: newId, title: \"New Thread\", status: \"regular\" },\n ]);\n setMainThreadId(newId);\n onSwitchToNewThread?.();\n };\n\n // Only the main thread is mounted, so it is the only thread that can run.\n const mainThreadClient = useClientResource(threadFactory(mainThreadId));\n\n const threadListItems = useClientLookup(\n threads.map((t) =>\n withKey(\n t.id,\n ThreadListItemClient({\n data: t,\n isRunning: t.id === mainThreadId && mainThreadClient.state.isRunning,\n onSwitchTo: () => handleSwitchToThread(t.id),\n onRename: (title) => handleRename(t.id, title),\n onUpdateCustom: (custom) => handleUpdateCustom(t.id, custom),\n onArchive: () => handleArchive(t.id),\n onUnarchive: () => handleUnarchive(t.id),\n onDelete: () => handleDelete(t.id),\n }),\n ),\n ),\n );\n\n const state = useMemo(() => {\n const regularThreads = threads.filter((t) => t.status === \"regular\");\n const archivedThreads = threads.filter((t) => t.status === \"archived\");\n\n return {\n mainThreadId,\n newThreadId: null,\n isLoading: false,\n isLoadingMore: false,\n hasMore: false,\n threadIds: regularThreads.map((t) => t.id),\n archivedThreadIds: archivedThreads.map((t) => t.id),\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n };\n }, [mainThreadId, threads, threadListItems.state, mainThreadClient.state]);\n\n return {\n getState: () => state,\n switchToThread: handleSwitchToThread,\n switchToNewThread: handleSwitchToNewThread,\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n reloadMainThread: () => RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (selector === \"main\") {\n const index = threads.findIndex((t) => t.id === mainThreadId);\n return threadListItems.get({ index: index === -1 ? 0 : index });\n }\n if (\"id\" in selector) {\n const index = threads.findIndex((t) => t.id === selector.id);\n return threadListItems.get({ index });\n }\n return threadListItems.get(selector);\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\nexport const InMemoryThreadList = resource(useInMemoryThreadList);\n\nattachTransformScopes(useInMemoryThreadList, (scopes, parent) => {\n scopes.thread ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.thread(\"main\"),\n });\n scopes.threadListItem ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.item(\"main\"),\n });\n scopes.composer ??= Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.threads.thread(\"main\").composer(),\n });\n\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n if (!scopes.suggestions && parent.suggestions.source === null) {\n scopes.suggestions = Suggestions();\n }\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InMemoryThreadList.js","names":["useState","useMemo","resource","withKey","ResourceElement","ClientOutput","useClientLookup","Derived","attachTransformScopes","useClientResource","ModelContext","Suggestions","Tools","DataRenderers","RESOLVED_PROMISE","Promise","resolve","InMemoryThreadListProps","thread","threadId","onSwitchToThread","onSwitchToNewThread","ThreadData","id","title","status","custom","Record","useThreadListItemClient","props","$","_c","data","isRunning","onSwitchTo","onRename","onUpdateCustom","onArchive","onUnarchive","onDelete","t0","remoteId","undefined","externalId","state","t1","t2","t3","getState","switchTo","rename","updateCustom","archive","unarchive","delete","generateTitle","_temp","initialize","detach","_temp2","ThreadListItemClient","useInMemoryThreadList","threadFactory","mainThreadId","setMainThreadId","threads","setThreads","_temp3","handleSwitchToThread","Symbol","for","threadId_0","prev","map","t","handleRename","threadId_1","prev_0","t_0","const","handleArchive","threadId_2","prev_1","t_1","handleUnarchive","t4","threadId_3","prev_2","t_2","handleUpdateCustom","t5","threadId_4","prev_3","filter","t_3","prev_4","find","t_4","handleDelete","t6","newId","Date","now","prev_5","handleSwitchToNewThread","t7","mainThreadClient","t8","t9","t_5","title_0","custom_0","threadListItems","t10","t11","t12","t13","t14","t15","regularThreads","_temp4","archivedThreads","_temp5","_temp6","_temp7","t16","newThreadId","isLoading","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t17","t18","selector","index","findIndex","t_10","get","index_0","t_11","t19","methods","t20","switchToThread","switchToNewThread","getLoadThreadsPromise","_temp8","reload","_temp9","reloadMainThread","_temp0","loadMore","_temp1","item","InMemoryThreadList","scopes","parent","source","query","type","aui","threadListItem","composer","modelContext","tools","dataRenderers","suggestions","t_6","t_7","t_8","t_9"],"sources":["../../src/client/InMemoryThreadList.ts"],"sourcesContent":["import { useState, useMemo } from \"react\";\nimport { resource, withKey, type ResourceElement } from \"@assistant-ui/tap\";\nimport {\n type ClientOutput,\n useClientLookup,\n Derived,\n attachTransformScopes,\n useClientResource,\n} from \"@assistant-ui/store\";\n\nimport { ModelContext, Suggestions } from \"@assistant-ui/core/store\";\nimport { Tools, DataRenderers } from \"@assistant-ui/core/react\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\n\nexport type InMemoryThreadListProps = {\n thread: (threadId: string) => ResourceElement<ClientOutput<\"thread\">>;\n onSwitchToThread?: (threadId: string) => void;\n onSwitchToNewThread?: () => void;\n};\n\ntype ThreadData = {\n id: string;\n title?: string;\n status: \"regular\" | \"archived\";\n custom?: Record<string, unknown> | undefined;\n};\n\n// ThreadListItem Client\nconst useThreadListItemClient = (props: {\n data: ThreadData;\n isRunning: boolean;\n onSwitchTo: () => void;\n onRename: (title: string) => void;\n onUpdateCustom: (custom: Record<string, unknown> | undefined) => void;\n onArchive: () => void;\n onUnarchive: () => void;\n onDelete: () => void;\n}): ClientOutput<\"threadListItem\"> => {\n const {\n data,\n isRunning,\n onSwitchTo,\n onRename,\n onUpdateCustom,\n onArchive,\n onUnarchive,\n onDelete,\n } = props;\n const state = useMemo(\n () => ({\n id: data.id,\n remoteId: undefined,\n externalId: undefined,\n title: data.title,\n status: data.status,\n custom: data.custom,\n isRunning,\n }),\n [data.id, data.title, data.status, data.custom, isRunning],\n );\n\n return {\n getState: () => state,\n switchTo: onSwitchTo,\n rename: onRename,\n updateCustom: onUpdateCustom,\n archive: onArchive,\n unarchive: onUnarchive,\n delete: onDelete,\n generateTitle: () => {},\n initialize: async () => ({ remoteId: data.id, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst ThreadListItemClient = resource(useThreadListItemClient);\n\n// InMemoryThreadList Client\nconst useInMemoryThreadList = (\n props: InMemoryThreadListProps,\n): ClientOutput<\"threads\"> => {\n const {\n thread: threadFactory,\n onSwitchToThread,\n onSwitchToNewThread,\n } = props;\n\n const [mainThreadId, setMainThreadId] = useState(\"main\");\n const [threads, setThreads] = useState<readonly ThreadData[]>(() => [\n { id: \"main\", title: \"Main Thread\", status: \"regular\" },\n ]);\n\n const handleSwitchToThread = (threadId: string) => {\n setMainThreadId(threadId);\n onSwitchToThread?.(threadId);\n };\n\n const handleRename = (threadId: string, title: string) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title } : t)),\n );\n };\n\n const handleArchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"archived\" as const } : t,\n ),\n );\n };\n\n const handleUnarchive = (threadId: string) => {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, status: \"regular\" as const } : t,\n ),\n );\n };\n\n const handleUpdateCustom = (\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ) => {\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, custom } : t)),\n );\n };\n\n const handleDelete = (threadId: string) => {\n setThreads((prev) => prev.filter((t) => t.id !== threadId));\n setMainThreadId((prev) =>\n prev === threadId\n ? threads.find((t) => t.id !== threadId)?.id || \"main\"\n : prev,\n );\n };\n\n const handleSwitchToNewThread = () => {\n const newId = `thread-${Date.now()}`;\n setThreads((prev) => [\n ...prev,\n { id: newId, title: \"New Thread\", status: \"regular\" },\n ]);\n setMainThreadId(newId);\n onSwitchToNewThread?.();\n };\n\n // Only the main thread is mounted, so it is the only thread that can run.\n const mainThreadClient = useClientResource(threadFactory(mainThreadId));\n\n const threadListItems = useClientLookup(\n threads.map((t) =>\n withKey(\n t.id,\n ThreadListItemClient({\n data: t,\n isRunning: t.id === mainThreadId && mainThreadClient.state.isRunning,\n onSwitchTo: () => handleSwitchToThread(t.id),\n onRename: (title) => handleRename(t.id, title),\n onUpdateCustom: (custom) => handleUpdateCustom(t.id, custom),\n onArchive: () => handleArchive(t.id),\n onUnarchive: () => handleUnarchive(t.id),\n onDelete: () => handleDelete(t.id),\n }),\n ),\n ),\n );\n\n const state = useMemo(() => {\n const regularThreads = threads.filter((t) => t.status === \"regular\");\n const archivedThreads = threads.filter((t) => t.status === \"archived\");\n\n return {\n mainThreadId,\n newThreadId: null,\n isLoading: false,\n isLoadingMore: false,\n hasMore: false,\n threadIds: regularThreads.map((t) => t.id),\n archivedThreadIds: archivedThreads.map((t) => t.id),\n threadItems: threadListItems.state,\n main: mainThreadClient.state,\n };\n }, [mainThreadId, threads, threadListItems.state, mainThreadClient.state]);\n\n return {\n getState: () => state,\n switchToThread: handleSwitchToThread,\n switchToNewThread: handleSwitchToNewThread,\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n reloadMainThread: () => RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (selector === \"main\") {\n const index = threads.findIndex((t) => t.id === mainThreadId);\n return threadListItems.get({ index: index === -1 ? 0 : index });\n }\n if (\"id\" in selector) {\n const index = threads.findIndex((t) => t.id === selector.id);\n return threadListItems.get({ index });\n }\n return threadListItems.get(selector);\n },\n thread: () => mainThreadClient.methods,\n };\n};\n\nexport const InMemoryThreadList = resource(useInMemoryThreadList);\n\nattachTransformScopes(useInMemoryThreadList, (scopes, parent) => {\n scopes.thread ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.thread(\"main\"),\n });\n scopes.threadListItem ??= Derived({\n source: \"threads\",\n query: { type: \"main\" },\n get: (aui) => aui.threads.item(\"main\"),\n });\n scopes.composer ??= Derived({\n source: \"thread\",\n query: {},\n get: (aui) => aui.threads.thread(\"main\").composer(),\n });\n\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n if (!scopes.tools && parent.tools.source === null) {\n scopes.tools = Tools({});\n }\n if (!scopes.dataRenderers && parent.dataRenderers.source === null) {\n scopes.dataRenderers = DataRenderers();\n }\n if (!scopes.suggestions && parent.suggestions.source === null) {\n scopes.suggestions = Suggestions();\n }\n});\n"],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@ import { createContextStoreHook } from "./utils/createContextStoreHook.js";
|
|
|
4
4
|
import { createContext } from "@assistant-ui/tap/react-shim";
|
|
5
5
|
//#region src/context/react/ThreadViewportContext.ts
|
|
6
6
|
const ThreadViewportContext = createContext(null);
|
|
7
|
-
const
|
|
7
|
+
const useThreadViewportContext = createContextHook(ThreadViewportContext, "ThreadPrimitive.Viewport");
|
|
8
|
+
const { useThreadViewport, useThreadViewportStore } = createContextStoreHook(useThreadViewportContext, "useThreadViewport");
|
|
8
9
|
//#endregion
|
|
9
10
|
export { ThreadViewportContext, useThreadViewport, useThreadViewportStore };
|
|
10
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadViewportContext.js","names":["createContext","ReadonlyStore","UseBoundStore","createContextHook","createContextStoreHook","ThreadViewportState","ThreadViewportContextValue","useThreadViewport","ThreadViewportContext","useThreadViewportContext","useThreadViewportStore"],"sources":["../../../src/context/react/ThreadViewportContext.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext } from \"react\";\nimport type { ReadonlyStore } from \"../ReadonlyStore\";\nimport type { UseBoundStore } from \"zustand\";\nimport { createContextHook } from \"./utils/createContextHook\";\nimport { createContextStoreHook } from \"./utils/createContextStoreHook\";\nimport type { ThreadViewportState } from \"../stores/ThreadViewport\";\n\nexport type ThreadViewportContextValue = {\n useThreadViewport: UseBoundStore<ReadonlyStore<ThreadViewportState>>;\n};\n\nexport const ThreadViewportContext =\n createContext<ThreadViewportContextValue | null>(null);\n\nconst useThreadViewportContext = createContextHook(\n ThreadViewportContext,\n \"ThreadPrimitive.Viewport\",\n);\n\nexport const { useThreadViewport, useThreadViewportStore } =\n createContextStoreHook(useThreadViewportContext, \"useThreadViewport\");\n"],"mappings":";;;;;AAaA,MAAaQ,wBACXR,cAAiD,IAAI;
|
|
1
|
+
{"version":3,"file":"ThreadViewportContext.js","names":["createContext","ReadonlyStore","UseBoundStore","createContextHook","createContextStoreHook","ThreadViewportState","ThreadViewportContextValue","useThreadViewport","ThreadViewportContext","useThreadViewportContext","useThreadViewportStore"],"sources":["../../../src/context/react/ThreadViewportContext.ts"],"sourcesContent":["\"use client\";\n\nimport { createContext } from \"react\";\nimport type { ReadonlyStore } from \"../ReadonlyStore\";\nimport type { UseBoundStore } from \"zustand\";\nimport { createContextHook } from \"./utils/createContextHook\";\nimport { createContextStoreHook } from \"./utils/createContextStoreHook\";\nimport type { ThreadViewportState } from \"../stores/ThreadViewport\";\n\nexport type ThreadViewportContextValue = {\n useThreadViewport: UseBoundStore<ReadonlyStore<ThreadViewportState>>;\n};\n\nexport const ThreadViewportContext =\n createContext<ThreadViewportContextValue | null>(null);\n\nconst useThreadViewportContext = createContextHook(\n ThreadViewportContext,\n \"ThreadPrimitive.Viewport\",\n);\n\nexport const { useThreadViewport, useThreadViewportStore } =\n createContextStoreHook(useThreadViewportContext, \"useThreadViewport\");\n"],"mappings":";;;;;AAaA,MAAaQ,wBACXR,cAAiD,IAAI;AAEvD,MAAMS,2BAA2BN,kBAC/BK,uBACA,0BACF;AAEA,MAAa,EAAED,mBAAmBG,2BAChCN,uBAAuBK,0BAA0B,mBAAmB"}
|
|
@@ -201,7 +201,8 @@ const ComposerPrimitiveInput = forwardRef(({ autoFocus = false, asChild, render,
|
|
|
201
201
|
children: cloneElement(render, void 0, renderChildren)
|
|
202
202
|
});
|
|
203
203
|
}
|
|
204
|
-
|
|
204
|
+
const Component = asChild ? Slot.Root : TextareaAutosize;
|
|
205
|
+
return /* @__PURE__ */ jsx(Component, { ...inputProps });
|
|
205
206
|
});
|
|
206
207
|
ComposerPrimitiveInput.displayName = "ComposerPrimitive.Input";
|
|
207
208
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposerInput.js","names":["composeEventHandlers","useComposedRefs","Slot","ClipboardEvent","KeyboardEvent","ReactElement","ReactNode","forwardRef","useCallback","useEffect","useRef","cloneElement","isValidElement","TextareaAutosize","TextareaAutosizeProps","TextareaHeightChangeMeta","useEscapeKeydown","useOnScrollToBottom","useMediaQuery","useAui","flushTapSync","useComposerInputPluginRegistryOptional","useComposerCompactContextOptional","useComposerInputDisabled","useComposerInputValue","useTriggerPopoverAriaProps","TOUCH_PRIMARY_QUERY","ComposerPrimitiveInput","Element","HTMLTextAreaElement","BaseProps","asChild","render","cancelOnEscape","unstable_focusOnRunStart","unstable_focusOnScrollToBottom","unstable_focusOnThreadSwitched","unstable_insertNewlineOnTouchEnter","addAttachmentOnPaste","SubmitModeProps","submitMode","submitOnEnter","Props","autoFocus","disabled","disabledProp","onChange","onKeyDown","onPaste","onSelect","onHeightChange","rest","forwardedRef","aui","pluginRegistry","compactContext","declaredSubmitMode","isTouchPrimary","effectiveSubmitMode","value","isDisabled","textareaRef","ref","compositionRef","e","current","contains","target","Node","isComposing","plugin","getPlugins","handleKeyDown","composer","getState","canCancel","cancel","preventDefault","handleKeyPress","nativeEvent","key","threadState","thread","hasQueue","capabilities","queue","shiftKey","ctrlKey","metaKey","canSend","send","steer","isRunning","shouldSubmit","closest","requestSubmit","handlePaste","threadCapabilities","files","Array","from","clipboardData","attachments","length","Promise","all","map","file","addAttachment","handleHeightChange","height","meta","el","cs","getComputedStyle","contentHeight","boxSizing","parseFloat","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","Math","round","rowHeight","setMultiline","autoFocusEnabled","focus","textarea","preventScroll","setSelectionRange","type","undefined","on","ariaComboboxProps","inputProps","name","const","React","ForwardedRef","ChangeEvent","isEditing","nativeIsComposing","setText","pos","selectionStart","setCursorPosition","onCompositionStart","CompositionEventHandler","onCompositionEnd","CompositionEvent","SyntheticEvent","renderChildren","children","props","Record","Component","Root","displayName"],"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"radix-ui\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n type TextareaHeightChangeMeta,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useMediaQuery } from \"../../utils/hooks/useMediaQuery\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { useComposerInputPluginRegistryOptional } from \"./ComposerInputPluginContext\";\nimport { useComposerCompactContextOptional } from \"./ComposerCompactContext\";\nimport {\n useComposerInputDisabled,\n useComposerInputValue,\n useTriggerPopoverAriaProps,\n} from \"./useComposerInputState\";\n\nconst TOUCH_PRIMARY_QUERY = \"(pointer: coarse) and (not (any-pointer: fine))\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n\n type BaseProps = {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * A React element to use as the input container, with props merged in.\n */\n render?: ReactElement | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether plain Enter on a touch-primary device should insert a newline\n * instead of submitting, detected via\n * `(pointer: coarse) and (not (any-pointer: fine))`. Only takes effect\n * when `submitMode` resolves to `\"enter\"`.\n * @default false\n */\n unstable_insertNewlineOnTouchEnter?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n\n type SubmitModeProps =\n | {\n /**\n * Controls how the Enter key submits messages.\n * - \"enter\": Plain Enter submits (Shift+Enter for newline)\n * - \"ctrlEnter\": Ctrl/Cmd+Enter submits (plain Enter for newline)\n * - \"none\": Keyboard submission disabled\n * @default \"enter\"\n */\n submitMode?: \"enter\" | \"ctrlEnter\" | \"none\" | undefined;\n /**\n * @deprecated Use `submitMode` instead\n * @ignore\n */\n submitOnEnter?: never;\n }\n | {\n submitMode?: never;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n * @deprecated Use `submitMode` instead. Will be removed in a future version.\n */\n submitOnEnter?: boolean | undefined;\n };\n\n export type Props = TextareaAutosizeProps & BaseProps & SubmitModeProps;\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * When rendered inside `Unstable_TriggerPopoverRoot` and a popover is open, the\n * underlying `<textarea>` automatically receives `aria-controls`,\n * `aria-expanded`, `aria-haspopup`, and `aria-activedescendant` for the\n * combobox relationship. These computed attributes override user-provided\n * values for those four ARIA props while the popover is open.\n *\n * @example\n * ```tsx\n * // Ctrl/Cmd+Enter to submit (plain Enter inserts newline)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitMode=\"ctrlEnter\"\n * />\n *\n * // Insert a newline on Enter on touch-primary devices.\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * unstable_insertNewlineOnTouchEnter\n * />\n *\n * // Old API (deprecated, still supported)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n render,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n onSelect,\n submitOnEnter,\n submitMode,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n unstable_insertNewlineOnTouchEnter = false,\n addAttachmentOnPaste = true,\n onHeightChange,\n ...rest\n },\n forwardedRef,\n ) => {\n const aui = useAui();\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n const compactContext = useComposerCompactContextOptional();\n\n const declaredSubmitMode =\n submitMode ?? (submitOnEnter === false ? \"none\" : \"enter\");\n const isTouchPrimary = useMediaQuery(\n unstable_insertNewlineOnTouchEnter ? TOUCH_PRIMARY_QUERY : null,\n );\n const effectiveSubmitMode =\n unstable_insertNewlineOnTouchEnter &&\n isTouchPrimary &&\n declaredSubmitMode === \"enter\"\n ? \"none\"\n : declaredSubmitMode;\n\n const value = useComposerInputValue();\n const isDisabled = useComposerInputDisabled(disabledProp);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n // suppress text/cursor broadcasts during IME composition\n const compositionRef = useRef(false);\n\n useEscapeKeydown((e) => {\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n // ignore IME composition events\n if (e.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle Escape first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (!cancelOnEscape) return;\n\n const composer = aui.composer;\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle keyboard events first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (e.key === \"Enter\") {\n const threadState = aui.thread.getState();\n const hasQueue = threadState.capabilities.queue;\n\n // Steer hotkey: Cmd/Ctrl+Shift+Enter (respects submitMode=\"none\" and canSend)\n if (\n e.shiftKey &&\n (e.ctrlKey || e.metaKey) &&\n hasQueue &&\n declaredSubmitMode !== \"none\" &&\n aui.composer.getState().canSend\n ) {\n e.preventDefault();\n aui.composer.send({ steer: true });\n return;\n }\n\n // Regular newline: Shift+Enter\n if (e.shiftKey) return;\n\n // Block submission when running unless queue is supported\n if (threadState.isRunning && !hasQueue) return;\n\n let shouldSubmit = false;\n if (effectiveSubmitMode === \"ctrlEnter\") {\n shouldSubmit = e.ctrlKey || e.metaKey;\n } else if (effectiveSubmitMode === \"enter\") {\n shouldSubmit = true;\n }\n\n if (shouldSubmit) {\n e.preventDefault();\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = aui.thread.getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n e.preventDefault();\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer.addAttachment(file);\n } catch {\n // The composer runtime emits composer.attachmentAddError before rejecting.\n }\n }),\n );\n }\n };\n\n const handleHeightChange = (\n height: number,\n meta: TextareaHeightChangeMeta,\n ) => {\n onHeightChange?.(height, meta);\n if (!compactContext) return;\n const el = textareaRef.current;\n if (!el || el.value === \"\") return;\n const cs = getComputedStyle(el);\n const contentHeight =\n cs.boxSizing === \"border-box\"\n ? height -\n parseFloat(cs.paddingTop) -\n parseFloat(cs.paddingBottom) -\n parseFloat(cs.borderTopWidth) -\n parseFloat(cs.borderBottomWidth)\n : height;\n if (Math.round(contentHeight / meta.rowHeight) > 1) {\n compactContext.setMultiline(true);\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n aui.composer.getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return aui.on(\"thread.runStart\", focus);\n }, [unstable_focusOnRunStart, focus, aui]);\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return aui.on(\"threadListItem.switchedTo\", focus);\n }, [unstable_focusOnThreadSwitched, focus, aui]);\n\n useEffect(() => {\n if (value === \"\") compactContext?.setMultiline(false);\n }, [value, compactContext]);\n\n const ariaComboboxProps = useTriggerPopoverAriaProps();\n\n const inputProps = {\n name: \"input\" as const,\n value,\n ...rest,\n ...ariaComboboxProps,\n ref: ref as React.ForwardedRef<HTMLTextAreaElement>,\n disabled: isDisabled,\n onChange: composeEventHandlers(\n onChange,\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!aui.composer.getState().isEditing) return;\n const nativeIsComposing =\n (e.nativeEvent as { isComposing?: boolean }).isComposing === true;\n // recover stuck compositionRef when the browser drops compositionend\n if (compositionRef.current && !nativeIsComposing) {\n compositionRef.current = false;\n }\n const isComposing = nativeIsComposing || compositionRef.current;\n // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value\n flushTapSync(() => {\n aui.composer.setText(e.target.value);\n });\n if (isComposing) return;\n const pos = e.target.selectionStart ?? e.target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),\n onCompositionStart: composeEventHandlers(\n (rest as { onCompositionStart?: React.CompositionEventHandler })\n .onCompositionStart,\n () => {\n compositionRef.current = true;\n },\n ),\n onCompositionEnd: composeEventHandlers(\n (rest as { onCompositionEnd?: React.CompositionEventHandler })\n .onCompositionEnd,\n (e: React.CompositionEvent<HTMLTextAreaElement>) => {\n compositionRef.current = false;\n if (!aui.composer.getState().isEditing) return;\n const target = e.target as HTMLTextAreaElement;\n flushTapSync(() => {\n aui.composer.setText(target.value);\n });\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onSelect: composeEventHandlers(\n onSelect,\n (e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n if (compositionRef.current) return;\n const target = e.target as HTMLTextAreaElement;\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onPaste: composeEventHandlers(onPaste, handlePaste),\n ...(compactContext\n ? { onHeightChange: handleHeightChange }\n : onHeightChange !== undefined\n ? { onHeightChange }\n : {}),\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n (rest as any).children !== undefined\n ? ((rest as any).children as ReactNode)\n : ((render.props as Record<string, unknown>).children as ReactNode);\n return (\n <Slot.Root {...inputProps}>\n {cloneElement(render, undefined, renderChildren)}\n </Slot.Root>\n );\n }\n\n const Component = asChild ? Slot.Root : TextareaAutosize;\n return <Component {...inputProps} />;\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ComposerInput.js","names":["composeEventHandlers","useComposedRefs","Slot","ClipboardEvent","KeyboardEvent","ReactElement","ReactNode","forwardRef","useCallback","useEffect","useRef","cloneElement","isValidElement","TextareaAutosize","TextareaAutosizeProps","TextareaHeightChangeMeta","useEscapeKeydown","useOnScrollToBottom","useMediaQuery","useAui","flushTapSync","useComposerInputPluginRegistryOptional","useComposerCompactContextOptional","useComposerInputDisabled","useComposerInputValue","useTriggerPopoverAriaProps","TOUCH_PRIMARY_QUERY","ComposerPrimitiveInput","Element","HTMLTextAreaElement","BaseProps","asChild","render","cancelOnEscape","unstable_focusOnRunStart","unstable_focusOnScrollToBottom","unstable_focusOnThreadSwitched","unstable_insertNewlineOnTouchEnter","addAttachmentOnPaste","SubmitModeProps","submitMode","submitOnEnter","Props","autoFocus","disabled","disabledProp","onChange","onKeyDown","onPaste","onSelect","onHeightChange","rest","forwardedRef","aui","pluginRegistry","compactContext","declaredSubmitMode","isTouchPrimary","effectiveSubmitMode","value","isDisabled","textareaRef","ref","compositionRef","e","current","contains","target","Node","isComposing","plugin","getPlugins","handleKeyDown","composer","getState","canCancel","cancel","preventDefault","handleKeyPress","nativeEvent","key","threadState","thread","hasQueue","capabilities","queue","shiftKey","ctrlKey","metaKey","canSend","send","steer","isRunning","shouldSubmit","closest","requestSubmit","handlePaste","threadCapabilities","files","Array","from","clipboardData","attachments","length","Promise","all","map","file","addAttachment","handleHeightChange","height","meta","el","cs","getComputedStyle","contentHeight","boxSizing","parseFloat","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","Math","round","rowHeight","setMultiline","autoFocusEnabled","focus","textarea","preventScroll","setSelectionRange","type","undefined","on","ariaComboboxProps","inputProps","name","const","React","ForwardedRef","ChangeEvent","isEditing","nativeIsComposing","setText","pos","selectionStart","setCursorPosition","onCompositionStart","CompositionEventHandler","onCompositionEnd","CompositionEvent","SyntheticEvent","renderChildren","children","props","Record","Component","Root","displayName"],"sources":["../../../src/primitives/composer/ComposerInput.tsx"],"sourcesContent":["\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"radix-ui\";\nimport {\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n type TextareaHeightChangeMeta,\n} from \"react-textarea-autosize\";\nimport { useEscapeKeydown } from \"@radix-ui/react-use-escape-keydown\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useMediaQuery } from \"../../utils/hooks/useMediaQuery\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { useComposerInputPluginRegistryOptional } from \"./ComposerInputPluginContext\";\nimport { useComposerCompactContextOptional } from \"./ComposerCompactContext\";\nimport {\n useComposerInputDisabled,\n useComposerInputValue,\n useTriggerPopoverAriaProps,\n} from \"./useComposerInputState\";\n\nconst TOUCH_PRIMARY_QUERY = \"(pointer: coarse) and (not (any-pointer: fine))\";\n\nexport namespace ComposerPrimitiveInput {\n export type Element = HTMLTextAreaElement;\n\n type BaseProps = {\n /**\n * Whether to render as a child component using Slot.\n * When true, the component will merge its props with its child.\n */\n asChild?: boolean | undefined;\n /**\n * A React element to use as the input container, with props merged in.\n */\n render?: ReactElement | undefined;\n /**\n * Whether to cancel message composition when Escape is pressed.\n * @default true\n */\n cancelOnEscape?: boolean | undefined;\n /**\n * Whether to automatically focus the input when a new run starts.\n * @default true\n */\n unstable_focusOnRunStart?: boolean | undefined;\n /**\n * Whether to automatically focus the input when scrolling to bottom.\n * @default true\n */\n unstable_focusOnScrollToBottom?: boolean | undefined;\n /**\n * Whether to automatically focus the input when switching threads.\n * @default true\n */\n unstable_focusOnThreadSwitched?: boolean | undefined;\n /**\n * Whether plain Enter on a touch-primary device should insert a newline\n * instead of submitting, detected via\n * `(pointer: coarse) and (not (any-pointer: fine))`. Only takes effect\n * when `submitMode` resolves to `\"enter\"`.\n * @default false\n */\n unstable_insertNewlineOnTouchEnter?: boolean | undefined;\n /**\n * Whether to automatically add pasted files as attachments.\n * @default true\n */\n addAttachmentOnPaste?: boolean | undefined;\n };\n\n type SubmitModeProps =\n | {\n /**\n * Controls how the Enter key submits messages.\n * - \"enter\": Plain Enter submits (Shift+Enter for newline)\n * - \"ctrlEnter\": Ctrl/Cmd+Enter submits (plain Enter for newline)\n * - \"none\": Keyboard submission disabled\n * @default \"enter\"\n */\n submitMode?: \"enter\" | \"ctrlEnter\" | \"none\" | undefined;\n /**\n * @deprecated Use `submitMode` instead\n * @ignore\n */\n submitOnEnter?: never;\n }\n | {\n submitMode?: never;\n /**\n * Whether to submit the message when Enter is pressed (without Shift).\n * @default true\n * @deprecated Use `submitMode` instead. Will be removed in a future version.\n */\n submitOnEnter?: boolean | undefined;\n };\n\n export type Props = TextareaAutosizeProps & BaseProps & SubmitModeProps;\n}\n\n/**\n * A text input component for composing messages.\n *\n * This component provides a rich text input experience with automatic resizing,\n * keyboard shortcuts, file paste support, and intelligent focus management.\n * It integrates with the composer context to manage message state and submission.\n *\n * When rendered inside `Unstable_TriggerPopoverRoot` and a popover is open, the\n * underlying `<textarea>` automatically receives `aria-controls`,\n * `aria-expanded`, `aria-haspopup`, and `aria-activedescendant` for the\n * combobox relationship. These computed attributes override user-provided\n * values for those four ARIA props while the popover is open.\n *\n * @example\n * ```tsx\n * // Ctrl/Cmd+Enter to submit (plain Enter inserts newline)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitMode=\"ctrlEnter\"\n * />\n *\n * // Insert a newline on Enter on touch-primary devices.\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * unstable_insertNewlineOnTouchEnter\n * />\n *\n * // Old API (deprecated, still supported)\n * <ComposerPrimitive.Input\n * placeholder=\"Type your message...\"\n * submitOnEnter={true}\n * />\n * ```\n */\nexport const ComposerPrimitiveInput = forwardRef<\n ComposerPrimitiveInput.Element,\n ComposerPrimitiveInput.Props\n>(\n (\n {\n autoFocus = false,\n asChild,\n render,\n disabled: disabledProp,\n onChange,\n onKeyDown,\n onPaste,\n onSelect,\n submitOnEnter,\n submitMode,\n cancelOnEscape = true,\n unstable_focusOnRunStart = true,\n unstable_focusOnScrollToBottom = true,\n unstable_focusOnThreadSwitched = true,\n unstable_insertNewlineOnTouchEnter = false,\n addAttachmentOnPaste = true,\n onHeightChange,\n ...rest\n },\n forwardedRef,\n ) => {\n const aui = useAui();\n const pluginRegistry = useComposerInputPluginRegistryOptional();\n const compactContext = useComposerCompactContextOptional();\n\n const declaredSubmitMode =\n submitMode ?? (submitOnEnter === false ? \"none\" : \"enter\");\n const isTouchPrimary = useMediaQuery(\n unstable_insertNewlineOnTouchEnter ? TOUCH_PRIMARY_QUERY : null,\n );\n const effectiveSubmitMode =\n unstable_insertNewlineOnTouchEnter &&\n isTouchPrimary &&\n declaredSubmitMode === \"enter\"\n ? \"none\"\n : declaredSubmitMode;\n\n const value = useComposerInputValue();\n const isDisabled = useComposerInputDisabled(disabledProp);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n // suppress text/cursor broadcasts during IME composition\n const compositionRef = useRef(false);\n\n useEscapeKeydown((e) => {\n // Only handle ESC if it originated from within this input\n if (!textareaRef.current?.contains(e.target as Node)) return;\n\n // ignore IME composition events\n if (e.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle Escape first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (!cancelOnEscape) return;\n\n const composer = aui.composer;\n if (composer.getState().canCancel) {\n composer.cancel();\n e.preventDefault();\n }\n });\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (isDisabled) return;\n\n // ignore IME composition events\n if (e.nativeEvent.isComposing) return;\n\n // Let registered plugins (mention, slash command, etc.) handle keyboard events first\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n if (plugin.handleKeyDown(e)) return;\n }\n }\n\n if (e.key === \"Enter\") {\n const threadState = aui.thread.getState();\n const hasQueue = threadState.capabilities.queue;\n\n // Steer hotkey: Cmd/Ctrl+Shift+Enter (respects submitMode=\"none\" and canSend)\n if (\n e.shiftKey &&\n (e.ctrlKey || e.metaKey) &&\n hasQueue &&\n declaredSubmitMode !== \"none\" &&\n aui.composer.getState().canSend\n ) {\n e.preventDefault();\n aui.composer.send({ steer: true });\n return;\n }\n\n // Regular newline: Shift+Enter\n if (e.shiftKey) return;\n\n // Block submission when running unless queue is supported\n if (threadState.isRunning && !hasQueue) return;\n\n let shouldSubmit = false;\n if (effectiveSubmitMode === \"ctrlEnter\") {\n shouldSubmit = e.ctrlKey || e.metaKey;\n } else if (effectiveSubmitMode === \"enter\") {\n shouldSubmit = true;\n }\n\n if (shouldSubmit) {\n e.preventDefault();\n textareaRef.current?.closest(\"form\")?.requestSubmit();\n }\n }\n };\n\n const handlePaste = async (e: ClipboardEvent<HTMLTextAreaElement>) => {\n if (!addAttachmentOnPaste) return;\n const threadCapabilities = aui.thread.getState().capabilities;\n const files = Array.from(e.clipboardData?.files || []);\n\n if (threadCapabilities.attachments && files.length > 0) {\n e.preventDefault();\n await Promise.all(\n files.map(async (file) => {\n try {\n await aui.composer.addAttachment(file);\n } catch {\n // The composer runtime emits composer.attachmentAddError before rejecting.\n }\n }),\n );\n }\n };\n\n const handleHeightChange = (\n height: number,\n meta: TextareaHeightChangeMeta,\n ) => {\n onHeightChange?.(height, meta);\n if (!compactContext) return;\n const el = textareaRef.current;\n if (!el || el.value === \"\") return;\n const cs = getComputedStyle(el);\n const contentHeight =\n cs.boxSizing === \"border-box\"\n ? height -\n parseFloat(cs.paddingTop) -\n parseFloat(cs.paddingBottom) -\n parseFloat(cs.borderTopWidth) -\n parseFloat(cs.borderBottomWidth)\n : height;\n if (Math.round(contentHeight / meta.rowHeight) > 1) {\n compactContext.setMultiline(true);\n }\n };\n\n const autoFocusEnabled = autoFocus && !isDisabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus({ preventScroll: true });\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (\n aui.composer.getState().type === \"thread\" &&\n unstable_focusOnScrollToBottom\n ) {\n focus();\n }\n });\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnRunStart\n )\n return undefined;\n\n return aui.on(\"thread.runStart\", focus);\n }, [unstable_focusOnRunStart, focus, aui]);\n\n useEffect(() => {\n if (\n aui.composer.getState().type !== \"thread\" ||\n !unstable_focusOnThreadSwitched\n )\n return undefined;\n\n return aui.on(\"threadListItem.switchedTo\", focus);\n }, [unstable_focusOnThreadSwitched, focus, aui]);\n\n useEffect(() => {\n if (value === \"\") compactContext?.setMultiline(false);\n }, [value, compactContext]);\n\n const ariaComboboxProps = useTriggerPopoverAriaProps();\n\n const inputProps = {\n name: \"input\" as const,\n value,\n ...rest,\n ...ariaComboboxProps,\n ref: ref as React.ForwardedRef<HTMLTextAreaElement>,\n disabled: isDisabled,\n onChange: composeEventHandlers(\n onChange,\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!aui.composer.getState().isEditing) return;\n const nativeIsComposing =\n (e.nativeEvent as { isComposing?: boolean }).isComposing === true;\n // recover stuck compositionRef when the browser drops compositionend\n if (compositionRef.current && !nativeIsComposing) {\n compositionRef.current = false;\n }\n const isComposing = nativeIsComposing || compositionRef.current;\n // keep controlled value in sync mid-IME so react does not reset the textarea to a stale value\n flushTapSync(() => {\n aui.composer.setText(e.target.value);\n });\n if (isComposing) return;\n const pos = e.target.selectionStart ?? e.target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onKeyDown: composeEventHandlers(onKeyDown, handleKeyPress),\n onCompositionStart: composeEventHandlers(\n (rest as { onCompositionStart?: React.CompositionEventHandler })\n .onCompositionStart,\n () => {\n compositionRef.current = true;\n },\n ),\n onCompositionEnd: composeEventHandlers(\n (rest as { onCompositionEnd?: React.CompositionEventHandler })\n .onCompositionEnd,\n (e: React.CompositionEvent<HTMLTextAreaElement>) => {\n compositionRef.current = false;\n if (!aui.composer.getState().isEditing) return;\n const target = e.target as HTMLTextAreaElement;\n flushTapSync(() => {\n aui.composer.setText(target.value);\n });\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onSelect: composeEventHandlers(\n onSelect,\n (e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n if (compositionRef.current) return;\n const target = e.target as HTMLTextAreaElement;\n const pos = target.selectionStart ?? target.value.length;\n if (pluginRegistry) {\n for (const plugin of pluginRegistry.getPlugins()) {\n plugin.setCursorPosition(pos);\n }\n }\n },\n ),\n onPaste: composeEventHandlers(onPaste, handlePaste),\n ...(compactContext\n ? { onHeightChange: handleHeightChange }\n : onHeightChange !== undefined\n ? { onHeightChange }\n : {}),\n };\n\n if (render && isValidElement(render)) {\n const renderChildren =\n (rest as any).children !== undefined\n ? ((rest as any).children as ReactNode)\n : ((render.props as Record<string, unknown>).children as ReactNode);\n return (\n <Slot.Root {...inputProps}>\n {cloneElement(render, undefined, renderChildren)}\n </Slot.Root>\n );\n }\n\n const Component = asChild ? Slot.Root : TextareaAutosize;\n return <Component {...inputProps} />;\n },\n);\n\nComposerPrimitiveInput.displayName = \"ComposerPrimitive.Input\";\n"],"mappings":"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"}
|
|
@@ -420,7 +420,8 @@ const MessagePrimitiveUnstable_PartsGrouped = (t0) => {
|
|
|
420
420
|
let t3;
|
|
421
421
|
if ($[5] !== components) {
|
|
422
422
|
t3 = (group, groupIndex) => {
|
|
423
|
-
|
|
423
|
+
const GroupComponent = components?.Group ?? defaultComponents.Group;
|
|
424
|
+
return /* @__PURE__ */ jsx(GroupComponent, {
|
|
424
425
|
groupKey: group.groupKey,
|
|
425
426
|
indices: group.indices,
|
|
426
427
|
children: group.indices.map((partIndex) => /* @__PURE__ */ jsx(MessagePart, {
|