opencami 1.4.0 → 1.5.0

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.
Files changed (77) hide show
  1. package/README.md +60 -0
  2. package/dist/client/assets/CSPContext-EgWK8bIJ.js +1 -0
  3. package/dist/client/assets/DirectionContext-DXtY05YF.js +1 -0
  4. package/dist/client/assets/_sessionKey-B89e7G3y.js +100 -0
  5. package/dist/client/assets/agents-screen-1BiEZ9od.js +1 -0
  6. package/dist/client/assets/agents-x54ocA9z.js +2 -0
  7. package/dist/client/assets/bots-screen-BNQciUeJ.js +1 -0
  8. package/dist/client/assets/bots-x86ZHG4b.js +2 -0
  9. package/dist/client/assets/button-nDcsaNPl.js +1 -0
  10. package/dist/client/assets/{connect-D3baVDFL.js → connect-w4lLOqiJ.js} +1 -1
  11. package/dist/client/assets/file-explorer-screen-CAsjd3w8.js +1 -0
  12. package/dist/client/assets/files-Bype5Mnb.js +2 -0
  13. package/dist/client/assets/{index-ByIsZcHh.js → index-36G0WCxU.js} +1 -1
  14. package/dist/client/assets/{index-CVV4XiZo.js → index-BXkRE220.js} +2 -2
  15. package/dist/client/assets/keyboard-shortcuts-dialog-BdCeXRjD.js +1 -0
  16. package/dist/client/assets/{main-CkIF0soY.js → main-B3N0eQFg.js} +129 -17
  17. package/dist/client/assets/{opencami-logo-CIxSO1oo.js → opencami-logo-DD0DPFRQ.js} +1 -1
  18. package/dist/client/assets/{react-BhVdgA5r.js → react-B16OrBeM.js} +1 -1
  19. package/dist/client/assets/search-dialog-BjTPceEl.js +1 -0
  20. package/dist/client/assets/session-export-dialog-DtHKG2zW.js +1 -0
  21. package/dist/client/assets/settings-dialog-hiqdk_UD.js +1 -0
  22. package/dist/client/assets/skills-DhwyFq3y.js +2 -0
  23. package/dist/client/assets/skills-panel-BLUjzfjJ.js +5 -0
  24. package/dist/client/assets/styles-CHP4l6vZ.css +1 -0
  25. package/dist/client/assets/switch-J6wLIVu2.js +1 -0
  26. package/dist/client/assets/tabs-DvPgTz5I.js +1 -0
  27. package/dist/client/assets/tooltip-C14vdXHK.js +1 -0
  28. package/dist/client/assets/use-file-explorer-state-BnaJEqRP.js +12 -0
  29. package/dist/client/assets/useButton-Bnnac1eR.js +1 -0
  30. package/dist/client/assets/useCompositeItem-BgiEMKAt.js +1 -0
  31. package/dist/client/assets/{useControlled-Y306krcC.js → useControlled-BhUuiHAm.js} +1 -1
  32. package/dist/client/assets/{useMutation-0WgW4xQJ.js → useMutation-CFmVaBag.js} +1 -1
  33. package/dist/client/assets/visuallyHidden-DCCICp6T.js +9 -0
  34. package/dist/server/assets/{_sessionKey-BhFH4uWY.js → _sessionKey-tRze5NLR.js} +178 -46
  35. package/dist/server/assets/_tanstack-start-manifest_v-CyfoMvUa.js +4 -0
  36. package/dist/server/assets/{agents-Dz_i76VW.js → agents-CmQ4vvXm.js} +1 -1
  37. package/dist/server/assets/{agents-screen-CqQPJndp.js → agents-screen-bmrIyFbk.js} +43 -35
  38. package/dist/server/assets/{bots-6ryCIgKh.js → bots-Byt6jv0a.js} +1 -1
  39. package/dist/server/assets/bots-screen-C2TGFv42.js +474 -0
  40. package/dist/server/assets/{button-DtQ3rV1m.js → button-CwY2OHFj.js} +2 -2
  41. package/dist/server/assets/{connect-B8jpGQGK.js → connect-d3AqjAqe.js} +2 -2
  42. package/dist/server/assets/{file-explorer-screen-DCfS_Ajx.js → file-explorer-screen-CVlFiAFu.js} +36 -36
  43. package/dist/server/assets/{files-D2GIrPF4.js → files-BIEcSPGp.js} +1 -1
  44. package/dist/server/assets/{index-BNSsDaLb.js → index-CNIATlJ9.js} +22 -3
  45. package/dist/server/assets/{index-B2JHn34C.js → index-CRfLKh30.js} +2 -1
  46. package/dist/server/assets/{keyboard-shortcuts-dialog-CqIm8aYF.js → keyboard-shortcuts-dialog-CsNP85q8.js} +2 -2
  47. package/dist/server/assets/{router-Dme7USeO.js → router-rn7pJO_D.js} +356 -64
  48. package/dist/server/assets/{search-dialog-DG0D9KRN.js → search-dialog-Bz4Cu0KW.js} +23 -6
  49. package/dist/server/assets/{session-export-dialog-DLPZVlQV.js → session-export-dialog-CwclV0Aj.js} +2 -2
  50. package/dist/server/assets/{settings-dialog-BaGT4e5l.js → settings-dialog-BBM7jCjE.js} +386 -95
  51. package/dist/server/assets/skills-Cy8xclXY.js +11 -0
  52. package/dist/server/assets/skills-panel-BnRNb7u9.js +762 -0
  53. package/dist/server/assets/{switch-DnX0MjGS.js → switch-BbkUeVDV.js} +1 -1
  54. package/dist/server/assets/tabs-DDFZob0m.js +67 -0
  55. package/dist/server/assets/{tooltip-gbV6rEVv.js → tooltip-DgsSPocE.js} +1 -1
  56. package/dist/server/assets/{use-file-explorer-state-DfAKF2gZ.js → use-file-explorer-state-Il1LlBAe.js} +1 -1
  57. package/dist/server/server.js +2 -2
  58. package/package.json +6 -2
  59. package/dist/client/assets/_sessionKey-DB95zj1L.js +0 -97
  60. package/dist/client/assets/agents-LFrWe-HX.js +0 -2
  61. package/dist/client/assets/agents-screen-CEBBk1yO.js +0 -1
  62. package/dist/client/assets/bots-CxDwf_WK.js +0 -2
  63. package/dist/client/assets/bots-screen-D6qma1wK.js +0 -1
  64. package/dist/client/assets/button-Il3CHIzX.js +0 -1
  65. package/dist/client/assets/file-explorer-screen-rtV6n-5_.js +0 -1
  66. package/dist/client/assets/files-DMemuq9D.js +0 -2
  67. package/dist/client/assets/keyboard-shortcuts-dialog-DXC0YHoy.js +0 -1
  68. package/dist/client/assets/search-dialog-I1jJplIh.js +0 -1
  69. package/dist/client/assets/session-export-dialog-CH5unryw.js +0 -1
  70. package/dist/client/assets/settings-dialog-B8v-GVJ8.js +0 -1
  71. package/dist/client/assets/styles-BaTVzdPa.css +0 -1
  72. package/dist/client/assets/switch-sQnv1YsK.js +0 -1
  73. package/dist/client/assets/tooltip-j_viC_EE.js +0 -1
  74. package/dist/client/assets/use-file-explorer-state-BUH-u7Jv.js +0 -12
  75. package/dist/client/assets/useButton-9VAzplAB.js +0 -9
  76. package/dist/server/assets/_tanstack-start-manifest_v-BaIrL1VQ.js +0 -4
  77. package/dist/server/assets/bots-screen-DS_ZF9Ec.js +0 -417
