@ottocode/web-sdk 0.1.251 → 0.1.252

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
@@ -1787,10 +1787,26 @@ function useUpdateDefaults() {
1787
1787
  // src/hooks/usePreferences.ts
1788
1788
  import { useCallback as useCallback4, useMemo as useMemo2, useSyncExternalStore } from "react";
1789
1789
  var STORAGE_KEY = "otto-preferences";
1790
+ var DEFAULT_FONT_FAMILY = "IBM Plex Mono";
1790
1791
  var DEFAULT_STORED_PREFERENCES = {
1791
1792
  vimMode: false,
1792
- compactThread: true
1793
+ compactThread: true,
1794
+ fontFamily: DEFAULT_FONT_FAMILY
1793
1795
  };
1796
+ function cssFontFamily(fontFamily) {
1797
+ const trimmed = fontFamily.trim();
1798
+ if (!trimmed || trimmed === DEFAULT_FONT_FAMILY) {
1799
+ return `"${DEFAULT_FONT_FAMILY}", monospace`;
1800
+ }
1801
+ return `"${trimmed.replaceAll('"', "\\\"")}", "${DEFAULT_FONT_FAMILY}", monospace`;
1802
+ }
1803
+ function applyFontFamily(fontFamily) {
1804
+ if (typeof document === "undefined") {
1805
+ return;
1806
+ }
1807
+ document.documentElement.style.setProperty("--otto-font-family", cssFontFamily(fontFamily));
1808
+ document.documentElement.dataset.ottoFontFamily = fontFamily;
1809
+ }
1794
1810
  function resolveInitialPreferences() {
1795
1811
  if (typeof window === "undefined") {
1796
1812
  return DEFAULT_STORED_PREFERENCES;
@@ -1801,7 +1817,8 @@ function resolveInitialPreferences() {
1801
1817
  const parsed = JSON.parse(stored);
1802
1818
  return {
1803
1819
  vimMode: typeof parsed.vimMode === "boolean" ? parsed.vimMode : DEFAULT_STORED_PREFERENCES.vimMode,
1804
- compactThread: typeof parsed.compactThread === "boolean" ? parsed.compactThread : DEFAULT_STORED_PREFERENCES.compactThread
1820
+ compactThread: typeof parsed.compactThread === "boolean" ? parsed.compactThread : DEFAULT_STORED_PREFERENCES.compactThread,
1821
+ fontFamily: typeof parsed.fontFamily === "string" && parsed.fontFamily.trim() ? parsed.fontFamily.trim() : DEFAULT_STORED_PREFERENCES.fontFamily
1805
1822
  };
1806
1823
  }
1807
1824
  } catch (error) {
@@ -1810,6 +1827,7 @@ function resolveInitialPreferences() {
1810
1827
  return DEFAULT_STORED_PREFERENCES;
1811
1828
  }
1812
1829
  var preferences = resolveInitialPreferences();
1830
+ applyFontFamily(preferences.fontFamily);
1813
1831
  var listeners = new Set;
1814
1832
  function getSnapshot() {
1815
1833
  return preferences;
@@ -1828,6 +1846,9 @@ function notifyListeners() {
1828
1846
  }
1829
1847
  function updateStore(updates) {
1830
1848
  preferences = { ...preferences, ...updates };
1849
+ if (updates.fontFamily !== undefined) {
1850
+ applyFontFamily(preferences.fontFamily);
1851
+ }
1831
1852
  if (typeof window !== "undefined") {
1832
1853
  try {
1833
1854
  window.localStorage.setItem(STORAGE_KEY, JSON.stringify(preferences));
@@ -1849,6 +1870,9 @@ function usePreferences() {
1849
1870
  if (updates.compactThread !== undefined) {
1850
1871
  localUpdates.compactThread = updates.compactThread;
1851
1872
  }
1873
+ if (updates.fontFamily !== undefined) {
1874
+ localUpdates.fontFamily = updates.fontFamily.trim() || DEFAULT_FONT_FAMILY;
1875
+ }
1852
1876
  if (Object.keys(localUpdates).length > 0) {
1853
1877
  updateStore(localUpdates);
1854
1878
  }
@@ -2190,12 +2214,12 @@ function Modal({
2190
2214
  }),
2191
2215
  /* @__PURE__ */ jsx11("div", {
2192
2216
  "data-native-overlay-root": "true",
2193
- className: `${overlayPositionClass} top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-[9999] w-full ${maxWidthClasses[maxWidth]} px-4`,
2217
+ className: `${overlayPositionClass} top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-[9999] w-full ${maxWidthClasses[maxWidth]} max-h-[calc(100dvh-2rem)] px-4 flex`,
2194
2218
  children: /* @__PURE__ */ jsxs6("div", {
2195
- className: "bg-background border border-border rounded-lg shadow-lg",
2219
+ className: "bg-background border border-border rounded-lg shadow-lg max-h-full w-full flex flex-col overflow-hidden",
2196
2220
  children: [
2197
2221
  (title || showCloseButton) && /* @__PURE__ */ jsxs6("div", {
2198
- className: "flex items-center justify-between p-4 border-b border-border",
2222
+ className: "flex flex-shrink-0 items-center justify-between p-4 border-b border-border",
2199
2223
  children: [
2200
2224
  title && /* @__PURE__ */ jsx11("div", {
2201
2225
  className: "text-lg font-semibold text-foreground",
@@ -2213,7 +2237,7 @@ function Modal({
2213
2237
  ]
2214
2238
  }),
2215
2239
  /* @__PURE__ */ jsx11("div", {
2216
- className: "p-6",
2240
+ className: "p-6 overflow-y-auto",
2217
2241
  children
2218
2242
  })
2219
2243
  ]
@@ -5172,7 +5196,7 @@ import {
5172
5196
  import { ChevronDown, Search } from "lucide-react";
5173
5197
  import Fuse2 from "fuse.js";
5174
5198
  import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
5175
- var UnifiedModelSelector = forwardRef6(function UnifiedModelSelector2({ provider, model, onChange, disabled = false }, ref) {
5199
+ var UnifiedModelSelector = forwardRef6(function UnifiedModelSelector2({ provider, model, onChange, disabled = false, dropdownMode = "absolute" }, ref) {
5176
5200
  const { data: allModels } = useAllModels();
5177
5201
  const { data: currentProviderModels, isLoading: isCurrentProviderLoading } = useModels(provider);
5178
5202
  const [isOpen, setIsOpen] = useState10(false);
@@ -5425,6 +5449,7 @@ var UnifiedModelSelector = forwardRef6(function UnifiedModelSelector2({ provider
5425
5449
  const currentProviderLabel = loadedModels[provider]?.label || currentProviderModels?.label || provider;
5426
5450
  const currentModelLabel = loadedModels[provider]?.models.find((m) => m.id === model)?.label || currentProviderModels?.models.find((m) => m.id === model)?.label || model;
5427
5451
  const displayedProviderKeys = searchQuery.trim() ? Object.keys(filteredModels) : configuredProviders;
5452
+ const dropdownPositionClass = dropdownMode === "inline" ? "relative" : "absolute z-50";
5428
5453
  return /* @__PURE__ */ jsxs10("div", {
5429
5454
  ref: dropdownRef,
5430
5455
  className: "relative w-full",
@@ -5458,7 +5483,7 @@ var UnifiedModelSelector = forwardRef6(function UnifiedModelSelector2({ provider
5458
5483
  ]
5459
5484
  }),
5460
5485
  isOpen && /* @__PURE__ */ jsxs10("div", {
5461
- className: "absolute z-50 mt-1 w-full bg-[hsl(var(--popover))] border border-[hsl(var(--border))] rounded-md shadow-lg max-h-80 overflow-hidden flex flex-col",
5486
+ className: `${dropdownPositionClass} mt-1 w-full bg-[hsl(var(--popover))] border border-[hsl(var(--border))] rounded-md shadow-lg max-h-80 overflow-hidden flex flex-col`,
5462
5487
  children: [
5463
5488
  /* @__PURE__ */ jsx16("div", {
5464
5489
  className: "p-2 border-b border-[hsl(var(--border))]",
@@ -5892,7 +5917,8 @@ function ConfigModal({
5892
5917
  ref: modelSelectorRef,
5893
5918
  provider,
5894
5919
  model,
5895
- onChange: handleModelChange
5920
+ onChange: handleModelChange,
5921
+ dropdownMode: "inline"
5896
5922
  })
5897
5923
  ]
5898
5924
  })
@@ -21167,7 +21193,8 @@ var ResearchSidebarToggle = memo30(function ResearchSidebarToggle2({
21167
21193
  });
21168
21194
  });
21169
21195
  // src/components/settings/SettingsSidebar.tsx
21170
- import { memo as memo31, useState as useState39, useMemo as useMemo22, useCallback as useCallback27, useEffect as useEffect37 } from "react";
21196
+ import { memo as memo31, useState as useState39, useMemo as useMemo22, useCallback as useCallback27, useEffect as useEffect37, useRef as useRef26 } from "react";
21197
+ import { createPortal } from "react-dom";
21171
21198
  import {
21172
21199
  Settings as Settings2,
21173
21200
  ChevronRight as ChevronRight13,
@@ -21182,7 +21209,9 @@ import {
21182
21209
  Copy as Copy3,
21183
21210
  Check as Check11,
21184
21211
  Key,
21185
- Loader2 as Loader210
21212
+ Loader2 as Loader210,
21213
+ Type,
21214
+ Sparkles as Sparkles6
21186
21215
  } from "lucide-react";
21187
21216
  import { QRCodeSVG } from "qrcode.react";
21188
21217
 
@@ -21589,6 +21618,26 @@ var SETTINGS_PANEL_KEY = "settings";
21589
21618
  var SETTINGS_DEFAULT_WIDTH = 320;
21590
21619
  var SETTINGS_MIN_WIDTH = 320;
21591
21620
  var SETTINGS_MAX_WIDTH = 500;
21621
+ var DEFAULT_FONT_FAMILY2 = "IBM Plex Mono";
21622
+ var COMMON_SYSTEM_FONTS = [
21623
+ DEFAULT_FONT_FAMILY2,
21624
+ "System UI",
21625
+ "Arial",
21626
+ "Avenir",
21627
+ "BlinkMacSystemFont",
21628
+ "Courier New",
21629
+ "Fira Code",
21630
+ "Georgia",
21631
+ "Helvetica",
21632
+ "Inter",
21633
+ "Menlo",
21634
+ "Monaco",
21635
+ "SF Mono",
21636
+ "Segoe UI",
21637
+ "Times New Roman",
21638
+ "Ubuntu",
21639
+ "Verdana"
21640
+ ];
21592
21641
  var SettingsSection = memo31(function SettingsSection2({
21593
21642
  title,
21594
21643
  icon,
@@ -21637,10 +21686,10 @@ var ToggleRow = memo31(function ToggleRow2({
21637
21686
  onChange
21638
21687
  }) {
21639
21688
  return /* @__PURE__ */ jsxs80("div", {
21640
- className: "flex items-center justify-between text-sm",
21689
+ className: "flex min-w-0 items-center justify-between gap-3 text-sm",
21641
21690
  children: [
21642
21691
  /* @__PURE__ */ jsx88("span", {
21643
- className: "text-muted-foreground",
21692
+ className: "min-w-0 flex-1 truncate text-muted-foreground",
21644
21693
  children: label
21645
21694
  }),
21646
21695
  /* @__PURE__ */ jsx88("button", {
@@ -21648,7 +21697,7 @@ var ToggleRow = memo31(function ToggleRow2({
21648
21697
  role: "switch",
21649
21698
  "aria-checked": checked,
21650
21699
  onClick: () => onChange(!checked),
21651
- className: `relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 ${checked ? "bg-primary" : "bg-muted"}`,
21700
+ className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 ${checked ? "bg-primary" : "bg-muted"}`,
21652
21701
  children: /* @__PURE__ */ jsx88("span", {
21653
21702
  className: `inline-block h-4 w-4 transform rounded-full transition-transform ${checked ? "translate-x-6" : "translate-x-1"} ${checked ? "bg-primary-foreground" : "bg-foreground"}`
21654
21703
  })
@@ -21664,7 +21713,31 @@ var SelectRow = memo31(function SelectRow2({
21664
21713
  disabled
21665
21714
  }) {
21666
21715
  const [isOpen, setIsOpen] = useState39(false);
21716
+ const [menuStyle, setMenuStyle] = useState39(null);
21717
+ const buttonRef = useRef26(null);
21667
21718
  const selectedOption = options.find((o) => o.id === value);
21719
+ useEffect37(() => {
21720
+ if (!isOpen || !buttonRef.current)
21721
+ return;
21722
+ const update = () => {
21723
+ const rect = buttonRef.current?.getBoundingClientRect();
21724
+ if (!rect)
21725
+ return;
21726
+ const width = Math.max(rect.width, 160);
21727
+ setMenuStyle({
21728
+ top: rect.bottom + 4,
21729
+ left: rect.right - width,
21730
+ width
21731
+ });
21732
+ };
21733
+ update();
21734
+ window.addEventListener("scroll", update, true);
21735
+ window.addEventListener("resize", update);
21736
+ return () => {
21737
+ window.removeEventListener("scroll", update, true);
21738
+ window.removeEventListener("resize", update);
21739
+ };
21740
+ }, [isOpen]);
21668
21741
  return /* @__PURE__ */ jsxs80("div", {
21669
21742
  className: "flex items-center justify-between text-sm",
21670
21743
  children: [
@@ -21676,6 +21749,7 @@ var SelectRow = memo31(function SelectRow2({
21676
21749
  className: "relative",
21677
21750
  children: [
21678
21751
  /* @__PURE__ */ jsxs80("button", {
21752
+ ref: buttonRef,
21679
21753
  type: "button",
21680
21754
  onClick: () => !disabled && setIsOpen(!isOpen),
21681
21755
  disabled,
@@ -21690,15 +21764,20 @@ var SelectRow = memo31(function SelectRow2({
21690
21764
  })
21691
21765
  ]
21692
21766
  }),
21693
- isOpen && /* @__PURE__ */ jsxs80(Fragment35, {
21767
+ isOpen && menuStyle && typeof document !== "undefined" && createPortal(/* @__PURE__ */ jsxs80(Fragment35, {
21694
21768
  children: [
21695
21769
  /* @__PURE__ */ jsx88("div", {
21696
- className: "fixed inset-0 z-40",
21770
+ className: "fixed inset-0 z-[10000]",
21697
21771
  onClick: () => setIsOpen(false),
21698
21772
  role: "presentation"
21699
21773
  }),
21700
21774
  /* @__PURE__ */ jsx88("div", {
21701
- className: "absolute right-0 top-full mt-1 z-50 min-w-[160px] max-h-[200px] overflow-y-auto bg-popover border border-border rounded-md shadow-lg",
21775
+ className: "fixed z-[10001] max-h-[240px] overflow-y-auto bg-popover border border-border rounded-md shadow-lg",
21776
+ style: {
21777
+ top: menuStyle.top,
21778
+ left: menuStyle.left,
21779
+ minWidth: menuStyle.width
21780
+ },
21702
21781
  children: options.map((option) => /* @__PURE__ */ jsx88("button", {
21703
21782
  type: "button",
21704
21783
  onClick: () => {
@@ -21710,12 +21789,135 @@ var SelectRow = memo31(function SelectRow2({
21710
21789
  }, option.id))
21711
21790
  })
21712
21791
  ]
21713
- })
21792
+ }), document.body)
21714
21793
  ]
21715
21794
  })
21716
21795
  ]
21717
21796
  });
21718
21797
  });
21798
+ var FontPickerRow = memo31(function FontPickerRow2({
21799
+ value,
21800
+ onChange
21801
+ }) {
21802
+ const [isOpen, setIsOpen] = useState39(false);
21803
+ const [search, setSearch] = useState39("");
21804
+ const [localFonts, setLocalFonts] = useState39([]);
21805
+ const [isLoadingFonts, setIsLoadingFonts] = useState39(false);
21806
+ const [fontError, setFontError] = useState39(null);
21807
+ const canQueryLocalFonts = typeof window !== "undefined" && typeof window.queryLocalFonts === "function";
21808
+ const fontOptions = useMemo22(() => {
21809
+ return Array.from(new Set([value, ...localFonts, ...COMMON_SYSTEM_FONTS].filter(Boolean))).sort((a, b) => a.localeCompare(b));
21810
+ }, [localFonts, value]);
21811
+ const filteredFonts = useMemo22(() => {
21812
+ const query = search.trim().toLowerCase();
21813
+ if (!query)
21814
+ return fontOptions;
21815
+ return fontOptions.filter((font) => font.toLowerCase().includes(query));
21816
+ }, [fontOptions, search]);
21817
+ const loadLocalFonts = useCallback27(async () => {
21818
+ if (isLoadingFonts || localFonts.length > 0)
21819
+ return;
21820
+ const queryLocalFonts = window.queryLocalFonts;
21821
+ if (!queryLocalFonts) {
21822
+ setFontError("Local font access is not supported in this browser");
21823
+ return;
21824
+ }
21825
+ setIsLoadingFonts(true);
21826
+ setFontError(null);
21827
+ try {
21828
+ const fonts = await queryLocalFonts();
21829
+ setLocalFonts(Array.from(new Set(fonts.map((font) => font.family).filter(Boolean))));
21830
+ } catch (error) {
21831
+ setFontError(error instanceof Error ? error.message : "Unable to load local fonts");
21832
+ } finally {
21833
+ setIsLoadingFonts(false);
21834
+ }
21835
+ }, [isLoadingFonts, localFonts.length]);
21836
+ const openPicker = () => {
21837
+ setIsOpen(true);
21838
+ loadLocalFonts();
21839
+ };
21840
+ return /* @__PURE__ */ jsx88("div", {
21841
+ className: "space-y-2 text-sm",
21842
+ children: /* @__PURE__ */ jsxs80("div", {
21843
+ className: "flex items-center justify-between gap-3",
21844
+ children: [
21845
+ /* @__PURE__ */ jsx88("span", {
21846
+ className: "text-muted-foreground",
21847
+ children: "UI Font"
21848
+ }),
21849
+ /* @__PURE__ */ jsxs80("div", {
21850
+ className: "relative min-w-0",
21851
+ children: [
21852
+ /* @__PURE__ */ jsxs80("button", {
21853
+ type: "button",
21854
+ onClick: () => isOpen ? setIsOpen(false) : openPicker(),
21855
+ className: "flex max-w-[170px] items-center gap-1 rounded border border-border bg-muted px-2 py-1 text-xs hover:bg-muted/80",
21856
+ children: [
21857
+ /* @__PURE__ */ jsx88("span", {
21858
+ className: "truncate",
21859
+ style: { fontFamily: value },
21860
+ children: value || DEFAULT_FONT_FAMILY2
21861
+ }),
21862
+ /* @__PURE__ */ jsx88(ChevronDown9, {
21863
+ className: "h-3 w-3 shrink-0"
21864
+ })
21865
+ ]
21866
+ }),
21867
+ isOpen && /* @__PURE__ */ jsxs80(Fragment35, {
21868
+ children: [
21869
+ /* @__PURE__ */ jsx88("div", {
21870
+ className: "fixed inset-0 z-40",
21871
+ onClick: () => setIsOpen(false),
21872
+ role: "presentation"
21873
+ }),
21874
+ /* @__PURE__ */ jsxs80("div", {
21875
+ className: "absolute right-0 top-full z-50 mt-1 w-72 rounded-md border border-border bg-popover shadow-lg",
21876
+ children: [
21877
+ /* @__PURE__ */ jsx88("div", {
21878
+ className: "border-b border-border p-2",
21879
+ children: /* @__PURE__ */ jsx88("input", {
21880
+ type: "search",
21881
+ value: search,
21882
+ onChange: (event) => setSearch(event.target.value),
21883
+ placeholder: "Search system fonts...",
21884
+ className: "w-full rounded border border-border bg-background px-2 py-1.5 text-xs outline-none placeholder:text-muted-foreground/70 focus:border-primary"
21885
+ })
21886
+ }),
21887
+ /* @__PURE__ */ jsxs80("div", {
21888
+ className: "max-h-64 overflow-y-auto py-1",
21889
+ children: [
21890
+ filteredFonts.map((font) => /* @__PURE__ */ jsx88("button", {
21891
+ type: "button",
21892
+ onClick: () => {
21893
+ onChange(font);
21894
+ setIsOpen(false);
21895
+ setSearch("");
21896
+ },
21897
+ className: `w-full px-3 py-2 text-left text-xs hover:bg-muted ${font === value ? "bg-muted/50" : ""}`,
21898
+ style: { fontFamily: font },
21899
+ children: font
21900
+ }, font)),
21901
+ filteredFonts.length === 0 && /* @__PURE__ */ jsx88("div", {
21902
+ className: "px-3 py-2 text-xs text-muted-foreground",
21903
+ children: "No fonts found"
21904
+ })
21905
+ ]
21906
+ }),
21907
+ /* @__PURE__ */ jsx88("div", {
21908
+ className: "border-t border-border px-3 py-2 text-xs text-muted-foreground",
21909
+ children: isLoadingFonts ? "Loading local fonts..." : fontError ? fontError : localFonts.length > 0 ? `${localFonts.length} local fonts found` : canQueryLocalFonts ? "Choose a font or allow local font access if prompted" : "Showing common system fonts"
21910
+ })
21911
+ ]
21912
+ })
21913
+ ]
21914
+ })
21915
+ ]
21916
+ })
21917
+ ]
21918
+ })
21919
+ });
21920
+ });
21719
21921
  var NumberInputRow = memo31(function NumberInputRow2({
21720
21922
  label,
21721
21923
  value,
@@ -21793,13 +21995,130 @@ var NumberInputRow = memo31(function NumberInputRow2({
21793
21995
  ]
21794
21996
  });
21795
21997
  });
21998
+ function PreferencesModal({ isOpen, onClose }) {
21999
+ const { data: config2 } = useConfig();
22000
+ const { preferences: preferences2, updatePreferences } = usePreferences();
22001
+ const updateDefaults = useUpdateDefaults();
22002
+ return /* @__PURE__ */ jsx88(Modal, {
22003
+ isOpen,
22004
+ onClose,
22005
+ title: "Preferences",
22006
+ maxWidth: "lg",
22007
+ children: /* @__PURE__ */ jsxs80("div", {
22008
+ className: "-m-6",
22009
+ children: [
22010
+ /* @__PURE__ */ jsxs80(SettingsSection, {
22011
+ title: "Editor",
22012
+ icon: /* @__PURE__ */ jsx88(Type, {
22013
+ className: "w-4 h-4 text-muted-foreground"
22014
+ }),
22015
+ children: [
22016
+ /* @__PURE__ */ jsx88(ToggleRow, {
22017
+ label: "Vim Mode",
22018
+ checked: preferences2.vimMode,
22019
+ onChange: (checked) => updatePreferences({ vimMode: checked })
22020
+ }),
22021
+ /* @__PURE__ */ jsx88(ToggleRow, {
22022
+ label: "Compact Thread",
22023
+ checked: preferences2.compactThread,
22024
+ onChange: (checked) => updatePreferences({ compactThread: checked })
22025
+ }),
22026
+ /* @__PURE__ */ jsx88(ToggleRow, {
22027
+ label: "Full Width Content",
22028
+ checked: preferences2.fullWidthContent,
22029
+ onChange: (checked) => updatePreferences({ fullWidthContent: checked })
22030
+ }),
22031
+ /* @__PURE__ */ jsx88(FontPickerRow, {
22032
+ value: preferences2.fontFamily,
22033
+ onChange: (fontFamily) => updatePreferences({ fontFamily })
22034
+ })
22035
+ ]
22036
+ }),
22037
+ /* @__PURE__ */ jsxs80(SettingsSection, {
22038
+ title: "Automation",
22039
+ icon: /* @__PURE__ */ jsx88(Zap, {
22040
+ className: "w-4 h-4 text-muted-foreground"
22041
+ }),
22042
+ children: [
22043
+ /* @__PURE__ */ jsx88(NumberInputRow, {
22044
+ label: "Auto Compact",
22045
+ value: config2?.defaults?.autoCompactThresholdTokens,
22046
+ onCommit: (value) => updateDefaults.mutate({
22047
+ autoCompactThresholdTokens: value,
22048
+ scope: "global"
22049
+ }),
22050
+ placeholder: "Tokens",
22051
+ disabled: updateDefaults.isPending
22052
+ }),
22053
+ /* @__PURE__ */ jsx88(SelectRow, {
22054
+ label: "Tool Approval",
22055
+ value: config2?.defaults?.toolApproval ?? "dangerous",
22056
+ options: [
22057
+ { id: "auto", label: "Auto (no approval)" },
22058
+ { id: "dangerous", label: "Dangerous only" },
22059
+ { id: "yolo", label: "YOLO (hard blocks only)" },
22060
+ { id: "all", label: "All tools" }
22061
+ ],
22062
+ onChange: (value) => updateDefaults.mutate({
22063
+ toolApproval: value,
22064
+ scope: "global"
22065
+ }),
22066
+ disabled: updateDefaults.isPending
22067
+ }),
22068
+ /* @__PURE__ */ jsx88(ToggleRow, {
22069
+ label: "Guided Mode",
22070
+ checked: config2?.defaults?.guidedMode ?? false,
22071
+ onChange: (checked) => updateDefaults.mutate({
22072
+ guidedMode: checked,
22073
+ scope: "global"
22074
+ })
22075
+ })
22076
+ ]
22077
+ }),
22078
+ /* @__PURE__ */ jsxs80(SettingsSection, {
22079
+ title: "Reasoning",
22080
+ icon: /* @__PURE__ */ jsx88(Sparkles6, {
22081
+ className: "w-4 h-4 text-muted-foreground"
22082
+ }),
22083
+ children: [
22084
+ /* @__PURE__ */ jsx88(ToggleRow, {
22085
+ label: "Show Reasoning",
22086
+ checked: config2?.defaults?.reasoningText ?? true,
22087
+ onChange: (checked) => updateDefaults.mutate({
22088
+ reasoningText: checked,
22089
+ scope: "global"
22090
+ })
22091
+ }),
22092
+ /* @__PURE__ */ jsx88(SelectRow, {
22093
+ label: "Reasoning Level",
22094
+ value: config2?.defaults?.reasoningLevel ?? "high",
22095
+ options: [
22096
+ { id: "minimal", label: "Minimal" },
22097
+ { id: "low", label: "Low" },
22098
+ { id: "medium", label: "Medium" },
22099
+ { id: "high", label: "High" },
22100
+ { id: "max", label: "Max" },
22101
+ { id: "xhigh", label: "Extra High" }
22102
+ ],
22103
+ onChange: (value) => updateDefaults.mutate({
22104
+ reasoningLevel: value,
22105
+ scope: "global"
22106
+ }),
22107
+ disabled: updateDefaults.isPending
22108
+ })
22109
+ ]
22110
+ })
22111
+ ]
22112
+ })
22113
+ });
22114
+ }
21796
22115
  var SettingsSidebar = memo31(function SettingsSidebar2() {
21797
22116
  const isExpanded = useSettingsStore((state) => state.isExpanded);
21798
22117
  const collapseSidebar = useSettingsStore((state) => state.collapseSidebar);
22118
+ const [isPreferencesOpen, setIsPreferencesOpen] = useState39(false);
21799
22119
  const panelWidth = usePanelWidthStore((s) => s.widths[SETTINGS_PANEL_KEY] ?? SETTINGS_DEFAULT_WIDTH);
21800
22120
  const { data: config2 } = useConfig();
21801
22121
  const { data: allModels } = useAllModels();
21802
- const { preferences: preferences2, updatePreferences } = usePreferences();
21803
22122
  const updateDefaults = useUpdateDefaults();
21804
22123
  const ottorouterBalance = useOttoRouterStore((s) => s.balance);
21805
22124
  const ottorouterWallet = useOttoRouterStore((s) => s.walletAddress);
@@ -21925,87 +22244,6 @@ var SettingsSidebar = memo31(function SettingsSidebar2() {
21925
22244
  })
21926
22245
  ]
21927
22246
  }),
21928
- /* @__PURE__ */ jsxs80(SettingsSection, {
21929
- title: "Preferences",
21930
- icon: /* @__PURE__ */ jsx88(User3, {
21931
- className: "w-4 h-4 text-muted-foreground"
21932
- }),
21933
- children: [
21934
- /* @__PURE__ */ jsx88(ToggleRow, {
21935
- label: "Vim Mode",
21936
- checked: preferences2.vimMode,
21937
- onChange: (checked) => updatePreferences({ vimMode: checked })
21938
- }),
21939
- /* @__PURE__ */ jsx88(ToggleRow, {
21940
- label: "Compact Thread",
21941
- checked: preferences2.compactThread,
21942
- onChange: (checked) => updatePreferences({ compactThread: checked })
21943
- }),
21944
- /* @__PURE__ */ jsx88(ToggleRow, {
21945
- label: "Full Width Content",
21946
- checked: preferences2.fullWidthContent,
21947
- onChange: (checked) => updatePreferences({ fullWidthContent: checked })
21948
- }),
21949
- /* @__PURE__ */ jsx88(NumberInputRow, {
21950
- label: "Auto Compact",
21951
- value: config2?.defaults?.autoCompactThresholdTokens,
21952
- onCommit: (value) => updateDefaults.mutate({
21953
- autoCompactThresholdTokens: value,
21954
- scope: "global"
21955
- }),
21956
- placeholder: "Tokens",
21957
- disabled: updateDefaults.isPending
21958
- }),
21959
- /* @__PURE__ */ jsx88(ToggleRow, {
21960
- label: "Show Reasoning",
21961
- checked: config2?.defaults?.reasoningText ?? true,
21962
- onChange: (checked) => updateDefaults.mutate({
21963
- reasoningText: checked,
21964
- scope: "global"
21965
- })
21966
- }),
21967
- /* @__PURE__ */ jsx88(SelectRow, {
21968
- label: "Reasoning Level",
21969
- value: config2?.defaults?.reasoningLevel ?? "high",
21970
- options: [
21971
- { id: "minimal", label: "Minimal" },
21972
- { id: "low", label: "Low" },
21973
- { id: "medium", label: "Medium" },
21974
- { id: "high", label: "High" },
21975
- { id: "max", label: "Max" },
21976
- { id: "xhigh", label: "Extra High" }
21977
- ],
21978
- onChange: (value) => updateDefaults.mutate({
21979
- reasoningLevel: value,
21980
- scope: "global"
21981
- }),
21982
- disabled: updateDefaults.isPending
21983
- }),
21984
- /* @__PURE__ */ jsx88(SelectRow, {
21985
- label: "Tool Approval",
21986
- value: config2?.defaults?.toolApproval ?? "dangerous",
21987
- options: [
21988
- { id: "auto", label: "Auto (no approval)" },
21989
- { id: "dangerous", label: "Dangerous only" },
21990
- { id: "yolo", label: "YOLO (hard blocks only)" },
21991
- { id: "all", label: "All tools" }
21992
- ],
21993
- onChange: (value) => updateDefaults.mutate({
21994
- toolApproval: value,
21995
- scope: "global"
21996
- }),
21997
- disabled: updateDefaults.isPending
21998
- }),
21999
- /* @__PURE__ */ jsx88(ToggleRow, {
22000
- label: "Guided Mode",
22001
- checked: config2?.defaults?.guidedMode ?? false,
22002
- onChange: (checked) => updateDefaults.mutate({
22003
- guidedMode: checked,
22004
- scope: "global"
22005
- })
22006
- })
22007
- ]
22008
- }),
22009
22247
  /* @__PURE__ */ jsx88(SettingsSection, {
22010
22248
  title: "Providers",
22011
22249
  icon: /* @__PURE__ */ jsx88(Zap, {
@@ -22048,6 +22286,28 @@ var SettingsSidebar = memo31(function SettingsSidebar2() {
22048
22286
  }),
22049
22287
  /* @__PURE__ */ jsx88(OttoRouterTopupModal, {})
22050
22288
  ]
22289
+ }),
22290
+ /* @__PURE__ */ jsxs80("button", {
22291
+ type: "button",
22292
+ onClick: () => setIsPreferencesOpen(true),
22293
+ title: "Open preferences",
22294
+ className: "group shrink-0 w-full h-12 px-4 flex items-center gap-2 bg-muted/20 hover:bg-muted/60 border-t border-border transition-colors text-left cursor-pointer",
22295
+ children: [
22296
+ /* @__PURE__ */ jsx88(User3, {
22297
+ className: "w-4 h-4 text-muted-foreground group-hover:text-foreground transition-colors"
22298
+ }),
22299
+ /* @__PURE__ */ jsx88("span", {
22300
+ className: "text-sm flex-1 text-muted-foreground group-hover:text-foreground transition-colors",
22301
+ children: "Preferences"
22302
+ }),
22303
+ /* @__PURE__ */ jsx88(ChevronRight13, {
22304
+ className: "w-4 h-4 text-muted-foreground group-hover:text-foreground group-hover:translate-x-0.5 transition-all"
22305
+ })
22306
+ ]
22307
+ }),
22308
+ /* @__PURE__ */ jsx88(PreferencesModal, {
22309
+ isOpen: isPreferencesOpen,
22310
+ onClose: () => setIsPreferencesOpen(false)
22051
22311
  })
22052
22312
  ]
22053
22313
  })
@@ -22410,7 +22670,7 @@ import { QRCodeSVG as QRCodeSVG2 } from "qrcode.react";
22410
22670
 
22411
22671
  // src/hooks/useTunnel.ts
22412
22672
  import { useQuery as useQuery12, useMutation as useMutation9, useQueryClient as useQueryClient16 } from "@tanstack/react-query";
22413
- import { useEffect as useEffect38, useCallback as useCallback28, useRef as useRef26 } from "react";
22673
+ import { useEffect as useEffect38, useCallback as useCallback28, useRef as useRef27 } from "react";
22414
22674
  async function fetchTunnelStatus() {
22415
22675
  const response = await fetch(`${API_BASE_URL}/v1/tunnel/status`);
22416
22676
  if (!response.ok) {
@@ -22518,7 +22778,7 @@ function useTunnelStream() {
22518
22778
  const setError = useTunnelStore((s) => s.setError);
22519
22779
  const setProgress = useTunnelStore((s) => s.setProgress);
22520
22780
  const isExpanded = useTunnelStore((s) => s.isExpanded);
22521
- const eventSourceRef = useRef26(null);
22781
+ const eventSourceRef = useRef27(null);
22522
22782
  const connect = useCallback28(() => {
22523
22783
  if (eventSourceRef.current) {
22524
22784
  eventSourceRef.current.close();
@@ -22818,7 +23078,7 @@ var TunnelSidebarToggle = memo34(function TunnelSidebarToggle2() {
22818
23078
  });
22819
23079
  });
22820
23080
  // src/components/mcp/MCPSidebar.tsx
22821
- import { memo as memo37, useState as useState42, useCallback as useCallback31, useMemo as useMemo23, useEffect as useEffect41, useRef as useRef29 } from "react";
23081
+ import { memo as memo37, useState as useState42, useCallback as useCallback31, useMemo as useMemo23, useEffect as useEffect41, useRef as useRef30 } from "react";
22822
23082
  import {
22823
23083
  ChevronDown as ChevronDown10,
22824
23084
  ChevronRight as ChevronRight15,
@@ -22838,7 +23098,7 @@ import { useQueryClient as useQueryClient18 } from "@tanstack/react-query";
22838
23098
 
22839
23099
  // src/hooks/useMCP.ts
22840
23100
  import { useQuery as useQuery13, useMutation as useMutation10, useQueryClient as useQueryClient17 } from "@tanstack/react-query";
22841
- import { useEffect as useEffect39, useRef as useRef27, useCallback as useCallback29 } from "react";
23101
+ import { useEffect as useEffect39, useRef as useRef28, useCallback as useCallback29 } from "react";
22842
23102
  import {
22843
23103
  listMcpServers,
22844
23104
  startMcpServer,
@@ -23004,7 +23264,7 @@ function useCopilotDevicePoller() {
23004
23264
  const setCopilotDevice = useMCPStore((s) => s.setCopilotDevice);
23005
23265
  const setLoading = useMCPStore((s) => s.setLoading);
23006
23266
  const queryClient = useQueryClient17();
23007
- const timerRef = useRef27(null);
23267
+ const timerRef = useRef28(null);
23008
23268
  const stopPolling = useCallback29(() => {
23009
23269
  if (timerRef.current) {
23010
23270
  clearInterval(timerRef.current);
@@ -23047,7 +23307,7 @@ function useCopilotDevicePoller() {
23047
23307
  }
23048
23308
 
23049
23309
  // src/components/mcp/AddMCPServerModal.tsx
23050
- import { memo as memo35, useState as useState41, useCallback as useCallback30, useRef as useRef28, useEffect as useEffect40 } from "react";
23310
+ import { memo as memo35, useState as useState41, useCallback as useCallback30, useRef as useRef29, useEffect as useEffect40 } from "react";
23051
23311
  import { Globe as Globe5, Laptop, Loader2 as Loader212, FolderDot, Terminal as Terminal9 } from "lucide-react";
23052
23312
  import { jsx as jsx92, jsxs as jsxs83, Fragment as Fragment37 } from "react/jsx-runtime";
23053
23313
  function parseCommandString(input) {
@@ -23168,7 +23428,7 @@ var AddMCPServerModal = memo35(function AddMCPServerModal2({
23168
23428
  addServer,
23169
23429
  handleClose
23170
23430
  ]);
23171
- const contentRef = useRef28(null);
23431
+ const contentRef = useRef29(null);
23172
23432
  const [contentHeight, setContentHeight] = useState41(undefined);
23173
23433
  useEffect40(() => {
23174
23434
  const el = contentRef.current;
@@ -23706,7 +23966,7 @@ var MCPServerCard = memo37(function MCPServerCard2({
23706
23966
  });
23707
23967
  function useAuthPoller(name, onAuthenticated) {
23708
23968
  const { data } = useMCPAuthStatus(name);
23709
- const prevAuth = useRef29(false);
23969
+ const prevAuth = useRef30(false);
23710
23970
  useEffect41(() => {
23711
23971
  if (data?.authenticated && !prevAuth.current) {
23712
23972
  onAuthenticated();
@@ -24004,7 +24264,7 @@ var MCPSidebarToggle = memo38(function MCPSidebarToggle2() {
24004
24264
  import { memo as memo39, useMemo as useMemo24 } from "react";
24005
24265
  import {
24006
24266
  ChevronRight as ChevronRight16,
24007
- Sparkles as Sparkles6,
24267
+ Sparkles as Sparkles7,
24008
24268
  Loader2 as Loader215,
24009
24269
  FolderDot as FolderDot3,
24010
24270
  Laptop as Laptop3,
@@ -24147,7 +24407,7 @@ var SkillsSidebar = memo39(function SkillsSidebar2() {
24147
24407
  /* @__PURE__ */ jsxs86("div", {
24148
24408
  className: "flex items-center gap-2",
24149
24409
  children: [
24150
- /* @__PURE__ */ jsx96(Sparkles6, {
24410
+ /* @__PURE__ */ jsx96(Sparkles7, {
24151
24411
  className: "w-4 h-4 text-muted-foreground"
24152
24412
  }),
24153
24413
  /* @__PURE__ */ jsx96("span", {
@@ -24273,7 +24533,7 @@ var SkillsSidebar = memo39(function SkillsSidebar2() {
24273
24533
  }) : totalCount === 0 ? /* @__PURE__ */ jsxs86("div", {
24274
24534
  className: "flex flex-col items-center justify-center h-full text-center p-4",
24275
24535
  children: [
24276
- /* @__PURE__ */ jsx96(Sparkles6, {
24536
+ /* @__PURE__ */ jsx96(Sparkles7, {
24277
24537
  className: "w-12 h-12 text-muted-foreground/30 mb-4"
24278
24538
  }),
24279
24539
  /* @__PURE__ */ jsx96("h3", {
@@ -24302,7 +24562,7 @@ var SkillsSidebar = memo39(function SkillsSidebar2() {
24302
24562
  }) : !globalEnabled ? /* @__PURE__ */ jsxs86("div", {
24303
24563
  className: "flex flex-col items-center justify-center h-full text-center p-4",
24304
24564
  children: [
24305
- /* @__PURE__ */ jsx96(Sparkles6, {
24565
+ /* @__PURE__ */ jsx96(Sparkles7, {
24306
24566
  className: "w-12 h-12 text-muted-foreground/30 mb-4"
24307
24567
  }),
24308
24568
  /* @__PURE__ */ jsx96("h3", {
@@ -24317,7 +24577,7 @@ var SkillsSidebar = memo39(function SkillsSidebar2() {
24317
24577
  }) : skills.length === 0 ? /* @__PURE__ */ jsxs86("div", {
24318
24578
  className: "flex flex-col items-center justify-center h-full text-center p-4",
24319
24579
  children: [
24320
- /* @__PURE__ */ jsx96(Sparkles6, {
24580
+ /* @__PURE__ */ jsx96(Sparkles7, {
24321
24581
  className: "w-12 h-12 text-muted-foreground/30 mb-4"
24322
24582
  }),
24323
24583
  /* @__PURE__ */ jsx96("h3", {
@@ -24395,7 +24655,7 @@ var SkillsSidebar = memo39(function SkillsSidebar2() {
24395
24655
  /* @__PURE__ */ jsxs86("div", {
24396
24656
  className: "flex items-center gap-2 min-w-0 flex-1",
24397
24657
  children: [
24398
- /* @__PURE__ */ jsx96(Sparkles6, {
24658
+ /* @__PURE__ */ jsx96(Sparkles7, {
24399
24659
  className: "w-3 h-3 flex-shrink-0"
24400
24660
  }),
24401
24661
  /* @__PURE__ */ jsxs86("span", {
@@ -24428,7 +24688,7 @@ var SkillsSidebar = memo39(function SkillsSidebar2() {
24428
24688
  });
24429
24689
  // src/components/skills/SkillsSidebarToggle.tsx
24430
24690
  import { memo as memo40 } from "react";
24431
- import { Sparkles as Sparkles7 } from "lucide-react";
24691
+ import { Sparkles as Sparkles8 } from "lucide-react";
24432
24692
  import { jsx as jsx97 } from "react/jsx-runtime";
24433
24693
  var SkillsSidebarToggle = memo40(function SkillsSidebarToggle2() {
24434
24694
  const isExpanded = useSkillsStore((state) => state.isExpanded);
@@ -24438,7 +24698,7 @@ var SkillsSidebarToggle = memo40(function SkillsSidebarToggle2() {
24438
24698
  onClick: toggleSidebar,
24439
24699
  className: `relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${isExpanded ? "bg-muted border-primary" : "border-transparent hover:bg-muted/50"}`,
24440
24700
  title: "Skills",
24441
- children: /* @__PURE__ */ jsx97(Sparkles7, {
24701
+ children: /* @__PURE__ */ jsx97(Sparkles8, {
24442
24702
  className: "w-5 h-5 text-muted-foreground mx-auto"
24443
24703
  })
24444
24704
  });
@@ -24991,7 +25251,7 @@ var FileViewerPanel = memo44(function FileViewerPanel2() {
24991
25251
  });
24992
25252
  });
24993
25253
  // src/components/file-browser/QuickFilePicker.tsx
24994
- import { memo as memo45, useState as useState43, useEffect as useEffect45, useRef as useRef30, useCallback as useCallback33, useMemo as useMemo25 } from "react";
25254
+ import { memo as memo45, useState as useState43, useEffect as useEffect45, useRef as useRef31, useCallback as useCallback33, useMemo as useMemo25 } from "react";
24995
25255
  import { FileCode as FileCode4, Search as Search7 } from "lucide-react";
24996
25256
 
24997
25257
  // src/stores/filePickerStore.ts
@@ -25035,8 +25295,8 @@ var QuickFilePicker = memo45(function QuickFilePicker2() {
25035
25295
  const expandSidebar = useFileBrowserStore((s) => s.expandSidebar);
25036
25296
  const [query, setQuery] = useState43("");
25037
25297
  const [selectedIndex, setSelectedIndex] = useState43(0);
25038
- const inputRef = useRef30(null);
25039
- const listRef = useRef30(null);
25298
+ const inputRef = useRef31(null);
25299
+ const listRef = useRef31(null);
25040
25300
  const { data: filesData } = useFiles();
25041
25301
  const ignoredSet = useMemo25(() => new Set(filesData?.ignoredFiles ?? []), [filesData?.ignoredFiles]);
25042
25302
  const filtered = useMemo25(() => {
@@ -25216,7 +25476,7 @@ function HighlightedPath({ path, query }) {
25216
25476
  import { memo as memo48 } from "react";
25217
25477
 
25218
25478
  // src/components/onboarding/steps/ProviderSetupStep.tsx
25219
- import { memo as memo46, useEffect as useEffect46, useState as useState44, useRef as useRef31 } from "react";
25479
+ import { memo as memo46, useEffect as useEffect46, useState as useState44, useRef as useRef32 } from "react";
25220
25480
  import {
25221
25481
  Copy as Copy5,
25222
25482
  Check as Check13,
@@ -25307,20 +25567,20 @@ var ProviderSetupStep = memo46(function ProviderSetupStep2({
25307
25567
  const [copilotCodeCopied, setCopilotCodeCopied] = useState44(false);
25308
25568
  const [copilotModalOpen, setCopilotModalOpen] = useState44(false);
25309
25569
  const [copilotLoading, setCopilotLoading] = useState44(false);
25310
- const copilotPollRef = useRef31(undefined);
25311
- const copilotCancelledRef = useRef31(false);
25312
- const copilotPollFnRef = useRef31(onPollCopilotDeviceFlow);
25570
+ const copilotPollRef = useRef32(undefined);
25571
+ const copilotCancelledRef = useRef32(false);
25572
+ const copilotPollFnRef = useRef32(onPollCopilotDeviceFlow);
25313
25573
  copilotPollFnRef.current = onPollCopilotDeviceFlow;
25314
25574
  const balance = useOttoRouterStore((s) => s.balance);
25315
25575
  const usdcBalance = useOttoRouterStore((s) => s.usdcBalance);
25316
25576
  const payg = useOttoRouterStore((s) => s.payg);
25317
25577
  const subscription = useOttoRouterStore((s) => s.subscription);
25318
25578
  const isBalanceLoading = useOttoRouterStore((s) => s.isLoading);
25319
- const apiKeyInputRef = useRef31(null);
25320
- const oauthCodeInputRef = useRef31(null);
25321
- const importPrivateKeyRef = useRef31(null);
25579
+ const apiKeyInputRef = useRef32(null);
25580
+ const oauthCodeInputRef = useRef32(null);
25581
+ const importPrivateKeyRef = useRef32(null);
25322
25582
  const isTopupModalOpen = useOttoRouterStore((s) => s.isTopupModalOpen);
25323
- const prevTopupModalOpen = useRef31(false);
25583
+ const prevTopupModalOpen = useRef32(false);
25324
25584
  const { fetchBalance } = useOttoRouterBalance("ottorouter");
25325
25585
  const effectivePayg = payg?.effectiveSpendableUsd ?? balance ?? 0;
25326
25586
  const setuStatusLabel = subscription?.active ? `GO ${(subscription.creditsRemaining ?? 0).toFixed(1)} credits` : `$${effectivePayg.toFixed(2)}`;
@@ -26736,8 +26996,8 @@ var ProviderSetupStep = memo46(function ProviderSetupStep2({
26736
26996
  });
26737
26997
 
26738
26998
  // src/components/onboarding/steps/DefaultsStep.tsx
26739
- import { memo as memo47, useState as useState45, useEffect as useEffect47, useId as useId3, useRef as useRef32 } from "react";
26740
- import { Loader2 as Loader217, ArrowLeft, Sparkles as Sparkles8, ChevronDown as ChevronDown12 } from "lucide-react";
26999
+ import { memo as memo47, useState as useState45, useEffect as useEffect47, useId as useId3, useRef as useRef33 } from "react";
27000
+ import { Loader2 as Loader217, ArrowLeft, Sparkles as Sparkles9, ChevronDown as ChevronDown12 } from "lucide-react";
26741
27001
  import { jsx as jsx104, jsxs as jsxs92, Fragment as Fragment40 } from "react/jsx-runtime";
26742
27002
  var DefaultsStep = memo47(function DefaultsStep2({
26743
27003
  authStatus,
@@ -26754,7 +27014,7 @@ var DefaultsStep = memo47(function DefaultsStep2({
26754
27014
  const [selectedAgent, setSelectedAgent] = useState45(authStatus.defaults.agent || "build");
26755
27015
  const [selectedApproval, setSelectedApproval] = useState45(authStatus.defaults.toolApproval || "dangerous");
26756
27016
  const [guidedMode, setGuidedMode] = useState45(false);
26757
- const hasUserChangedProvider = useRef32(false);
27017
+ const hasUserChangedProvider = useRef33(false);
26758
27018
  const providerId = useId3();
26759
27019
  const modelId = useId3();
26760
27020
  const agentId = useId3();
@@ -27081,7 +27341,7 @@ var DefaultsStep = memo47(function DefaultsStep2({
27081
27341
  }) : /* @__PURE__ */ jsxs92(Fragment40, {
27082
27342
  children: [
27083
27343
  "Start Using otto",
27084
- /* @__PURE__ */ jsx104(Sparkles8, {
27344
+ /* @__PURE__ */ jsx104(Sparkles9, {
27085
27345
  className: "w-4 h-4"
27086
27346
  })
27087
27347
  ]
@@ -27688,10 +27948,10 @@ function useImageUpload(options = {}) {
27688
27948
  };
27689
27949
  }
27690
27950
  // src/hooks/useSetuPayments.ts
27691
- import { useEffect as useEffect52, useRef as useRef33 } from "react";
27951
+ import { useEffect as useEffect52, useRef as useRef34 } from "react";
27692
27952
  function useSetuPayments(sessionId) {
27693
- const clientRef = useRef33(null);
27694
- const loadingToastIdRef = useRef33(null);
27953
+ const clientRef = useRef34(null);
27954
+ const loadingToastIdRef = useRef34(null);
27695
27955
  const setBalance = useOttoRouterStore((s) => s.setBalance);
27696
27956
  const setPaymentPending = useOttoRouterStore((s) => s.setPaymentPending);
27697
27957
  const removeToast = useToastStore((s) => s.removeToast);
@@ -28002,4 +28262,4 @@ export {
28002
28262
  API_BASE_URL
28003
28263
  };
28004
28264
 
28005
- //# debugId=7BFF7991CFAF945D64756E2164756E21
28265
+ //# debugId=E3101CA897DB4F5364756E2164756E21