hermium 0.1.6 → 0.1.7

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 (52) hide show
  1. package/dist/public/assets/{IconAlertCircle-B7TgWpbP.js → IconAlertCircle-C98Iam1j.js} +1 -1
  2. package/dist/public/assets/{IconAlertTriangle-B7IYa46Q.js → IconAlertTriangle-DdD7_dc8.js} +1 -1
  3. package/dist/public/assets/{IconCheck-B-_pWgtP.js → IconCheck-CYZ4_524.js} +1 -1
  4. package/dist/public/assets/{IconLoader2-ClSf33Yd.js → IconLoader2-DkEhzUxZ.js} +1 -1
  5. package/dist/public/assets/{IconRefresh-D4MZeezY.js → IconRefresh-CCXMrUxO.js} +1 -1
  6. package/dist/public/assets/index-BTiEWEax.js +1 -0
  7. package/dist/public/assets/{index-BuznEPrX.js → index-Bfadg8tB.js} +1 -1
  8. package/dist/public/assets/{index-CsJLc3b2.js → index-C0ivmMuU.js} +1 -1
  9. package/dist/public/assets/index-CQCxtJMS.js +14 -0
  10. package/dist/public/assets/{index-BiFHsDt6.js → index-D6B0cdTJ.js} +1 -1
  11. package/dist/public/assets/{index-D04H-m2p.js → index-DCT13_ZI.js} +1 -1
  12. package/dist/public/assets/{index-B-EALIKE.js → index-DhCVawEl.js} +1 -1
  13. package/dist/public/assets/{index-xH6PhxmS.js → index-KT0CxDFc.js} +1 -1
  14. package/dist/public/assets/index-qsvsww7-.js +1 -0
  15. package/dist/public/assets/{index-DKYPj90W.js → index-twHXYGSY.js} +5 -5
  16. package/dist/public/assets/{index-DmUrSr_K.js → index-zFJdOj6P.js} +1 -1
  17. package/dist/public/assets/input-C_TtyOcH.js +1 -0
  18. package/dist/public/assets/queries-DuZAFrOY.js +1 -0
  19. package/dist/public/assets/styles-Bc7sFPhq.css +1 -0
  20. package/dist/public/assets/{switch-CgWk9YD3.js → switch-BKlJnOab.js} +1 -1
  21. package/dist/public/assets/{syntax-highlighter-CR5pD3DZ.js → syntax-highlighter-BuOqgzbp.js} +1 -1
  22. package/dist/public/assets/textarea-a9VUYAmJ.js +1 -0
  23. package/dist/public/assets/{useQuery-BtGwEPDz.js → useQuery-ByTdbkfi.js} +1 -1
  24. package/dist/server/index.mjs +132 -128
  25. package/dist/web-server/_libs/tabler__icons-react.mjs +3 -3
  26. package/dist/web-server/_ssr/{index-DSIu0x-q.mjs → index-BFCBaZTA.mjs} +3 -3
  27. package/dist/web-server/_ssr/{index-JzLhPyir.mjs → index-BT-fOdbN.mjs} +2 -2
  28. package/dist/web-server/_ssr/{index-Bp9a_nTf.mjs → index-BVtbpy73.mjs} +1 -1
  29. package/dist/web-server/_ssr/{index-BLK6uN4p.mjs → index-B_d-ca5z.mjs} +4 -4
  30. package/dist/web-server/_ssr/{index-EKE8NFy_.mjs → index-ClGONv4K.mjs} +1 -1
  31. package/dist/web-server/_ssr/{index-BkkxTg0a.mjs → index-CmwSlgGR.mjs} +12 -19
  32. package/dist/web-server/_ssr/{index-C8t8AZQG.mjs → index-D4rgpZTm.mjs} +4 -4
  33. package/dist/web-server/_ssr/{index-DqFrn6kj.mjs → index-DxgfsEKM.mjs} +67 -25
  34. package/dist/web-server/_ssr/{index-wTy_4MhH.mjs → index-KGEq7IhY.mjs} +2 -2
  35. package/dist/web-server/_ssr/index.mjs +2 -2
  36. package/dist/web-server/_ssr/{input-BQFduUUo.mjs → input-CZtNKDXd.mjs} +1 -1
  37. package/dist/web-server/_ssr/queries-ixVDom0l.mjs +16 -0
  38. package/dist/web-server/_ssr/{router-59cN5lqo.mjs → router-CrULUyXB.mjs} +21 -21
  39. package/dist/web-server/_ssr/{switch-Bim4kX8N.mjs → switch-Bd3Khe3S.mjs} +1 -1
  40. package/dist/web-server/_ssr/{textarea-CK0ROhfF.mjs → textarea-ClM2KXId.mjs} +1 -1
  41. package/dist/web-server/_tanstack-start-manifest_v-cNUQI9I2.mjs +4 -0
  42. package/dist/web-server/index.mjs +148 -155
  43. package/package.json +1 -1
  44. package/dist/public/assets/IconCode-AzDguzgN.js +0 -1
  45. package/dist/public/assets/IconPlus-BcEAWT5L.js +0 -1
  46. package/dist/public/assets/index-BP5217kc.js +0 -1
  47. package/dist/public/assets/index-DEVyhUPW.js +0 -14
  48. package/dist/public/assets/index-D_8SzN4W.js +0 -1
  49. package/dist/public/assets/input-of658hyw.js +0 -1
  50. package/dist/public/assets/styles-C9Ypt703.css +0 -1
  51. package/dist/public/assets/textarea-xdRt6_lX.js +0 -1
  52. package/dist/web-server/_tanstack-start-manifest_v-DLw6M7p4.mjs +0 -4
