@assistant-ui/react 0.4.6 → 0.4.8

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.js CHANGED
@@ -55,9 +55,12 @@ __export(src_exports, {
55
55
  UserMessage: () => user_message_default,
56
56
  fromCoreMessages: () => fromCoreMessages,
57
57
  fromLanguageModelMessages: () => fromLanguageModelMessages,
58
+ fromLanguageModelTools: () => fromLanguageModelTools,
58
59
  makeAssistantTool: () => makeAssistantTool,
59
60
  makeAssistantToolUI: () => makeAssistantToolUI,
61
+ toCoreMessages: () => toCoreMessages,
60
62
  toLanguageModelMessages: () => toLanguageModelMessages,
63
+ toLanguageModelTools: () => toLanguageModelTools,
61
64
  useActionBarCopy: () => useActionBarCopy,
62
65
  useActionBarEdit: () => useActionBarEdit,
63
66
  useActionBarReload: () => useActionBarReload,
@@ -93,10 +96,10 @@ __export(src_exports, {
93
96
  module.exports = __toCommonJS(src_exports);
94
97
 
95
98
  // src/context/providers/AssistantRuntimeProvider.tsx
96
- var import_react5 = require("react");
99
+ var import_react6 = require("react");
97
100
 
98
101
  // src/context/providers/AssistantProvider.tsx
99
- var import_react4 = require("react");
102
+ var import_react5 = require("react");
100
103
 
101
104
  // src/context/react/AssistantContext.ts
102
105
  var import_react = require("react");
@@ -154,6 +157,18 @@ ${config.system}`;
154
157
  acc.tools[name] = tool;
155
158
  }
156
159
  }
160
+ if (config.config) {
161
+ acc.config = {
162
+ ...acc.config,
163
+ ...config.config
164
+ };
165
+ }
166
+ if (config.callSettings) {
167
+ acc.callSettings = {
168
+ ...acc.callSettings,
169
+ ...config.callSettings
170
+ };
171
+ }
157
172
  return acc;
158
173
  }, {});
159
174
  };
@@ -218,7 +233,7 @@ var makeAssistantToolUIsStore = () => (0, import_zustand2.create)((set) => {
218
233
  });
219
234
 
220
235
  // src/context/providers/ThreadProvider.tsx
221
- var import_react3 = require("react");
236
+ var import_react4 = require("react");
222
237
 
223
238
  // src/context/react/ThreadContext.ts
224
239
  var import_react2 = require("react");
@@ -284,7 +299,7 @@ var makeComposerStore = (useThreadMessages, useThreadActions) => {
284
299
  var import_zustand4 = require("zustand");
285
300
  var makeThreadStore = (runtimeRef) => {
286
301
  return (0, import_zustand4.create)(() => ({
287
- isRunning: runtimeRef.current.isRunning
302
+ isRunning: runtimeRef.getState().isRunning
288
303
  }));
289
304
  };
290
305
 
@@ -310,19 +325,18 @@ var makeThreadViewportStore = () => {
310
325
 
311
326
  // src/context/stores/ThreadActions.ts
312
327
  var import_zustand6 = require("zustand");
313
- var makeThreadActionStore = (runtimeRef) => {
328
+ var makeThreadActionStore = (runtimeStore) => {
314
329
  return (0, import_zustand6.create)(
315
330
  () => Object.freeze({
316
331
  get capabilities() {
317
- return runtimeRef.current.capabilities;
332
+ return runtimeStore.getState().capabilities;
318
333
  },
319
- getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
320
- switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
321
- startRun: (parentId) => runtimeRef.current.startRun(parentId),
322
- append: (message) => runtimeRef.current.append(message),
323
- cancelRun: () => runtimeRef.current.cancelRun(),
324
- addToolResult: (options) => runtimeRef.current.addToolResult(options),
325
- getRuntime: () => runtimeRef.current
334
+ getBranches: (messageId) => runtimeStore.getState().getBranches(messageId),
335
+ switchToBranch: (branchId) => runtimeStore.getState().switchToBranch(branchId),
336
+ startRun: (parentId) => runtimeStore.getState().startRun(parentId),
337
+ append: (message) => runtimeStore.getState().append(message),
338
+ cancelRun: () => runtimeStore.getState().cancelRun(),
339
+ addToolResult: (options) => runtimeStore.getState().addToolResult(options)
326
340
  })
327
341
  );
328
342
  };
@@ -330,60 +344,96 @@ var makeThreadActionStore = (runtimeRef) => {
330
344
  // src/context/stores/ThreadMessages.ts
331
345
  var import_zustand7 = require("zustand");
332
346
  var makeThreadMessagesStore = (runtimeRef) => {
333
- return (0, import_zustand7.create)(() => runtimeRef.current.messages);
347
+ return (0, import_zustand7.create)(() => runtimeRef.getState().messages);
348
+ };
349
+
350
+ // src/context/stores/ThreadRuntime.tsx
351
+ var import_zustand8 = require("zustand");
352
+ var makeThreadRuntimeStore = (runtime) => {
353
+ return (0, import_zustand8.create)(() => runtime);
354
+ };
355
+
356
+ // src/utils/hooks/useManagedRef.ts
357
+ var import_react3 = require("react");
358
+ var useManagedRef = (callback) => {
359
+ const cleanupRef = (0, import_react3.useRef)();
360
+ const ref = (0, import_react3.useCallback)(
361
+ (el) => {
362
+ if (cleanupRef.current) {
363
+ cleanupRef.current();
364
+ }
365
+ if (el) {
366
+ cleanupRef.current = callback(el);
367
+ }
368
+ },
369
+ [callback]
370
+ );
371
+ return ref;
334
372
  };
335
373
 
336
374
  // src/context/providers/ThreadProvider.tsx
337
375
  var import_jsx_runtime = require("react/jsx-runtime");
338
376
  var ThreadProvider = ({
339
377
  children,
340
- runtime
378
+ provider
341
379
  }) => {
342
- const runtimeRef = (0, import_react3.useRef)(runtime.thread);
343
- const [context] = (0, import_react3.useState)(() => {
344
- const useThread = makeThreadStore(runtimeRef);
345
- const useThreadMessages = makeThreadMessagesStore(runtimeRef);
346
- const useThreadActions = makeThreadActionStore(runtimeRef);
380
+ const [context] = (0, import_react4.useState)(() => {
381
+ const useThreadRuntime = makeThreadRuntimeStore(provider.thread);
382
+ const useThread = makeThreadStore(useThreadRuntime);
383
+ const useThreadMessages = makeThreadMessagesStore(useThreadRuntime);
384
+ const useThreadActions = makeThreadActionStore(useThreadRuntime);
347
385
  const useViewport = makeThreadViewportStore();
348
386
  const useComposer = makeComposerStore(useThreadMessages, useThreadActions);
349
387
  return {
350
388
  useThread,
389
+ useThreadRuntime,
351
390
  useThreadMessages,
352
391
  useThreadActions,
353
392
  useComposer,
354
393
  useViewport
355
394
  };
356
395
  });
357
- const thread = (0, import_react3.useSyncExternalStore)(
358
- (0, import_react3.useCallback)((c) => runtime.subscribe(c), [runtime]),
359
- () => runtime.thread,
360
- () => runtime.thread
396
+ const threadRef = useManagedRef(
397
+ (0, import_react4.useCallback)(
398
+ (thread) => {
399
+ const onThreadUpdate = () => {
400
+ context.useThread.setState(
401
+ Object.freeze({
402
+ isRunning: context.useThreadRuntime.getState().isRunning
403
+ }),
404
+ true
405
+ );
406
+ context.useThreadMessages.setState(thread.messages, true);
407
+ };
408
+ onThreadUpdate();
409
+ return thread.subscribe(onThreadUpdate);
410
+ },
411
+ [context]
412
+ )
361
413
  );
362
- (0, import_react3.useInsertionEffect)(() => {
363
- runtimeRef.current = thread;
364
- });
365
- (0, import_react3.useEffect)(() => {
366
- const onThreadUpdate = () => {
367
- context.useThread.setState(
368
- Object.freeze({
369
- isRunning: runtimeRef.current.isRunning
370
- }),
371
- true
372
- );
373
- context.useThreadMessages.setState(Object.freeze(runtimeRef.current.messages), true);
414
+ (0, import_react4.useInsertionEffect)(() => {
415
+ const unsubscribe = provider.subscribe(() => {
416
+ context.useThreadRuntime.setState(provider.thread, true);
417
+ threadRef(provider.thread);
418
+ });
419
+ threadRef(provider.thread);
420
+ return () => {
421
+ unsubscribe();
422
+ threadRef(null);
374
423
  };
375
- onThreadUpdate();
376
- return thread.subscribe(onThreadUpdate);
377
- }, [context, thread]);
424
+ }, [provider, context]);
425
+ const Synchronizer = context.useThreadRuntime(
426
+ (t) => t.unstable_synchronizer
427
+ );
378
428
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(ThreadContext.Provider, { value: context, children: [
379
- thread.unstable_synchronizer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(thread.unstable_synchronizer, {}),
429
+ Synchronizer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Synchronizer, {}),
380
430
  children
381
431
  ] });
382
432
  };
383
433
 
384
434
  // src/context/stores/AssistantActions.tsx
385
- var import_zustand8 = require("zustand");
386
- var makeAssistantActionsStore = (runtimeRef) => (0, import_zustand8.create)(
435
+ var import_zustand9 = require("zustand");
436
+ var makeAssistantActionsStore = (runtimeRef) => (0, import_zustand9.create)(
387
437
  () => Object.freeze({
388
438
  switchToThread: () => runtimeRef.current.switchToThread(null),
389
439
  getRuntime: () => runtimeRef.current
@@ -393,21 +443,21 @@ var makeAssistantActionsStore = (runtimeRef) => (0, import_zustand8.create)(
393
443
  // src/context/providers/AssistantProvider.tsx
394
444
  var import_jsx_runtime2 = require("react/jsx-runtime");
395
445
  var AssistantProvider = ({ children, runtime }) => {
396
- const runtimeRef = (0, import_react4.useRef)(runtime);
397
- (0, import_react4.useInsertionEffect)(() => {
446
+ const runtimeRef = (0, import_react5.useRef)(runtime);
447
+ (0, import_react5.useInsertionEffect)(() => {
398
448
  runtimeRef.current = runtime;
399
449
  });
400
- const [context] = (0, import_react4.useState)(() => {
450
+ const [context] = (0, import_react5.useState)(() => {
401
451
  const useModelConfig = makeAssistantModelConfigStore();
402
452
  const useToolUIs = makeAssistantToolUIsStore();
403
453
  const useAssistantActions = makeAssistantActionsStore(runtimeRef);
404
454
  return { useModelConfig, useToolUIs, useAssistantActions };
405
455
  });
406
456
  const getModelConfig = context.useModelConfig();
407
- (0, import_react4.useEffect)(() => {
457
+ (0, import_react5.useEffect)(() => {
408
458
  return runtime.registerModelConfigProvider(getModelConfig);
409
459
  }, [runtime, getModelConfig]);
410
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThreadProvider, { runtime, children }) });
460
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThreadProvider, { provider: runtime, children }) });
411
461
  };
412
462
 
413
463
  // src/context/providers/AssistantRuntimeProvider.tsx
@@ -415,16 +465,16 @@ var import_jsx_runtime3 = require("react/jsx-runtime");
415
465
  var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
416
466
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AssistantProvider, { runtime, children });
417
467
  };
418
- var AssistantRuntimeProvider = (0, import_react5.memo)(AssistantRuntimeProviderImpl);
468
+ var AssistantRuntimeProvider = (0, import_react6.memo)(AssistantRuntimeProviderImpl);
419
469
 
420
470
  // src/context/react/ComposerContext.ts
421
- var import_react7 = require("react");
471
+ var import_react8 = require("react");
422
472
 
423
473
  // src/context/react/MessageContext.ts
424
- var import_react6 = require("react");
425
- var MessageContext = (0, import_react6.createContext)(null);
474
+ var import_react7 = require("react");
475
+ var MessageContext = (0, import_react7.createContext)(null);
426
476
  function useMessageContext(options) {
427
- const context = (0, import_react6.useContext)(MessageContext);
477
+ const context = (0, import_react7.useContext)(MessageContext);
428
478
  if (!options?.optional && !context)
429
479
  throw new Error(
430
480
  "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
@@ -436,7 +486,7 @@ function useMessageContext(options) {
436
486
  var useComposerContext = () => {
437
487
  const { useComposer } = useThreadContext();
438
488
  const { useEditComposer } = useMessageContext({ optional: true }) ?? {};
439
- return (0, import_react7.useMemo)(
489
+ return (0, import_react8.useMemo)(
440
490
  () => ({
441
491
  useComposer: useEditComposer ?? useComposer,
442
492
  type: useEditComposer ? "edit" : "new"
@@ -446,12 +496,12 @@ var useComposerContext = () => {
446
496
  };
447
497
 
448
498
  // src/context/react/ContentPartContext.ts
449
- var import_react8 = require("react");
450
- var ContentPartContext = (0, import_react8.createContext)(
499
+ var import_react9 = require("react");
500
+ var ContentPartContext = (0, import_react9.createContext)(
451
501
  null
452
502
  );
453
503
  function useContentPartContext(options) {
454
- const context = (0, import_react8.useContext)(ContentPartContext);
504
+ const context = (0, import_react9.useContext)(ContentPartContext);
455
505
  if (!options?.optional && !context)
456
506
  throw new Error(
457
507
  "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
@@ -460,7 +510,7 @@ function useContentPartContext(options) {
460
510
  }
461
511
 
462
512
  // src/hooks/useAppendMessage.tsx
463
- var import_react9 = require("react");
513
+ var import_react10 = require("react");
464
514
  var toAppendMessage = (useThreadMessages, message) => {
465
515
  if (typeof message === "string") {
466
516
  return {
@@ -477,7 +527,7 @@ var toAppendMessage = (useThreadMessages, message) => {
477
527
  };
478
528
  var useAppendMessage = () => {
479
529
  const { useThreadMessages, useThreadActions, useViewport, useComposer } = useThreadContext();
480
- const append = (0, import_react9.useCallback)(
530
+ const append = (0, import_react10.useCallback)(
481
531
  (message) => {
482
532
  const appendMessage = toAppendMessage(useThreadMessages, message);
483
533
  useThreadActions.getState().append(appendMessage);
@@ -490,11 +540,11 @@ var useAppendMessage = () => {
490
540
  };
491
541
 
492
542
  // src/hooks/useSwitchToNewThread.tsx
493
- var import_react10 = require("react");
543
+ var import_react11 = require("react");
494
544
  var useSwitchToNewThread = () => {
495
545
  const { useAssistantActions } = useAssistantContext();
496
546
  const { useComposer } = useThreadContext();
497
- const switchToNewThread = (0, import_react10.useCallback)(() => {
547
+ const switchToNewThread = (0, import_react11.useCallback)(() => {
498
548
  useAssistantActions.getState().switchToThread(null);
499
549
  useComposer.getState().focus();
500
550
  }, [useAssistantActions, useComposer]);
@@ -502,14 +552,14 @@ var useSwitchToNewThread = () => {
502
552
  };
503
553
 
504
554
  // src/model-config/useAssistantTool.tsx
505
- var import_react11 = require("react");
555
+ var import_react12 = require("react");
506
556
  var useAssistantTool = (tool) => {
507
557
  const { useModelConfig, useToolUIs } = useAssistantContext();
508
558
  const registerModelConfigProvider = useModelConfig(
509
559
  (s) => s.registerModelConfigProvider
510
560
  );
511
561
  const setToolUI = useToolUIs((s) => s.setToolUI);
512
- (0, import_react11.useEffect)(() => {
562
+ (0, import_react12.useEffect)(() => {
513
563
  const { toolName, render, ...rest } = tool;
514
564
  const config = {
515
565
  tools: {
@@ -537,11 +587,11 @@ var makeAssistantTool = (tool) => {
537
587
  };
538
588
 
539
589
  // src/model-config/useAssistantToolUI.tsx
540
- var import_react12 = require("react");
590
+ var import_react13 = require("react");
541
591
  var useAssistantToolUI = (tool) => {
542
592
  const { useToolUIs } = useAssistantContext();
543
593
  const setToolUI = useToolUIs((s) => s.setToolUI);
544
- (0, import_react12.useEffect)(() => {
594
+ (0, import_react13.useEffect)(() => {
545
595
  if (!tool) return;
546
596
  const { toolName, render } = tool;
547
597
  return setToolUI(toolName, render);
@@ -558,13 +608,13 @@ var makeAssistantToolUI = (tool) => {
558
608
  };
559
609
 
560
610
  // src/model-config/useAssistantInstructions.tsx
561
- var import_react13 = require("react");
611
+ var import_react14 = require("react");
562
612
  var useAssistantInstructions = (instruction) => {
563
613
  const { useModelConfig } = useAssistantContext();
564
614
  const registerModelConfigProvider = useModelConfig(
565
615
  (s) => s.registerModelConfigProvider
566
616
  );
567
- (0, import_react13.useEffect)(() => {
617
+ (0, import_react14.useEffect)(() => {
568
618
  const config = {
569
619
  system: instruction
570
620
  };
@@ -573,13 +623,13 @@ var useAssistantInstructions = (instruction) => {
573
623
  };
574
624
 
575
625
  // src/primitive-hooks/actionBar/useActionBarCopy.tsx
576
- var import_react16 = require("react");
626
+ var import_react17 = require("react");
577
627
 
578
628
  // src/utils/combined/useCombinedStore.ts
579
- var import_react15 = require("react");
629
+ var import_react16 = require("react");
580
630
 
581
631
  // src/utils/combined/createCombinedStore.ts
582
- var import_react14 = require("react");
632
+ var import_react15 = require("react");
583
633
  var createCombinedStore = (stores) => {
584
634
  const subscribe = (callback) => {
585
635
  const unsubscribes = stores.map((store) => store.subscribe(callback));
@@ -591,13 +641,13 @@ var createCombinedStore = (stores) => {
591
641
  };
592
642
  return (selector) => {
593
643
  const getSnapshot = () => selector(...stores.map((store) => store.getState()));
594
- return (0, import_react14.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
644
+ return (0, import_react15.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
595
645
  };
596
646
  };
597
647
 
598
648
  // src/utils/combined/useCombinedStore.ts
599
649
  var useCombinedStore = (stores, selector) => {
600
- const useCombined = (0, import_react15.useMemo)(() => createCombinedStore(stores), stores);
650
+ const useCombined = (0, import_react16.useMemo)(() => createCombinedStore(stores), stores);
601
651
  return useCombined(selector);
602
652
  };
603
653
 
@@ -620,7 +670,7 @@ var useActionBarCopy = ({
620
670
  return !c.isEditing && m.message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
621
671
  }
622
672
  );
623
- const callback = (0, import_react16.useCallback)(() => {
673
+ const callback = (0, import_react17.useCallback)(() => {
624
674
  const { message } = useMessage.getState();
625
675
  const { setIsCopied } = useMessageUtils.getState();
626
676
  const { isEditing, value: composerValue } = useEditComposer.getState();
@@ -635,14 +685,14 @@ var useActionBarCopy = ({
635
685
  };
636
686
 
637
687
  // src/primitive-hooks/actionBar/useActionBarEdit.tsx
638
- var import_react17 = require("react");
688
+ var import_react18 = require("react");
639
689
  var useActionBarEdit = () => {
640
690
  const { useMessage, useEditComposer } = useMessageContext();
641
691
  const disabled = useCombinedStore(
642
692
  [useMessage, useEditComposer],
643
693
  (m, c) => m.message.role !== "user" || c.isEditing
644
694
  );
645
- const callback = (0, import_react17.useCallback)(() => {
695
+ const callback = (0, import_react18.useCallback)(() => {
646
696
  const { edit } = useEditComposer.getState();
647
697
  edit();
648
698
  }, [useEditComposer]);
@@ -651,7 +701,7 @@ var useActionBarEdit = () => {
651
701
  };
652
702
 
653
703
  // src/primitive-hooks/actionBar/useActionBarReload.tsx
654
- var import_react18 = require("react");
704
+ var import_react19 = require("react");
655
705
  var useActionBarReload = () => {
656
706
  const { useThread, useThreadActions, useComposer, useViewport } = useThreadContext();
657
707
  const { useMessage } = useMessageContext();
@@ -659,7 +709,7 @@ var useActionBarReload = () => {
659
709
  [useThread, useMessage],
660
710
  (t, m) => t.isRunning || m.message.role !== "assistant"
661
711
  );
662
- const callback = (0, import_react18.useCallback)(() => {
712
+ const callback = (0, import_react19.useCallback)(() => {
663
713
  const { parentId } = useMessage.getState();
664
714
  useThreadActions.getState().startRun(parentId);
665
715
  useViewport.getState().scrollToBottom();
@@ -677,7 +727,7 @@ var useBranchPickerCount = () => {
677
727
  };
678
728
 
679
729
  // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
680
- var import_react19 = require("react");
730
+ var import_react20 = require("react");
681
731
  var useBranchPickerNext = () => {
682
732
  const { useThreadActions } = useThreadContext();
683
733
  const { useMessage, useEditComposer } = useMessageContext();
@@ -685,7 +735,7 @@ var useBranchPickerNext = () => {
685
735
  [useMessage, useEditComposer],
686
736
  (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
687
737
  );
688
- const callback = (0, import_react19.useCallback)(() => {
738
+ const callback = (0, import_react20.useCallback)(() => {
689
739
  const { message, branches } = useMessage.getState();
690
740
  useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
691
741
  }, [useThreadActions, useMessage]);
@@ -701,7 +751,7 @@ var useBranchPickerNumber = () => {
701
751
  };
702
752
 
703
753
  // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
704
- var import_react20 = require("react");
754
+ var import_react21 = require("react");
705
755
  var useBranchPickerPrevious = () => {
706
756
  const { useThreadActions } = useThreadContext();
707
757
  const { useMessage, useEditComposer } = useMessageContext();
@@ -709,7 +759,7 @@ var useBranchPickerPrevious = () => {
709
759
  [useMessage, useEditComposer],
710
760
  (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
711
761
  );
712
- const callback = (0, import_react20.useCallback)(() => {
762
+ const callback = (0, import_react21.useCallback)(() => {
713
763
  const { message, branches } = useMessage.getState();
714
764
  useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
715
765
  }, [useThreadActions, useMessage]);
@@ -718,11 +768,11 @@ var useBranchPickerPrevious = () => {
718
768
  };
719
769
 
720
770
  // src/primitive-hooks/composer/useComposerCancel.tsx
721
- var import_react21 = require("react");
771
+ var import_react22 = require("react");
722
772
  var useComposerCancel = () => {
723
773
  const { useComposer } = useComposerContext();
724
774
  const disabled = useComposer((c) => !c.canCancel);
725
- const callback = (0, import_react21.useCallback)(() => {
775
+ const callback = (0, import_react22.useCallback)(() => {
726
776
  const { cancel } = useComposer.getState();
727
777
  cancel();
728
778
  }, [useComposer]);
@@ -741,12 +791,12 @@ var useComposerIf = (props) => {
741
791
  };
742
792
 
743
793
  // src/primitive-hooks/composer/useComposerSend.tsx
744
- var import_react22 = require("react");
794
+ var import_react23 = require("react");
745
795
  var useComposerSend = () => {
746
796
  const { useViewport, useComposer: useNewComposer } = useThreadContext();
747
797
  const { useComposer } = useComposerContext();
748
798
  const disabled = useComposer((c) => !c.isEditing || c.value.length === 0);
749
- const callback = (0, import_react22.useCallback)(() => {
799
+ const callback = (0, import_react23.useCallback)(() => {
750
800
  const composerState = useComposer.getState();
751
801
  if (!composerState.isEditing) return;
752
802
  composerState.send();
@@ -835,11 +885,11 @@ var useThreadEmpty = () => {
835
885
  };
836
886
 
837
887
  // src/primitive-hooks/thread/useThreadScrollToBottom.tsx
838
- var import_react23 = require("react");
888
+ var import_react24 = require("react");
839
889
  var useThreadScrollToBottom = () => {
840
890
  const { useComposer, useViewport } = useThreadContext();
841
891
  const isAtBottom = useViewport((s) => s.isAtBottom);
842
- const handleScrollToBottom = (0, import_react23.useCallback)(() => {
892
+ const handleScrollToBottom = (0, import_react24.useCallback)(() => {
843
893
  useViewport.getState().scrollToBottom();
844
894
  useComposer.getState().focus();
845
895
  }, [useViewport, useComposer]);
@@ -848,7 +898,7 @@ var useThreadScrollToBottom = () => {
848
898
  };
849
899
 
850
900
  // src/primitive-hooks/thread/useThreadSuggestion.tsx
851
- var import_react24 = require("react");
901
+ var import_react25 = require("react");
852
902
  var useThreadSuggestion = ({
853
903
  prompt,
854
904
  autoSend
@@ -856,7 +906,7 @@ var useThreadSuggestion = ({
856
906
  const { useThread, useComposer } = useThreadContext();
857
907
  const append = useAppendMessage();
858
908
  const disabled = useThread((t) => t.isRunning);
859
- const callback = (0, import_react24.useCallback)(() => {
909
+ const callback = (0, import_react25.useCallback)(() => {
860
910
  const thread = useThread.getState();
861
911
  const composer = useComposer.getState();
862
912
  if (autoSend && !thread.isRunning) {
@@ -881,7 +931,7 @@ __export(actionBar_exports, {
881
931
 
882
932
  // src/primitives/actionBar/ActionBarRoot.tsx
883
933
  var import_react_primitive = require("@radix-ui/react-primitive");
884
- var import_react25 = require("react");
934
+ var import_react26 = require("react");
885
935
 
886
936
  // src/primitives/actionBar/useActionBarFloatStatus.tsx
887
937
  var useActionBarFloatStatus = ({
@@ -907,7 +957,7 @@ var useActionBarFloatStatus = ({
907
957
 
908
958
  // src/primitives/actionBar/ActionBarRoot.tsx
909
959
  var import_jsx_runtime4 = require("react/jsx-runtime");
910
- var ActionBarPrimitiveRoot = (0, import_react25.forwardRef)(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
960
+ var ActionBarPrimitiveRoot = (0, import_react26.forwardRef)(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
911
961
  const hideAndfloatStatus = useActionBarFloatStatus({
912
962
  hideWhenRunning,
913
963
  autohide,
@@ -926,12 +976,12 @@ var ActionBarPrimitiveRoot = (0, import_react25.forwardRef)(({ hideWhenRunning,
926
976
  ActionBarPrimitiveRoot.displayName = "ActionBarPrimitive.Root";
927
977
 
928
978
  // src/utils/createActionButton.tsx
929
- var import_react26 = require("react");
979
+ var import_react27 = require("react");
930
980
  var import_react_primitive2 = require("@radix-ui/react-primitive");
931
981
  var import_primitive = require("@radix-ui/primitive");
932
982
  var import_jsx_runtime5 = require("react/jsx-runtime");
933
983
  var createActionButton = (displayName, useActionButton, forwardProps = []) => {
934
- const ActionButton = (0, import_react26.forwardRef)((props, forwardedRef) => {
984
+ const ActionButton = (0, import_react27.forwardRef)((props, forwardedRef) => {
935
985
  const forwardedProps = {};
936
986
  const primitiveProps = {};
937
987
  Object.keys(props).forEach((key) => {
@@ -988,17 +1038,17 @@ __export(assistantModal_exports, {
988
1038
  });
989
1039
 
990
1040
  // src/primitives/assistantModal/AssistantModalRoot.tsx
991
- var import_react28 = require("react");
1041
+ var import_react29 = require("react");
992
1042
  var PopoverPrimitive2 = __toESM(require("@radix-ui/react-popover"));
993
1043
  var import_primitive2 = require("@radix-ui/primitive");
994
1044
 
995
1045
  // src/utils/hooks/useOnComposerFocus.tsx
996
1046
  var import_react_use_callback_ref = require("@radix-ui/react-use-callback-ref");
997
- var import_react27 = require("react");
1047
+ var import_react28 = require("react");
998
1048
  var useOnComposerFocus = (callback) => {
999
1049
  const callbackRef = (0, import_react_use_callback_ref.useCallbackRef)(callback);
1000
1050
  const { useComposer } = useThreadContext();
1001
- (0, import_react27.useEffect)(() => {
1051
+ (0, import_react28.useEffect)(() => {
1002
1052
  return useComposer.getState().onFocus(() => {
1003
1053
  callbackRef();
1004
1054
  });
@@ -1012,7 +1062,7 @@ var usePopoverScope = PopoverPrimitive.createPopoverScope();
1012
1062
  // src/primitives/assistantModal/AssistantModalRoot.tsx
1013
1063
  var import_jsx_runtime6 = require("react/jsx-runtime");
1014
1064
  var useAssistantModalOpenState = (defaultOpen = false) => {
1015
- const state = (0, import_react28.useState)(defaultOpen);
1065
+ const state = (0, import_react29.useState)(defaultOpen);
1016
1066
  const [, setOpen] = state;
1017
1067
  useOnComposerFocus(() => {
1018
1068
  setOpen(true);
@@ -1041,10 +1091,10 @@ var AssistantModalPrimitiveRoot = ({
1041
1091
  AssistantModalPrimitiveRoot.displayName = "AssistantModalPrimitive.Root";
1042
1092
 
1043
1093
  // src/primitives/assistantModal/AssistantModalTrigger.tsx
1044
- var import_react29 = require("react");
1094
+ var import_react30 = require("react");
1045
1095
  var PopoverPrimitive3 = __toESM(require("@radix-ui/react-popover"));
1046
1096
  var import_jsx_runtime7 = require("react/jsx-runtime");
1047
- var AssistantModalPrimitiveTrigger = (0, import_react29.forwardRef)(
1097
+ var AssistantModalPrimitiveTrigger = (0, import_react30.forwardRef)(
1048
1098
  ({
1049
1099
  __scopeAssistantModal,
1050
1100
  ...rest
@@ -1056,11 +1106,11 @@ var AssistantModalPrimitiveTrigger = (0, import_react29.forwardRef)(
1056
1106
  AssistantModalPrimitiveTrigger.displayName = "AssistantModalPrimitive.Trigger";
1057
1107
 
1058
1108
  // src/primitives/assistantModal/AssistantModalContent.tsx
1059
- var import_react30 = require("react");
1109
+ var import_react31 = require("react");
1060
1110
  var PopoverPrimitive4 = __toESM(require("@radix-ui/react-popover"));
1061
1111
  var import_primitive3 = require("@radix-ui/primitive");
1062
1112
  var import_jsx_runtime8 = require("react/jsx-runtime");
1063
- var AssistantModalPrimitiveContent = (0, import_react30.forwardRef)(
1113
+ var AssistantModalPrimitiveContent = (0, import_react31.forwardRef)(
1064
1114
  ({
1065
1115
  __scopeAssistantModal,
1066
1116
  side,
@@ -1089,10 +1139,10 @@ var AssistantModalPrimitiveContent = (0, import_react30.forwardRef)(
1089
1139
  AssistantModalPrimitiveContent.displayName = "AssistantModalPrimitive.Content";
1090
1140
 
1091
1141
  // src/primitives/assistantModal/AssistantModalAnchor.tsx
1092
- var import_react31 = require("react");
1142
+ var import_react32 = require("react");
1093
1143
  var PopoverPrimitive5 = __toESM(require("@radix-ui/react-popover"));
1094
1144
  var import_jsx_runtime9 = require("react/jsx-runtime");
1095
- var AssistantModalPrimitiveAnchor = (0, import_react31.forwardRef)(
1145
+ var AssistantModalPrimitiveAnchor = (0, import_react32.forwardRef)(
1096
1146
  ({
1097
1147
  __scopeAssistantModal,
1098
1148
  ...rest
@@ -1157,26 +1207,6 @@ __export(message_exports, {
1157
1207
  // src/primitives/message/MessageRoot.tsx
1158
1208
  var import_react_primitive3 = require("@radix-ui/react-primitive");
1159
1209
  var import_react33 = require("react");
1160
-
1161
- // src/utils/hooks/useManagedRef.ts
1162
- var import_react32 = require("react");
1163
- var useManagedRef = (callback) => {
1164
- const cleanupRef = (0, import_react32.useRef)();
1165
- const ref = (0, import_react32.useCallback)(
1166
- (el) => {
1167
- if (cleanupRef.current) {
1168
- cleanupRef.current();
1169
- }
1170
- if (el) {
1171
- cleanupRef.current = callback(el);
1172
- }
1173
- },
1174
- [callback]
1175
- );
1176
- return ref;
1177
- };
1178
-
1179
- // src/primitives/message/MessageRoot.tsx
1180
1210
  var import_react_compose_refs = require("@radix-ui/react-compose-refs");
1181
1211
  var import_jsx_runtime12 = require("react/jsx-runtime");
1182
1212
  var useIsHoveringRef = () => {
@@ -1224,7 +1254,7 @@ var import_react38 = require("react");
1224
1254
 
1225
1255
  // src/context/providers/ContentPartProvider.tsx
1226
1256
  var import_react34 = require("react");
1227
- var import_zustand9 = require("zustand");
1257
+ var import_zustand10 = require("zustand");
1228
1258
  var import_jsx_runtime13 = require("react/jsx-runtime");
1229
1259
  var DONE_STATUS = { type: "done" };
1230
1260
  var syncContentPart = ({ message }, useContentPart, partIndex) => {
@@ -1244,7 +1274,7 @@ var syncContentPart = ({ message }, useContentPart, partIndex) => {
1244
1274
  var useContentPartContext2 = (partIndex) => {
1245
1275
  const { useMessage } = useMessageContext();
1246
1276
  const [context] = (0, import_react34.useState)(() => {
1247
- const useContentPart = (0, import_zustand9.create)(
1277
+ const useContentPart = (0, import_zustand10.create)(
1248
1278
  () => ({})
1249
1279
  );
1250
1280
  syncContentPart(useMessage.getState(), useContentPart, partIndex);
@@ -1802,14 +1832,14 @@ var import_react49 = require("react");
1802
1832
 
1803
1833
  // src/context/providers/MessageProvider.tsx
1804
1834
  var import_react48 = require("react");
1805
- var import_zustand12 = require("zustand");
1835
+ var import_zustand13 = require("zustand");
1806
1836
 
1807
1837
  // src/context/stores/EditComposer.ts
1808
- var import_zustand10 = require("zustand");
1838
+ var import_zustand11 = require("zustand");
1809
1839
  var makeEditComposerStore = ({
1810
1840
  onEdit,
1811
1841
  onSend
1812
- }) => (0, import_zustand10.create)()((set, get, store) => ({
1842
+ }) => (0, import_zustand11.create)()((set, get, store) => ({
1813
1843
  ...makeBaseComposer(set, get, store),
1814
1844
  canCancel: false,
1815
1845
  isEditing: false,
@@ -1828,8 +1858,8 @@ var makeEditComposerStore = ({
1828
1858
  }));
1829
1859
 
1830
1860
  // src/context/stores/MessageUtils.ts
1831
- var import_zustand11 = require("zustand");
1832
- var makeMessageUtilsStore = () => (0, import_zustand11.create)((set) => ({
1861
+ var import_zustand12 = require("zustand");
1862
+ var makeMessageUtilsStore = () => (0, import_zustand12.create)((set) => ({
1833
1863
  isCopied: false,
1834
1864
  setIsCopied: (value) => {
1835
1865
  set({ isCopied: value });
@@ -1864,7 +1894,7 @@ var syncMessage = (messages, getBranches, useMessage, messageIndex) => {
1864
1894
  var useMessageContext2 = (messageIndex) => {
1865
1895
  const { useThreadMessages, useThreadActions } = useThreadContext();
1866
1896
  const [context] = (0, import_react48.useState)(() => {
1867
- const useMessage = (0, import_zustand12.create)(() => ({}));
1897
+ const useMessage = (0, import_zustand13.create)(() => ({}));
1868
1898
  const useMessageUtils = makeMessageUtilsStore();
1869
1899
  const useEditComposer = makeEditComposerStore({
1870
1900
  onEdit: () => {
@@ -2288,86 +2318,332 @@ var TooltipIconButton = (0, import_react52.forwardRef)(({ children, tooltip, sid
2288
2318
  });
2289
2319
  TooltipIconButton.displayName = "TooltipIconButton";
2290
2320
 
2291
- // src/runtimes/edge/useEdgeRuntime.ts
2292
- var import_react53 = require("react");
2293
-
2294
- // src/runtimes/edge/converters/toCoreMessages.ts
2295
- var toCoreMessages = (message) => {
2296
- return message.map((message2) => {
2297
- return {
2298
- role: message2.role,
2299
- content: message2.content.map((part) => {
2300
- if (part.type === "ui") throw new Error("UI parts are not supported");
2301
- if (part.type === "tool-call") {
2302
- const { argsText, ...rest } = part;
2303
- return rest;
2304
- }
2305
- return part;
2306
- })
2307
- };
2308
- });
2309
- };
2310
-
2311
- // src/runtimes/edge/converters/toLanguageModelTools.ts
2312
- var import_zod2 = require("zod");
2313
- var import_zod_to_json_schema = __toESM(require("zod-to-json-schema"));
2314
- var toLanguageModelTools = (tools) => {
2315
- if (!tools) return [];
2316
- return Object.entries(tools).map(([name, tool]) => ({
2317
- type: "function",
2318
- name,
2319
- ...tool.description ? { description: tool.description } : void 0,
2320
- parameters: tool.parameters instanceof import_zod2.z.ZodType ? (0, import_zod_to_json_schema.default)(tool.parameters) : tool.parameters
2321
- }));
2322
- };
2323
-
2324
- // src/runtimes/edge/streams/assistantDecoderStream.ts
2325
- function assistantDecoderStream() {
2326
- const toolCallNames = /* @__PURE__ */ new Map();
2327
- let currentToolCall;
2328
- return new TransformStream({
2329
- transform(chunk, controller) {
2330
- const [code, value] = parseStreamPart(chunk);
2331
- if (currentToolCall && code !== "2" /* ToolCallArgsTextDelta */ && code !== "E" /* Error */) {
2332
- controller.enqueue({
2333
- type: "tool-call",
2334
- toolCallType: "function",
2335
- toolCallId: currentToolCall.id,
2336
- toolName: currentToolCall.name,
2337
- args: currentToolCall.argsText
2321
+ // src/runtimes/edge/converters/toLanguageModelMessages.ts
2322
+ var assistantMessageSplitter = () => {
2323
+ const stash = [];
2324
+ let assistantMessage = {
2325
+ role: "assistant",
2326
+ content: []
2327
+ };
2328
+ let toolMessage = {
2329
+ role: "tool",
2330
+ content: []
2331
+ };
2332
+ return {
2333
+ addTextContentPart: (part) => {
2334
+ if (toolMessage.content.length > 0) {
2335
+ stash.push(assistantMessage);
2336
+ stash.push(toolMessage);
2337
+ assistantMessage = {
2338
+ role: "assistant",
2339
+ content: []
2340
+ };
2341
+ toolMessage = {
2342
+ role: "tool",
2343
+ content: []
2344
+ };
2345
+ }
2346
+ assistantMessage.content.push(part);
2347
+ },
2348
+ addToolCallPart: (part) => {
2349
+ assistantMessage.content.push({
2350
+ type: "tool-call",
2351
+ toolCallId: part.toolCallId,
2352
+ toolName: part.toolName,
2353
+ args: part.args
2354
+ });
2355
+ if (part.result) {
2356
+ toolMessage.content.push({
2357
+ type: "tool-result",
2358
+ toolCallId: part.toolCallId,
2359
+ toolName: part.toolName,
2360
+ result: part.result
2361
+ // isError
2338
2362
  });
2339
- currentToolCall = void 0;
2340
2363
  }
2341
- switch (code) {
2342
- case "0" /* TextDelta */: {
2343
- controller.enqueue({
2344
- type: "text-delta",
2345
- textDelta: value
2346
- });
2347
- break;
2348
- }
2349
- case "1" /* ToolCallBegin */: {
2350
- const { id, name } = value;
2351
- toolCallNames.set(id, name);
2352
- currentToolCall = { id, name, argsText: "" };
2353
- break;
2354
- }
2355
- case "2" /* ToolCallArgsTextDelta */: {
2356
- const delta = value;
2357
- currentToolCall.argsText += delta;
2358
- controller.enqueue({
2359
- type: "tool-call-delta",
2360
- toolCallType: "function",
2361
- toolCallId: currentToolCall.id,
2362
- toolName: currentToolCall.name,
2363
- argsTextDelta: delta
2364
- });
2365
- break;
2366
- }
2367
- case "3" /* ToolCallResult */: {
2368
- controller.enqueue({
2369
- type: "tool-result",
2370
- toolCallType: "function",
2364
+ },
2365
+ getMessages: () => {
2366
+ if (toolMessage.content.length > 0) {
2367
+ return [...stash, assistantMessage, toolMessage];
2368
+ }
2369
+ return [...stash, assistantMessage];
2370
+ }
2371
+ };
2372
+ };
2373
+ function toLanguageModelMessages(message) {
2374
+ return message.flatMap((message2) => {
2375
+ const role = message2.role;
2376
+ switch (role) {
2377
+ case "system": {
2378
+ return [{ role: "system", content: message2.content[0].text }];
2379
+ }
2380
+ case "user": {
2381
+ const msg = {
2382
+ role: "user",
2383
+ content: message2.content.map(
2384
+ (part) => {
2385
+ const type = part.type;
2386
+ switch (type) {
2387
+ case "text": {
2388
+ return part;
2389
+ }
2390
+ case "image": {
2391
+ return {
2392
+ type: "image",
2393
+ image: new URL(part.image)
2394
+ };
2395
+ }
2396
+ default: {
2397
+ const unhandledType = type;
2398
+ throw new Error(
2399
+ `Unspported content part type: ${unhandledType}`
2400
+ );
2401
+ }
2402
+ }
2403
+ }
2404
+ )
2405
+ };
2406
+ return [msg];
2407
+ }
2408
+ case "assistant": {
2409
+ const splitter = assistantMessageSplitter();
2410
+ for (const part of message2.content) {
2411
+ const type = part.type;
2412
+ switch (type) {
2413
+ case "text": {
2414
+ splitter.addTextContentPart(part);
2415
+ break;
2416
+ }
2417
+ case "tool-call": {
2418
+ splitter.addToolCallPart(part);
2419
+ break;
2420
+ }
2421
+ default: {
2422
+ const unhandledType = type;
2423
+ throw new Error(`Unhandled content part type: ${unhandledType}`);
2424
+ }
2425
+ }
2426
+ }
2427
+ return splitter.getMessages();
2428
+ }
2429
+ default: {
2430
+ const unhandledRole = role;
2431
+ throw new Error(`Unknown message role: ${unhandledRole}`);
2432
+ }
2433
+ }
2434
+ });
2435
+ }
2436
+
2437
+ // src/runtimes/edge/converters/fromLanguageModelMessages.ts
2438
+ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
2439
+ const messages = [];
2440
+ for (const lmMessage of lm) {
2441
+ const role = lmMessage.role;
2442
+ switch (role) {
2443
+ case "system": {
2444
+ messages.push({
2445
+ role: "system",
2446
+ content: [
2447
+ {
2448
+ type: "text",
2449
+ text: lmMessage.content
2450
+ }
2451
+ ]
2452
+ });
2453
+ break;
2454
+ }
2455
+ case "user": {
2456
+ messages.push({
2457
+ role: "user",
2458
+ content: lmMessage.content.map((part) => {
2459
+ const type = part.type;
2460
+ switch (type) {
2461
+ case "text": {
2462
+ return {
2463
+ type: "text",
2464
+ text: part.text
2465
+ };
2466
+ }
2467
+ case "image": {
2468
+ if (part.image instanceof URL) {
2469
+ return {
2470
+ type: "image",
2471
+ image: part.image.href
2472
+ };
2473
+ }
2474
+ throw new Error("Only images with URL data are supported");
2475
+ }
2476
+ default: {
2477
+ const unhandledType = type;
2478
+ throw new Error(`Unknown content part type: ${unhandledType}`);
2479
+ }
2480
+ }
2481
+ })
2482
+ });
2483
+ break;
2484
+ }
2485
+ case "assistant": {
2486
+ const newContent = lmMessage.content.map((part) => {
2487
+ if (part.type === "tool-call") {
2488
+ return {
2489
+ type: "tool-call",
2490
+ toolCallId: part.toolCallId,
2491
+ toolName: part.toolName,
2492
+ argsText: JSON.stringify(part.args),
2493
+ args: part.args
2494
+ };
2495
+ }
2496
+ return part;
2497
+ });
2498
+ if (mergeRoundtrips) {
2499
+ const previousMessage = messages[messages.length - 1];
2500
+ if (previousMessage?.role === "assistant") {
2501
+ previousMessage.content.push(...newContent);
2502
+ break;
2503
+ }
2504
+ }
2505
+ messages.push({
2506
+ role: "assistant",
2507
+ content: newContent
2508
+ });
2509
+ break;
2510
+ }
2511
+ case "tool": {
2512
+ const previousMessage = messages[messages.length - 1];
2513
+ if (previousMessage?.role !== "assistant")
2514
+ throw new Error(
2515
+ "A tool message must be preceded by an assistant message."
2516
+ );
2517
+ for (const tool of lmMessage.content) {
2518
+ const toolCall = previousMessage.content.find(
2519
+ (c) => c.type === "tool-call" && c.toolCallId === tool.toolCallId
2520
+ );
2521
+ if (!toolCall)
2522
+ throw new Error("Received tool result for an unknown tool call.");
2523
+ if (toolCall.toolName !== tool.toolName)
2524
+ throw new Error("Tool call name mismatch.");
2525
+ toolCall.result = tool.result;
2526
+ if (tool.isError) {
2527
+ toolCall.isError = true;
2528
+ }
2529
+ }
2530
+ break;
2531
+ }
2532
+ default: {
2533
+ const unhandledRole = role;
2534
+ throw new Error(`Unknown message role: ${unhandledRole}`);
2535
+ }
2536
+ }
2537
+ }
2538
+ return messages;
2539
+ };
2540
+
2541
+ // src/runtimes/edge/converters/fromCoreMessage.ts
2542
+ var fromCoreMessages = (message) => {
2543
+ return message.map((message2) => {
2544
+ return {
2545
+ id: generateId(),
2546
+ createdAt: /* @__PURE__ */ new Date(),
2547
+ ...message2.role === "assistant" ? {
2548
+ status: { type: "done" }
2549
+ } : void 0,
2550
+ ...message2
2551
+ };
2552
+ });
2553
+ };
2554
+
2555
+ // src/runtimes/edge/converters/toCoreMessages.ts
2556
+ var toCoreMessages = (message) => {
2557
+ return message.map((message2) => {
2558
+ return {
2559
+ role: message2.role,
2560
+ content: message2.content.map((part) => {
2561
+ if (part.type === "ui") throw new Error("UI parts are not supported");
2562
+ if (part.type === "tool-call") {
2563
+ const { argsText, ...rest } = part;
2564
+ return rest;
2565
+ }
2566
+ return part;
2567
+ })
2568
+ };
2569
+ });
2570
+ };
2571
+
2572
+ // src/runtimes/edge/converters/fromLanguageModelTools.ts
2573
+ var fromLanguageModelTools = (tools) => {
2574
+ return Object.fromEntries(
2575
+ tools.map((tool) => [
2576
+ tool.name,
2577
+ {
2578
+ description: tool.description,
2579
+ parameters: tool.parameters
2580
+ }
2581
+ ])
2582
+ );
2583
+ };
2584
+
2585
+ // src/runtimes/edge/converters/toLanguageModelTools.ts
2586
+ var import_zod2 = require("zod");
2587
+ var import_zod_to_json_schema = __toESM(require("zod-to-json-schema"));
2588
+ var toLanguageModelTools = (tools) => {
2589
+ return Object.entries(tools).map(([name, tool]) => ({
2590
+ type: "function",
2591
+ name,
2592
+ ...tool.description ? { description: tool.description } : void 0,
2593
+ parameters: tool.parameters instanceof import_zod2.z.ZodType ? (0, import_zod_to_json_schema.default)(tool.parameters) : tool.parameters
2594
+ }));
2595
+ };
2596
+
2597
+ // src/runtimes/edge/useEdgeRuntime.ts
2598
+ var import_react53 = require("react");
2599
+
2600
+ // src/runtimes/edge/streams/assistantDecoderStream.ts
2601
+ function assistantDecoderStream() {
2602
+ const toolCallNames = /* @__PURE__ */ new Map();
2603
+ let currentToolCall;
2604
+ return new TransformStream({
2605
+ transform(chunk, controller) {
2606
+ const [code, value] = parseStreamPart(chunk);
2607
+ if (currentToolCall && code !== "2" /* ToolCallArgsTextDelta */ && code !== "E" /* Error */) {
2608
+ controller.enqueue({
2609
+ type: "tool-call",
2610
+ toolCallType: "function",
2611
+ toolCallId: currentToolCall.id,
2612
+ toolName: currentToolCall.name,
2613
+ args: currentToolCall.argsText
2614
+ });
2615
+ currentToolCall = void 0;
2616
+ }
2617
+ switch (code) {
2618
+ case "0" /* TextDelta */: {
2619
+ controller.enqueue({
2620
+ type: "text-delta",
2621
+ textDelta: value
2622
+ });
2623
+ break;
2624
+ }
2625
+ case "1" /* ToolCallBegin */: {
2626
+ const { id, name } = value;
2627
+ toolCallNames.set(id, name);
2628
+ currentToolCall = { id, name, argsText: "" };
2629
+ break;
2630
+ }
2631
+ case "2" /* ToolCallArgsTextDelta */: {
2632
+ const delta = value;
2633
+ currentToolCall.argsText += delta;
2634
+ controller.enqueue({
2635
+ type: "tool-call-delta",
2636
+ toolCallType: "function",
2637
+ toolCallId: currentToolCall.id,
2638
+ toolName: currentToolCall.name,
2639
+ argsTextDelta: delta
2640
+ });
2641
+ break;
2642
+ }
2643
+ case "3" /* ToolCallResult */: {
2644
+ controller.enqueue({
2645
+ type: "tool-result",
2646
+ toolCallType: "function",
2371
2647
  toolCallId: value.id,
2372
2648
  toolName: toolCallNames.get(value.id),
2373
2649
  result: value.result
@@ -2997,14 +3273,17 @@ var EdgeChatAdapter = class {
2997
3273
  body: JSON.stringify({
2998
3274
  system: config.system,
2999
3275
  messages: toCoreMessages(messages),
3000
- tools: toLanguageModelTools(
3001
- config.tools
3002
- ),
3276
+ tools: config.tools ? toLanguageModelTools(config.tools) : [],
3003
3277
  ...config.callSettings,
3004
3278
  ...config.config
3005
3279
  }),
3006
3280
  signal: abortSignal
3007
3281
  });
3282
+ if (result.status !== 200) {
3283
+ throw new Error(
3284
+ `Edge runtime returned status ${result.status}: ${await result.text()}`
3285
+ );
3286
+ }
3008
3287
  const stream = result.body.pipeThrough(new TextDecoderStream()).pipeThrough(chunkByLineStream()).pipeThrough(assistantDecoderStream()).pipeThrough(toolResultStream(config.tools)).pipeThrough(runResultStream(initialContent));
3009
3288
  let message;
3010
3289
  let update;
@@ -3057,240 +3336,6 @@ var useEdgeRuntime = ({
3057
3336
  return useLocalRuntime(adapter, { initialMessages });
3058
3337
  };
3059
3338
 
3060
- // src/runtimes/edge/converters/toLanguageModelMessages.ts
3061
- var assistantMessageSplitter = () => {
3062
- const stash = [];
3063
- let assistantMessage = {
3064
- role: "assistant",
3065
- content: []
3066
- };
3067
- let toolMessage = {
3068
- role: "tool",
3069
- content: []
3070
- };
3071
- return {
3072
- addTextContentPart: (part) => {
3073
- if (toolMessage.content.length > 0) {
3074
- stash.push(assistantMessage);
3075
- stash.push(toolMessage);
3076
- assistantMessage = {
3077
- role: "assistant",
3078
- content: []
3079
- };
3080
- toolMessage = {
3081
- role: "tool",
3082
- content: []
3083
- };
3084
- }
3085
- assistantMessage.content.push(part);
3086
- },
3087
- addToolCallPart: (part) => {
3088
- assistantMessage.content.push({
3089
- type: "tool-call",
3090
- toolCallId: part.toolCallId,
3091
- toolName: part.toolName,
3092
- args: part.args
3093
- });
3094
- if (part.result) {
3095
- toolMessage.content.push({
3096
- type: "tool-result",
3097
- toolCallId: part.toolCallId,
3098
- toolName: part.toolName,
3099
- result: part.result
3100
- // isError
3101
- });
3102
- }
3103
- },
3104
- getMessages: () => {
3105
- if (toolMessage.content.length > 0) {
3106
- return [...stash, assistantMessage, toolMessage];
3107
- }
3108
- return [...stash, assistantMessage];
3109
- }
3110
- };
3111
- };
3112
- function toLanguageModelMessages(message) {
3113
- return message.flatMap((message2) => {
3114
- const role = message2.role;
3115
- switch (role) {
3116
- case "system": {
3117
- return [{ role: "system", content: message2.content[0].text }];
3118
- }
3119
- case "user": {
3120
- const msg = {
3121
- role: "user",
3122
- content: message2.content.map(
3123
- (part) => {
3124
- const type = part.type;
3125
- switch (type) {
3126
- case "text": {
3127
- return part;
3128
- }
3129
- case "image": {
3130
- return {
3131
- type: "image",
3132
- image: new URL(part.image)
3133
- };
3134
- }
3135
- default: {
3136
- const unhandledType = type;
3137
- throw new Error(
3138
- `Unspported content part type: ${unhandledType}`
3139
- );
3140
- }
3141
- }
3142
- }
3143
- )
3144
- };
3145
- return [msg];
3146
- }
3147
- case "assistant": {
3148
- const splitter = assistantMessageSplitter();
3149
- for (const part of message2.content) {
3150
- const type = part.type;
3151
- switch (type) {
3152
- case "text": {
3153
- splitter.addTextContentPart(part);
3154
- break;
3155
- }
3156
- case "tool-call": {
3157
- splitter.addToolCallPart(part);
3158
- break;
3159
- }
3160
- default: {
3161
- const unhandledType = type;
3162
- throw new Error(`Unhandled content part type: ${unhandledType}`);
3163
- }
3164
- }
3165
- }
3166
- return splitter.getMessages();
3167
- }
3168
- default: {
3169
- const unhandledRole = role;
3170
- throw new Error(`Unknown message role: ${unhandledRole}`);
3171
- }
3172
- }
3173
- });
3174
- }
3175
-
3176
- // src/runtimes/edge/converters/fromLanguageModelMessages.ts
3177
- var fromLanguageModelMessages = (lm, mergeRoundtrips) => {
3178
- const messages = [];
3179
- for (const lmMessage of lm) {
3180
- const role = lmMessage.role;
3181
- switch (role) {
3182
- case "system": {
3183
- messages.push({
3184
- role: "system",
3185
- content: [
3186
- {
3187
- type: "text",
3188
- text: lmMessage.content
3189
- }
3190
- ]
3191
- });
3192
- break;
3193
- }
3194
- case "user": {
3195
- messages.push({
3196
- role: "user",
3197
- content: lmMessage.content.map((part) => {
3198
- const type = part.type;
3199
- switch (type) {
3200
- case "text": {
3201
- return {
3202
- type: "text",
3203
- text: part.text
3204
- };
3205
- }
3206
- case "image": {
3207
- if (part.image instanceof URL) {
3208
- return {
3209
- type: "image",
3210
- image: part.image.href
3211
- };
3212
- }
3213
- throw new Error("Only images with URL data are supported");
3214
- }
3215
- default: {
3216
- const unhandledType = type;
3217
- throw new Error(`Unknown content part type: ${unhandledType}`);
3218
- }
3219
- }
3220
- })
3221
- });
3222
- break;
3223
- }
3224
- case "assistant": {
3225
- const newContent = lmMessage.content.map((part) => {
3226
- if (part.type === "tool-call") {
3227
- return {
3228
- type: "tool-call",
3229
- toolCallId: part.toolCallId,
3230
- toolName: part.toolName,
3231
- argsText: JSON.stringify(part.args),
3232
- args: part.args
3233
- };
3234
- }
3235
- return part;
3236
- });
3237
- if (mergeRoundtrips) {
3238
- const previousMessage = messages[messages.length - 1];
3239
- if (previousMessage?.role === "assistant") {
3240
- previousMessage.content.push(...newContent);
3241
- break;
3242
- }
3243
- }
3244
- messages.push({
3245
- role: "assistant",
3246
- content: newContent
3247
- });
3248
- break;
3249
- }
3250
- case "tool": {
3251
- const previousMessage = messages[messages.length - 1];
3252
- if (previousMessage?.role !== "assistant")
3253
- throw new Error(
3254
- "A tool message must be preceded by an assistant message."
3255
- );
3256
- for (const tool of lmMessage.content) {
3257
- const toolCall = previousMessage.content.find(
3258
- (c) => c.type === "tool-call" && c.toolCallId === tool.toolCallId
3259
- );
3260
- if (!toolCall)
3261
- throw new Error("Received tool result for an unknown tool call.");
3262
- if (toolCall.toolName !== tool.toolName)
3263
- throw new Error("Tool call name mismatch.");
3264
- toolCall.result = tool.result;
3265
- if (tool.isError) {
3266
- toolCall.isError = true;
3267
- }
3268
- }
3269
- break;
3270
- }
3271
- default: {
3272
- const unhandledRole = role;
3273
- throw new Error(`Unknown message role: ${unhandledRole}`);
3274
- }
3275
- }
3276
- }
3277
- return messages;
3278
- };
3279
-
3280
- // src/runtimes/edge/converters/fromCoreMessage.ts
3281
- var fromCoreMessages = (message) => {
3282
- return message.map((message2) => {
3283
- return {
3284
- id: generateId(),
3285
- createdAt: /* @__PURE__ */ new Date(),
3286
- ...message2.role === "assistant" ? {
3287
- status: { type: "done" }
3288
- } : void 0,
3289
- ...message2
3290
- };
3291
- });
3292
- };
3293
-
3294
3339
  // src/runtimes/local/LocalRuntime.tsx
3295
3340
  var LocalRuntime = class extends BaseAssistantRuntime {
3296
3341
  _proxyConfigProvider;
@@ -4167,9 +4212,12 @@ var assistant_modal_default = Object.assign(AssistantModal, exports12);
4167
4212
  UserMessage,
4168
4213
  fromCoreMessages,
4169
4214
  fromLanguageModelMessages,
4215
+ fromLanguageModelTools,
4170
4216
  makeAssistantTool,
4171
4217
  makeAssistantToolUI,
4218
+ toCoreMessages,
4172
4219
  toLanguageModelMessages,
4220
+ toLanguageModelTools,
4173
4221
  useActionBarCopy,
4174
4222
  useActionBarEdit,
4175
4223
  useActionBarReload,