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.
- package/README.md +56 -0
- package/bin/hermium.mjs +201 -136
- package/dist/api.mjs +3513 -0
- package/dist/{web-server → server}/_chunks/ssr-renderer.mjs +1 -1
- package/dist/{web-server → server}/_libs/base-ui__react.mjs +338 -34
- package/dist/{web-server → server}/_libs/base-ui__utils.mjs +38 -33
- package/dist/server/_libs/comma-separated-tokens.mjs +10 -0
- package/dist/{web-server → server}/_libs/floating-ui__core.mjs +3 -3
- package/dist/{web-server → server}/_libs/floating-ui__dom.mjs +4 -4
- package/dist/{web-server → server}/_libs/floating-ui__react-dom.mjs +3 -3
- package/dist/{web-server → server}/_libs/floating-ui__utils.mjs +38 -38
- package/dist/{web-server → server}/_libs/h3.mjs +3 -3
- package/dist/server/_libs/hast-util-is-element.mjs +75 -0
- package/dist/{web-server → server}/_libs/hast-util-to-jsx-runtime.mjs +2 -2
- package/dist/server/_libs/hast-util-to-text.mjs +305 -0
- package/dist/server/_libs/highlight.js.mjs +14756 -0
- package/dist/server/_libs/lowlight.mjs +262 -0
- package/dist/{web-server → server}/_libs/mdast-util-from-markdown.mjs +1 -1
- package/dist/{web-server → server}/_libs/mdast-util-gfm-autolink-literal+[...].mjs +2 -2
- package/dist/{web-server → server}/_libs/mdast-util-to-hast.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-core-commonmark.mjs +24 -24
- package/dist/{web-server → server}/_libs/micromark-extension-gfm-autolink-literal+[...].mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-extension-gfm-footnote+[...].mjs +2 -2
- package/dist/{web-server → server}/_libs/micromark-extension-gfm-table.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-extension-gfm-task-list-item+[...].mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-factory-destination.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-factory-label.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-factory-space.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-factory-whitespace.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-util-character.mjs +12 -12
- package/dist/{web-server → server}/_libs/micromark-util-classify-character+[...].mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark-util-html-tag-name.mjs +2 -2
- package/dist/{web-server → server}/_libs/micromark-util-sanitize-uri.mjs +1 -1
- package/dist/{web-server → server}/_libs/micromark.mjs +3 -3
- package/dist/{web-server → server}/_libs/property-information.mjs +2 -3
- package/dist/{web-server → server}/_libs/react-dom.mjs +1 -1
- package/dist/{web-server → server}/_libs/react.mjs +42 -42
- package/dist/server/_libs/rehype-highlight.mjs +94 -0
- package/dist/server/_libs/space-separated-tokens.mjs +6 -0
- package/dist/server/_libs/tabler__icons-react.mjs +140 -0
- package/dist/server/_libs/tailwind-merge.mjs +3255 -0
- package/dist/server/_libs/tanstack__history.mjs +29 -0
- package/dist/{web-server → server}/_libs/tanstack__react-router.mjs +3 -3
- package/dist/{web-server → server}/_libs/tanstack__router-core.mjs +47 -741
- package/dist/server/_libs/unist-util-find-after.mjs +41 -0
- package/dist/{web-server → server}/_libs/unist-util-position.mjs +2 -2
- package/dist/{web-server → server}/_libs/use-sync-external-store.mjs +1 -1
- package/dist/server/_libs/zustand.mjs +43 -0
- package/dist/server/_ssr/ChatInputBlock-Bu2-iop_.mjs +220 -0
- package/dist/server/_ssr/MarkdownMessage-CNS7OSKN.mjs +68 -0
- package/dist/server/_ssr/chat._sessionId-P02iSfut.mjs +477 -0
- package/dist/{web-server/_ssr/index-CoDfv1vI.mjs → server/_ssr/chat.index-BYB_48NC.mjs} +6 -8
- package/dist/server/_ssr/index-C1mT_2d8.mjs +4890 -0
- package/dist/server/_ssr/index-DFV9_oCk.mjs +43 -0
- package/dist/server/_ssr/memory-CW_fSOG9.mjs +257 -0
- package/dist/{web-server/_ssr/router-CS6Zq3md.mjs → server/_ssr/router-CUAfx91O.mjs} +1009 -1108
- package/dist/server/_ssr/settings-DoXurzvn.mjs +10 -0
- package/dist/server/_ssr/skills-Cs7A5ZwO.mjs +422 -0
- package/dist/server/_ssr/theme-BK4-7E2h.mjs +42 -0
- package/dist/server/_ssr/usage-Bs2-LXGz.mjs +298 -0
- package/dist/server/_tanstack-start-manifest_v-C7Upe2TI.mjs +4 -0
- package/dist/server/index.mjs +502 -240
- package/package.json +4 -3
- package/dist/public/assets/IconAlertCircle-BW147gsG.js +0 -1
- package/dist/public/assets/IconAlertTriangle-DCoTLVSd.js +0 -1
- package/dist/public/assets/IconCheck-DAO7Fpl9.js +0 -1
- package/dist/public/assets/IconCode-BqfTl5wU.js +0 -1
- package/dist/public/assets/IconLoader2-B_pehSXN.js +0 -1
- package/dist/public/assets/IconRefresh-BbMGoMV8.js +0 -1
- package/dist/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/dist/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/dist/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/dist/public/assets/index-BL9a2Xg9.js +0 -1
- package/dist/public/assets/index-BSwXjgjr.js +0 -1
- package/dist/public/assets/index-BWl8tn18.js +0 -1
- package/dist/public/assets/index-CQh8SXb2.js +0 -94
- package/dist/public/assets/index-Cxd-kSUY.js +0 -1
- package/dist/public/assets/index-DA5SH--7.js +0 -2
- package/dist/public/assets/index-DCHbvtBS.js +0 -1
- package/dist/public/assets/index-DCYXJZEe.js +0 -1
- package/dist/public/assets/index-DFDfp0ca.js +0 -1
- package/dist/public/assets/index-GuAAqSCJ.js +0 -14
- package/dist/public/assets/index-WIDirTHx.js +0 -29
- package/dist/public/assets/index-X3XZcAzy.js +0 -1
- package/dist/public/assets/input-7TQEEJq6.js +0 -1
- package/dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/public/assets/models-BlUb1eaf.js +0 -1
- package/dist/public/assets/styles-PHtUFHUr.css +0 -1
- package/dist/public/assets/switch-B_iYUUM3.js +0 -1
- package/dist/public/assets/syntax-highlighter-DcBYfnEK.js +0 -6
- package/dist/public/assets/textarea-Dm4aaRqS.js +0 -1
- package/dist/public/favicon.ico +0 -0
- package/dist/public/favicon.png +0 -0
- package/dist/public/manifest.json +0 -25
- package/dist/public/nous-logo.png +0 -0
- package/dist/public/robots.txt +0 -3
- package/dist/web-server/_libs/babel__runtime.mjs +0 -237
- package/dist/web-server/_libs/character-entities-legacy.mjs +0 -111
- package/dist/web-server/_libs/character-reference-invalid.mjs +0 -33
- package/dist/web-server/_libs/comma-separated-tokens.mjs +0 -31
- package/dist/web-server/_libs/cookie-es.mjs +0 -44
- package/dist/web-server/_libs/hast-util-parse-selector.mjs +0 -39
- package/dist/web-server/_libs/hastscript.mjs +0 -200
- package/dist/web-server/_libs/is-alphabetical.mjs +0 -7
- package/dist/web-server/_libs/is-alphanumerical.mjs +0 -8
- package/dist/web-server/_libs/is-decimal.mjs +0 -7
- package/dist/web-server/_libs/is-hexadecimal.mjs +0 -7
- package/dist/web-server/_libs/lowlight.mjs +0 -1
- package/dist/web-server/_libs/parse-entities.mjs +0 -245
- package/dist/web-server/_libs/react-syntax-highlighter.mjs +0 -941
- package/dist/web-server/_libs/refractor.mjs +0 -2425
- package/dist/web-server/_libs/seroval-plugins.mjs +0 -58
- package/dist/web-server/_libs/seroval.mjs +0 -1775
- package/dist/web-server/_libs/space-separated-tokens.mjs +0 -11
- package/dist/web-server/_libs/tabler__icons-react.mjs +0 -233
- package/dist/web-server/_libs/tanstack__history.mjs +0 -204
- package/dist/web-server/_libs/tanstack__query-core.mjs +0 -2552
- package/dist/web-server/_libs/tanstack__react-query.mjs +0 -190
- package/dist/web-server/_libs/zod.mjs +0 -3915
- package/dist/web-server/_libs/zustand.mjs +0 -343
- package/dist/web-server/_ssr/index--Bo2_ipW.mjs +0 -277
- package/dist/web-server/_ssr/index-BEvygh5x.mjs +0 -612
- package/dist/web-server/_ssr/index-BFaKxYfN.mjs +0 -40
- package/dist/web-server/_ssr/index-BdrMzRTd.mjs +0 -513
- package/dist/web-server/_ssr/index-Cwp8Gyl1.mjs +0 -1812
- package/dist/web-server/_ssr/index-DQsfKYjV.mjs +0 -449
- package/dist/web-server/_ssr/index-Dbs9k8Ea.mjs +0 -251
- package/dist/web-server/_ssr/index-Dk93oyZD.mjs +0 -213
- package/dist/web-server/_ssr/index-KNJ7huw_.mjs +0 -369
- package/dist/web-server/_ssr/index.mjs +0 -1558
- package/dist/web-server/_ssr/input-BV1DMASc.mjs +0 -20
- package/dist/web-server/_ssr/models-MzrvbL2i.mjs +0 -43
- package/dist/web-server/_ssr/start-HYkvq4Ni.mjs +0 -4
- package/dist/web-server/_ssr/switch-Bd-Sg0HG.mjs +0 -33
- package/dist/web-server/_ssr/syntax-highlighter-5vezNTce.mjs +0 -62
- package/dist/web-server/_ssr/textarea-CB4kQp9w.mjs +0 -18
- package/dist/web-server/_tanstack-start-manifest_v-m5lY48LR.mjs +0 -4
- package/dist/web-server/index.mjs +0 -611
- /package/dist/{web-server → server}/__23tanstack-start-plugin-adapters-Cwee5PKy.mjs +0 -0
- /package/dist/{web-server → server}/_libs/bail.mjs +0 -0
- /package/dist/{web-server → server}/_libs/ccount.mjs +0 -0
- /package/dist/{web-server → server}/_libs/character-entities.mjs +0 -0
- /package/dist/{web-server → server}/_libs/class-variance-authority.mjs +0 -0
- /package/dist/{web-server → server}/_libs/clsx.mjs +0 -0
- /package/dist/{web-server/_libs/croner.mjs → server/_libs/cookie-es.mjs} +0 -0
- /package/dist/{web-server/_libs/crossws.mjs → server/_libs/croner.mjs} +0 -0
- /package/dist/{web-server/_libs/fault.mjs → server/_libs/crossws.mjs} +0 -0
- /package/dist/{web-server → server}/_libs/decode-named-character-reference+[...].mjs +0 -0
- /package/dist/{web-server → server}/_libs/devlop.mjs +0 -0
- /package/dist/{web-server → server}/_libs/escape-string-regexp.mjs +0 -0
- /package/dist/{web-server → server}/_libs/estree-util-is-identifier-name.mjs +0 -0
- /package/dist/{web-server → server}/_libs/extend.mjs +0 -0
- /package/dist/{web-server → server}/_libs/hast-util-whitespace.mjs +0 -0
- /package/dist/{web-server → server}/_libs/hookable.mjs +0 -0
- /package/dist/{web-server → server}/_libs/html-url-attributes.mjs +0 -0
- /package/dist/{web-server → server}/_libs/inline-style-parser.mjs +0 -0
- /package/dist/{web-server → server}/_libs/is-plain-obj.mjs +0 -0
- /package/dist/{web-server → server}/_libs/isbot.mjs +0 -0
- /package/dist/{web-server → server}/_libs/longest-streak.mjs +0 -0
- /package/dist/{web-server → server}/_libs/markdown-table.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-find-and-replace.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-gfm-footnote.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-gfm-strikethrough.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-gfm-table.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-gfm-task-list-item.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-gfm.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-phrasing.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-to-markdown.mjs +0 -0
- /package/dist/{web-server → server}/_libs/mdast-util-to-string.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-extension-gfm-strikethrough+[...].mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-extension-gfm-tagfilter+[...].mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-extension-gfm.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-factory-title.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-chunked.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-combine-extensions+[...].mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-decode-string.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-encode.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-normalize-identifier+[...].mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-resolve-all.mjs +0 -0
- /package/dist/{web-server → server}/_libs/micromark-util-subtokenize.mjs +0 -0
- /package/dist/{web-server → server}/_libs/ocache.mjs +0 -0
- /package/dist/{web-server → server}/_libs/ohash.mjs +0 -0
- /package/dist/{web-server → server}/_libs/react-markdown.mjs +0 -0
- /package/dist/{web-server → server}/_libs/remark-gfm.mjs +0 -0
- /package/dist/{web-server → server}/_libs/remark-parse.mjs +0 -0
- /package/dist/{web-server → server}/_libs/remark-rehype.mjs +0 -0
- /package/dist/{web-server → server}/_libs/reselect.mjs +0 -0
- /package/dist/{web-server → server}/_libs/rou3.mjs +0 -0
- /package/dist/{web-server/_libs/format.mjs → server/_libs/seroval-plugins.mjs} +0 -0
- /package/dist/{web-server/_libs/highlight.js.mjs → server/_libs/seroval.mjs} +0 -0
- /package/dist/{web-server → server}/_libs/srvx.mjs +0 -0
- /package/dist/{web-server → server}/_libs/style-to-js.mjs +0 -0
- /package/dist/{web-server → server}/_libs/style-to-object.mjs +0 -0
- /package/dist/{web-server → server}/_libs/tanstack__react-store.mjs +0 -0
- /package/dist/{web-server → server}/_libs/tanstack__store.mjs +0 -0
- /package/dist/{web-server → server}/_libs/trim-lines.mjs +0 -0
- /package/dist/{web-server → server}/_libs/trough.mjs +0 -0
- /package/dist/{web-server → server}/_libs/ufo.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unctx.mjs +0 -0
- /package/dist/{web-server → server}/_libs/ungap__structured-clone.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unified.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unist-util-is.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unist-util-stringify-position.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unist-util-visit-parents.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unist-util-visit.mjs +0 -0
- /package/dist/{web-server → server}/_libs/unstorage.mjs +0 -0
- /package/dist/{web-server → server}/_libs/vfile-message.mjs +0 -0
- /package/dist/{web-server → server}/_libs/vfile.mjs +0 -0
- /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
|
-
};
|