@@ -7,7 +7,7 @@ function cn(...inputs) {
7
7
  return twMerge(clsx(inputs));
8
8
  }
9
9
  const buttonVariants = cva(
10
- "relative inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:ring-primary-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0] select-none duration-150",
10
+ "relative inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:ring-[var(--opencami-accent)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0] select-none duration-150",
11
11
  {
12
12
  defaultVariants: {
13
13
  size: "default",
@@ -24,7 +24,7 @@ const buttonVariants = cva(
24
24
  "icon-xl": "size-11 [&_svg]:size-5"
25
25
  },
26
26
  variant: {
27
- default: "bg-primary-950 text-primary-50 hover:bg-primary-900 shadow-sm outline outline-primary-900/10 shadow-2xs",
27
+ default: "bg-[var(--opencami-accent)] text-white hover:bg-[var(--opencami-accent-hover)] shadow-sm outline outline-primary-900/10 shadow-2xs",
28
28
  secondary: "bg-primary-50 text-primary-950 hover:bg-primary-200 outline outline-primary-900/10 shadow-2xs",
29
29
  outline: "border-primary-200 bg-transparent text-primary-900 hover:bg-primary-50 shadow-2xs outline outline-primary-900/10",
30
30
  ghost: "text-primary-900 hover:bg-primary-200 hover:text-primary-950",
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { C as CodeBlock } from "./index-BNSsDaLb.js";
2
+ import { C as CodeBlock } from "./index-CNIATlJ9.js";
3
3
  import "react";
4
4
  import "@hugeicons/react";
5
5
  import "@hugeicons/core-free-icons";
@@ -38,7 +38,7 @@ import "@shikijs/langs/xml";
38
38
  import "@shikijs/langs/yaml";
39
39
  import "zustand";
40
40
  import "zustand/middleware";
41
- import "./button-DtQ3rV1m.js";
41
+ import "./button-CwY2OHFj.js";
42
42
  import "@base-ui/react/merge-props";
43
43
  import "@base-ui/react/use-render";
44
44
  import "class-variance-authority";
@@ -4,10 +4,10 @@ import { useQuery, useQueryClient, useMutation } from "@tanstack/react-query";
4
4
  import { HugeiconsIcon } from "@hugeicons/react";
5
5
  import { Home09Icon, SidebarLeft01Icon, ArrowLeft01Icon, Settings01Icon, ArrowRight01Icon, Home02Icon, Menu01Icon, GridViewIcon, ArrowUp01Icon, ArrowDown01Icon, Upload04Icon, FolderAddIcon, FolderOpenIcon, Download04Icon, FileEditIcon, Edit02Icon, Delete02Icon, Folder01Icon, Image01Icon, Video01Icon, MusicNote01Icon, Archive01Icon, Doc01Icon, CodeIcon, File01Icon, FloppyDiskIcon, Cancel01Icon } from "@hugeicons/core-free-icons";
6
6
  import { motion, AnimatePresence } from "motion/react";
7
- import { T as TooltipProvider, a as TooltipRoot, b as TooltipTrigger, c as TooltipContent, d as chatUiQueryKey, g as getChatUiState, s as setChatUiState } from "./tooltip-gbV6rEVv.js";
8
- import { c as cn, b as buttonVariants, B as Button } from "./button-DtQ3rV1m.js";
7
+ import { T as TooltipProvider, a as TooltipRoot, b as TooltipTrigger, c as TooltipContent, d as chatUiQueryKey, g as getChatUiState, s as setChatUiState } from "./tooltip-DgsSPocE.js";
8
+ import { c as cn, b as buttonVariants, B as Button } from "./button-CwY2OHFj.js";
9
9
  import { Link } from "@tanstack/react-router";
10
- import { u as useFileExplorerState, M as MenuRoot, e as MenuTrigger, f as MenuContent, g as MenuItem, D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-DfAKF2gZ.js";
10
+ import { u as useFileExplorerState, M as MenuRoot, e as MenuTrigger, f as MenuContent, g as MenuItem, D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-Il1LlBAe.js";
11
11
  import "@base-ui/react/tooltip";
12
12
  import "@base-ui/react/merge-props";
13
13
  import "@base-ui/react/use-render";
@@ -1509,35 +1509,35 @@ const GridItem = memo(function GridItem2({
1509
1509
  type: "button",
1510
1510
  whileHover: reduceMotion ? {} : { scale: 1.02 },
1511
1511
  whileTap: reduceMotion ? {} : { scale: 0.98 },
1512
- transition: { duration: reduceMotion ? 0 : 0.1 },
1512
+ transition: { duration: reduceMotion ? 0 : 0.15 },
1513
1513
  onClick: handleClick,
1514
1514
  onDoubleClick: handleDoubleClick,
1515
1515
  onKeyDown: handleKeyDown,
1516
1516
  "aria-label": getItemAriaLabel(),
1517
1517
  className: cn(
1518
- "flex flex-col items-center p-3 rounded-lg w-full",
1519
- "transition-colors duration-150 ease-out",
1520
- "hover:bg-primary-100 focus-visible:bg-primary-100",
1518
+ "flex flex-col items-center p-3 rounded-lg w-full border border-transparent",
1519
+ "transition-all duration-150 ease-out",
1520
+ "hover:bg-primary-50 hover:border-primary-100 focus-visible:bg-primary-50",
1521
1521
  "focus-visible:ring-2 focus-visible:ring-primary-300 focus-visible:outline-none",
1522
1522
  "touch-manipulation",
1523
- isSelected && "bg-primary-200"
1523
+ isSelected && "bg-primary-100 border-primary-200"
1524
1524
  ),
1525
1525
  children: [
1526
1526
  /* @__PURE__ */ jsx(
1527
1527
  HugeiconsIcon,
1528
1528
  {
1529
1529
  icon: getFileIcon(item),
1530
- size: 48,
1530
+ size: 40,
1531
1531
  strokeWidth: 1,
1532
1532
  className: cn(
1533
1533
  "mb-2",
1534
- item.isDir ? "text-blue-500" : "text-primary-600"
1534
+ item.isDir ? "text-sky-500" : "text-primary-500"
1535
1535
  ),
1536
1536
  "aria-hidden": "true"
1537
1537
  }
1538
1538
  ),
1539
- /* @__PURE__ */ jsx("span", { className: "text-xs text-center text-primary-900 font-medium truncate w-full min-w-0", children: item.name }),
1540
- !item.isDir ? /* @__PURE__ */ jsx("span", { className: "text-xs text-primary-500 mt-1 tabular-nums", children: formatFileSize$1(item.size) }) : null
1539
+ /* @__PURE__ */ jsx("span", { className: "text-[11px] text-center text-primary-900 font-medium truncate w-full min-w-0", children: item.name }),
1540
+ !item.isDir ? /* @__PURE__ */ jsx("span", { className: "text-[10px] text-primary-400 mt-0.5 tabular-nums", children: formatFileSize$1(item.size) }) : null
1541
1541
  ]
1542
1542
  }
1543
1543
  );
@@ -1572,54 +1572,54 @@ const ListItem = memo(function ListItem2({
1572
1572
  {
1573
1573
  type: "button",
1574
1574
  whileHover: reduceMotion ? {} : { backgroundColor: "rgb(248 250 252)" },
1575
- transition: { duration: reduceMotion ? 0 : 0.1 },
1575
+ transition: { duration: reduceMotion ? 0 : 0.15 },
1576
1576
  onClick: handleClick,
1577
1577
  onDoubleClick: handleDoubleClick,
1578
1578
  onKeyDown: handleKeyDown,
1579
1579
  "aria-label": getItemAriaLabel(),
1580
1580
  className: cn(
1581
- "w-full grid grid-cols-[auto_1fr_auto_auto] gap-4 px-4 py-3 text-left",
1582
- "transition-colors duration-150 ease-out",
1583
- "hover:bg-primary-100 focus-visible:bg-primary-100",
1581
+ "w-full grid grid-cols-[auto_1fr_auto_auto] gap-4 px-4 py-2.5 text-left",
1582
+ "transition-all duration-150 ease-out",
1583
+ "hover:bg-primary-50 focus-visible:bg-primary-50",
1584
1584
  "focus-visible:ring-2 focus-visible:ring-primary-300 focus-visible:outline-none",
1585
1585
  "touch-manipulation",
1586
- isSelected && "bg-primary-200"
1586
+ isSelected && "bg-primary-100"
1587
1587
  ),
1588
1588
  children: [
1589
1589
  /* @__PURE__ */ jsx(
1590
1590
  HugeiconsIcon,
1591
1591
  {
1592
1592
  icon: getFileIcon(item),
1593
- size: 20,
1593
+ size: 18,
1594
1594
  strokeWidth: 1.5,
1595
1595
  className: cn(
1596
1596
  "mt-0.5 shrink-0",
1597
- item.isDir ? "text-blue-500" : "text-primary-600"
1597
+ item.isDir ? "text-sky-500" : "text-primary-500"
1598
1598
  ),
1599
1599
  "aria-hidden": "true"
1600
1600
  }
1601
1601
  ),
1602
- /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx("span", { className: "text-primary-900 font-medium truncate block", children: item.name }) }),
1603
- /* @__PURE__ */ jsx("div", { className: "text-sm text-primary-600 text-right w-16 tabular-nums shrink-0", children: item.isDir ? "—" : formatFileSize$1(item.size) }),
1604
- /* @__PURE__ */ jsx("div", { className: "text-sm text-primary-600 text-right w-20 tabular-nums shrink-0", children: formatRelativeTime(item.modified) })
1602
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx("span", { className: "text-[13px] text-primary-900 font-medium truncate block", children: item.name }) }),
1603
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500 text-right w-16 tabular-nums shrink-0", children: item.isDir ? "—" : formatFileSize$1(item.size) }),
1604
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500 text-right w-20 tabular-nums shrink-0", children: formatRelativeTime(item.modified) })
1605
1605
  ]
1606
1606
  }
1607
1607
  );
1608
1608
  return /* @__PURE__ */ jsx(FileContextMenu, { item, onOpenFile, children: itemComponent });
1609
1609
  });
1610
- const emptyState = /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
1611
- /* @__PURE__ */ jsx(
1610
+ const emptyState = /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full py-12", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
1611
+ /* @__PURE__ */ jsx("div", { className: "inline-flex items-center justify-center w-12 h-12 rounded-lg bg-primary-50 mb-3", children: /* @__PURE__ */ jsx(
1612
1612
  HugeiconsIcon,
1613
1613
  {
1614
1614
  icon: Folder01Icon,
1615
- size: 48,
1616
- strokeWidth: 1,
1617
- className: "mx-auto text-primary-400 mb-3",
1615
+ size: 24,
1616
+ strokeWidth: 1.5,
1617
+ className: "text-primary-400",
1618
1618
  "aria-hidden": "true"
1619
1619
  }
1620
- ),
1621
- /* @__PURE__ */ jsx("p", { className: "text-primary-600 font-medium", children: "This folder is empty" }),
1622
- /* @__PURE__ */ jsx("p", { className: "text-sm text-primary-500 mt-1", children: "Upload files or create a new folder to get started" })
1620
+ ) }),
1621
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-primary-500", children: "This folder is empty" }),
1622
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-primary-400 mt-1", children: "Upload files or create a new folder to get started" })
1623
1623
  ] }) });