@@ -168,9 +168,9 @@ export {
168
168
  IconCode as B,
169
169
  IconHeart as C,
170
170
  IconCloud as D,
171
- IconArrowUp as E,
172
- IconRefresh as F,
173
- IconLoader2 as G,
171
+ IconLoader2 as E,
172
+ IconArrowUp as F,
173
+ IconRefresh as G,
174
174
  IconAlertCircle as H,
175
175
  IconSearch as I,
176
176
  IconVersions as J,
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn, g as get, p as post } from "./router-59cN5lqo.mjs";
3
- import { S as Switch } from "./switch-Bim4kX8N.mjs";
4
- import { G as IconLoader2, H as IconAlertCircle, F as IconRefresh, p as IconPuzzle, I as IconSearch, a as IconX, m as IconChevronDown, J as IconVersions, K as IconTag, L as IconLink } from "../_libs/tabler__icons-react.mjs";
2
+ import { a as cn, g as get, p as post } from "./router-CrULUyXB.mjs";
3
+ import { S as Switch } from "./switch-Bd3Khe3S.mjs";
4
+ import { E as IconLoader2, H as IconAlertCircle, G as IconRefresh, p as IconPuzzle, I as IconSearch, a as IconX, m as IconChevronDown, J as IconVersions, K as IconTag, L as IconLink } from "../_libs/tabler__icons-react.mjs";
5
5
  import { M as Markdown } from "../_libs/react-markdown.mjs";
6
6
  import { r as remarkGfm } from "../_libs/remark-gfm.mjs";
7
7
  import "../_libs/tanstack__react-router.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn, g as get } from "./router-59cN5lqo.mjs";
3
- import { F as IconRefresh, s as IconChartBar } from "../_libs/tabler__icons-react.mjs";
2
+ import { a as cn, g as get } from "./router-CrULUyXB.mjs";
3
+ import { G as IconRefresh, s as IconChartBar } from "../_libs/tabler__icons-react.mjs";
4
4
  import "../_libs/tanstack__react-router.mjs";
5
5
  import "../_libs/tanstack__router-core.mjs";
6
6
  import "../_libs/tanstack__history.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
2
  import { d as useNavigate } from "../_libs/tanstack__react-router.mjs";
3
- import { b as useChatStore, c as createSession } from "./router-59cN5lqo.mjs";
3
+ import { f as useChatStore, c as createSession } from "./router-CrULUyXB.mjs";
4
4
  import "../_libs/tanstack__router-core.mjs";
5
5
  import "../_libs/tanstack__history.mjs";
6
6
  import "../_libs/cookie-es.mjs";
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
2
  import { u as useQueryClient, b as useMutation, a as useQuery } from "../_libs/tanstack__react-query.mjs";
