@assistant-ui/react 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -30,7 +30,7 @@ import { create } from "zustand";
30
30
 
31
31
  // src/types/ModelConfigTypes.ts
32
32
  var mergeModelConfigs = (configSet) => {
33
- const configs = Array.from(configSet).map((c) => c()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
33
+ const configs = Array.from(configSet).map((c) => c.getModelConfig()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
34
34
  return configs.reduce((acc, config) => {
35
35
  if (config.system) {
36
36
  if (acc.system) {
@@ -226,7 +226,8 @@ var makeThreadActionStore = (runtimeRef) => {
226
226
  startRun: (parentId) => runtimeRef.current.startRun(parentId),
227
227
  append: (message) => runtimeRef.current.append(message),
228
228
  cancelRun: () => runtimeRef.current.cancelRun(),
229
- addToolResult: (options) => runtimeRef.current.addToolResult(options)
229
+ addToolResult: (options) => runtimeRef.current.addToolResult(options),
230
+ getRuntime: () => runtimeRef.current
230
231
  })
231
232
  );
232
233
  };
@@ -243,10 +244,7 @@ var ThreadProvider = ({
243
244
  children,
244
245
  runtime
245
246
  }) => {
246
- const runtimeRef = useRef(runtime);
247
- useInsertionEffect(() => {
248
- runtimeRef.current = runtime;
249
- });
247
+ const runtimeRef = useRef(runtime.thread);
250
248
  const [context] = useState(() => {
251
249
  const useThread = makeThreadStore(runtimeRef);
252
250
  const useThreadMessages = makeThreadMessagesStore(runtimeRef);
@@ -261,8 +259,16 @@ var ThreadProvider = ({
261
259
  useViewport
262
260
  };
263
261
  });
262
+ const thread = useSyncExternalStore(
263
+ useCallback((c) => runtime.subscribe(c), [runtime]),
264
+ () => runtime.thread,
265
+ () => runtime.thread
266
+ );
267
+ useInsertionEffect(() => {
268
+ runtimeRef.current = thread;
269
+ });
264
270
  useEffect(() => {
265
- const onRuntimeUpdate = () => {
271
+ const onThreadUpdate = () => {
266
272
  context.useThread.setState(
267
273
  Object.freeze({
268
274
  isRunning: runtimeRef.current.isRunning
@@ -271,20 +277,11 @@ var ThreadProvider = ({
271
277
  );
272
278
  context.useThreadMessages.setState(Object.freeze(runtimeRef.current.messages), true);
273
279
  };
274
- onRuntimeUpdate();
275
- return runtime.subscribe(onRuntimeUpdate);
276
- }, [context, runtime]);
277
- const subscribe = useCallback(
278
- (c) => runtime.subscribe(c),
279
- [runtime]
280
- );
281
- const RuntimeSynchronizer = useSyncExternalStore(
282
- subscribe,
283
- () => runtime.unstable_synchronizer,
284
- () => void 0
285
- );
280
+ onThreadUpdate();
281
+ return thread.subscribe(onThreadUpdate);
282
+ }, [context, thread]);
286
283
  return /* @__PURE__ */ jsxs(ThreadContext.Provider, { value: context, children: [
287
- RuntimeSynchronizer && /* @__PURE__ */ jsx(RuntimeSynchronizer, {}),
284
+ thread.unstable_synchronizer && /* @__PURE__ */ jsx(thread.unstable_synchronizer, {}),
288
285
  children
289
286
  ] });
290
287
  };
@@ -293,7 +290,8 @@ var ThreadProvider = ({
293
290
  import { create as create8 } from "zustand";
294
291
  var makeAssistantActionsStore = (runtimeRef) => create8(
295
292
  () => Object.freeze({
296
- switchToThread: () => runtimeRef.current.switchToThread(null)
293
+ switchToThread: () => runtimeRef.current.switchToThread(null),
294
+ getRuntime: () => runtimeRef.current
297
295
  })
298
296
  );
299
297
 
@@ -310,10 +308,10 @@ var AssistantProvider = ({ children, runtime }) => {
310
308
  const useAssistantActions = makeAssistantActionsStore(runtimeRef);
311
309
  return { useModelConfig, useToolUIs, useAssistantActions };
312
310
  });
313
- const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
311
+ const getModelConfig = context.useModelConfig();
314
312
  useEffect2(() => {
315
- return runtime.registerModelConfigProvider(getModelCOnfig);
316
- }, [runtime, getModelCOnfig]);
313
+ return runtime.registerModelConfigProvider(getModelConfig);
314
+ }, [runtime, getModelConfig]);
317
315
  return /* @__PURE__ */ jsx2(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx2(ThreadProvider, { runtime, children }) });
318
316
  };
319
317
 
@@ -423,7 +421,9 @@ var useAssistantTool = (tool) => {
423
421
  [tool.toolName]: rest
424
422
  }
425
423
  };
426
- const unsub1 = registerModelConfigProvider(() => config);
424
+ const unsub1 = registerModelConfigProvider({
425
+ getModelConfig: () => config
426
+ });
427
427
  const unsub2 = render ? setToolUI(toolName, render) : void 0;
428
428
  return () => {
429
429
  unsub1();
@@ -473,7 +473,7 @@ var useAssistantInstructions = (instruction) => {
473
473
  const config = {
474
474
  system: instruction
475
475
  };
476
- return registerModelConfigProvider(() => config);
476
+ return registerModelConfigProvider({ getModelConfig: () => config });
477
477
  }, [registerModelConfigProvider, instruction]);
478
478
  };
479
479
 
@@ -1902,7 +1902,7 @@ var ThreadPrimitiveSuggestion = createActionButton(
1902
1902
  );
1903
1903
 
1904
1904
  // src/runtimes/local/useLocalRuntime.tsx
1905
- import { useInsertionEffect as useInsertionEffect3, useState as useState7 } from "react";
1905
+ import { useInsertionEffect as useInsertionEffect3, useState as useState8 } from "react";
1906
1906
 
1907
1907
  // src/utils/idUtils.tsx
1908
1908
  import { customAlphabet } from "nanoid/non-secure";
@@ -2080,45 +2080,14 @@ var BaseAssistantRuntime = class {
2080
2080
  constructor(_thread) {
2081
2081
  this._thread = _thread;
2082
2082
  this._thread = _thread;
2083
- this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
2084
- }
2085
- get capabilities() {
2086
- return this._thread.capabilities;
2087
2083
  }
2088
- _unsubscribe;
2089
2084
  get thread() {
2090
2085
  return this._thread;
2091
2086
  }
2092
2087
  set thread(thread) {
2093
- this._unsubscribe();
2094
2088
  this._thread = thread;
2095
- this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
2096
2089
  this.subscriptionHandler();
2097
2090
  }
2098
- get messages() {
2099
- return this.thread.messages;
2100
- }
2101
- get isRunning() {
2102
- return this.thread.isRunning;
2103
- }
2104
- getBranches(messageId) {
2105
- return this.thread.getBranches(messageId);
2106
- }
2107
- switchToBranch(branchId) {
2108
- return this.thread.switchToBranch(branchId);
2109
- }
2110
- append(message) {
2111
- return this.thread.append(message);
2112
- }
2113
- startRun(parentId) {
2114
- return this.thread.startRun(parentId);
2115
- }
2116
- cancelRun() {
2117
- return this.thread.cancelRun();
2118
- }
2119
- addToolResult(options) {
2120
- return this.thread.addToolResult(options);
2121
- }
2122
2091
  _subscriptions = /* @__PURE__ */ new Set();
2123
2092
  subscribe(callback) {
2124
2093
  this._subscriptions.add(callback);
@@ -2127,179 +2096,158 @@ var BaseAssistantRuntime = class {
2127
2096
  subscriptionHandler = () => {
2128
2097
  for (const callback of this._subscriptions) callback();
2129
2098
  };
2130
- get unstable_synchronizer() {
2131
- return this.thread.unstable_synchronizer;
2132
- }
2133
2099
  };
2134
2100
 
2135
- // src/runtimes/local/LocalRuntime.tsx
2136
- var LocalRuntime = class extends BaseAssistantRuntime {
2137
- _configProviders;
2138
- constructor(adapter) {
2139
- const configProviders = /* @__PURE__ */ new Set();
2140
- super(new LocalThreadRuntime(configProviders, adapter));
2141
- this._configProviders = configProviders;
2142
- }
2143
- set adapter(adapter) {
2144
- this.thread.adapter = adapter;
2145
- }
2146
- registerModelConfigProvider(provider) {
2147
- this._configProviders.add(provider);
2148
- return () => this._configProviders.delete(provider);
2149
- }
2150
- switchToThread(threadId) {
2151
- if (threadId) {
2152
- throw new Error("LocalRuntime does not yet support switching threads");
2101
+ // src/internal.ts
2102
+ var internal_exports = {};
2103
+ __export(internal_exports, {
2104
+ BaseAssistantRuntime: () => BaseAssistantRuntime,
2105
+ MessageRepository: () => MessageRepository,
2106
+ ProxyConfigProvider: () => ProxyConfigProvider,
2107
+ TooltipIconButton: () => TooltipIconButton,
2108
+ generateId: () => generateId,
2109
+ useSmooth: () => useSmooth
2110
+ });
2111
+
2112
+ // src/ui/base/tooltip-icon-button.tsx
2113
+ import { forwardRef as forwardRef17 } from "react";
2114
+
2115
+ // src/ui/base/tooltip.tsx
2116
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
2117
+
2118
+ // src/ui/utils/withDefaults.tsx
2119
+ import {
2120
+ forwardRef as forwardRef15
2121
+ } from "react";
2122
+ import classNames from "classnames";
2123
+ import { jsx as jsx25 } from "react/jsx-runtime";
2124
+ var withDefaultProps = ({
2125
+ className,
2126
+ ...defaultProps
2127
+ }) => ({ className: classNameProp, ...props }) => {
2128
+ return {
2129
+ className: classNames(className, classNameProp),
2130
+ ...defaultProps,
2131
+ ...props
2132
+ };
2133
+ };
2134
+ var withDefaults = (Component, defaultProps) => {
2135
+ const getProps = withDefaultProps(defaultProps);
2136
+ const WithDefaults = forwardRef15(
2137
+ (props, ref) => {
2138
+ const ComponentAsAny = Component;
2139
+ return /* @__PURE__ */ jsx25(ComponentAsAny, { ...getProps(props), ref });
2153
2140
  }
2154
- return this.thread = new LocalThreadRuntime(
2155
- this._configProviders,
2156
- this.thread.adapter
2157
- );
2158
- }
2141
+ );
2142
+ WithDefaults.displayName = "withDefaults(" + (typeof Component === "string" ? Component : Component.displayName) + ")";
2143
+ return WithDefaults;
2159
2144
  };
2160
- var CAPABILITIES = Object.freeze({
2161
- edit: true,
2162
- reload: true,
2163
- cancel: true,
2164
- copy: true
2145
+
2146
+ // src/ui/base/tooltip.tsx
2147
+ import { jsx as jsx26 } from "react/jsx-runtime";
2148
+ var Tooltip = (props) => {
2149
+ return /* @__PURE__ */ jsx26(TooltipPrimitive.Provider, { children: /* @__PURE__ */ jsx26(TooltipPrimitive.Root, { ...props }) });
2150
+ };
2151
+ Tooltip.displayName = "Tooltip";
2152
+ var TooltipTrigger = TooltipPrimitive.Trigger;
2153
+ var TooltipContent = withDefaults(TooltipPrimitive.Content, {
2154
+ sideOffset: 4,
2155
+ className: "aui-tooltip-content"
2165
2156
  });
2166
- var LocalThreadRuntime = class {
2167
- constructor(_configProviders, adapter) {
2168
- this._configProviders = _configProviders;
2169
- this.adapter = adapter;
2170
- }
2171
- _subscriptions = /* @__PURE__ */ new Set();
2172
- abortController = null;
2173
- repository = new MessageRepository();
2174
- capabilities = CAPABILITIES;
2175
- get messages() {
2176
- return this.repository.getMessages();
2177
- }
2178
- get isRunning() {
2179
- return this.abortController != null;
2180
- }
2181
- getBranches(messageId) {
2182
- return this.repository.getBranches(messageId);
2183
- }
2184
- switchToBranch(branchId) {
2185
- this.repository.switchToBranch(branchId);
2186
- this.notifySubscribers();
2187
- }
2188
- async append(message) {
2189
- const userMessageId = generateId();
2190
- const userMessage = {
2191
- id: userMessageId,
2192
- role: "user",
2193
- content: message.content,
2194
- createdAt: /* @__PURE__ */ new Date()
2195
- };
2196
- this.repository.addOrUpdateMessage(message.parentId, userMessage);
2197
- await this.startRun(userMessageId);
2198
- }
2199
- async startRun(parentId) {
2200
- const id = generateId();
2201
- this.repository.resetHead(parentId);
2202
- const messages = this.repository.getMessages();
2203
- const message = {
2204
- id,
2205
- role: "assistant",
2206
- status: { type: "in_progress" },
2207
- content: [{ type: "text", text: "" }],
2208
- createdAt: /* @__PURE__ */ new Date()
2209
- };
2210
- this.repository.addOrUpdateMessage(parentId, { ...message });
2211
- this.abortController?.abort();
2212
- this.abortController = new AbortController();
2213
- this.notifySubscribers();
2214
- try {
2215
- const updateHandler = ({ content }) => {
2216
- message.content = content;
2217
- this.repository.addOrUpdateMessage(parentId, { ...message });
2218
- this.notifySubscribers();
2219
- };
2220
- const result = await this.adapter.run({
2221
- messages,
2222
- abortSignal: this.abortController.signal,
2223
- config: mergeModelConfigs(this._configProviders),
2224
- onUpdate: updateHandler
2225
- });
2226
- if (result !== void 0) {
2227
- updateHandler(result);
2228
- }
2229
- if (result.status?.type === "in_progress")
2230
- throw new Error(
2231
- "Unexpected in_progress status returned from ChatModelAdapter"
2232
- );
2233
- message.status = result.status ?? { type: "done" };
2234
- this.repository.addOrUpdateMessage(parentId, { ...message });
2235
- } catch (e) {
2236
- message.status = { type: "error", error: e };
2237
- this.repository.addOrUpdateMessage(parentId, { ...message });
2238
- console.error(e);
2239
- } finally {
2240
- this.abortController = null;
2241
- this.notifySubscribers();
2157
+ TooltipContent.displayName = "TooltipContent";
2158
+
2159
+ // src/ui/base/button.tsx
2160
+ import { cva } from "class-variance-authority";
2161
+ import { Primitive as Primitive11 } from "@radix-ui/react-primitive";
2162
+ import { forwardRef as forwardRef16 } from "react";
2163
+ import { jsx as jsx27 } from "react/jsx-runtime";
2164
+ var buttonVariants = cva("aui-button", {
2165
+ variants: {
2166
+ variant: {
2167
+ default: "aui-button-primary",
2168
+ outline: "aui-button-outline",
2169
+ ghost: "aui-button-ghost"
2170
+ },
2171
+ size: {
2172
+ default: "aui-button-medium",
2173
+ icon: "aui-button-icon"
2242
2174
  }
2175
+ },
2176
+ defaultVariants: {
2177
+ variant: "default",
2178
+ size: "default"
2243
2179
  }
2244
- cancelRun() {
2245
- if (!this.abortController) return;
2246
- this.abortController.abort();
2247
- this.abortController = null;
2248
- this.notifySubscribers();
2249
- }
2250
- notifySubscribers() {
2251
- for (const callback of this._subscriptions) callback();
2252
- }
2253
- subscribe(callback) {
2254
- this._subscriptions.add(callback);
2255
- return () => this._subscriptions.delete(callback);
2256
- }
2257
- addToolResult({ messageId, toolCallId, result }) {
2258
- const { parentId, message } = this.repository.getMessage(messageId);
2259
- if (message.role !== "assistant")
2260
- throw new Error("Tried to add tool re^sult to non-assistant message");
2261
- let found = false;
2262
- const newContent = message.content.map((c) => {
2263
- if (c.type !== "tool-call") return c;
2264
- if (c.toolCallId !== toolCallId) return c;
2265
- found = true;
2266
- return {
2267
- ...c,
2268
- result
2269
- };
2270
- });
2271
- if (!found)
2272
- throw new Error("Tried to add tool result to non-existing tool call");
2273
- this.repository.addOrUpdateMessage(parentId, {
2274
- ...message,
2275
- content: newContent
2276
- });
2180
+ });
2181
+ var Button = forwardRef16(
2182
+ ({ className, variant, size, ...props }, ref) => {
2183
+ return /* @__PURE__ */ jsx27(
2184
+ Primitive11.button,
2185
+ {
2186
+ className: buttonVariants({ variant, size, className }),
2187
+ ...props,
2188
+ ref
2189
+ }
2190
+ );
2277
2191
  }
2278
- };
2192
+ );
2193
+ Button.displayName = "Button";
2279
2194
 
2280
- // src/runtimes/local/useLocalRuntime.tsx
2281
- var useLocalRuntime = (adapter) => {
2282
- const [runtime] = useState7(() => new LocalRuntime(adapter));
2283
- useInsertionEffect3(() => {
2284
- runtime.adapter = adapter;
2195
+ // src/ui/base/tooltip-icon-button.tsx
2196
+ import { jsx as jsx28, jsxs as jsxs4 } from "react/jsx-runtime";
2197
+ var TooltipIconButton = forwardRef17(({ children, tooltip, side = "bottom", ...rest }, ref) => {
2198
+ return /* @__PURE__ */ jsxs4(Tooltip, { children: [
2199
+ /* @__PURE__ */ jsx28(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs4(Button, { variant: "ghost", size: "icon", ...rest, ref, children: [
2200
+ children,
2201
+ /* @__PURE__ */ jsx28("span", { className: "aui-sr-only", children: tooltip })
2202
+ ] }) }),
2203
+ /* @__PURE__ */ jsx28(TooltipContent, { side, children: tooltip })
2204
+ ] });
2205
+ });
2206
+ TooltipIconButton.displayName = "TooltipIconButton";
2207
+
2208
+ // src/runtimes/edge/useEdgeRuntime.ts
2209
+ import { useState as useState7 } from "react";
2210
+
2211
+ // src/runtimes/edge/converters/toCoreMessages.ts
2212
+ var toCoreMessages = (message) => {
2213
+ return message.map((message2) => {
2214
+ return {
2215
+ role: message2.role,
2216
+ content: message2.content.map((part) => {
2217
+ if (part.type === "ui") throw new Error("UI parts are not supported");
2218
+ return part;
2219
+ })
2220
+ };
2285
2221
  });
2286
- return runtime;
2222
+ };
2223
+
2224
+ // src/runtimes/edge/converters/toLanguageModelTools.ts
2225
+ import { z } from "zod";
2226
+ import zodToJsonSchema from "zod-to-json-schema";
2227
+ var toLanguageModelTools = (tools) => {
2228
+ if (!tools) return [];
2229
+ return Object.entries(tools).map(([name, tool]) => ({
2230
+ type: "function",
2231
+ name,
2232
+ ...tool.description ? { description: tool.description } : void 0,
2233
+ parameters: tool.parameters instanceof z.ZodType ? zodToJsonSchema(tool.parameters) : tool.parameters
2234
+ }));
2287
2235
  };
2288
2236
 
2289
2237
  // src/runtimes/edge/streams/assistantDecoderStream.ts
2290
2238
  function assistantDecoderStream() {
2239
+ const toolCallNames = /* @__PURE__ */ new Map();
2291
2240
  let currentToolCall;
2292
2241
  return new TransformStream({
2293
2242
  transform(chunk, controller) {
2294
- const [code, valueJson] = parseStreamPart(chunk);
2295
- const value = JSON.parse(valueJson);
2243
+ const [code, value] = parseStreamPart(chunk);
2296
2244
  if (currentToolCall && code !== "2" /* ToolCallArgsTextDelta */ && code !== "E" /* Error */) {
2297
2245
  controller.enqueue({
2298
2246
  type: "tool-call",
2299
2247
  toolCallType: "function",
2300
2248
  toolCallId: currentToolCall.id,
2301
2249
  toolName: currentToolCall.name,
2302
- args: JSON.parse(currentToolCall.argsText)
2250
+ args: currentToolCall.argsText
2303
2251
  });
2304
2252
  currentToolCall = void 0;
2305
2253
  }
@@ -2312,12 +2260,13 @@ function assistantDecoderStream() {
2312
2260
  break;
2313
2261
  }
2314
2262
  case "1" /* ToolCallBegin */: {
2315
- const { id, name } = JSON.parse(value);
2263
+ const { id, name } = value;
2264
+ toolCallNames.set(id, name);
2316
2265
  currentToolCall = { id, name, argsText: "" };
2317
2266
  break;
2318
2267
  }
2319
2268
  case "2" /* ToolCallArgsTextDelta */: {
2320
- const delta = JSON.parse(value);
2269
+ const delta = value;
2321
2270
  currentToolCall.argsText += delta;
2322
2271
  controller.enqueue({
2323
2272
  type: "tool-call-delta",
@@ -2328,17 +2277,27 @@ function assistantDecoderStream() {
2328
2277
  });
2329
2278
  break;
2330
2279
  }
2331
- case "F" /* Finish */: {
2280
+ case "3" /* ToolCallResult */: {
2332
2281
  controller.enqueue({
2333
- type: "finish",
2334
- ...JSON.parse(value)
2282
+ type: "tool-result",
2283
+ toolCallType: "function",
2284
+ toolCallId: value.id,
2285
+ toolName: toolCallNames.get(value.id),
2286
+ result: value.result
2287
+ });
2288
+ break;
2289
+ }
2290
+ case "F" /* Finish */: {
2291
+ controller.enqueue({
2292
+ type: "finish",
2293
+ ...value
2335
2294
  });
2336
2295
  break;
2337
2296
  }
2338
2297
  case "E" /* Error */: {
2339
2298
  controller.enqueue({
2340
2299
  type: "error",
2341
- error: JSON.parse(value)
2300
+ error: value
2342
2301
  });
2343
2302
  break;
2344
2303
  }
@@ -2355,7 +2314,7 @@ var parseStreamPart = (part) => {
2355
2314
  if (index === -1) throw new Error("Invalid stream part");
2356
2315
  return [
2357
2316
  part.slice(0, index),
2358
- part.slice(index + 1)
2317
+ JSON.parse(part.slice(index + 1))
2359
2318
  ];
2360
2319
  };
2361
2320
 
@@ -2714,9 +2673,9 @@ var parsePartialJson = (json) => {
2714
2673
  };
2715
2674
 
2716
2675
  // src/runtimes/edge/streams/runResultStream.ts
2717
- function runResultStream() {
2676
+ function runResultStream(initialContent) {
2718
2677
  let message = {
2719
- content: []
2678
+ content: initialContent
2720
2679
  };
2721
2680
  const currentToolCall = { toolCallId: "", argsText: "" };
2722
2681
  return new TransformStream({
@@ -2740,7 +2699,7 @@ function runResultStream() {
2740
2699
  message,
2741
2700
  toolCallId,
2742
2701
  toolName,
2743
- parsePartialJson(currentToolCall.argsText)
2702
+ currentToolCall.argsText
2744
2703
  );
2745
2704
  controller.enqueue(message);
2746
2705
  break;
@@ -2788,7 +2747,7 @@ var appendOrUpdateText = (message, textDelta) => {
2788
2747
  content: contentParts.concat([contentPart])
2789
2748
  };
2790
2749
  };
2791
- var appendOrUpdateToolCall = (message, toolCallId, toolName, args) => {
2750
+ var appendOrUpdateToolCall = (message, toolCallId, toolName, argsText) => {
2792
2751
  let contentParts = message.content;
2793
2752
  let contentPart = message.content.at(-1);
2794
2753
  if (contentPart?.type !== "tool-call" || contentPart.toolCallId !== toolCallId) {
@@ -2796,13 +2755,15 @@ var appendOrUpdateToolCall = (message, toolCallId, toolName, args) => {
2796
2755
  type: "tool-call",
2797
2756
  toolCallId,
2798
2757
  toolName,
2799
- args
2758
+ argsText,
2759
+ args: parsePartialJson(argsText)
2800
2760
  };
2801
2761
  } else {
2802
2762
  contentParts = contentParts.slice(0, -1);
2803
2763
  contentPart = {
2804
2764
  ...contentPart,
2805
- args
2765
+ argsText,
2766
+ args: parsePartialJson(argsText)
2806
2767
  };
2807
2768
  }
2808
2769
  return {
@@ -2845,11 +2806,8 @@ var appendOrUpdateFinish = (message, chunk) => {
2845
2806
  };
2846
2807
  };
2847
2808
 
2848
- // src/runtimes/edge/useEdgeRuntime.ts
2849
- import { useMemo as useMemo3 } from "react";
2850
-
2851
2809
  // src/runtimes/edge/streams/toolResultStream.ts
2852
- import { z } from "zod";
2810
+ import { z as z2 } from "zod";
2853
2811
  import sjson2 from "secure-json-parse";
2854
2812
  function toolResultStream(tools) {
2855
2813
  const toolCallExecutions = /* @__PURE__ */ new Map();
@@ -2861,9 +2819,9 @@ function toolResultStream(tools) {
2861
2819
  case "tool-call": {
2862
2820
  const { toolCallId, toolCallType, toolName, args: argsText } = chunk;
2863
2821
  const tool = tools?.[toolName];
2864
- if (!tool) return;
2822
+ if (!tool || !tool.execute) return;
2865
2823
  const args = sjson2.parse(argsText);
2866
- if (tool.parameters instanceof z.ZodType) {
2824
+ if (tool.parameters instanceof z2.ZodType) {
2867
2825
  const result = tool.parameters.safeParse(args);
2868
2826
  if (!result.success) {
2869
2827
  controller.enqueue({
@@ -2900,6 +2858,7 @@ function toolResultStream(tools) {
2900
2858
  }
2901
2859
  case "text-delta":
2902
2860
  case "tool-call-delta":
2861
+ case "tool-result":
2903
2862
  case "finish":
2904
2863
  case "error":
2905
2864
  break;
@@ -2915,9 +2874,7 @@ function toolResultStream(tools) {
2915
2874
  });
2916
2875
  }
2917
2876
 
2918
- // src/runtimes/edge/useEdgeRuntime.ts
2919
- import { z as z2 } from "zod";
2920
- import { zodToJsonSchema } from "zod-to-json-schema";
2877
+ // src/runtimes/edge/EdgeChatAdapter.ts
2921
2878
  function asAsyncIterable(source) {
2922
2879
  return {
2923
2880
  [Symbol.asyncIterator]: () => {
@@ -2931,51 +2888,479 @@ function asAsyncIterable(source) {
2931
2888
  }
2932
2889
  };
2933
2890
  }
2934
- var toSerializableTools = (tools) => {
2935
- if (!tools) return [];
2936
- return Object.entries(tools).map(([name, tool]) => ({
2937
- type: "function",
2938
- name,
2939
- ...tool.description ? { description: tool.description } : void 0,
2940
- parameters: tool.parameters instanceof z2.ZodType ? zodToJsonSchema(tool.parameters) : tool.parameters
2941
- }));
2942
- };
2943
- var createEdgeChatAdapter = ({
2944
- api
2945
- }) => ({
2946
- run: async ({ messages, abortSignal, config, onUpdate }) => {
2947
- const result = await fetch(api, {
2891
+ var EdgeChatAdapter = class {
2892
+ constructor(options) {
2893
+ this.options = options;
2894
+ }
2895
+ async roundtrip(initialContent, { messages, abortSignal, config, onUpdate }) {
2896
+ const result = await fetch(this.options.api, {
2948
2897
  method: "POST",
2949
2898
  headers: {
2950
2899
  "Content-Type": "application/json"
2951
2900
  },
2952
2901
  body: JSON.stringify({
2953
2902
  system: config.system,
2954
- messages,
2955
- tools: toSerializableTools(
2903
+ messages: toCoreMessages(messages),
2904
+ tools: toLanguageModelTools(
2956
2905
  config.tools
2957
2906
  )
2958
2907
  }),
2959
2908
  signal: abortSignal
2960
2909
  });
2961
- const stream = result.body.pipeThrough(new TextDecoderStream()).pipeThrough(chunkByLineStream()).pipeThrough(assistantDecoderStream()).pipeThrough(toolResultStream(config.tools)).pipeThrough(runResultStream());
2910
+ const stream = result.body.pipeThrough(new TextDecoderStream()).pipeThrough(chunkByLineStream()).pipeThrough(assistantDecoderStream()).pipeThrough(toolResultStream(config.tools)).pipeThrough(runResultStream(initialContent));
2911
+ let message;
2962
2912
  let update;
2963
2913
  for await (update of asAsyncIterable(stream)) {
2964
- onUpdate(update);
2914
+ message = onUpdate(update);
2965
2915
  }
2966
2916
  if (update === void 0)
2967
2917
  throw new Error("No data received from Edge Runtime");
2968
- return update;
2918
+ return [message, update];
2919
+ }
2920
+ async run({ messages, abortSignal, config, onUpdate }) {
2921
+ let roundtripAllowance = this.options.maxToolRoundtrips ?? 1;
2922
+ let usage = {
2923
+ promptTokens: 0,
2924
+ completionTokens: 0
2925
+ };
2926
+ let result;
2927
+ let assistantMessage;
2928
+ do {
2929
+ [assistantMessage, result] = await this.roundtrip(result?.content ?? [], {
2930
+ messages: assistantMessage ? [...messages, assistantMessage] : messages,
2931
+ abortSignal,
2932
+ config,
2933
+ onUpdate
2934
+ });
2935
+ if (result.status?.type === "done") {
2936
+ usage.promptTokens += result.status.usage?.promptTokens ?? 0;
2937
+ usage.completionTokens += result.status.usage?.completionTokens ?? 0;
2938
+ }
2939
+ } while (result.status?.type === "done" && result.status.finishReason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result) && roundtripAllowance-- > 0);
2940
+ if (result.status?.type === "done" && usage.promptTokens > 0) {
2941
+ result = {
2942
+ ...result,
2943
+ status: {
2944
+ ...result.status,
2945
+ usage
2946
+ }
2947
+ };
2948
+ }
2949
+ return result;
2950
+ }
2951
+ };
2952
+
2953
+ // src/runtimes/edge/useEdgeRuntime.ts
2954
+ var useEdgeRuntime = ({
2955
+ initialMessages,
2956
+ ...options
2957
+ }) => {
2958
+ const [adapter] = useState7(() => new EdgeChatAdapter(options));
2959
+ return useLocalRuntime(adapter, { initialMessages });
2960
+ };
2961
+
2962
+ // src/runtimes/edge/converters/toLanguageModelMessages.ts
2963
+ var assistantMessageSplitter = () => {
2964
+ const stash = [];
2965
+ let assistantMessage = {
2966
+ role: "assistant",
2967
+ content: []
2968
+ };
2969
+ let toolMessage = {
2970
+ role: "tool",
2971
+ content: []
2972
+ };
2973
+ return {
2974
+ addTextContentPart: (part) => {
2975
+ if (toolMessage.content.length > 0) {
2976
+ stash.push(assistantMessage);
2977
+ stash.push(toolMessage);
2978
+ assistantMessage = {
2979
+ role: "assistant",
2980
+ content: []
2981
+ };
2982
+ toolMessage = {
2983
+ role: "tool",
2984
+ content: []
2985
+ };
2986
+ }
2987
+ assistantMessage.content.push(part);
2988
+ },
2989
+ addToolCallPart: (part) => {
2990
+ assistantMessage.content.push({
2991
+ type: "tool-call",
2992
+ toolCallId: part.toolCallId,
2993
+ toolName: part.toolName,
2994
+ args: part.args
2995
+ });
2996
+ if (part.result) {
2997
+ toolMessage.content.push({
2998
+ type: "tool-result",
2999
+ toolCallId: part.toolCallId,
3000
+ toolName: part.toolName,
3001
+ result: part.result
3002
+ // isError
3003
+ });
3004
+ }
3005
+ },
3006
+ getMessages: () => {
3007
+ if (toolMessage.content.length > 0) {
3008
+ return [...stash, assistantMessage, toolMessage];
3009
+ }
3010
+ return [...stash, assistantMessage];
3011
+ }
3012
+ };
3013
+ };
3014
+ function toLanguageModelMessages(message) {
3015
+ return message.flatMap((message2) => {
3016
+ const role = message2.role;
3017
+ switch (role) {
3018
+ case "system": {
3019
+ return [{ role: "system", content: message2.content[0].text }];
3020
+ }
3021
+ case "user": {
3022
+ const msg = {
3023
+ role: "user",
3024
+ content: message2.content.map(
3025
+ (part) => {
3026
+ const type = part.type;
3027
+ switch (type) {
3028
+ case "text": {
3029
+ return part;
3030
+ }
3031
+ case "image": {
3032
+ return {
3033
+ type: "image",
3034
+ image: new URL(part.image)
3035
+ };
3036
+ }
3037
+ default: {
3038
+ const unhandledType = type;
3039
+ throw new Error(
3040
+ `Unspported content part type: ${unhandledType}`
3041
+ );
3042
+ }
3043
+ }
3044
+ }
3045
+ )
3046
+ };
3047
+ return [msg];
3048
+ }
3049
+ case "assistant": {
3050
+ const splitter = assistantMessageSplitter();
3051
+ for (const part of message2.content) {
3052
+ const type = part.type;
3053
+ switch (type) {
3054
+ case "text": {
3055
+ splitter.addTextContentPart(part);
3056
+ break;
3057
+ }
3058
+ case "tool-call": {
3059
+ splitter.addToolCallPart(part);
3060
+ break;
3061
+ }
3062
+ default: {
3063
+ const unhandledType = type;
3064
+ throw new Error(`Unhandled content part type: ${unhandledType}`);
3065
+ }
3066
+ }
3067
+ }
3068
+ return splitter.getMessages();
3069
+ }
3070
+ default: {
3071
+ const unhandledRole = role;
3072
+ throw new Error(`Unknown message role: ${unhandledRole}`);
3073
+ }
3074
+ }
3075
+ });
3076
+ }
3077
+
3078
+ // src/runtimes/edge/converters/fromLanguageModelMessages.ts
3079
+ var fromLanguageModelMessages = (lm, mergeRoundtrips) => {
3080
+ const messages = [];
3081
+ for (const lmMessage of lm) {
3082
+ const role = lmMessage.role;
3083
+ switch (role) {
3084
+ case "system": {
3085
+ messages.push({
3086
+ role: "system",
3087
+ content: [
3088
+ {
3089
+ type: "text",
3090
+ text: lmMessage.content
3091
+ }
3092
+ ]
3093
+ });
3094
+ break;
3095
+ }
3096
+ case "user": {
3097
+ messages.push({
3098
+ role: "user",
3099
+ content: lmMessage.content.map((part) => {
3100
+ const type = part.type;
3101
+ switch (type) {
3102
+ case "text": {
3103
+ return {
3104
+ type: "text",
3105
+ text: part.text
3106
+ };
3107
+ }
3108
+ case "image": {
3109
+ if (part.image instanceof URL) {
3110
+ return {
3111
+ type: "image",
3112
+ image: part.image.href
3113
+ };
3114
+ }
3115
+ throw new Error("Only images with URL data are supported");
3116
+ }
3117
+ default: {
3118
+ const unhandledType = type;
3119
+ throw new Error(`Unknown content part type: ${unhandledType}`);
3120
+ }
3121
+ }
3122
+ })
3123
+ });
3124
+ break;
3125
+ }
3126
+ case "assistant": {
3127
+ const newContent = lmMessage.content.map((part) => {
3128
+ if (part.type === "tool-call") {
3129
+ return {
3130
+ type: "tool-call",
3131
+ toolCallId: part.toolCallId,
3132
+ toolName: part.toolName,
3133
+ argsText: JSON.stringify(part.args),
3134
+ args: typeof part.args === "string" ? part.args : part.args
3135
+ };
3136
+ }
3137
+ return part;
3138
+ });
3139
+ if (mergeRoundtrips) {
3140
+ const previousMessage = messages[messages.length - 1];
3141
+ if (previousMessage?.role === "assistant") {
3142
+ previousMessage.content.push(...newContent);
3143
+ break;
3144
+ }
3145
+ }
3146
+ messages.push({
3147
+ role: "assistant",
3148
+ content: newContent
3149
+ });
3150
+ break;
3151
+ }
3152
+ case "tool": {
3153
+ const previousMessage = messages[messages.length - 1];
3154
+ if (previousMessage?.role !== "assistant")
3155
+ throw new Error(
3156
+ "A tool message must be preceded by an assistant message."
3157
+ );
3158
+ for (const tool of lmMessage.content) {
3159
+ const toolCall = previousMessage.content.find(
3160
+ (c) => c.type === "tool-call" && c.toolCallId === tool.toolCallId
3161
+ );
3162
+ if (!toolCall)
3163
+ throw new Error("Received tool result for an unknown tool call.");
3164
+ if (toolCall.toolName !== tool.toolName)
3165
+ throw new Error("Tool call name mismatch.");
3166
+ toolCall.result = tool.result;
3167
+ if (tool.isError) {
3168
+ toolCall.isError = true;
3169
+ }
3170
+ }
3171
+ break;
3172
+ }
3173
+ default: {
3174
+ const unhandledRole = role;
3175
+ throw new Error(`Unknown message role: ${unhandledRole}`);
3176
+ }
3177
+ }
3178
+ }
3179
+ return messages;
3180
+ };
3181
+
3182
+ // src/runtimes/edge/converters/fromCoreMessage.ts
3183
+ var fromCoreMessages = (message) => {
3184
+ return message.map((message2) => {
3185
+ return {
3186
+ id: generateId(),
3187
+ createdAt: /* @__PURE__ */ new Date(),
3188
+ ...message2.role === "assistant" ? {
3189
+ status: { type: "done" }
3190
+ } : void 0,
3191
+ ...message2
3192
+ };
3193
+ });
3194
+ };
3195
+
3196
+ // src/runtimes/local/LocalRuntime.tsx
3197
+ var LocalRuntime = class extends BaseAssistantRuntime {
3198
+ _proxyConfigProvider;
3199
+ constructor(adapter, options) {
3200
+ const proxyConfigProvider = new ProxyConfigProvider();
3201
+ super(new LocalThreadRuntime(proxyConfigProvider, adapter, options));
3202
+ this._proxyConfigProvider = proxyConfigProvider;
3203
+ }
3204
+ set adapter(adapter) {
3205
+ this.thread.adapter = adapter;
3206
+ }
3207
+ registerModelConfigProvider(provider) {
3208
+ return this._proxyConfigProvider.registerModelConfigProvider(provider);
3209
+ }
3210
+ switchToThread(threadId) {
3211
+ if (threadId) {
3212
+ throw new Error("LocalRuntime does not yet support switching threads");
3213
+ }
3214
+ return this.thread = new LocalThreadRuntime(
3215
+ this._proxyConfigProvider,
3216
+ this.thread.adapter
3217
+ );
2969
3218
  }
3219
+ };
3220
+ var CAPABILITIES = Object.freeze({
3221
+ edit: true,
3222
+ reload: true,
3223
+ cancel: true,
3224
+ copy: true
2970
3225
  });
2971
- var useEdgeRuntime = (options) => {
2972
- const adapter = useMemo3(() => createEdgeChatAdapter(options), [options]);
2973
- return useLocalRuntime(adapter);
3226
+ var LocalThreadRuntime = class {
3227
+ constructor(configProvider, adapter, options) {
3228
+ this.configProvider = configProvider;
3229
+ this.adapter = adapter;
3230
+ if (options?.initialMessages) {
3231
+ let parentId = null;
3232
+ const messages = fromCoreMessages(options.initialMessages);
3233
+ for (const message of messages) {
3234
+ this.repository.addOrUpdateMessage(parentId, message);
3235
+ parentId = message.id;
3236
+ }
3237
+ }
3238
+ }
3239
+ _subscriptions = /* @__PURE__ */ new Set();
3240
+ abortController = null;
3241
+ repository = new MessageRepository();
3242
+ capabilities = CAPABILITIES;
3243
+ get messages() {
3244
+ return this.repository.getMessages();
3245
+ }
3246
+ get isRunning() {
3247
+ return this.abortController != null;
3248
+ }
3249
+ getBranches(messageId) {
3250
+ return this.repository.getBranches(messageId);
3251
+ }
3252
+ switchToBranch(branchId) {
3253
+ this.repository.switchToBranch(branchId);
3254
+ this.notifySubscribers();
3255
+ }
3256
+ async append(message) {
3257
+ if (message.role !== "user")
3258
+ throw new Error(
3259
+ "Only appending user messages are supported in LocalRuntime. This is likely an internal bug in assistant-ui."
3260
+ );
3261
+ const userMessageId = generateId();
3262
+ const userMessage = {
3263
+ id: userMessageId,
3264
+ role: "user",
3265
+ content: message.content,
3266
+ createdAt: /* @__PURE__ */ new Date()
3267
+ };
3268
+ this.repository.addOrUpdateMessage(message.parentId, userMessage);
3269
+ await this.startRun(userMessageId);
3270
+ }
3271
+ async startRun(parentId) {
3272
+ this.repository.resetHead(parentId);
3273
+ const messages = this.repository.getMessages();
3274
+ const message = {
3275
+ id: generateId(),
3276
+ role: "assistant",
3277
+ status: { type: "in_progress" },
3278
+ content: [{ type: "text", text: "" }],
3279
+ createdAt: /* @__PURE__ */ new Date()
3280
+ };
3281
+ this.repository.addOrUpdateMessage(parentId, { ...message });
3282
+ this.abortController?.abort();
3283
+ this.abortController = new AbortController();
3284
+ this.notifySubscribers();
3285
+ try {
3286
+ const updateHandler = ({ content }) => {
3287
+ message.content = content;
3288
+ const newMessage = { ...message };
3289
+ this.repository.addOrUpdateMessage(parentId, newMessage);
3290
+ this.notifySubscribers();
3291
+ return newMessage;
3292
+ };
3293
+ const result = await this.adapter.run({
3294
+ messages,
3295
+ abortSignal: this.abortController.signal,
3296
+ config: this.configProvider.getModelConfig(),
3297
+ onUpdate: updateHandler
3298
+ });
3299
+ if (result !== void 0) {
3300
+ updateHandler(result);
3301
+ }
3302
+ if (result.status?.type === "in_progress")
3303
+ throw new Error(
3304
+ "Unexpected in_progress status returned from ChatModelAdapter"
3305
+ );
3306
+ message.status = result.status ?? { type: "done" };
3307
+ this.repository.addOrUpdateMessage(parentId, { ...message });
3308
+ } catch (e) {
3309
+ message.status = { type: "error", error: e };
3310
+ this.repository.addOrUpdateMessage(parentId, { ...message });
3311
+ throw e;
3312
+ } finally {
3313
+ this.abortController = null;
3314
+ this.notifySubscribers();
3315
+ }
3316
+ }
3317
+ cancelRun() {
3318
+ if (!this.abortController) return;
3319
+ this.abortController.abort();
3320
+ this.abortController = null;
3321
+ }
3322
+ notifySubscribers() {
3323
+ for (const callback of this._subscriptions) callback();
3324
+ }
3325
+ subscribe(callback) {
3326
+ this._subscriptions.add(callback);
3327
+ return () => this._subscriptions.delete(callback);
3328
+ }
3329
+ addToolResult({ messageId, toolCallId, result }) {
3330
+ const { parentId, message } = this.repository.getMessage(messageId);
3331
+ if (message.role !== "assistant")
3332
+ throw new Error("Tried to add tool result to non-assistant message");
3333
+ let found = false;
3334
+ const newContent = message.content.map((c) => {
3335
+ if (c.type !== "tool-call") return c;
3336
+ if (c.toolCallId !== toolCallId) return c;
3337
+ found = true;
3338
+ return {
3339
+ ...c,
3340
+ result
3341
+ };
3342
+ });
3343
+ if (!found)
3344
+ throw new Error("Tried to add tool result to non-existing tool call");
3345
+ this.repository.addOrUpdateMessage(parentId, {
3346
+ ...message,
3347
+ content: newContent
3348
+ });
3349
+ }
3350
+ };
3351
+
3352
+ // src/runtimes/local/useLocalRuntime.tsx
3353
+ var useLocalRuntime = (adapter, options) => {
3354
+ const [runtime] = useState8(() => new LocalRuntime(adapter, options));
3355
+ useInsertionEffect3(() => {
3356
+ runtime.adapter = adapter;
3357
+ });
3358
+ return runtime;
2974
3359
  };
2975
3360
 
2976
3361
  // src/ui/thread-config.tsx
2977
3362
  import { createContext as createContext5, useContext as useContext5 } from "react";
2978
- import { Fragment as Fragment3, jsx as jsx25 } from "react/jsx-runtime";
3363
+ import { Fragment as Fragment3, jsx as jsx29 } from "react/jsx-runtime";
2979
3364
  var ThreadConfigContext = createContext5({});
2980
3365
  var useThreadConfig = () => {
2981
3366
  return useContext5(ThreadConfigContext);
@@ -2985,119 +3370,21 @@ var ThreadConfigProvider = ({
2985
3370
  config
2986
3371
  }) => {
2987
3372
  const assistant = useAssistantContext({ optional: true });
2988
- const configProvider = config && Object.keys(config ?? {}).length > 0 ? /* @__PURE__ */ jsx25(ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ jsx25(Fragment3, { children });
3373
+ const configProvider = config && Object.keys(config ?? {}).length > 0 ? /* @__PURE__ */ jsx29(ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ jsx29(Fragment3, { children });
2989
3374
  if (!config?.runtime) return configProvider;
2990
3375
  if (assistant) {
2991
3376
  throw new Error(
2992
3377
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
2993
3378
  );
2994
3379
  }
2995
- return /* @__PURE__ */ jsx25(AssistantRuntimeProvider, { runtime: config.runtime, children: configProvider });
3380
+ return /* @__PURE__ */ jsx29(AssistantRuntimeProvider, { runtime: config.runtime, children: configProvider });
2996
3381
  };
2997
3382
  ThreadConfigProvider.displayName = "ThreadConfigProvider";
2998
3383
 
2999
3384
  // src/ui/assistant-action-bar.tsx
3000
3385
  import { forwardRef as forwardRef18 } from "react";
3001
3386
  import { CheckIcon, CopyIcon, RefreshCwIcon } from "lucide-react";
3002
-
3003
- // src/ui/base/tooltip-icon-button.tsx
3004
- import { forwardRef as forwardRef17 } from "react";
3005
-
3006
- // src/ui/base/tooltip.tsx
3007
- import * as TooltipPrimitive from "@radix-ui/react-tooltip";
3008
-
3009
- // src/ui/utils/withDefaults.tsx
3010
- import {
3011
- forwardRef as forwardRef15
3012
- } from "react";
3013
- import classNames from "classnames";
3014
- import { jsx as jsx26 } from "react/jsx-runtime";
3015
- var withDefaultProps = ({
3016
- className,
3017
- ...defaultProps
3018
- }) => ({ className: classNameProp, ...props }) => {
3019
- return {
3020
- className: classNames(className, classNameProp),
3021
- ...defaultProps,
3022
- ...props
3023
- };
3024
- };
3025
- var withDefaults = (Component, defaultProps) => {
3026
- const getProps = withDefaultProps(defaultProps);
3027
- const WithDefaults = forwardRef15(
3028
- (props, ref) => {
3029
- const ComponentAsAny = Component;
3030
- return /* @__PURE__ */ jsx26(ComponentAsAny, { ...getProps(props), ref });
3031
- }
3032
- );
3033
- WithDefaults.displayName = "withDefaults(" + (typeof Component === "string" ? Component : Component.displayName) + ")";
3034
- return WithDefaults;
3035
- };
3036
-
3037
- // src/ui/base/tooltip.tsx
3038
- import { jsx as jsx27 } from "react/jsx-runtime";
3039
- var Tooltip = (props) => {
3040
- return /* @__PURE__ */ jsx27(TooltipPrimitive.Provider, { children: /* @__PURE__ */ jsx27(TooltipPrimitive.Root, { ...props }) });
3041
- };
3042
- Tooltip.displayName = "Tooltip";
3043
- var TooltipTrigger = TooltipPrimitive.Trigger;
3044
- var TooltipContent = withDefaults(TooltipPrimitive.Content, {
3045
- sideOffset: 4,
3046
- className: "aui-tooltip-content"
3047
- });
3048
- TooltipContent.displayName = "TooltipContent";
3049
-
3050
- // src/ui/base/button.tsx
3051
- import { cva } from "class-variance-authority";
3052
- import { Primitive as Primitive11 } from "@radix-ui/react-primitive";
3053
- import { forwardRef as forwardRef16 } from "react";
3054
- import { jsx as jsx28 } from "react/jsx-runtime";
3055
- var buttonVariants = cva("aui-button", {
3056
- variants: {
3057
- variant: {
3058
- default: "aui-button-primary",
3059
- outline: "aui-button-outline",
3060
- ghost: "aui-button-ghost"
3061
- },
3062
- size: {
3063
- default: "aui-button-medium",
3064
- icon: "aui-button-icon"
3065
- }
3066
- },
3067
- defaultVariants: {
3068
- variant: "default",
3069
- size: "default"
3070
- }
3071
- });
3072
- var Button = forwardRef16(
3073
- ({ className, variant, size, ...props }, ref) => {
3074
- return /* @__PURE__ */ jsx28(
3075
- Primitive11.button,
3076
- {
3077
- className: buttonVariants({ variant, size, className }),
3078
- ...props,
3079
- ref
3080
- }
3081
- );
3082
- }
3083
- );
3084
- Button.displayName = "Button";
3085
-
3086
- // src/ui/base/tooltip-icon-button.tsx
3087
- import { jsx as jsx29, jsxs as jsxs4 } from "react/jsx-runtime";
3088
- var TooltipIconButton = forwardRef17(({ children, tooltip, side = "bottom", ...rest }, ref) => {
3089
- return /* @__PURE__ */ jsxs4(Tooltip, { children: [
3090
- /* @__PURE__ */ jsx29(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs4(Button, { variant: "ghost", size: "icon", ...rest, ref, children: [
3091
- children,
3092
- /* @__PURE__ */ jsx29("span", { className: "aui-sr-only", children: tooltip })
3093
- ] }) }),
3094
- /* @__PURE__ */ jsx29(TooltipContent, { side, children: tooltip })
3095
- ] });
3096
- });
3097
- TooltipIconButton.displayName = "TooltipIconButton";
3098
-
3099
- // src/ui/assistant-action-bar.tsx
3100
- import { jsx as jsx30, jsxs as jsxs5 } from "react/jsx-runtime";
3387
+ import { Fragment as Fragment4, jsx as jsx30, jsxs as jsxs5 } from "react/jsx-runtime";
3101
3388
  var useAllowCopy = () => {
3102
3389
  const { assistantMessage: { allowCopy = true } = {} } = useThreadConfig();
3103
3390
  const { useThreadActions } = useThreadContext();
@@ -3140,10 +3427,10 @@ var AssistantActionBarCopy = forwardRef18((props, ref) => {
3140
3427
  } = useThreadConfig();
3141
3428
  const allowCopy = useAllowCopy();
3142
3429
  if (!allowCopy) return null;
3143
- return /* @__PURE__ */ jsx30(actionBar_exports.Copy, { asChild: true, children: /* @__PURE__ */ jsxs5(TooltipIconButton, { tooltip, ...props, ref, children: [
3430
+ return /* @__PURE__ */ jsx30(actionBar_exports.Copy, { asChild: true, children: /* @__PURE__ */ jsx30(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsxs5(Fragment4, { children: [
3144
3431
  /* @__PURE__ */ jsx30(message_exports.If, { copied: true, children: /* @__PURE__ */ jsx30(CheckIcon, {}) }),
3145
3432
  /* @__PURE__ */ jsx30(message_exports.If, { copied: false, children: /* @__PURE__ */ jsx30(CopyIcon, {}) })
3146
- ] }) });
3433
+ ] }) }) });
3147
3434
  });
3148
3435
  AssistantActionBarCopy.displayName = "AssistantActionBarCopy";
3149
3436
  var AssistantActionBarReload = forwardRef18((props, ref) => {
@@ -3192,7 +3479,7 @@ var BranchPickerPrevious2 = forwardRef19((props, ref) => {
3192
3479
  branchPicker: { previous: { tooltip = "Previous" } = {} } = {}
3193
3480
  } = {}
3194
3481
  } = useThreadConfig();
3195
- return /* @__PURE__ */ jsx31(branchPicker_exports.Previous, { asChild: true, children: /* @__PURE__ */ jsx31(TooltipIconButton, { tooltip, ...props, ref, children: /* @__PURE__ */ jsx31(ChevronLeftIcon, {}) }) });
3482
+ return /* @__PURE__ */ jsx31(branchPicker_exports.Previous, { asChild: true, children: /* @__PURE__ */ jsx31(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx31(ChevronLeftIcon, {}) }) });
3196
3483
  });
3197
3484
  BranchPickerPrevious2.displayName = "BranchPickerPrevious";
3198
3485
  var BranchPickerStateWrapper = withDefaults("span", {
@@ -3210,7 +3497,7 @@ var BranchPickerNext = forwardRef19((props, ref) => {
3210
3497
  const {
3211
3498
  strings: { branchPicker: { next: { tooltip = "Next" } = {} } = {} } = {}
3212
3499
  } = useThreadConfig();
3213
- return /* @__PURE__ */ jsx31(branchPicker_exports.Next, { asChild: true, children: /* @__PURE__ */ jsx31(TooltipIconButton, { tooltip, ...props, ref, children: /* @__PURE__ */ jsx31(ChevronRightIcon, {}) }) });
3500
+ return /* @__PURE__ */ jsx31(branchPicker_exports.Next, { asChild: true, children: /* @__PURE__ */ jsx31(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx31(ChevronRightIcon, {}) }) });
3214
3501
  });
3215
3502
  BranchPickerNext.displayName = "BranchPickerNext";
3216
3503
  var exports2 = {
@@ -3317,7 +3604,7 @@ import { ArrowDownIcon } from "lucide-react";
3317
3604
 
3318
3605
  // src/ui/composer.tsx
3319
3606
  import { forwardRef as forwardRef21 } from "react";
3320
- import { SendHorizonalIcon } from "lucide-react";
3607
+ import { SendHorizontalIcon } from "lucide-react";
3321
3608
 
3322
3609
  // src/ui/base/CircleStopIcon.tsx
3323
3610
  import { jsx as jsx35 } from "react/jsx-runtime";
@@ -3335,7 +3622,7 @@ var CircleStopIcon = () => {
3335
3622
  CircleStopIcon.displayName = "CircleStopIcon";
3336
3623
 
3337
3624
  // src/ui/composer.tsx
3338
- import { Fragment as Fragment4, jsx as jsx36, jsxs as jsxs9 } from "react/jsx-runtime";
3625
+ import { Fragment as Fragment5, jsx as jsx36, jsxs as jsxs9 } from "react/jsx-runtime";
3339
3626
  var Composer = () => {
3340
3627
  return /* @__PURE__ */ jsxs9(ComposerRoot, { children: [
3341
3628
  /* @__PURE__ */ jsx36(ComposerInput, { autoFocus: true }),
@@ -3371,7 +3658,7 @@ var useAllowCancel = () => {
3371
3658
  var ComposerAction = () => {
3372
3659
  const allowCancel = useAllowCancel();
3373
3660
  if (!allowCancel) return /* @__PURE__ */ jsx36(ComposerSend, {});
3374
- return /* @__PURE__ */ jsxs9(Fragment4, { children: [
3661
+ return /* @__PURE__ */ jsxs9(Fragment5, { children: [
3375
3662
  /* @__PURE__ */ jsx36(thread_exports.If, { running: false, children: /* @__PURE__ */ jsx36(ComposerSend, {}) }),
3376
3663
  /* @__PURE__ */ jsx36(thread_exports.If, { running: true, children: /* @__PURE__ */ jsx36(ComposerCancel, {}) })
3377
3664
  ] });
@@ -3385,7 +3672,7 @@ var ComposerSend = forwardRef21((props, ref) => {
3385
3672
  const {
3386
3673
  strings: { composer: { send: { tooltip = "Send" } = {} } = {} } = {}
3387
3674
  } = useThreadConfig();
3388
- return /* @__PURE__ */ jsx36(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx36(ComposerSendButton, { tooltip, ...props, ref, children: /* @__PURE__ */ jsx36(SendHorizonalIcon, {}) }) });
3675
+ return /* @__PURE__ */ jsx36(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx36(ComposerSendButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx36(SendHorizontalIcon, {}) }) });
3389
3676
  });
3390
3677
  ComposerSend.displayName = "ComposerSend";
3391
3678
  var ComposerCancelButton = withDefaults(TooltipIconButton, {
@@ -3396,7 +3683,7 @@ var ComposerCancel = forwardRef21((props, ref) => {
3396
3683
  const {
3397
3684
  strings: { composer: { cancel: { tooltip = "Cancel" } = {} } = {} } = {}
3398
3685
  } = useThreadConfig();
3399
- return /* @__PURE__ */ jsx36(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx36(ComposerCancelButton, { tooltip, ...props, ref, children: /* @__PURE__ */ jsx36(CircleStopIcon, {}) }) });
3686
+ return /* @__PURE__ */ jsx36(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx36(ComposerCancelButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx36(CircleStopIcon, {}) }) });
3400
3687
  });
3401
3688
  ComposerCancel.displayName = "ComposerCancel";
3402
3689
  var exports5 = {
@@ -3511,7 +3798,7 @@ var UserActionBarEdit = forwardRef23((props, ref) => {
3511
3798
  } = useThreadConfig();
3512
3799
  const allowEdit = useAllowEdit();
3513
3800
  if (!allowEdit) return null;
3514
- return /* @__PURE__ */ jsx38(actionBar_exports.Edit, { asChild: true, children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: /* @__PURE__ */ jsx38(PencilIcon, {}) }) });
3801
+ return /* @__PURE__ */ jsx38(actionBar_exports.Edit, { asChild: true, children: /* @__PURE__ */ jsx38(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx38(PencilIcon, {}) }) });
3515
3802
  });
3516
3803
  UserActionBarEdit.displayName = "UserActionBarEdit";
3517
3804
  var exports7 = {
@@ -3589,7 +3876,7 @@ var EditComposerCancel = forwardRef25(
3589
3876
  editComposer: { cancel: { label = "Cancel" } = {} } = {}
3590
3877
  } = {}
3591
3878
  } = useThreadConfig();
3592
- return /* @__PURE__ */ jsx40(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx40(Button, { variant: "ghost", ...props, ref, children: label }) });
3879
+ return /* @__PURE__ */ jsx40(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx40(Button, { variant: "ghost", ...props, ref, children: props.children ?? label }) });
3593
3880
  }
3594
3881
  );
3595
3882
  EditComposerCancel.displayName = "EditComposerCancel";
@@ -3598,7 +3885,7 @@ var EditComposerSend = forwardRef25(
3598
3885
  const {
3599
3886
  strings: { editComposer: { send: { label = "Send" } = {} } = {} } = {}
3600
3887
  } = useThreadConfig();
3601
- return /* @__PURE__ */ jsx40(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx40(Button, { ...props, ref, children: label }) });
3888
+ return /* @__PURE__ */ jsx40(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx40(Button, { ...props, ref, children: props.children ?? label }) });
3602
3889
  }
3603
3890
  );
3604
3891
  EditComposerSend.displayName = "EditComposerSend";
@@ -3666,7 +3953,7 @@ var ThreadScrollToBottom = forwardRef26((props, ref) => {
3666
3953
  thread: { scrollToBottom: { tooltip = "Scroll to bottom" } = {} } = {}
3667
3954
  } = {}
3668
3955
  } = useThreadConfig();
3669
- return /* @__PURE__ */ jsx41(thread_exports.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ jsx41(ThreadScrollToBottomIconButton, { tooltip, ...props, ref, children: /* @__PURE__ */ jsx41(ArrowDownIcon, {}) }) });
3956
+ return /* @__PURE__ */ jsx41(thread_exports.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ jsx41(ThreadScrollToBottomIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx41(ArrowDownIcon, {}) }) });
3670
3957
  });
3671
3958
  ThreadScrollToBottom.displayName = "ThreadScrollToBottom";
3672
3959
  var exports10 = {
@@ -3679,7 +3966,7 @@ var exports10 = {
3679
3966
  var thread_default = Object.assign(Thread, exports10);
3680
3967
 
3681
3968
  // src/ui/assistant-modal.tsx
3682
- import { jsx as jsx42, jsxs as jsxs14 } from "react/jsx-runtime";
3969
+ import { Fragment as Fragment6, jsx as jsx42, jsxs as jsxs14 } from "react/jsx-runtime";
3683
3970
  var AssistantModal = (config) => {
3684
3971
  return /* @__PURE__ */ jsxs14(AssistantModalRoot, { config, children: [
3685
3972
  /* @__PURE__ */ jsx42(AssistantModalTrigger, {}),
@@ -3717,7 +4004,7 @@ var AssistantModalButton = forwardRef27(({ "data-state": state, ...rest }, ref)
3717
4004
  } = {}
3718
4005
  } = useThreadConfig();
3719
4006
  const tooltip = state === "open" ? openTooltip : closedTooltip;
3720
- return /* @__PURE__ */ jsxs14(
4007
+ return /* @__PURE__ */ jsx42(
3721
4008
  ModalButtonStyled,
3722
4009
  {
3723
4010
  side: "left",
@@ -3725,17 +4012,22 @@ var AssistantModalButton = forwardRef27(({ "data-state": state, ...rest }, ref)
3725
4012
  "data-state": state,
3726
4013
  ...rest,
3727
4014
  ref,
3728
- children: [
3729
- /* @__PURE__ */ jsx42(BotIcon, { "data-state": state, className: "aui-modal-button-closed-icon" }),
4015
+ children: rest.children ?? /* @__PURE__ */ jsxs14(Fragment6, { children: [
4016
+ /* @__PURE__ */ jsx42(
4017
+ BotIcon,
4018
+ {
4019
+ "data-state": state,
4020
+ className: "aui-modal-button-closed-icon"
4021
+ }
4022
+ ),
3730
4023
  /* @__PURE__ */ jsx42(
3731
4024
  ChevronDownIcon,
3732
4025
  {
3733
4026
  "data-state": state,
3734
4027
  className: "aui-modal-button-open-icon"
3735
4028
  }
3736
- ),
3737
- /* @__PURE__ */ jsx42("span", { className: "aui-sr-only", children: tooltip })
3738
- ]
4029
+ )
4030
+ ] })
3739
4031
  }
3740
4032
  );
3741
4033
  });
@@ -3751,16 +4043,6 @@ var exports11 = {
3751
4043
  Content: AssistantModalContent
3752
4044
  };
3753
4045
  var assistant_modal_default = Object.assign(AssistantModal, exports11);
3754
-
3755
- // src/internal.ts
3756
- var internal_exports = {};
3757
- __export(internal_exports, {
3758
- BaseAssistantRuntime: () => BaseAssistantRuntime,
3759
- MessageRepository: () => MessageRepository,
3760
- ProxyConfigProvider: () => ProxyConfigProvider,
3761
- TooltipIconButton: () => TooltipIconButton,
3762
- useSmooth: () => useSmooth
3763
- });
3764
4046
  export {
3765
4047
  actionBar_exports as ActionBarPrimitive,
3766
4048
  assistant_action_bar_default as AssistantActionBar,
@@ -3774,6 +4056,7 @@ export {
3774
4056
  composer_exports as ComposerPrimitive,
3775
4057
  content_part_default as ContentPart,
3776
4058
  contentPart_exports as ContentPartPrimitive,
4059
+ EdgeChatAdapter,
3777
4060
  edit_composer_default as EditComposer,
3778
4061
  internal_exports as INTERNAL,
3779
4062
  message_exports as MessagePrimitive,
@@ -3783,8 +4066,11 @@ export {
3783
4066
  thread_welcome_default as ThreadWelcome,
3784
4067
  user_action_bar_default as UserActionBar,
3785
4068
  user_message_default as UserMessage,
4069
+ fromCoreMessages,
4070
+ fromLanguageModelMessages,
3786
4071
  makeAssistantTool,
3787
4072
  makeAssistantToolUI,
4073
+ toLanguageModelMessages,
3788
4074
  useActionBarCopy,
3789
4075
  useActionBarEdit,
3790
4076
  useActionBarReload,