@assistant-ui/react 0.15.9 → 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.
@@ -71,7 +71,7 @@ const useThreadListItemClient = (props) => {
71
71
  };
72
72
  const ThreadListItemClient = resource(useThreadListItemClient);
73
73
  const useInMemoryThreadList = (props) => {
74
- const $ = c(58);
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] !== mainThreadId || $[7] !== threads) {
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
- if (mainThreadId === threadId_4) {
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] = mainThreadId;
142
- $[7] = threads;
143
- $[8] = t5;
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 ($[9] !== onSwitchToNewThread) {
143
+ if ($[8] !== onSwitchToNewThread) {
148
144
  t6 = () => {
149
145
  const newId = `thread-${Date.now()}`;
150
- setThreads((prev_4) => [...prev_4, {
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
- $[9] = onSwitchToNewThread;
159
- $[10] = t6;
160
- } else t6 = $[10];
154
+ $[8] = onSwitchToNewThread;
155
+ $[9] = t6;
156
+ } else t6 = $[9];
161
157
  const handleSwitchToNewThread = t6;
162
158
  let t7;
163
- if ($[11] !== mainThreadId || $[12] !== threadFactory) {
159
+ if ($[10] !== mainThreadId || $[11] !== threadFactory) {
164
160
  t7 = threadFactory(mainThreadId);
165
- $[11] = mainThreadId;
166
- $[12] = threadFactory;
167
- $[13] = t7;
168
- } else t7 = $[13];
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 ($[14] !== handleDelete || $[15] !== handleSwitchToThread || $[16] !== mainThreadClient.state || $[17] !== mainThreadId || $[18] !== threads) {
167
+ if ($[13] !== handleDelete || $[14] !== handleSwitchToThread || $[15] !== mainThreadClient.state || $[16] !== mainThreadId || $[17] !== threads) {
172
168
  let t9;
173
- if ($[20] !== handleDelete || $[21] !== handleSwitchToThread || $[22] !== mainThreadClient.state || $[23] !== mainThreadId) {
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
- $[20] = handleDelete;
185
- $[21] = handleSwitchToThread;
186
- $[22] = mainThreadClient.state;
187
- $[23] = mainThreadId;
188
- $[24] = t9;
189
- } else t9 = $[24];
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
- $[14] = handleDelete;
192
- $[15] = handleSwitchToThread;
193
- $[16] = mainThreadClient.state;
194
- $[17] = mainThreadId;
195
- $[18] = threads;
196
- $[19] = t8;
197
- } else t8 = $[19];
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 ($[25] !== mainThreadId || $[26] !== threads) {
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
- $[25] = mainThreadId;
217
- $[26] = threads;
218
- $[27] = t10;
219
- $[28] = t11;
220
- $[29] = t12;
221
- $[30] = t13;
222
- $[31] = t14;
223
- $[32] = t15;
224
- $[33] = t9;
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 = $[27];
227
- t11 = $[28];
228
- t12 = $[29];
229
- t13 = $[30];
230
- t14 = $[31];
231
- t15 = $[32];
232
- t9 = $[33];
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 ($[34] !== mainThreadClient.state || $[35] !== t10 || $[36] !== t11 || $[37] !== t12 || $[38] !== t13 || $[39] !== t14 || $[40] !== t15 || $[41] !== t9 || $[42] !== threadListItems.state) {
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
- $[34] = mainThreadClient.state;
248
- $[35] = t10;
249
- $[36] = t11;
250
- $[37] = t12;
251
- $[38] = t13;
252
- $[39] = t14;
253
- $[40] = t15;
254
- $[41] = t9;
255
- $[42] = threadListItems.state;
256
- $[43] = t16;
257
- } else t16 = $[43];
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 ($[44] !== state) {
256
+ if ($[43] !== state) {
261
257
  t17 = () => state;
262
- $[44] = state;
263
- $[45] = t17;
264
- } else t17 = $[45];
258
+ $[43] = state;
259
+ $[44] = t17;
260
+ } else t17 = $[44];
265
261
  let t18;
266
- if ($[46] !== mainThreadId || $[47] !== threadListItems || $[48] !== threads) {
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
- $[46] = mainThreadId;
279
- $[47] = threadListItems;
280
- $[48] = threads;
281
- $[49] = t18;
282
- } else t18 = $[49];
274
+ $[45] = mainThreadId;
275
+ $[46] = threadListItems;
276
+ $[47] = threads;
277
+ $[48] = t18;
278
+ } else t18 = $[48];
283
279
  let t19;
284
- if ($[50] !== mainThreadClient.methods) {
280
+ if ($[49] !== mainThreadClient.methods) {
285
281
  t19 = () => mainThreadClient.methods;
286
- $[50] = mainThreadClient.methods;
287
- $[51] = t19;
288
- } else t19 = $[51];
282
+ $[49] = mainThreadClient.methods;
283
+ $[50] = t19;
284
+ } else t19 = $[50];
289
285
  let t20;
290
- if ($[52] !== handleSwitchToNewThread || $[53] !== handleSwitchToThread || $[54] !== t17 || $[55] !== t18 || $[56] !== t19) {
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
- $[52] = handleSwitchToNewThread;
303
- $[53] = handleSwitchToThread;
304
- $[54] = t17;
305
- $[55] = t18;
306
- $[56] = t19;
307
- $[57] = t20;
308
- } else t20 = $[57];
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 { useThreadViewport, useThreadViewportStore } = createContextStoreHook(createContextHook(ThreadViewportContext, "ThreadPrimitive.Viewport"), "useThreadViewport");
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;AAOvD,MAAa,EAAEO,mBAAmBG,2BAChCN,uBAN+BD,kBAC/BK,uBACA,0BAIuBC,GAA0B,mBAAmB"}
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
- return /* @__PURE__ */ jsx(asChild ? Slot.Root : TextareaAutosize, { ...inputProps });
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
- return /* @__PURE__ */ jsx(components?.Group ?? defaultComponents.Group, {
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, {