3
- import { B as Button, a as cn, e as patch, p as post, f as del, g as get } from "./router-59cN5lqo.mjs";
4
- import { I as Input } from "./input-BQFduUUo.mjs";
5
- import { T as Textarea } from "./textarea-CK0ROhfF.mjs";
6
- import { S as IconPlus, F as IconRefresh, T as IconClock, U as IconPower, v as IconPencil, y as IconTrash, V as IconPlayerPlay, W as IconCalendar, X as IconChevronRight, G as IconLoader2 } from "../_libs/tabler__icons-react.mjs";
3
+ import { B as Button, a as cn, i as patch, p as post, j as del, g as get } from "./router-CrULUyXB.mjs";
4
+ import { I as Input } from "./input-CZtNKDXd.mjs";
5
+ import { T as Textarea } from "./textarea-ClM2KXId.mjs";
6
+ import { S as IconPlus, G as IconRefresh, T as IconClock, U as IconPower, v as IconPencil, y as IconTrash, V as IconPlayerPlay, W as IconCalendar, X as IconChevronRight, E as IconLoader2 } from "../_libs/tabler__icons-react.mjs";
7
7
  import "../_libs/tanstack__query-core.mjs";
8
8
  import "../_libs/tanstack__react-router.mjs";
9
9
  import "../_libs/tanstack__router-core.mjs";
@@ -1,5 +1,5 @@
1
1
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { R as Route$5, u as useTheme } from "./router-59cN5lqo.mjs";
2
+ import { R as Route$5, u as useTheme } from "./router-CrULUyXB.mjs";
3
3
  import { i as IconLanguage, h as IconKey, g as IconBell, f as IconPaint, e as IconUser, q as IconRobot, c as IconSun, d as IconMoon, M as IconDeviceDesktop } from "../_libs/tabler__icons-react.mjs";
4
4
  import "../_libs/tanstack__react-router.mjs";
5
5
  import "../_libs/tanstack__router-core.mjs";
@@ -1,13 +1,14 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
2
  import { u as useShallow } from "../_libs/zustand.mjs";
3
- import { n as Route, b as useChatStore, c as createSession, D as DropdownMenu, i as DropdownMenuTrigger, j as DropdownMenuContent, k as DropdownMenuItem, r as renameSession, B as Button, a as cn, l as deleteSessionApi, m as respondApproval, h as fetchModels } from "./router-59cN5lqo.mjs";
4
- import { T as Textarea } from "./textarea-CK0ROhfF.mjs";
5
- import { a as useQuery } from "../_libs/tanstack__react-query.mjs";
3
+ import { m as Route, f as useChatStore, c as createSession, D as DropdownMenu, b as DropdownMenuTrigger, d as DropdownMenuContent, e as DropdownMenuItem, r as renameSession, B as Button, a as cn, k as deleteSessionApi, l as respondApproval } from "./router-CrULUyXB.mjs";
4
+ import { T as Textarea } from "./textarea-ClM2KXId.mjs";
5
+ import { u as useModels } from "./queries-ixVDom0l.mjs";
6
6
  import { d as useNavigate } from "../_libs/tanstack__react-router.mjs";
7
- import { S as IconPlus, y as IconTrash, u as IconDots, v as IconPencil, I as IconSearch, g as IconBell, Y as IconMail, B as IconCode, T as IconClock, Z as IconChartLine, _ as IconShieldCheck, Q as IconAlertTriangle, N as IconCheck, a as IconX, $ as IconCommand, a0 as IconPaperclip, D as IconCloud, G as IconLoader2, a1 as IconPlayerStop, E as IconArrowUp, a2 as IconPhoto, a3 as IconFile, X as IconChevronRight, x as IconCopy } from "../_libs/tabler__icons-react.mjs";
7
+ import { S as IconPlus, y as IconTrash, u as IconDots, v as IconPencil, I as IconSearch, g as IconBell, Y as IconMail, B as IconCode, T as IconClock, Z as IconChartLine, _ as IconShieldCheck, Q as IconAlertTriangle, N as IconCheck, a as IconX, $ as IconCommand, a0 as IconPaperclip, D as IconCloud, E as IconLoader2, a1 as IconPlayerStop, F as IconArrowUp, a2 as IconPhoto, a3 as IconFile, X as IconChevronRight, x as IconCopy } from "../_libs/tabler__icons-react.mjs";
8
8
  import { M as Markdown } from "../_libs/react-markdown.mjs";
9
9
  import { r as remarkGfm } from "../_libs/remark-gfm.mjs";
10
10
  import "../_libs/tanstack__query-core.mjs";
11
+ import "../_libs/tanstack__react-query.mjs";
11
12
  import "../_libs/clsx.mjs";
12
13
  import "../_libs/class-variance-authority.mjs";
13
14
  import "../_libs/base-ui__react.mjs";
