hermium 0.1.10 → 0.3.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 (216) hide show
  1. package/README.md +56 -0
  2. package/bin/hermium.mjs +201 -136
  3. package/dist/api.mjs +3513 -0
  4. package/dist/{web-server → server}/_chunks/ssr-renderer.mjs +1 -1
  5. package/dist/{web-server → server}/_libs/base-ui__react.mjs +338 -34
  6. package/dist/{web-server → server}/_libs/base-ui__utils.mjs +38 -33
  7. package/dist/server/_libs/comma-separated-tokens.mjs +10 -0
  8. package/dist/{web-server → server}/_libs/floating-ui__core.mjs +3 -3
  9. package/dist/{web-server → server}/_libs/floating-ui__dom.mjs +4 -4
  10. package/dist/{web-server → server}/_libs/floating-ui__react-dom.mjs +3 -3
  11. package/dist/{web-server → server}/_libs/floating-ui__utils.mjs +38 -38
  12. package/dist/{web-server → server}/_libs/h3.mjs +3 -3
  13. package/dist/server/_libs/hast-util-is-element.mjs +75 -0
  14. package/dist/{web-server → server}/_libs/hast-util-to-jsx-runtime.mjs +2 -2
  15. package/dist/server/_libs/hast-util-to-text.mjs +305 -0
  16. package/dist/server/_libs/highlight.js.mjs +14756 -0
  17. package/dist/server/_libs/lowlight.mjs +262 -0
  18. package/dist/{web-server → server}/_libs/mdast-util-from-markdown.mjs +1 -1
  19. package/dist/{web-server → server}/_libs/mdast-util-gfm-autolink-literal+[...].mjs +2 -2
  20. package/dist/{web-server → server}/_libs/mdast-util-to-hast.mjs +1 -1
  21. package/dist/{web-server → server}/_libs/micromark-core-commonmark.mjs +24 -24
  22. package/dist/{web-server → server}/_libs/micromark-extension-gfm-autolink-literal+[...].mjs +1 -1
  23. package/dist/{web-server → server}/_libs/micromark-extension-gfm-footnote+[...].mjs +2 -2
  24. package/dist/{web-server → server}/_libs/micromark-extension-gfm-table.mjs +1 -1
  25. package/dist/{web-server → server}/_libs/micromark-extension-gfm-task-list-item+[...].mjs +1 -1
  26. package/dist/{web-server → server}/_libs/micromark-factory-destination.mjs +1 -1
  27. package/dist/{web-server → server}/_libs/micromark-factory-label.mjs +1 -1
  28. package/dist/{web-server → server}/_libs/micromark-factory-space.mjs +1 -1
  29. package/dist/{web-server → server}/_libs/micromark-factory-whitespace.mjs +1 -1
  30. package/dist/{web-server → server}/_libs/micromark-util-character.mjs +12 -12
  31. package/dist/{web-server → server}/_libs/micromark-util-classify-character+[...].mjs +1 -1
  32. package/dist/{web-server → server}/_libs/micromark-util-html-tag-name.mjs +2 -2
  33. package/dist/{web-server → server}/_libs/micromark-util-sanitize-uri.mjs +1 -1
  34. package/dist/{web-server → server}/_libs/micromark.mjs +3 -3
  35. package/dist/{web-server → server}/_libs/property-information.mjs +2 -3
  36. package/dist/{web-server → server}/_libs/react-dom.mjs +1 -1
  37. package/dist/{web-server → server}/_libs/react.mjs +42 -42
  38. package/dist/server/_libs/rehype-highlight.mjs +94 -0
  39. package/dist/server/_libs/space-separated-tokens.mjs +6 -0
  40. package/dist/server/_libs/tabler__icons-react.mjs +140 -0
  41. package/dist/server/_libs/tailwind-merge.mjs +3255 -0
  42. package/dist/server/_libs/tanstack__history.mjs +29 -0
  43. package/dist/{web-server → server}/_libs/tanstack__react-router.mjs +3 -3
  44. package/dist/{web-server → server}/_libs/tanstack__router-core.mjs +47 -741
  45. package/dist/server/_libs/unist-util-find-after.mjs +41 -0
  46. package/dist/{web-server → server}/_libs/unist-util-position.mjs +2 -2
  47. package/dist/{web-server → server}/_libs/use-sync-external-store.mjs +1 -1
  48. package/dist/server/_libs/zustand.mjs +43 -0
  49. package/dist/server/_ssr/ChatInputBlock-Bu2-iop_.mjs +220 -0
  50. package/dist/server/_ssr/MarkdownMessage-CNS7OSKN.mjs +68 -0
  51. package/dist/server/_ssr/chat._sessionId-P02iSfut.mjs +477 -0
  52. package/dist/{web-server/_ssr/index-CoDfv1vI.mjs → server/_ssr/chat.index-BYB_48NC.mjs} +6 -8
  53. package/dist/server/_ssr/index-C1mT_2d8.mjs +4890 -0
  54. package/dist/server/_ssr/index-DFV9_oCk.mjs +43 -0
  55. package/dist/server/_ssr/memory-CW_fSOG9.mjs +257 -0
  56. package/dist/{web-server/_ssr/router-CS6Zq3md.mjs → server/_ssr/router-CUAfx91O.mjs} +1009 -1108
  57. package/dist/server/_ssr/settings-DoXurzvn.mjs +10 -0
  58. package/dist/server/_ssr/skills-Cs7A5ZwO.mjs +422 -0
  59. package/dist/server/_ssr/theme-BK4-7E2h.mjs +42 -0
  60. package/dist/server/_ssr/usage-Bs2-LXGz.mjs +298 -0
  61. package/dist/server/_tanstack-start-manifest_v-C7Upe2TI.mjs +4 -0
  62. package/dist/server/index.mjs +502 -240
  63. package/package.json +4 -3
  64. package/dist/public/assets/IconAlertCircle-BW147gsG.js +0 -1
  65. package/dist/public/assets/IconAlertTriangle-DCoTLVSd.js +0 -1
  66. package/dist/public/assets/IconCheck-DAO7Fpl9.js +0 -1
  67. package/dist/public/assets/IconCode-BqfTl5wU.js +0 -1
  68. package/dist/public/assets/IconLoader2-B_pehSXN.js +0 -1
  69. package/dist/public/assets/IconRefresh-BbMGoMV8.js +0 -1
  70. package/dist/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
  71. package/dist/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
  72. package/dist/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
  73. package/dist/public/assets/index-BL9a2Xg9.js +0 -1
  74. package/dist/public/assets/index-BSwXjgjr.js +0 -1
  75. package/dist/public/assets/index-BWl8tn18.js +0 -1
  76. package/dist/public/assets/index-CQh8SXb2.js +0 -94
  77. package/dist/public/assets/index-Cxd-kSUY.js +0 -1
  78. package/dist/public/assets/index-DA5SH--7.js +0 -2
  79. package/dist/public/assets/index-DCHbvtBS.js +0 -1
  80. package/dist/public/assets/index-DCYXJZEe.js +0 -1
  81. package/dist/public/assets/index-DFDfp0ca.js +0 -1
  82. package/dist/public/assets/index-GuAAqSCJ.js +0 -14
  83. package/dist/public/assets/index-WIDirTHx.js +0 -29
  84. package/dist/public/assets/index-X3XZcAzy.js +0 -1
  85. package/dist/public/assets/input-7TQEEJq6.js +0 -1
  86. package/dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  87. package/dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  88. package/dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  89. package/dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  90. package/dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  91. package/dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  92. package/dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  93. package/dist/public/assets/models-BlUb1eaf.js +0 -1
  94. package/dist/public/assets/styles-PHtUFHUr.css +0 -1
  95. package/dist/public/assets/switch-B_iYUUM3.js +0 -1
  96. package/dist/public/assets/syntax-highlighter-DcBYfnEK.js +0 -6
  97. package/dist/public/assets/textarea-Dm4aaRqS.js +0 -1
  98. package/dist/public/favicon.ico +0 -0
  99. package/dist/public/favicon.png +0 -0
  100. package/dist/public/manifest.json +0 -25
  101. package/dist/public/nous-logo.png +0 -0
  102. package/dist/public/robots.txt +0 -3
  103. package/dist/web-server/_libs/babel__runtime.mjs +0 -237
  104. package/dist/web-server/_libs/character-entities-legacy.mjs +0 -111
  105. package/dist/web-server/_libs/character-reference-invalid.mjs +0 -33
  106. package/dist/web-server/_libs/comma-separated-tokens.mjs +0 -31
  107. package/dist/web-server/_libs/cookie-es.mjs +0 -44
  108. package/dist/web-server/_libs/hast-util-parse-selector.mjs +0 -39
  109. package/dist/web-server/_libs/hastscript.mjs +0 -200
  110. package/dist/web-server/_libs/is-alphabetical.mjs +0 -7
  111. package/dist/web-server/_libs/is-alphanumerical.mjs +0 -8
  112. package/dist/web-server/_libs/is-decimal.mjs +0 -7
  113. package/dist/web-server/_libs/is-hexadecimal.mjs +0 -7
  114. package/dist/web-server/_libs/lowlight.mjs +0 -1
  115. package/dist/web-server/_libs/parse-entities.mjs +0 -245
  116. package/dist/web-server/_libs/react-syntax-highlighter.mjs +0 -941
  117. package/dist/web-server/_libs/refractor.mjs +0 -2425
  118. package/dist/web-server/_libs/seroval-plugins.mjs +0 -58
  119. package/dist/web-server/_libs/seroval.mjs +0 -1775
  120. package/dist/web-server/_libs/space-separated-tokens.mjs +0 -11
  121. package/dist/web-server/_libs/tabler__icons-react.mjs +0 -233
  122. package/dist/web-server/_libs/tanstack__history.mjs +0 -204
  123. package/dist/web-server/_libs/tanstack__query-core.mjs +0 -2552
  124. package/dist/web-server/_libs/tanstack__react-query.mjs +0 -190
  125. package/dist/web-server/_libs/zod.mjs +0 -3915
  126. package/dist/web-server/_libs/zustand.mjs +0 -343
  127. package/dist/web-server/_ssr/index--Bo2_ipW.mjs +0 -277
  128. package/dist/web-server/_ssr/index-BEvygh5x.mjs +0 -612
  129. package/dist/web-server/_ssr/index-BFaKxYfN.mjs +0 -40
  130. package/dist/web-server/_ssr/index-BdrMzRTd.mjs +0 -513
  131. package/dist/web-server/_ssr/index-Cwp8Gyl1.mjs +0 -1812
  132. package/dist/web-server/_ssr/index-DQsfKYjV.mjs +0 -449
  133. package/dist/web-server/_ssr/index-Dbs9k8Ea.mjs +0 -251
  134. package/dist/web-server/_ssr/index-Dk93oyZD.mjs +0 -213
  135. package/dist/web-server/_ssr/index-KNJ7huw_.mjs +0 -369
  136. package/dist/web-server/_ssr/index.mjs +0 -1558
  137. package/dist/web-server/_ssr/input-BV1DMASc.mjs +0 -20
  138. package/dist/web-server/_ssr/models-MzrvbL2i.mjs +0 -43
  139. package/dist/web-server/_ssr/start-HYkvq4Ni.mjs +0 -4
  140. package/dist/web-server/_ssr/switch-Bd-Sg0HG.mjs +0 -33
  141. package/dist/web-server/_ssr/syntax-highlighter-5vezNTce.mjs +0 -62
  142. package/dist/web-server/_ssr/textarea-CB4kQp9w.mjs +0 -18
  143. package/dist/web-server/_tanstack-start-manifest_v-m5lY48LR.mjs +0 -4
  144. package/dist/web-server/index.mjs +0 -611
  145. /package/dist/{web-server → server}/__23tanstack-start-plugin-adapters-Cwee5PKy.mjs +0 -0
  146. /package/dist/{web-server → server}/_libs/bail.mjs +0 -0
  147. /package/dist/{web-server → server}/_libs/ccount.mjs +0 -0
  148. /package/dist/{web-server → server}/_libs/character-entities.mjs +0 -0
  149. /package/dist/{web-server → server}/_libs/class-variance-authority.mjs +0 -0
  150. /package/dist/{web-server → server}/_libs/clsx.mjs +0 -0
  151. /package/dist/{web-server/_libs/croner.mjs → server/_libs/cookie-es.mjs} +0 -0
  152. /package/dist/{web-server/_libs/crossws.mjs → server/_libs/croner.mjs} +0 -0
  153. /package/dist/{web-server/_libs/fault.mjs → server/_libs/crossws.mjs} +0 -0
  154. /package/dist/{web-server → server}/_libs/decode-named-character-reference+[...].mjs +0 -0
  155. /package/dist/{web-server → server}/_libs/devlop.mjs +0 -0
  156. /package/dist/{web-server → server}/_libs/escape-string-regexp.mjs +0 -0
  157. /package/dist/{web-server → server}/_libs/estree-util-is-identifier-name.mjs +0 -0
  158. /package/dist/{web-server → server}/_libs/extend.mjs +0 -0
  159. /package/dist/{web-server → server}/_libs/hast-util-whitespace.mjs +0 -0
  160. /package/dist/{web-server → server}/_libs/hookable.mjs +0 -0
  161. /package/dist/{web-server → server}/_libs/html-url-attributes.mjs +0 -0
  162. /package/dist/{web-server → server}/_libs/inline-style-parser.mjs +0 -0
  163. /package/dist/{web-server → server}/_libs/is-plain-obj.mjs +0 -0
  164. /package/dist/{web-server → server}/_libs/isbot.mjs +0 -0
  165. /package/dist/{web-server → server}/_libs/longest-streak.mjs +0 -0
  166. /package/dist/{web-server → server}/_libs/markdown-table.mjs +0 -0
  167. /package/dist/{web-server → server}/_libs/mdast-util-find-and-replace.mjs +0 -0
  168. /package/dist/{web-server → server}/_libs/mdast-util-gfm-footnote.mjs +0 -0
  169. /package/dist/{web-server → server}/_libs/mdast-util-gfm-strikethrough.mjs +0 -0
  170. /package/dist/{web-server → server}/_libs/mdast-util-gfm-table.mjs +0 -0
  171. /package/dist/{web-server → server}/_libs/mdast-util-gfm-task-list-item.mjs +0 -0
  172. /package/dist/{web-server → server}/_libs/mdast-util-gfm.mjs +0 -0
  173. /package/dist/{web-server → server}/_libs/mdast-util-phrasing.mjs +0 -0
  174. /package/dist/{web-server → server}/_libs/mdast-util-to-markdown.mjs +0 -0
  175. /package/dist/{web-server → server}/_libs/mdast-util-to-string.mjs +0 -0
  176. /package/dist/{web-server → server}/_libs/micromark-extension-gfm-strikethrough+[...].mjs +0 -0
  177. /package/dist/{web-server → server}/_libs/micromark-extension-gfm-tagfilter+[...].mjs +0 -0
  178. /package/dist/{web-server → server}/_libs/micromark-extension-gfm.mjs +0 -0
  179. /package/dist/{web-server → server}/_libs/micromark-factory-title.mjs +0 -0
  180. /package/dist/{web-server → server}/_libs/micromark-util-chunked.mjs +0 -0
  181. /package/dist/{web-server → server}/_libs/micromark-util-combine-extensions+[...].mjs +0 -0
  182. /package/dist/{web-server → server}/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -0
  183. /package/dist/{web-server → server}/_libs/micromark-util-decode-string.mjs +0 -0
  184. /package/dist/{web-server → server}/_libs/micromark-util-encode.mjs +0 -0
  185. /package/dist/{web-server → server}/_libs/micromark-util-normalize-identifier+[...].mjs +0 -0
  186. /package/dist/{web-server → server}/_libs/micromark-util-resolve-all.mjs +0 -0
  187. /package/dist/{web-server → server}/_libs/micromark-util-subtokenize.mjs +0 -0
  188. /package/dist/{web-server → server}/_libs/ocache.mjs +0 -0
  189. /package/dist/{web-server → server}/_libs/ohash.mjs +0 -0
  190. /package/dist/{web-server → server}/_libs/react-markdown.mjs +0 -0
  191. /package/dist/{web-server → server}/_libs/remark-gfm.mjs +0 -0
  192. /package/dist/{web-server → server}/_libs/remark-parse.mjs +0 -0
  193. /package/dist/{web-server → server}/_libs/remark-rehype.mjs +0 -0
  194. /package/dist/{web-server → server}/_libs/reselect.mjs +0 -0
  195. /package/dist/{web-server → server}/_libs/rou3.mjs +0 -0
  196. /package/dist/{web-server/_libs/format.mjs → server/_libs/seroval-plugins.mjs} +0 -0
  197. /package/dist/{web-server/_libs/highlight.js.mjs → server/_libs/seroval.mjs} +0 -0
  198. /package/dist/{web-server → server}/_libs/srvx.mjs +0 -0
  199. /package/dist/{web-server → server}/_libs/style-to-js.mjs +0 -0
  200. /package/dist/{web-server → server}/_libs/style-to-object.mjs +0 -0
  201. /package/dist/{web-server → server}/_libs/tanstack__react-store.mjs +0 -0
  202. /package/dist/{web-server → server}/_libs/tanstack__store.mjs +0 -0
  203. /package/dist/{web-server → server}/_libs/trim-lines.mjs +0 -0
  204. /package/dist/{web-server → server}/_libs/trough.mjs +0 -0
  205. /package/dist/{web-server → server}/_libs/ufo.mjs +0 -0
  206. /package/dist/{web-server → server}/_libs/unctx.mjs +0 -0
  207. /package/dist/{web-server → server}/_libs/ungap__structured-clone.mjs +0 -0
  208. /package/dist/{web-server → server}/_libs/unified.mjs +0 -0
  209. /package/dist/{web-server → server}/_libs/unist-util-is.mjs +0 -0
  210. /package/dist/{web-server → server}/_libs/unist-util-stringify-position.mjs +0 -0
  211. /package/dist/{web-server → server}/_libs/unist-util-visit-parents.mjs +0 -0
  212. /package/dist/{web-server → server}/_libs/unist-util-visit.mjs +0 -0
  213. /package/dist/{web-server → server}/_libs/unstorage.mjs +0 -0
  214. /package/dist/{web-server → server}/_libs/vfile-message.mjs +0 -0
  215. /package/dist/{web-server → server}/_libs/vfile.mjs +0 -0
  216. /package/dist/{web-server → server}/_libs/zwitch.mjs +0 -0