1624
1624
  function FileList({ listing, loading, onOpenFile }) {
1625
1625
  const {
@@ -1727,17 +1727,17 @@ function FileList({ listing, loading, onOpenFile }) {
1727
1727
  role: "table",
1728
1728
  "aria-label": "Files list",
1729
1729
  tabIndex: 0,
1730
- children: /* @__PURE__ */ jsxs("div", { className: "divide-y divide-primary-200", children: [
1730
+ children: /* @__PURE__ */ jsxs("div", { className: "divide-y divide-primary-100", children: [
1731
1731
  /* @__PURE__ */ jsxs(
1732
1732
  "div",
1733
1733
  {
1734
- className: "grid grid-cols-[auto_1fr_auto_auto] gap-4 px-4 py-2 text-sm font-medium text-primary-600 bg-primary-50",
1734
+ className: "grid grid-cols-[auto_1fr_auto_auto] gap-4 px-4 py-2 text-xs font-medium text-primary-400 uppercase tracking-wider bg-primary-50/50",
1735
1735
  role: "row",
1736
1736
  children: [
1737
1737
  /* @__PURE__ */ jsx("div", { className: "w-6", role: "columnheader", "aria-label": "File type" }),
1738
1738
  /* @__PURE__ */ jsx("div", { role: "columnheader", children: "Name" }),
1739
- /* @__PURE__ */ jsx("div", { className: "w-16 text-right tabular-nums", role: "columnheader", children: "Size" }),
1740
- /* @__PURE__ */ jsx("div", { className: "w-20 text-right tabular-nums", role: "columnheader", children: "Modified" })
1739
+ /* @__PURE__ */ jsx("div", { className: "w-16 text-right", role: "columnheader", children: "Size" }),
1740
+ /* @__PURE__ */ jsx("div", { className: "w-20 text-right", role: "columnheader", children: "Modified" })
1741
1741
  ]
1742
1742
  }
1743
1743
  ),
@@ -2398,8 +2398,8 @@ function FileExplorerScreen() {
2398
2398
  /* @__PURE__ */ jsxs("div", { className: cn("h-full overflow-hidden grid grid-cols-[auto_1fr]"), children: [
2399
2399
  sidebar,
2400
2400
  /* @__PURE__ */ jsxs("main", { "aria-label": "File explorer", style: mainStyles, children: [
2401
- /* @__PURE__ */ jsxs("header", { className: "border-b border-primary-200 px-4 py-3", children: [
2402
- /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between mb-2", children: /* @__PURE__ */ jsx(FileBreadcrumb, { path: currentPath }) }),
2401
+ /* @__PURE__ */ jsxs("header", { className: "border-b border-primary-100 px-4 py-3", children: [
2402
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ jsx(FileBreadcrumb, { path: currentPath }) }),
2403
2403
  /* @__PURE__ */ jsx(
2404
2404
  FileToolbar,
2405
2405
  {
@@ -1,6 +1,6 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { Suspense, lazy } from "react";
3
- const FileExplorerScreen = lazy(() => import("./file-explorer-screen-DCfS_Ajx.js").then((m) => ({
3
+ const FileExplorerScreen = lazy(() => import("./file-explorer-screen-CVlFiAFu.js").then((m) => ({
4
4
  default: m.FileExplorerScreen
5
5
  })));
6
6
  function FilesRoute() {
@@ -37,7 +37,7 @@ import langXml from "@shikijs/langs/xml";
37
37
  import langYaml from "@shikijs/langs/yaml";
38
38
  import { create } from "zustand";
39
39
  import { persist } from "zustand/middleware";
40
- import { B as Button, c as cn } from "./button-DtQ3rV1m.js";
40
+ import { B as Button, c as cn } from "./button-CwY2OHFj.js";
41
41
  const useChatSettingsStore = create()(
42
42
  persist(
43
43
  (set) => ({
@@ -46,14 +46,31 @@ const useChatSettingsStore = create()(
46
46
  showReasoningBlocks: true,
47
47
  showSearchSources: true,
48
48
  inlineFilePreview: false,
49
- theme: "system"
49
+ theme: "system",
50
+ fontFamily: "system",
51
+ density: "comfortable",
52
+ accentColor: "green",
53
+ chatWidth: "wide",
54
+ sidebarWidth: "normal",
55
+ bubbleStyle: "default"
50
56
  },
51
57
  updateSettings: (updates) => set((state) => ({
52
58
  settings: { ...state.settings, ...updates }
53
59
  }))
54
60
  }),
55
61
  {
56
- name: "chat-settings"
62
+ name: "chat-settings",
63
+ merge: (persistedState, currentState) => {
64
+ const persisted = persistedState;
65
+ return {
66
+ ...currentState,
67
+ ...persisted,
68
+ settings: {
69
+ ...currentState.settings,
70
+ ...persisted?.settings ?? {}
71
+ }
72
+ };
73
+ }
57
74
  }
58
75
  )
59
76
  );
@@ -81,6 +98,8 @@ function useResolvedTheme() {
81
98
  return useMemo(() => {
82
99
  if (theme === "dark") return "dark";
83
100
  if (theme === "light") return "light";
101
+ if (theme === "frost-light") return "light";
102
+ if (theme === "frost-dark") return "dark";
84
103
  return systemIsDark ? "dark" : "light";
85
104
  }, [theme, systemIsDark]);
86
105
  }
@@ -1,6 +1,6 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { useEffect } from "react";
3
- import { R as Route } from "./router-Dme7USeO.js";
3
+ import { R as Route } from "./router-rn7pJO_D.js";
4
4
  import "@tanstack/react-router";
5
5
  import "@tanstack/react-query";
6
6
  import "node:crypto";
@@ -9,6 +9,7 @@ import "node:fs";
9
9
  import "node:path";
10
10
  import "node:os";
11
11
  import "@tanstack/router-core/ssr/client";
12
+ import "node:child_process";
12
13
  import "node:fs/promises";
13
14
  import "path";
14
15
  function IndexRoute() {
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-DfAKF2gZ.js";
3
- import { B as Button } from "./button-DtQ3rV1m.js";
2
+ import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./use-file-explorer-state-Il1LlBAe.js";
3
+ import { B as Button } from "./button-CwY2OHFj.js";
4
4
  import "@base-ui/react/dialog";
5
5
  import "@base-ui/react/menu";
6
6
  import "zustand";