@@ -183,17 +184,6 @@ function useInputHistory({
183
184
  const size = reactExports.useCallback(() => history.length, [history.length]);
184
185
  return { push, recallPrev, recallNext, isNavigating, size };
185
186
  }
186
- function useModels() {
187
- return useQuery({
188
- queryKey: ["models"],
189
- queryFn: fetchModels,
190
- staleTime: 3e5,
191
- // 5min — models don't change often
192
- gcTime: 6e5,
193
- // 10min
194
- refetchOnWindowFocus: false
195
- });
196
- }
197
187
  function formatSize(bytes) {
198
188
  if (bytes < 1024) return `${bytes} B`;
199
189
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
@@ -1731,12 +1721,15 @@ function Chat({
1731
1721
  });
1732
1722
  reactExports.useEffect(() => {
1733
1723
  if (!sessionId || pendingSentRef.current) return;
1734
- const key = `hermium_pending_msg_${sessionId}`;
1735
- const pending = sessionStorage.getItem(key);
1724
+ const msgKey = `hermium_pending_msg_${sessionId}`;
1725
+ const modelKey = `hermium_pending_model_${sessionId}`;
1726
+ const pending = sessionStorage.getItem(msgKey);
1736
1727
  if (!pending) return;
1737
1728
  pendingSentRef.current = true;
1738
- sessionStorage.removeItem(key);
1739
- sendMessage(pending, sessionId, model);
1729
+ const pendingModel = sessionStorage.getItem(modelKey) || model;
1730
+ sessionStorage.removeItem(msgKey);
1731
+ sessionStorage.removeItem(modelKey);
1732
+ sendMessage(pending, sessionId, pendingModel);
1740
1733
  }, [sessionId, model, sendMessage]);
1741
1734
  reactExports.useEffect(() => {
1742
1735
  function onKey(e) {
@@ -1,9 +1,9 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { S as Switch } from "./switch-Bim4kX8N.mjs";
3
- import { I as Input } from "./input-BQFduUUo.mjs";
2
+ import { S as Switch } from "./switch-Bd3Khe3S.mjs";
3
+ import { I as Input } from "./input-CZtNKDXd.mjs";
4
4
  import { u as useQueryClient, a as useQuery, b as useMutation } from "../_libs/tanstack__react-query.mjs";
5
- import { a as cn, d as put, g as get } from "./router-59cN5lqo.mjs";
6
- import { G as IconLoader2, O as IconSparkles, P as IconPlugConnected, Q as IconAlertTriangle, R as IconPlug, m as IconChevronDown, N as IconCheck } from "../_libs/tabler__icons-react.mjs";
5
+ import { a as cn, h as put, g as get } from "./router-CrULUyXB.mjs";
6
+ import { E as IconLoader2, O as IconSparkles, P as IconPlugConnected, Q as IconAlertTriangle, R as IconPlug, m as IconChevronDown, N as IconCheck } from "../_libs/tabler__icons-react.mjs";
7
7
  import "../_libs/base-ui__react.mjs";
8
8
  import "../_libs/base-ui__utils.mjs";
9
9
  import "../_libs/use-sync-external-store.mjs";
@@ -1,8 +1,8 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
2
  import { d as useNavigate } from "../_libs/tanstack__react-router.mjs";
3
- import { c as createSession, B as Button, a as cn } from "./router-59cN5lqo.mjs";
4
- import { T as Textarea } from "./textarea-CK0ROhfF.mjs";
5
- import { z as IconChevronLeft, v as IconPencil, A as IconBook, B as IconCode, C as IconHeart, D as IconCloud, E as IconArrowUp } from "../_libs/tabler__icons-react.mjs";
3
+ import { c as createSession, B as Button, a as cn, D as DropdownMenu, b as DropdownMenuTrigger, d as DropdownMenuContent, e as DropdownMenuItem } from "./router-CrULUyXB.mjs";
4
+ import { u as useModels } from "./queries-ixVDom0l.mjs";
5
+ import { z as IconChevronLeft, v as IconPencil, A as IconBook, B as IconCode, C as IconHeart, D as IconCloud, E as IconLoader2, F as IconArrowUp } from "../_libs/tabler__icons-react.mjs";
6
6
  import "../_libs/tanstack__router-core.mjs";
7
7
  import "../_libs/tanstack__history.mjs";
8
8
  import "../_libs/cookie-es.mjs";
@@ -107,12 +107,27 @@ function useGreeting() {
107
107
  }, []);
108
108
  return greeting;
109
109
  }
110
+ function displayName(model) {
111
+ if (model.name && model.name !== model.id) return model.name;
112
+ const short = model.id.split("/").pop() || model.id;
113
+ return short.split("-").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
114
+ }
110
115
  function DashboardInput({
111
116
  onSubmit,
112
117
  disabled
113
118
  }) {
114
119
  const [value, setValue] = reactExports.useState("");
115
120
  const textareaRef = reactExports.useRef(null);
121
+ const { data: modelsData, isLoading: modelsLoading } = useModels();
122
+ const models = modelsData?.models ?? [];
123
+ const [selectedModelId, setSelectedModelId] = reactExports.useState("");
124
+ reactExports.useEffect(() => {
125
+ if (!models.length) return;
126
+ if (selectedModelId && models.some((m) => m.id === selectedModelId)) return;
127
+ const target = modelsData?.default_model || models[0]?.id;
128
+ if (target) setSelectedModelId(target);
129
+ }, [models, modelsData?.default_model, selectedModelId]);
130
+ const selectedModel = models.find((m) => m.id === selectedModelId);
116
131
  const autoResize = reactExports.useCallback(() => {
117
132
  const el = textareaRef.current;
118
133
  if (!el) return;
@@ -130,8 +145,8 @@ function DashboardInput({
130
145
  if (!text || disabled) return;
131
146
  setValue("");
132
147
  if (textareaRef.current) textareaRef.current.style.height = "auto";
133
- onSubmit(text);
134
- }, [value, disabled, onSubmit]);
148
+ onSubmit(text, selectedModelId);
149
+ }, [value, disabled, onSubmit, selectedModelId]);
135
150
  function handleKeyDown(e) {
136
151
  if (e.key === "Enter" && !e.shiftKey) {
137
152
  e.preventDefault();
@@ -139,9 +154,9 @@ function DashboardInput({
139
154
  }
140
155
  }
141
156
  const canSend = value.trim().length > 0;
142
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col rounded-2xl border border-border bg-card shadow-lg transition-colors", children: [
157
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-[80px] flex-col rounded-2xl border border-border bg-card shadow-sm transition-colors cursor-text hover:border-border/80", children: [
143
158
  /* @__PURE__ */ jsxRuntimeExports.jsx(
144
- Textarea,
159
+ "textarea",
145
160
  {
146
161
  ref: textareaRef,
147
162
  value,
@@ -151,26 +166,50 @@ function DashboardInput({
151
166
  rows: 1,
152
167
  disabled,
153
168
  className: cn(
154
- "w-full !rounded-none border-0 p-4 outline-none text-[15px] text-foreground resize-none shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 focus-visible:border-transparent bg-transparent whitespace-pre-wrap break-words",
169
+ "w-full rounded-none border-0 p-4 text-[15px] text-foreground resize-none shadow-none outline-none bg-transparent whitespace-pre-wrap break-words placeholder:text-muted-foreground disabled:opacity-50",
155
170
  "min-h-[56px] max-h-[200px]"
156
171
  )
157
172
  }
158
173
  ),
159
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-end p-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
160
- Button,
161
- {
162
- variant: "ghost",
163
- size: "icon-sm",
164
- className: cn(
165
- "rounded-full transition-colors cursor-pointer",
166
- canSend && !disabled ? "bg-primary hover:bg-primary/90 text-primary-foreground" : "bg-primary text-primary-foreground opacity-40"
167
- ),
168
- disabled: !canSend || disabled,
169
- onClick: handleSend,
170
- title: "Send message",
171
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowUp, { className: "h-4 w-4" })
172
- }
173
- ) })
174
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-[40px] items-center gap-2 p-2 pb-1", children: [
175
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { children: [
176
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenuTrigger, { className: "flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground transition-colors cursor-pointer outline-none", children: [
177
+ /* @__PURE__ */ jsxRuntimeExports.jsx(IconCloud, { className: "h-4 w-4 shrink-0" }),
178
+ modelsLoading && /* @__PURE__ */ jsxRuntimeExports.jsx(IconLoader2, { className: "h-3.5 w-3.5 animate-spin shrink-0" }),
179
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: cn(modelsLoading && "opacity-60"), children: modelsLoading ? "Loading…" : selectedModel ? displayName(selectedModel) : "Select model" })
180
+ ] }),
181
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuContent, { align: "start", className: "max-h-[300px] overflow-y-auto min-w-48", children: models.map((model) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
182
+ DropdownMenuItem,
183
+ {
184
+ onClick: () => setSelectedModelId(model.id),
185
+ className: cn(
186
+ "flex-col items-start py-2",
187
+ model.id === selectedModelId && "bg-muted"
188
+ ),
189
+ children: [
190
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: displayName(model) }),
191
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground text-xs", children: model.provider_name })
192
+ ]
193
+ },
194
+ model.id
195
+ )) })
196
+ ] }),
197
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto flex items-center gap-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
198
+ Button,
199
+ {
200
+ variant: "ghost",
201
+ size: "icon-sm",
202
+ className: cn(
203
+ "rounded-full transition-colors cursor-pointer",
204
+ canSend && !disabled ? "bg-primary hover:bg-primary/90 text-primary-foreground" : "bg-primary text-primary-foreground opacity-40"
205
+ ),
206
+ disabled: !canSend || disabled,
207
+ onClick: handleSend,
208
+ title: "Send message",
209
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowUp, { className: "h-4 w-4" })
210
+ }
211
+ ) })
212
+ ] })
174
213
  ] });