@@ -1,251 +0,0 @@
1
- import { j as jsxRuntimeExports, r as reactExports } from "../_libs/react.mjs";
2
- import { h as updateModelConfig, i as useVersionCheck, j as useTheme, f as fetchModels } from "./router-CS6Zq3md.mjs";
3
- import { a as useQuery } from "../_libs/tanstack__react-query.mjs";
4
- import { g as IconBrandGithub, f as IconBrain, e as IconPaint, W as IconPackage, X as IconArrowUpRight, Y as IconWorld, Z as IconBrandTelegram } from "../_libs/tabler__icons-react.mjs";
5
- function useModels() {
6
- return useQuery({
7
- queryKey: ["models"],
8
- queryFn: fetchModels,
9
- staleTime: 3e5,
10
- // 5min — models don't change often
11
- gcTime: 6e5,
12
- // 10min
13
- refetchOnWindowFocus: false
14
- });
15
- }
16
- const settingsMap = {
17
- appearance: {
18
- icon: IconPaint,
19
- title: "Appearance",
20
- description: "Choose your preferred theme",
21
- get content() {
22
- return /* @__PURE__ */ jsxRuntimeExports.jsx(AppearanceSettings, {});
23
- }
24
- },
25
- model: {
26
- icon: IconBrain,
27
- title: "Model",
28
- description: "Choose your default AI model",
29
- get content() {
30
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ModelSettings, {});
31
- }
32
- },
33
- about: {
34
- icon: IconBrandGithub,
35
- title: "About",
36
- description: "Links and community",
37
- get content() {
38
- return /* @__PURE__ */ jsxRuntimeExports.jsx(AboutSettings, {});
39
- }
40
- }
41
- };
42
- function AboutSettings() {
43
- const { data } = useVersionCheck();
44
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [
45
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5 rounded-xl border border-border bg-background px-4 py-3 shadow-sm", children: [
46
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-violet-50 dark:bg-violet-950/40", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconPackage, { className: "size-5 text-violet-600 dark:text-violet-400" }) }),
47
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
48
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Hermium" }),
49
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground", children: [
50
- data?.current ? `Version ${data.current}` : "Loading version...",
51
- data?.outdated && data.latest && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1.5 text-amber-600 dark:text-amber-400", children: [
52
- "(v",
53
- data.latest,
54
- " available)"
55
- ] })
56
- ] })
57
- ] })
58
- ] }),
59
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
60
- "a",
61
- {
62
- href: "https://github.com/abboskhonov/hermium",
63
- target: "_blank",
64
- rel: "noopener noreferrer",
65
- className: "group flex items-center gap-3.5 rounded-xl border border-border bg-background px-4 py-3 text-sm text-foreground shadow-sm hover:border-foreground/20 hover:shadow-md transition-all",
66
- children: [
67
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-neutral-100 dark:bg-neutral-800", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconBrandGithub, { className: "size-5 text-neutral-700 dark:text-neutral-300" }) }),
68
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
69
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "GitHub" }),
70
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground truncate", children: "abboskhonov/hermium" })
71
- ] }),
72
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowUpRight, { className: "size-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
73
- ]
74
- }
75
- ),
76
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
77
- "a",
78
- {
79
- href: "https://hermium.vercel.app",
80
- target: "_blank",
81
- rel: "noopener noreferrer",
82
- className: "group flex items-center gap-3.5 rounded-xl border border-border bg-background px-4 py-3 text-sm text-foreground shadow-sm hover:border-foreground/20 hover:shadow-md transition-all",
83
- children: [
84
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-emerald-50 dark:bg-emerald-950/40", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconWorld, { className: "size-5 text-emerald-600 dark:text-emerald-400" }) }),
85
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
86
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Website" }),
87
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground truncate", children: "hermium.vercel.app" })
88
- ] }),
89
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowUpRight, { className: "size-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
90
- ]
91
- }
92
- ),
93
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
94
- "a",
95
- {
96
- href: "https://t.me/hermium_chat",
97
- target: "_blank",
98
- rel: "noopener noreferrer",
99
- className: "group flex items-center gap-3.5 rounded-xl border border-border bg-background px-4 py-3 text-sm text-foreground shadow-sm hover:border-foreground/20 hover:shadow-md transition-all",
100
- children: [
101
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-sky-50 dark:bg-sky-950/40", children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconBrandTelegram, { className: "size-5 text-sky-500 dark:text-sky-400" }) }),
102
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
103
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium", children: "Telegram" }),
104
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground truncate", children: "@hermium_chat" })
105
- ] }),
106
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowUpRight, { className: "size-4 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0" })
107
- ]
108
- }
109
- )
110
- ] });
111
- }
112
- function ModelSettings() {
113
- const { data, isLoading } = useModels();
114
- const [selected, setSelected] = reactExports.useState("");
115
- const [saving, setSaving] = reactExports.useState(false);
116
- const models = data?.models ?? [];
117
- const defaultModel = data?.default_model;
118
- const current = selected || defaultModel || "";
119
- const handleSave = reactExports.useCallback(async () => {
120
- if (!current) return;
121
- setSaving(true);
122
- try {
123
- await updateModelConfig({ model: current });
124
- } catch {
125
- } finally {
126
- setSaving(false);
127
- }
128
- }, [current]);
129
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
130
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium text-foreground", children: "Active Model" }),
131
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Pick the model your Hermes agent currently uses." }),
132
- isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground", children: "Loading…" }) : models.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-sm text-muted-foreground", children: [
133
- "No models found. Check your ",
134
- /* @__PURE__ */ jsxRuntimeExports.jsx("code", { children: "~/.hermes/config.yaml" }),
135
- "."
136
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
137
- /* @__PURE__ */ jsxRuntimeExports.jsx(
138
- "select",
139
- {
140
- value: current,
141
- onChange: (e) => setSelected(e.target.value),
142
- className: "rounded-lg border border-border bg-background px-3 py-2 text-sm text-foreground shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-ring min-w-[240px]",
143
- children: models.map((m) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: m.id, children: m.name }, m.id))
144
- }
145
- ),
146
- /* @__PURE__ */ jsxRuntimeExports.jsx(
147
- "button",
148
- {
149
- onClick: handleSave,
150
- disabled: saving || !current || current === defaultModel,
151
- className: cn(
152
- "rounded-lg px-4 py-2 text-sm font-medium transition-colors",
153
- saving || !current || current === defaultModel ? "bg-muted text-muted-foreground cursor-not-allowed" : "bg-primary text-primary-foreground hover:bg-primary/90"
154
- ),
155
- children: saving ? "Saving…" : "Save"
156
- }
157
- )
158
- ] }),
159
- defaultModel && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground", children: [
160
- "Current: ",
161
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: defaultModel })
162
- ] })
163
- ] });
164
- }
165
- function ThemePreview({ variant }) {
166
- const isLight = variant === "light";
167
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative w-full aspect-[16/10] overflow-hidden rounded-lg", children: variant === "system" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full w-full", children: [
168
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full w-1/2 bg-neutral-100", children: [
169
- /* @__PURE__ */ jsxRuntimeExports.jsx(MiniSidebar, { light: true }),
170
- /* @__PURE__ */ jsxRuntimeExports.jsx(MiniContent, { light: true })
171
- ] }),
172
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full w-1/2 bg-neutral-900", children: [
173
- /* @__PURE__ */ jsxRuntimeExports.jsx(MiniSidebar, { light: false }),
174
- /* @__PURE__ */ jsxRuntimeExports.jsx(MiniContent, { light: false })
175
- ] })
176
- ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cn("flex h-full w-full", isLight ? "bg-neutral-100" : "bg-neutral-900"), children: [
177
- /* @__PURE__ */ jsxRuntimeExports.jsx(MiniSidebar, { light: isLight }),
178
- /* @__PURE__ */ jsxRuntimeExports.jsx(MiniContent, { light: isLight })
179
- ] }) });
180
- }
181
- function MiniSidebar({ light }) {
182
- const bg = light ? "bg-white" : "bg-neutral-800";
183
- const line = light ? "bg-neutral-200" : "bg-neutral-700";
184
- const accent = light ? "bg-neutral-300" : "bg-neutral-600";
185
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cn("flex w-[28%] flex-col gap-1.5 p-1.5", bg), children: [
186
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("h-1.5 w-4 rounded-sm", accent) }),
187
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("mt-1 h-0.5 w-full rounded-sm", line) }),
188
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("h-0.5 w-3/4 rounded-sm", line) }),
189
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("h-0.5 w-5/6 rounded-sm", line) }),
190
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("mt-auto h-0.5 w-2/3 rounded-sm", line) })
191
- ] });
192
- }
193
- function MiniContent({ light }) {
194
- const bg = light ? "bg-neutral-50" : "bg-neutral-950";
195
- const msgUser = light ? "bg-neutral-200" : "bg-neutral-700";
196
- const msgBot = light ? "bg-neutral-100" : "bg-neutral-800";
197
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: cn("flex flex-1 flex-col gap-1.5 p-1.5", bg), children: [
198
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("h-2 w-full rounded-sm", msgBot) }),
199
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("ml-auto h-2 w-2/3 rounded-sm", msgUser) }),
200
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("h-2 w-5/6 rounded-sm", msgBot) }),
201
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("ml-auto h-2 w-1/2 rounded-sm", msgUser) }),
202
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("mt-auto h-1.5 w-full rounded-sm", light ? "bg-white" : "bg-neutral-800") })
203
- ] });
204
- }
205
- function AppearanceSettings() {
206
- const { theme, setTheme } = useTheme();
207
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [
208
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-sm font-medium text-foreground", children: "Theme" }),
209
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Choose how Hermium looks for you." }),
210
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-3 gap-3 pt-1", children: [
211
- { id: "light", label: "Light" },
212
- { id: "dark", label: "Dark" },
213
- { id: "system", label: "System" }
214
- ].map((t) => {
215
- const isActive = t.id === theme;
216
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
217
- "button",
218
- {
219
- onClick: () => setTheme(t.id),
220
- className: cn(
221
- "flex flex-col items-center gap-2 rounded-xl border p-2 text-xs font-medium transition-all",
222
- isActive ? "border-[#2563eb] bg-primary/5 text-foreground ring-1 ring-[#2563eb]" : "border-border text-muted-foreground hover:border-foreground/20 hover:text-foreground"
223
- ),
224
- children: [
225
- /* @__PURE__ */ jsxRuntimeExports.jsx(ThemePreview, { variant: t.id }),
226
- t.label
227
- ]
228
- },
229
- t.id
230
- );
231
- }) })
232
- ] });
233
- }
234
- function cn(...classes) {
235
- return classes.filter(Boolean).join(" ");
236
- }
237
- function SettingsPage({ section }) {
238
- const currentSectionId = section && section in settingsMap ? section : "appearance";
239
- const current = settingsMap[currentSectionId];
240
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-2xl px-8 py-8", children: [
241
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [
242
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold text-foreground", children: current.title }),
243
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mt-0.5", children: current.description })
244
- ] }),
245
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-xl border border-border bg-card p-6", children: current.content })
246
- ] }) });
247
- }
248
- export {
249
- ModelSettings as M,
250
- SettingsPage as S
251
- };
@@ -1,213 +0,0 @@
1
- import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { a as cn, g as get } from "./router-CS6Zq3md.mjs";
3
- import { D as IconRefresh, p as IconChartBar } from "../_libs/tabler__icons-react.mjs";
4
- import "../_libs/tanstack__react-router.mjs";
5
- import "../_libs/tanstack__router-core.mjs";
6
- import "../_libs/tanstack__history.mjs";
7
- import "../_libs/cookie-es.mjs";
8
- import "../_libs/seroval.mjs";
9
- import "../_libs/seroval-plugins.mjs";
10
- import "node:stream/web";
11
- import "node:stream";
12
- import "../_libs/react-dom.mjs";
13
- import "util";
14
- import "crypto";
15
- import "async_hooks";
16
- import "stream";
17
- import "../_libs/isbot.mjs";
18
- import "../_libs/tanstack__query-core.mjs";
19
- import "../_libs/tanstack__react-query.mjs";
20
- import "../_libs/clsx.mjs";
21
- import "../_libs/class-variance-authority.mjs";
22
- import "../_libs/zustand.mjs";
23
- import "../_libs/base-ui__react.mjs";
24
- import "../_libs/base-ui__utils.mjs";
25
- import "../_libs/use-sync-external-store.mjs";
26
- import "../_libs/floating-ui__utils.mjs";
27
- import "../_libs/floating-ui__react-dom.mjs";
28
- import "../_libs/floating-ui__dom.mjs";
29
- import "../_libs/floating-ui__core.mjs";
30
- import "../_libs/zod.mjs";
31
- function fetchUsage(days = 30) {
32
- return get(`/api/hermes/insights?days=${days}`);
33
- }
34
- const PERIODS = [
35
- { label: "7d", days: 7 },
36
- { label: "30d", days: 30 },
37
- { label: "90d", days: 90 }
38
- ];
39
- function fmt(n) {
40
- if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
41
- if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
42
- return String(n);
43
- }
44
- function fmtCost(n) {
45
- if (n >= 1) return `$${n.toFixed(2)}`;
46
- if (n >= 0.01) return `$${n.toFixed(4)}`;
47
- return n > 0 ? `$${n.toFixed(6)}` : "$0.00";
48
- }
49
- function fmtPct(n) {
50
- return `${(n * 100).toFixed(1)}%`;
51
- }
52
- function fmtDate(day) {
53
- try {
54
- const d = /* @__PURE__ */ new Date(day + "T00:00:00");
55
- return d.toLocaleDateString(void 0, { month: "short", day: "numeric" });
56
- } catch {
57
- return day;
58
- }
59
- }
60
- function StatCard({
61
- label,
62
- value,
63
- sub
64
- }) {
65
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-card p-4 flex flex-col gap-1", children: [
66
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/70", children: label }),
67
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xl font-semibold text-foreground tracking-tight", children: value }),
68
- sub && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground/50", children: sub })
69
- ] });
70
- }
71
- function ModelBreakdown({ models }) {
72
- if (models.length === 0) return null;
73
- const total = models.reduce((s, m) => s + m.sessions, 0);
74
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-card p-4", children: [
75
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium text-foreground mb-3", children: "Model Breakdown" }),
76
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2.5", children: models.map((m) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
77
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-1", children: [
78
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-foreground truncate", children: m.model }),
79
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-muted-foreground tabular-nums ml-3", children: m.sessions })
80
- ] }),
81
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-1.5 rounded-full bg-muted overflow-hidden", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
82
- "div",
83
- {
84
- className: "h-full rounded-full bg-primary/50 transition-all",
85
- style: { width: `${total > 0 ? m.sessions / total * 100 : 0}%` }
86
- }
87
- ) })
88
- ] }) }, m.model)) })
89
- ] });
90
- }
91
- function DailyTable({ daily }) {
92
- if (daily.length === 0) return null;
93
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-card", children: [
94
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-4 pt-4 pb-3", children: [
95
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconChartBar, { className: "size-4 text-muted-foreground" }),
96
- /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-medium text-foreground", children: "Daily Usage (Last 30 Days)" })
97
- ] }),
98
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full text-xs", children: [
99
- /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t border-border text-muted-foreground/60", children: [
100
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-left px-4 py-2 font-medium", children: "Date" }),
101
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-right px-2 py-2 font-medium", children: "Input" }),
102
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-right px-2 py-2 font-medium", children: "Output" }),
103
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-right px-2 py-2 font-medium", children: "Cache Hit Rate" }),
104
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "text-right px-2 py-2 font-medium", children: "Sessions" })
105
- ] }) }),
106
- /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: daily.map((d) => /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-t border-border/50 hover:bg-muted/30 transition-colors", children: [
107
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-4 py-2.5 text-foreground font-medium whitespace-nowrap", children: fmtDate(d.date) }),
108
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-2.5 text-right text-muted-foreground tabular-nums", children: d.input_tokens > 0 ? fmt(d.input_tokens) : "—" }),
109
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-2.5 text-right text-muted-foreground tabular-nums", children: d.output_tokens > 0 ? fmt(d.output_tokens) : "—" }),
110
- /* @__PURE__ */ jsxRuntimeExports.jsx(
111
- "td",
112
- {
113
- className: "px-2 py-2.5 text-right tabular-nums",
114
- style: { color: d.cache_hit_rate > 0.8 ? "#22c55e" : d.cache_hit_rate > 0.5 ? "#eab308" : "inherit" },
115
- children: d.cache_hit_rate > 0 ? fmtPct(d.cache_hit_rate) : "—"
116
- }
117
- ),
118
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-2 py-2.5 text-right text-muted-foreground tabular-nums", children: d.sessions })
119
- ] }, d.date)) })
120
- ] }) })
121
- ] });
122
- }
123
- function UsagePage() {
124
- const [days, setDays] = reactExports.useState(30);
125
- const [data, setData] = reactExports.useState(null);
126
- const [loading, setLoading] = reactExports.useState(true);
127
- const [error, setError] = reactExports.useState(null);
128
- const load = reactExports.useCallback(() => {
129
- setLoading(true);
130
- setError(null);
131
- fetchUsage(days).then(setData).catch((err) => setError(err instanceof Error ? err.message : "Failed to load")).finally(() => setLoading(false));
132
- }, [days]);
133
- reactExports.useEffect(() => {
134
- load();
135
- }, [load]);
136
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0 overflow-y-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-3xl px-6 py-6 flex flex-col gap-5", children: [
137
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
138
- /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Usage" }),
139
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
140
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-0.5 rounded-lg border border-border p-0.5", children: PERIODS.map((p) => /* @__PURE__ */ jsxRuntimeExports.jsx(
141
- "button",
142
- {
143
- onClick: () => setDays(p.days),
144
- className: cn(
145
- "rounded-md px-2.5 py-1 text-xs font-medium transition-colors",
146
- days === p.days ? "bg-muted text-foreground" : "text-muted-foreground hover:text-foreground"
147
- ),
148
- children: p.label
149
- },
150
- p.label
151
- )) }),
152
- /* @__PURE__ */ jsxRuntimeExports.jsx(
153
- "button",
154
- {
155
- onClick: load,
156
- disabled: loading,
157
- className: "flex items-center justify-center rounded-md size-7 text-muted-foreground hover:text-foreground hover:bg-muted transition-colors disabled:opacity-50",
158
- "aria-label": "Refresh",
159
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconRefresh, { className: cn("size-3.5", loading && "animate-spin") })
160
- }
161
- )
162
- ] })
163
- ] }),
164
- loading && !data && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center py-20", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-5 rounded-full border-2 border-muted-foreground/30 border-t-foreground animate-spin" }) }),
165
- error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg border border-destructive/30 bg-destructive/5 px-4 py-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-destructive", children: error }) }),
166
- data && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
167
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-4 gap-3", children: [
168
- /* @__PURE__ */ jsxRuntimeExports.jsx(
169
- StatCard,
170
- {
171
- label: "Total Tokens",
172
- value: data.total_tokens > 0 ? fmt(data.total_tokens) : "—",
173
- sub: data.total_tokens > 0 ? `${fmt(data.total_input_tokens)} Input / ${fmt(data.total_output_tokens)} Output` : void 0
174
- }
175
- ),
176
- /* @__PURE__ */ jsxRuntimeExports.jsx(
177
- StatCard,
178
- {
179
- label: "Total Sessions",
180
- value: String(data.total_sessions),
181
- sub: data.total_sessions > 0 ? `~${(data.total_sessions / days).toFixed(1)}/day avg` : void 0
182
- }
183
- ),
184
- /* @__PURE__ */ jsxRuntimeExports.jsx(
185
- StatCard,
186
- {
187
- label: "Est. Cost",
188
- value: fmtCost(data.total_cost)
189
- }
190
- ),
191
- /* @__PURE__ */ jsxRuntimeExports.jsx(
192
- StatCard,
193
- {
194
- label: "Cache Hit Rate",
195
- value: data.cache_hit_rate > 0 ? fmtPct(data.cache_hit_rate) : "—",
196
- sub: data.total_cache_read > 0 ? `${fmt(data.total_cache_read)} Tokens` : void 0
197
- }
198
- )
199
- ] }),
200
- /* @__PURE__ */ jsxRuntimeExports.jsx(ModelBreakdown, { models: data.models }),
201
- /* @__PURE__ */ jsxRuntimeExports.jsx(DailyTable, { daily: data.daily_tokens }),
202
- data.daily_tokens.length === 0 && data.models.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center py-20 text-muted-foreground", children: [
203
- /* @__PURE__ */ jsxRuntimeExports.jsx(IconChartBar, { className: "size-8 mb-3 opacity-40" }),
204
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium", children: "No usage data available" }),
205
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs mt-1 text-muted-foreground/60", children: "Start a conversation to see usage stats." })
206
- ] })
207
- ] })
208
- ] }) });
209
- }
210
- const SplitComponent = UsagePage;
211
- export {
212
- SplitComponent as component
213
- };