175
214
  }
176
215
  function DashboardPage() {
@@ -180,15 +219,18 @@ function DashboardPage() {
180
219
  const [isSubmitting, setIsSubmitting] = reactExports.useState(false);
181
220
  const submittingRef = reactExports.useRef(false);
182
221
  const handleNewChat = reactExports.useCallback(
183
- async (initialMessage) => {
222
+ async (initialMessage, modelId) => {
184
223
  if (submittingRef.current) return;
185
224
  submittingRef.current = true;
186
225
  setIsSubmitting(true);
187
226
  try {
188
- const session = await createSession();
227
+ const session = await createSession({ model: modelId });
189
228
  if (initialMessage) {
190
229
  sessionStorage.setItem(`hermium_pending_msg_${session.id}`, initialMessage);
191
230
  }
231
+ if (modelId) {
232
+ sessionStorage.setItem(`hermium_pending_model_${session.id}`, modelId);
233
+ }
192
234
  navigate({
193
235
  to: "/chat/$sessionId",
194
236
  params: { sessionId: session.id }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn, g as get, p as post } from "./router-59cN5lqo.mjs";
3
- import { o as IconBrain, e as IconUser, G as IconLoader2, H as IconAlertCircle, F as IconRefresh, a as IconX, N as IconCheck, v as IconPencil } from "../_libs/tabler__icons-react.mjs";
2
+ import { a as cn, g as get, p as post } from "./router-CrULUyXB.mjs";
3
+ import { o as IconBrain, e as IconUser, E as IconLoader2, H as IconAlertCircle, G as IconRefresh, a as IconX, N as IconCheck, v as IconPencil } from "../_libs/tabler__icons-react.mjs";
4
4
  import { M as Markdown } from "../_libs/react-markdown.mjs";
5
5
  import { r as remarkGfm } from "../_libs/remark-gfm.mjs";
6
6
  import "../_libs/tanstack__react-router.mjs";
@@ -365,7 +365,7 @@ function getResponse() {
365
365
  }
366
366
  var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
367
367
  async function getStartManifest(matchedRoutes) {
368
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DLw6M7p4.mjs");
368
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-cNUQI9I2.mjs");
369
369
  const startManifest = tsrStartManifest();
370
370
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
371
371
  rootRoute.assets = rootRoute.assets || [];
@@ -1194,7 +1194,7 @@ var baseManifestPromise;
1194
1194
  var cachedFinalManifestPromise;
1195
1195
  async function loadEntries() {
1196
1196
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
1197
- import("./router-59cN5lqo.mjs").then((n) => n.o),
1197
+ import("./router-CrULUyXB.mjs").then((n) => n.o),
1198
1198
  import("./start-HYkvq4Ni.mjs"),
1199
1199
  import("../__23tanstack-start-plugin-adapters-Cwee5PKy.mjs")
1200
1200
  ]);
@@ -1,5 +1,5 @@
1
1
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn } from "./router-59cN5lqo.mjs";
2
+ import { a as cn } from "./router-CrULUyXB.mjs";
3
3
  import { I as Input$1 } from "../_libs/base-ui__react.mjs";
4
4
  function Input({ className, type, ...props }) {
5
5
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -0,0 +1,16 @@
1
+ import { a as useQuery } from "../_libs/tanstack__react-query.mjs";
2
+ import { n as fetchModels } from "./router-CrULUyXB.mjs";
3
+ function useModels() {
4
+ return useQuery({
5
+ queryKey: ["models"],
6
+ queryFn: fetchModels,
7
+ staleTime: 3e5,
8
+ // 5min — models don't change often
9
+ gcTime: 6e5,
10
+ // 10min
11
+ refetchOnWindowFocus: false
12
+ });
13
+ }
14
+ export {
15
+ useModels as u
16
+ };
@@ -1818,7 +1818,7 @@ function DashboardLayout({ children }) {
1818
1818
  /* @__PURE__ */ jsxRuntimeExports.jsx(SidebarInset, { className: "flex flex-col min-w-0", children })
1819
1819
  ] }) });
1820
1820
  }
1821
- const appCss = "/assets/styles-C9Ypt703.css";
1821
+ const appCss = "/assets/styles-Bc7sFPhq.css";
1822
1822
  const themeScript = `
1823
1823
  (function() {
1824
1824
  try {
@@ -1863,19 +1863,19 @@ function RootDocument({ children }) {
1863
1863
  ] })
1864
1864
  ] });
1865
1865
  }
1866
- const $$splitComponentImporter$8 = () => import("./index-DqFrn6kj.mjs");
1866
+ const $$splitComponentImporter$8 = () => import("./index-DxgfsEKM.mjs");
1867
1867
  const Route$8 = createFileRoute("/")({
1868
1868
  component: lazyRouteComponent($$splitComponentImporter$8, "component")
1869
1869
  });
1870
- const $$splitComponentImporter$7 = () => import("./index-JzLhPyir.mjs");
1870
+ const $$splitComponentImporter$7 = () => import("./index-BT-fOdbN.mjs");
1871
1871
  const Route$7 = createFileRoute("/usage/")({
1872
1872
  component: lazyRouteComponent($$splitComponentImporter$7, "component")
1873
1873
  });
1874
- const $$splitComponentImporter$6 = () => import("./index-DSIu0x-q.mjs");
1874
+ const $$splitComponentImporter$6 = () => import("./index-BFCBaZTA.mjs");
1875
1875
  const Route$6 = createFileRoute("/skills/")({
1876
1876
  component: lazyRouteComponent($$splitComponentImporter$6, "component")
1877
1877
  });
1878
- const $$splitComponentImporter$5 = () => import("./index-EKE8NFy_.mjs");
1878
+ const $$splitComponentImporter$5 = () => import("./index-ClGONv4K.mjs");
1879
1879
  const settingsSearchSchema = object({
1880
1880
  section: string().optional().default("profile")
1881
1881
  });
@@ -1883,23 +1883,23 @@ const Route$5 = createFileRoute("/settings/")({
1883
1883
  component: lazyRouteComponent($$splitComponentImporter$5, "component"),
1884
1884
  validateSearch: (search) => settingsSearchSchema.parse(search)
1885
1885
  });
1886
- const $$splitComponentImporter$4 = () => import("./index-wTy_4MhH.mjs");
1886
+ const $$splitComponentImporter$4 = () => import("./index-KGEq7IhY.mjs");
1887
1887
  const Route$4 = createFileRoute("/memory/")({
1888
1888
  component: lazyRouteComponent($$splitComponentImporter$4, "component")
1889
1889
  });
1890
- const $$splitComponentImporter$3 = () => import("./index-Bp9a_nTf.mjs");
1890
+ const $$splitComponentImporter$3 = () => import("./index-BVtbpy73.mjs");
1891
1891
  const Route$3 = createFileRoute("/chat/")({
1892
1892
  component: lazyRouteComponent($$splitComponentImporter$3, "component")
1893
1893
  });
1894
- const $$splitComponentImporter$2 = () => import("./index-C8t8AZQG.mjs");
1894
+ const $$splitComponentImporter$2 = () => import("./index-D4rgpZTm.mjs");
1895
1895
  const Route$2 = createFileRoute("/channels/")({
1896
1896
  component: lazyRouteComponent($$splitComponentImporter$2, "component")
1897
1897
  });
1898
- const $$splitComponentImporter$1 = () => import("./index-BLK6uN4p.mjs");
1898
+ const $$splitComponentImporter$1 = () => import("./index-B_d-ca5z.mjs");
1899
1899
  const Route$1 = createFileRoute("/automations/")({
1900
1900
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
1901
1901
  });
1902
- const $$splitComponentImporter = () => import("./index-BkkxTg0a.mjs");
1902
+ const $$splitComponentImporter = () => import("./index-CmwSlgGR.mjs");
1903
1903
  const Route = createFileRoute("/chat/$sessionId/")({
1904
1904
  component: lazyRouteComponent($$splitComponentImporter, "component")
1905
1905
  });
@@ -1978,19 +1978,19 @@ export {
1978
1978
  DropdownMenu as D,
1979
1979
  Route$5 as R,
1980
1980
  cn as a,
1981
- useChatStore as b,
1981
+ DropdownMenuTrigger as b,
1982
1982
  createSession as c,
1983
- put as d,
1984
- patch as e,
1985
- del as f,
1983
+ DropdownMenuContent as d,
1984
+ DropdownMenuItem as e,
1985
+ useChatStore as f,
1986
1986
  get as g,
1987
- fetchModels as h,
1988
- DropdownMenuTrigger as i,
1989
- DropdownMenuContent as j,
1990
- DropdownMenuItem as k,
1991
- deleteSessionApi as l,
1992
- respondApproval as m,
1993
- Route as n,
1987
+ put as h,
1988
+ patch as i,
1989
+ del as j,
1990
+ deleteSessionApi as k,
1991
+ respondApproval as l,
1992
+ Route as m,
1993
+ fetchModels as n,
1994
1994
  router as o,
1995
1995
  post as p,
1996
1996
  renameSession as r,
@@ -1,5 +1,5 @@
1
1
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn } from "./router-59cN5lqo.mjs";
2
+ import { a as cn } from "./router-CrULUyXB.mjs";
3
3
  function Switch({ checked, onCheckedChange, disabled, className }) {
4
4
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
5
5
  "button",
@@ -1,5 +1,5 @@
1
1
  import { j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn } from "./router-59cN5lqo.mjs";
2
+ import { a as cn } from "./router-CrULUyXB.mjs";
3
3
  function Textarea({ className, ...props }) {
4
4
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
5
5
  "textarea",
@@ -0,0 +1,4 @@
1
+ const tsrStartManifest = () => ({ routes: { __root__: { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/__root.tsx", children: ["/", "/automations/", "/channels/", "/chat/", "/memory/", "/settings/", "/skills/", "/usage/", "/chat/$sessionId/"], assets: void 0, preloads: ["/assets/index-twHXYGSY.js"] }, "/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-qsvsww7-.js", "/assets/queries-DuZAFrOY.js", "/assets/IconLoader2-DkEhzUxZ.js", "/assets/useQuery-ByTdbkfi.js"] }, "/automations/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/automations/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-BTiEWEax.js", "/assets/useQuery-ByTdbkfi.js", "/assets/input-C_TtyOcH.js", "/assets/textarea-a9VUYAmJ.js", "/assets/IconRefresh-CCXMrUxO.js", "/assets/IconLoader2-DkEhzUxZ.js"] }, "/channels/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/channels/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-KT0CxDFc.js", "/assets/switch-BKlJnOab.js", "/assets/input-C_TtyOcH.js", "/assets/useQuery-ByTdbkfi.js", "/assets/IconAlertTriangle-DdD7_dc8.js", "/assets/IconLoader2-DkEhzUxZ.js", "/assets/IconCheck-CYZ4_524.js"] }, "/chat/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/chat/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-DhCVawEl.js"] }, "/memory/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/memory/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-D6B0cdTJ.js", "/assets/IconLoader2-DkEhzUxZ.js", "/assets/IconAlertCircle-C98Iam1j.js", "/assets/IconRefresh-CCXMrUxO.js", "/assets/IconCheck-CYZ4_524.js", "/assets/index-DCT13_ZI.js"] }, "/settings/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/settings/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-Bfadg8tB.js"] }, "/skills/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/skills/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-C0ivmMuU.js", "/assets/switch-BKlJnOab.js", "/assets/IconLoader2-DkEhzUxZ.js", "/assets/IconAlertCircle-C98Iam1j.js", "/assets/IconRefresh-CCXMrUxO.js", "/assets/index-DCT13_ZI.js"] }, "/usage/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/usage/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-zFJdOj6P.js", "/assets/IconRefresh-CCXMrUxO.js"] }, "/chat/$sessionId/": { filePath: "/home/abbskhnv/Desktop/hermium/apps/web/src/routes/chat/$sessionId/index.tsx", children: void 0, assets: void 0, preloads: ["/assets/index-CQCxtJMS.js", "/assets/textarea-a9VUYAmJ.js", "/assets/queries-DuZAFrOY.js", "/assets/IconLoader2-DkEhzUxZ.js", "/assets/index-DCT13_ZI.js", "/assets/IconCheck-CYZ4_524.js", "/assets/IconAlertTriangle-DdD7_dc8.js", "/assets/useQuery-ByTdbkfi.js"] } }, clientEntry: "/assets/index-twHXYGSY.js" });
2
+ export {
3
+ tsrStartManifest
4
+ };