@shi-yangyang/dsh-token-dashboard 0.2.0 → 0.2.1
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.en.md +6 -5
- package/README.md +6 -5
- package/client/client.js +1185 -954
- package/lib/shared/builtin-prices.d.ts +10 -1
- package/lib/shared/builtin-prices.generated.d.ts +1 -1
- package/lib/shared/builtin-prices.generated.js +479 -95
- package/lib/shared/builtin-prices.js +25 -1
- package/lib/shared/pricing.d.ts +2 -0
- package/lib/shared/pricing.js +14 -1
- package/package.json +1 -1
package/client/client.js
CHANGED
|
@@ -39,10 +39,10 @@ window.__ModuleLoader__.load({
|
|
|
39
39
|
module.exports = __toCommonJS(index_exports);
|
|
40
40
|
|
|
41
41
|
// src/client/plugin.ts
|
|
42
|
-
var
|
|
42
|
+
var import_react93 = require("react");
|
|
43
43
|
|
|
44
44
|
// src/client/App.tsx
|
|
45
|
-
var
|
|
45
|
+
var import_react92 = require("react");
|
|
46
46
|
|
|
47
47
|
// src/client/components/Cards.tsx
|
|
48
48
|
var import_react = require("react");
|
|
@@ -329,10 +329,10 @@ window.__ModuleLoader__.load({
|
|
|
329
329
|
}
|
|
330
330
|
|
|
331
331
|
// src/client/components/Cost.tsx
|
|
332
|
-
var
|
|
332
|
+
var import_react56 = require("react");
|
|
333
333
|
|
|
334
334
|
// src/client/components/common.tsx
|
|
335
|
-
var
|
|
335
|
+
var import_react49 = require("react");
|
|
336
336
|
|
|
337
337
|
// src/client/icons.tsx
|
|
338
338
|
var import_react2 = require("react");
|
|
@@ -15869,7 +15869,7 @@ window.__ModuleLoader__.load({
|
|
|
15869
15869
|
|
|
15870
15870
|
// src/client/beui/components/motion/morphing-modal.tsx
|
|
15871
15871
|
var import_react47 = require("react");
|
|
15872
|
-
var
|
|
15872
|
+
var import_react48 = require("react");
|
|
15873
15873
|
|
|
15874
15874
|
// src/client/beui/lib/hooks/use-focus-trap.ts
|
|
15875
15875
|
var import_react46 = require("react");
|
|
@@ -15935,154 +15935,6 @@ window.__ModuleLoader__.load({
|
|
|
15935
15935
|
}, [open, panel]);
|
|
15936
15936
|
}
|
|
15937
15937
|
|
|
15938
|
-
// src/client/beui/components/motion/morphing-modal.tsx
|
|
15939
|
-
function MorphingModal({
|
|
15940
|
-
viewId,
|
|
15941
|
-
onClose,
|
|
15942
|
-
children,
|
|
15943
|
-
placement = "bottom",
|
|
15944
|
-
ariaLabel,
|
|
15945
|
-
className
|
|
15946
|
-
}) {
|
|
15947
|
-
const open = viewId !== null;
|
|
15948
|
-
const reduce = useReducedMotion();
|
|
15949
|
-
const panelRef = (0, import_react49.useRef)(null);
|
|
15950
|
-
const uid = (0, import_react49.useId)();
|
|
15951
|
-
const [headingId, setHeadingId] = (0, import_react49.useState)();
|
|
15952
|
-
useFocusTrap(open, panelRef, { onEscape: onClose });
|
|
15953
|
-
const currentView = () => Array.from(
|
|
15954
|
-
panelRef.current?.querySelectorAll("[data-view]") ?? []
|
|
15955
|
-
).find((element) => element.dataset.view === viewId);
|
|
15956
|
-
(0, import_react49.useLayoutEffect)(() => {
|
|
15957
|
-
if (!viewId || ariaLabel) return;
|
|
15958
|
-
const heading = currentView()?.querySelector(
|
|
15959
|
-
"h1, h2, h3, h4, h5, h6"
|
|
15960
|
-
);
|
|
15961
|
-
if (heading && !heading.id) heading.id = `${uid}-${viewId}-title`;
|
|
15962
|
-
setHeadingId(heading?.id);
|
|
15963
|
-
});
|
|
15964
|
-
const shownView = (0, import_react49.useRef)(viewId);
|
|
15965
|
-
(0, import_react49.useEffect)(() => {
|
|
15966
|
-
const previous = shownView.current;
|
|
15967
|
-
shownView.current = viewId;
|
|
15968
|
-
if (!viewId || !previous || previous === viewId) return;
|
|
15969
|
-
const panel = panelRef.current;
|
|
15970
|
-
const active2 = document.activeElement;
|
|
15971
|
-
if (!panel || active2 && active2 !== document.body && !panel.contains(active2))
|
|
15972
|
-
return;
|
|
15973
|
-
const view = currentView();
|
|
15974
|
-
(focusablesIn(view ?? null)[0] ?? panel).focus({ preventScroll: true });
|
|
15975
|
-
});
|
|
15976
|
-
const enterY = reduce ? 0 : placement === "bottom" ? 40 : 20;
|
|
15977
|
-
const enterScale = reduce ? 1 : 0.97;
|
|
15978
|
-
(0, import_react49.useEffect)(() => {
|
|
15979
|
-
if (!open) return;
|
|
15980
|
-
const prev = document.body.style.overflow;
|
|
15981
|
-
document.body.style.overflow = "hidden";
|
|
15982
|
-
return () => {
|
|
15983
|
-
document.body.style.overflow = prev;
|
|
15984
|
-
};
|
|
15985
|
-
}, [open]);
|
|
15986
|
-
return /* @__PURE__ */ (0, import_react47.createElement)(AnimatePresence, { initial: false }, open ? /* @__PURE__ */ (0, import_react47.createElement)(PresenceGate, { key: "backdrop" }, ({ gate }) => /* @__PURE__ */ (0, import_react47.createElement)(
|
|
15987
|
-
motion2.button,
|
|
15988
|
-
{
|
|
15989
|
-
type: "button",
|
|
15990
|
-
"aria-label": "Close modal",
|
|
15991
|
-
tabIndex: -1,
|
|
15992
|
-
initial: { opacity: 0 },
|
|
15993
|
-
animate: { opacity: 1 },
|
|
15994
|
-
exit: { opacity: 0 },
|
|
15995
|
-
transition: { duration: 0.2, ease: EASE_OUT },
|
|
15996
|
-
...gate,
|
|
15997
|
-
onClick: onClose,
|
|
15998
|
-
className: "pointer-events-auto fixed inset-0 z-[80] bg-background/5 [backdrop-filter:blur(14px)_saturate(140%)] [-webkit-backdrop-filter:blur(14px)_saturate(140%)]"
|
|
15999
|
-
}
|
|
16000
|
-
)) : null, open ? /* @__PURE__ */ (0, import_react47.createElement)(PresenceGate, { key: "panel-layer" }, ({ isPresent: isPresent2, gate }) => (
|
|
16001
|
-
// The layer itself never takes pointer events, so it carries
|
|
16002
|
-
// `inert` alone rather than the gate's pointer-events value.
|
|
16003
|
-
/* @__PURE__ */ (0, import_react47.createElement)(
|
|
16004
|
-
"div",
|
|
16005
|
-
{
|
|
16006
|
-
inert: !isPresent2 ? "" : void 0,
|
|
16007
|
-
className: cn(
|
|
16008
|
-
"pointer-events-none fixed inset-4 z-[80] flex justify-center",
|
|
16009
|
-
placement === "bottom" ? "items-end pb-4" : "items-center"
|
|
16010
|
-
)
|
|
16011
|
-
},
|
|
16012
|
-
/* @__PURE__ */ (0, import_react47.createElement)(
|
|
16013
|
-
motion2.div,
|
|
16014
|
-
{
|
|
16015
|
-
key: "panel",
|
|
16016
|
-
ref: panelRef,
|
|
16017
|
-
role: "dialog",
|
|
16018
|
-
"aria-modal": "true",
|
|
16019
|
-
"aria-label": ariaLabel,
|
|
16020
|
-
"aria-labelledby": ariaLabel ? void 0 : headingId,
|
|
16021
|
-
tabIndex: -1,
|
|
16022
|
-
layout: true,
|
|
16023
|
-
initial: { opacity: 0, y: enterY, scale: enterScale },
|
|
16024
|
-
animate: { opacity: 1, y: 0, scale: 1 },
|
|
16025
|
-
exit: {
|
|
16026
|
-
opacity: 0,
|
|
16027
|
-
y: enterY,
|
|
16028
|
-
scale: reduce ? 1 : 0.98,
|
|
16029
|
-
transition: { duration: 0.18, ease: EASE_OUT }
|
|
16030
|
-
},
|
|
16031
|
-
transition: SPRING_PANEL,
|
|
16032
|
-
...gate,
|
|
16033
|
-
className: cn(
|
|
16034
|
-
"pointer-events-auto relative w-full max-w-sm overflow-hidden rounded-3xl border border-border bg-background shadow-2xl outline-none will-change-transform",
|
|
16035
|
-
className
|
|
16036
|
-
)
|
|
16037
|
-
},
|
|
16038
|
-
/* @__PURE__ */ (0, import_react47.createElement)(motion2.div, { layout: "position", className: "p-5" }, /* @__PURE__ */ (0, import_react47.createElement)(AnimatePresence, { mode: "popLayout", initial: false }, /* @__PURE__ */ (0, import_react47.createElement)(
|
|
16039
|
-
motion2.div,
|
|
16040
|
-
{
|
|
16041
|
-
key: viewId,
|
|
16042
|
-
"data-view": viewId,
|
|
16043
|
-
initial: reduce ? { opacity: 0 } : { opacity: 0, y: 8, filter: "blur(4px)" },
|
|
16044
|
-
animate: reduce ? {
|
|
16045
|
-
opacity: 1,
|
|
16046
|
-
transition: {
|
|
16047
|
-
duration: 0.18,
|
|
16048
|
-
ease: EASE_OUT
|
|
16049
|
-
}
|
|
16050
|
-
} : {
|
|
16051
|
-
opacity: 1,
|
|
16052
|
-
y: 0,
|
|
16053
|
-
filter: "blur(0px)",
|
|
16054
|
-
transition: {
|
|
16055
|
-
duration: 0.24,
|
|
16056
|
-
ease: EASE_OUT
|
|
16057
|
-
}
|
|
16058
|
-
},
|
|
16059
|
-
exit: reduce ? {
|
|
16060
|
-
opacity: 0,
|
|
16061
|
-
transition: {
|
|
16062
|
-
duration: 0.14,
|
|
16063
|
-
ease: EASE_OUT
|
|
16064
|
-
}
|
|
16065
|
-
} : {
|
|
16066
|
-
opacity: 0,
|
|
16067
|
-
y: -8,
|
|
16068
|
-
filter: "blur(4px)",
|
|
16069
|
-
transition: {
|
|
16070
|
-
duration: 0.16,
|
|
16071
|
-
ease: EASE_OUT
|
|
16072
|
-
}
|
|
16073
|
-
}
|
|
16074
|
-
},
|
|
16075
|
-
/* @__PURE__ */ (0, import_react47.createElement)(PresenceGate, null, ({ isPresent: viewPresent }) => (
|
|
16076
|
-
// The outgoing view stays for its exit; inert keeps
|
|
16077
|
-
// the trap and assistive technology on the incoming one.
|
|
16078
|
-
/* @__PURE__ */ (0, import_react47.createElement)("div", { inert: !viewPresent ? "" : void 0 }, children)
|
|
16079
|
-
))
|
|
16080
|
-
)))
|
|
16081
|
-
)
|
|
16082
|
-
)
|
|
16083
|
-
)) : null);
|
|
16084
|
-
}
|
|
16085
|
-
|
|
16086
15938
|
// src/client/components/common.tsx
|
|
16087
15939
|
function Button3({
|
|
16088
15940
|
variant = "default",
|
|
@@ -16094,7 +15946,7 @@ window.__ModuleLoader__.load({
|
|
|
16094
15946
|
...rest
|
|
16095
15947
|
}) {
|
|
16096
15948
|
const beuiVariant = variant === "primary" ? "primary" : variant === "ghost" ? "ghost" : "outline";
|
|
16097
|
-
return (0,
|
|
15949
|
+
return (0, import_react49.createElement)(Button, {
|
|
16098
15950
|
...rest,
|
|
16099
15951
|
variant: beuiVariant,
|
|
16100
15952
|
size: iconOnly ? "icon" : "sm",
|
|
@@ -16105,46 +15957,46 @@ window.__ModuleLoader__.load({
|
|
|
16105
15957
|
}
|
|
16106
15958
|
function Tag({ tone, children }) {
|
|
16107
15959
|
const suffix = tone === void 0 ? "" : ` tdb-tag--${tone}`;
|
|
16108
|
-
return (0,
|
|
15960
|
+
return (0, import_react49.createElement)("span", { className: `tdb-tag${suffix}` }, children);
|
|
16109
15961
|
}
|
|
16110
15962
|
function ShareBar({ ratio, label: label2 }) {
|
|
16111
15963
|
const percent2 = Number.isFinite(ratio) ? Math.max(0, Math.min(1, ratio)) : 0;
|
|
16112
|
-
return (0,
|
|
15964
|
+
return (0, import_react49.createElement)(
|
|
16113
15965
|
"div",
|
|
16114
15966
|
{ className: "tdb-share" },
|
|
16115
|
-
(0,
|
|
15967
|
+
(0, import_react49.createElement)(
|
|
16116
15968
|
"div",
|
|
16117
15969
|
{ className: "tdb-share-track" },
|
|
16118
|
-
(0,
|
|
15970
|
+
(0, import_react49.createElement)("div", { className: "tdb-share-fill", style: { width: `${(percent2 * 100).toFixed(2)}%` } })
|
|
16119
15971
|
),
|
|
16120
|
-
(0,
|
|
15972
|
+
(0, import_react49.createElement)("span", { className: "tdb-share-text" }, label2)
|
|
16121
15973
|
);
|
|
16122
15974
|
}
|
|
16123
15975
|
function Notice({ tone = "info", icon, children, action }) {
|
|
16124
15976
|
const variant = tone === "error" ? "destructive" : tone === "warn" ? "warning" : "info";
|
|
16125
|
-
return (0,
|
|
15977
|
+
return (0, import_react49.createElement)(
|
|
16126
15978
|
Alert,
|
|
16127
15979
|
{ variant, open: true, className: "tdb-notice", role: tone === "error" ? "alert" : "status" },
|
|
16128
|
-
(0,
|
|
15980
|
+
(0, import_react49.createElement)(
|
|
16129
15981
|
AlertContent,
|
|
16130
15982
|
{},
|
|
16131
15983
|
icon,
|
|
16132
|
-
(0,
|
|
16133
|
-
action === void 0 ? null : (0,
|
|
15984
|
+
(0, import_react49.createElement)("div", { className: "min-w-0" }, children),
|
|
15985
|
+
action === void 0 ? null : (0, import_react49.createElement)(AlertAction, {}, action)
|
|
16134
15986
|
)
|
|
16135
15987
|
);
|
|
16136
15988
|
}
|
|
16137
15989
|
function EmptyState({ icon, title }) {
|
|
16138
|
-
return (0,
|
|
15990
|
+
return (0, import_react49.createElement)(
|
|
16139
15991
|
"div",
|
|
16140
15992
|
{ className: "tdb-empty" },
|
|
16141
15993
|
icon ?? null,
|
|
16142
|
-
(0,
|
|
15994
|
+
(0, import_react49.createElement)("div", { style: { color: "var(--tdb-ink)" } }, title)
|
|
16143
15995
|
);
|
|
16144
15996
|
}
|
|
16145
15997
|
function Menu({ open, onClose, triggerRef, children }) {
|
|
16146
|
-
const ref = (0,
|
|
16147
|
-
(0,
|
|
15998
|
+
const ref = (0, import_react49.useRef)(null);
|
|
15999
|
+
(0, import_react49.useEffect)(() => {
|
|
16148
16000
|
if (!open) return;
|
|
16149
16001
|
const onPointer = (event) => {
|
|
16150
16002
|
const target = event.target;
|
|
@@ -16164,76 +16016,45 @@ window.__ModuleLoader__.load({
|
|
|
16164
16016
|
};
|
|
16165
16017
|
}, [open, onClose, triggerRef]);
|
|
16166
16018
|
if (!open) return null;
|
|
16167
|
-
return (0,
|
|
16019
|
+
return (0, import_react49.createElement)("div", { className: "tdb-menu", ref, role: "menu" }, children);
|
|
16168
16020
|
}
|
|
16169
16021
|
function MenuItem({ onClick, title }) {
|
|
16170
|
-
return (0,
|
|
16171
|
-
}
|
|
16172
|
-
function Modal({ open, title, subtitle, onClose, closeLabel, children, footer }) {
|
|
16173
|
-
if (!open) return null;
|
|
16174
|
-
return (0, import_react50.createElement)(MorphingModal, {
|
|
16175
|
-
viewId: "modal",
|
|
16176
|
-
onClose,
|
|
16177
|
-
placement: "center",
|
|
16178
|
-
ariaLabel: typeof title === "string" ? title : closeLabel,
|
|
16179
|
-
className: "tdb-modal max-w-2xl",
|
|
16180
|
-
children: [
|
|
16181
|
-
(0, import_react50.createElement)(
|
|
16182
|
-
"div",
|
|
16183
|
-
{ className: "tdb-modal-head" },
|
|
16184
|
-
(0, import_react50.createElement)(
|
|
16185
|
-
"div",
|
|
16186
|
-
{},
|
|
16187
|
-
(0, import_react50.createElement)("h2", { className: "tdb-modal-title" }, title),
|
|
16188
|
-
subtitle === void 0 ? null : (0, import_react50.createElement)("p", { className: "tdb-modal-sub" }, subtitle)
|
|
16189
|
-
),
|
|
16190
|
-
(0, import_react50.createElement)(Button3, {
|
|
16191
|
-
variant: "ghost",
|
|
16192
|
-
iconOnly: true,
|
|
16193
|
-
"data-autofocus": true,
|
|
16194
|
-
"aria-label": closeLabel,
|
|
16195
|
-
onClick: onClose
|
|
16196
|
-
}, (0, import_react50.createElement)(CloseIcon, { size: 16 }))
|
|
16197
|
-
),
|
|
16198
|
-
(0, import_react50.createElement)("div", { className: "tdb-modal-body" }, children),
|
|
16199
|
-
footer === void 0 ? null : (0, import_react50.createElement)("div", { className: "tdb-modal-foot" }, footer)
|
|
16200
|
-
]
|
|
16201
|
-
});
|
|
16022
|
+
return (0, import_react49.createElement)("button", { type: "button", className: "tdb-menu-item", role: "menuitem", onClick }, title);
|
|
16202
16023
|
}
|
|
16203
16024
|
function SkeletonDashboard() {
|
|
16204
|
-
return (0,
|
|
16025
|
+
return (0, import_react49.createElement)(
|
|
16205
16026
|
"div",
|
|
16206
16027
|
{ className: "tdb-container", "aria-busy": "true" },
|
|
16207
|
-
(0,
|
|
16028
|
+
(0, import_react49.createElement)(
|
|
16208
16029
|
"div",
|
|
16209
16030
|
{ className: "tdb-head" },
|
|
16210
|
-
(0,
|
|
16031
|
+
(0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { width: "180px", height: "26px" } })
|
|
16211
16032
|
),
|
|
16212
|
-
(0,
|
|
16033
|
+
(0, import_react49.createElement)(
|
|
16213
16034
|
"div",
|
|
16214
16035
|
{ className: "tdb-surface" },
|
|
16215
|
-
(0,
|
|
16036
|
+
(0, import_react49.createElement)(
|
|
16216
16037
|
"div",
|
|
16217
16038
|
{ className: "tdb-kpis" },
|
|
16218
|
-
(0,
|
|
16219
|
-
(0,
|
|
16220
|
-
(0,
|
|
16221
|
-
(0,
|
|
16039
|
+
(0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
|
|
16040
|
+
(0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
|
|
16041
|
+
(0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
|
|
16042
|
+
(0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } }))
|
|
16222
16043
|
),
|
|
16223
|
-
(0,
|
|
16224
|
-
(0,
|
|
16225
|
-
(0,
|
|
16226
|
-
(0,
|
|
16044
|
+
(0, import_react49.createElement)("div", { className: "tdb-rule" }),
|
|
16045
|
+
(0, import_react49.createElement)("div", { className: "tdb-section" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton tdb-skeleton--chart" })),
|
|
16046
|
+
(0, import_react49.createElement)("div", { className: "tdb-rule" }),
|
|
16047
|
+
(0, import_react49.createElement)("div", { className: "tdb-section" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton tdb-skeleton--table" }))
|
|
16227
16048
|
)
|
|
16228
16049
|
);
|
|
16229
16050
|
}
|
|
16230
16051
|
|
|
16231
16052
|
// src/client/components/ui/Pager.tsx
|
|
16232
|
-
var
|
|
16053
|
+
var import_react53 = require("react");
|
|
16233
16054
|
|
|
16234
16055
|
// src/client/beui/components/motion/pagination.tsx
|
|
16235
|
-
var
|
|
16236
|
-
var
|
|
16056
|
+
var import_react50 = require("react");
|
|
16057
|
+
var import_react52 = require("react");
|
|
16237
16058
|
function paginationRange(page, totalPages, siblings = 1, boundaries = 1) {
|
|
16238
16059
|
const range = (start, end) => Array.from({ length: Math.max(0, end - start + 1) }, (_, index) => start + index);
|
|
16239
16060
|
const slots = boundaries * 2 + siblings * 2 + 3;
|
|
@@ -16279,11 +16100,11 @@ window.__ModuleLoader__.load({
|
|
|
16279
16100
|
"aria-label": ariaLabel = "Pagination",
|
|
16280
16101
|
...props
|
|
16281
16102
|
}) {
|
|
16282
|
-
const id3 = (0,
|
|
16103
|
+
const id3 = (0, import_react52.useId)();
|
|
16283
16104
|
const reduce = useReducedMotion();
|
|
16284
16105
|
const total = Math.max(1, Math.floor(totalPages));
|
|
16285
16106
|
const clamp3 = (value) => Math.min(total, Math.max(1, Math.round(value)));
|
|
16286
|
-
const [internal, setInternal] = (0,
|
|
16107
|
+
const [internal, setInternal] = (0, import_react52.useState)(() => clamp3(defaultPage));
|
|
16287
16108
|
const current2 = clamp3(page ?? internal);
|
|
16288
16109
|
const go = (next) => {
|
|
16289
16110
|
const target = clamp3(next);
|
|
@@ -16315,22 +16136,22 @@ window.__ModuleLoader__.load({
|
|
|
16315
16136
|
go(target);
|
|
16316
16137
|
}
|
|
16317
16138
|
};
|
|
16318
|
-
return renderLink ? renderLink(linkProps) : /* @__PURE__ */ (0,
|
|
16139
|
+
return renderLink ? renderLink(linkProps) : /* @__PURE__ */ (0, import_react50.createElement)("a", { ...linkProps });
|
|
16319
16140
|
}
|
|
16320
|
-
return /* @__PURE__ */ (0,
|
|
16141
|
+
return /* @__PURE__ */ (0, import_react50.createElement)("button", { type: "button", disabled, onClick: () => go(target), ...shared });
|
|
16321
16142
|
};
|
|
16322
16143
|
const items = paginationRange(current2, total, siblings, boundaries);
|
|
16323
16144
|
const fade = { duration: reduce ? 0.12 : 0.16, ease: EASE_OUT };
|
|
16324
|
-
return /* @__PURE__ */ (0,
|
|
16145
|
+
return /* @__PURE__ */ (0, import_react50.createElement)("nav", { ...props, "aria-label": ariaLabel, className: cn("flex", className) }, /* @__PURE__ */ (0, import_react50.createElement)(LayoutGroup, { id: id3 }, /* @__PURE__ */ (0, import_react50.createElement)("ul", { className: "relative flex items-center gap-0.5 sm:gap-1" }, /* @__PURE__ */ (0, import_react50.createElement)("li", null, control(current2 - 1, {
|
|
16325
16146
|
label: "Previous page",
|
|
16326
16147
|
disabled: current2 === 1,
|
|
16327
16148
|
className: "text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-40",
|
|
16328
|
-
children: /* @__PURE__ */ (0,
|
|
16329
|
-
})), /* @__PURE__ */ (0,
|
|
16149
|
+
children: /* @__PURE__ */ (0, import_react50.createElement)(ChevronLeft, { "aria-hidden": "true", className: "size-4" })
|
|
16150
|
+
})), /* @__PURE__ */ (0, import_react50.createElement)(AnimatePresence, { mode: "popLayout", initial: false }, items.map((item) => {
|
|
16330
16151
|
if (typeof item !== "number") {
|
|
16331
16152
|
const back = item === "ellipsis-start";
|
|
16332
16153
|
const Chevrons = back ? ChevronsLeft : ChevronsRight;
|
|
16333
|
-
return /* @__PURE__ */ (0,
|
|
16154
|
+
return /* @__PURE__ */ (0, import_react50.createElement)(
|
|
16334
16155
|
motion2.li,
|
|
16335
16156
|
{
|
|
16336
16157
|
key: item,
|
|
@@ -16340,18 +16161,18 @@ window.__ModuleLoader__.load({
|
|
|
16340
16161
|
exit: { opacity: 0, transition: fade },
|
|
16341
16162
|
transition: { layout: SPRING_LAYOUT, opacity: fade }
|
|
16342
16163
|
},
|
|
16343
|
-
/* @__PURE__ */ (0,
|
|
16164
|
+
/* @__PURE__ */ (0, import_react50.createElement)(PresenceGate, null, ({ gate }) => control(current2 + (back ? -jump : jump), {
|
|
16344
16165
|
gate,
|
|
16345
16166
|
label: back ? `Back ${jump} pages` : `Forward ${jump} pages`,
|
|
16346
16167
|
className: "group text-muted-foreground hover:text-foreground",
|
|
16347
|
-
children: /* @__PURE__ */ (0,
|
|
16168
|
+
children: /* @__PURE__ */ (0, import_react50.createElement)(import_react50.Fragment, null, /* @__PURE__ */ (0, import_react50.createElement)(
|
|
16348
16169
|
"span",
|
|
16349
16170
|
{
|
|
16350
16171
|
"aria-hidden": "true",
|
|
16351
16172
|
className: "transition-[opacity,transform] duration-150 ease-out group-hover:scale-75 group-hover:opacity-0 group-focus-visible:scale-75 group-focus-visible:opacity-0 motion-reduce:transform-none"
|
|
16352
16173
|
},
|
|
16353
16174
|
"\u2026"
|
|
16354
|
-
), /* @__PURE__ */ (0,
|
|
16175
|
+
), /* @__PURE__ */ (0, import_react50.createElement)(
|
|
16355
16176
|
Chevrons,
|
|
16356
16177
|
{
|
|
16357
16178
|
"aria-hidden": "true",
|
|
@@ -16362,7 +16183,7 @@ window.__ModuleLoader__.load({
|
|
|
16362
16183
|
);
|
|
16363
16184
|
}
|
|
16364
16185
|
const isCurrent = item === current2;
|
|
16365
|
-
return /* @__PURE__ */ (0,
|
|
16186
|
+
return /* @__PURE__ */ (0, import_react50.createElement)(
|
|
16366
16187
|
motion2.li,
|
|
16367
16188
|
{
|
|
16368
16189
|
key: item,
|
|
@@ -16372,12 +16193,12 @@ window.__ModuleLoader__.load({
|
|
|
16372
16193
|
exit: { opacity: 0, scale: reduce ? 1 : 0.8, transition: fade },
|
|
16373
16194
|
transition: { layout: SPRING_LAYOUT, opacity: fade, scale: SPRING_LAYOUT }
|
|
16374
16195
|
},
|
|
16375
|
-
/* @__PURE__ */ (0,
|
|
16196
|
+
/* @__PURE__ */ (0, import_react50.createElement)(PresenceGate, null, ({ gate }) => control(item, {
|
|
16376
16197
|
gate,
|
|
16377
16198
|
label: `Page ${item}`,
|
|
16378
16199
|
current: isCurrent,
|
|
16379
16200
|
className: isCurrent ? "font-medium text-background" : "text-muted-foreground hover:bg-foreground/[0.05] hover:text-foreground",
|
|
16380
|
-
children: /* @__PURE__ */ (0,
|
|
16201
|
+
children: /* @__PURE__ */ (0, import_react50.createElement)(import_react50.Fragment, null, isCurrent ? /* @__PURE__ */ (0, import_react50.createElement)(
|
|
16381
16202
|
motion2.span,
|
|
16382
16203
|
{
|
|
16383
16204
|
"aria-hidden": "true",
|
|
@@ -16385,28 +16206,28 @@ window.__ModuleLoader__.load({
|
|
|
16385
16206
|
transition: SPRING_LAYOUT,
|
|
16386
16207
|
className: "absolute inset-0 rounded-full bg-foreground"
|
|
16387
16208
|
}
|
|
16388
|
-
) : null, /* @__PURE__ */ (0,
|
|
16209
|
+
) : null, /* @__PURE__ */ (0, import_react50.createElement)("span", { className: "relative" }, item))
|
|
16389
16210
|
}))
|
|
16390
16211
|
);
|
|
16391
|
-
})), /* @__PURE__ */ (0,
|
|
16212
|
+
})), /* @__PURE__ */ (0, import_react50.createElement)("li", null, control(current2 + 1, {
|
|
16392
16213
|
label: "Next page",
|
|
16393
16214
|
disabled: current2 === total,
|
|
16394
16215
|
className: "text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-40",
|
|
16395
|
-
children: /* @__PURE__ */ (0,
|
|
16216
|
+
children: /* @__PURE__ */ (0, import_react50.createElement)(ChevronRight, { "aria-hidden": "true", className: "size-4" })
|
|
16396
16217
|
})))));
|
|
16397
16218
|
}
|
|
16398
16219
|
|
|
16399
16220
|
// src/client/components/ui/Pager.tsx
|
|
16400
16221
|
function Pager({ page, pages, onChange, label: label2, ariaLabel }) {
|
|
16401
|
-
return (0,
|
|
16222
|
+
return (0, import_react53.createElement)(
|
|
16402
16223
|
"div",
|
|
16403
16224
|
{ className: "tdb-pager" },
|
|
16404
|
-
(0,
|
|
16405
|
-
(0,
|
|
16225
|
+
(0, import_react53.createElement)("span", {}, label2),
|
|
16226
|
+
(0, import_react53.createElement)(
|
|
16406
16227
|
"div",
|
|
16407
16228
|
{ className: "tdb-pager-actions" },
|
|
16408
|
-
(0,
|
|
16409
|
-
(0,
|
|
16229
|
+
(0, import_react53.createElement)("span", { className: "sr-only" }, `${page} / ${pages}`),
|
|
16230
|
+
(0, import_react53.createElement)(Pagination, {
|
|
16410
16231
|
page,
|
|
16411
16232
|
totalPages: pages,
|
|
16412
16233
|
onPageChange: onChange,
|
|
@@ -16420,29 +16241,29 @@ window.__ModuleLoader__.load({
|
|
|
16420
16241
|
}
|
|
16421
16242
|
|
|
16422
16243
|
// src/client/components/ui/Section.tsx
|
|
16423
|
-
var
|
|
16244
|
+
var import_react54 = require("react");
|
|
16424
16245
|
function Section({ title, actions, children, ariaLabel, className = "" }) {
|
|
16425
16246
|
const hasHeader = title !== void 0 || actions !== void 0;
|
|
16426
|
-
return (0,
|
|
16247
|
+
return (0, import_react54.createElement)(
|
|
16427
16248
|
"section",
|
|
16428
16249
|
{
|
|
16429
16250
|
className: `tdb-section ${className}`.trim(),
|
|
16430
16251
|
"aria-label": ariaLabel ?? (typeof title === "string" ? title : void 0)
|
|
16431
16252
|
},
|
|
16432
|
-
hasHeader ? (0,
|
|
16253
|
+
hasHeader ? (0, import_react54.createElement)(
|
|
16433
16254
|
"div",
|
|
16434
16255
|
{
|
|
16435
16256
|
className: `tdb-section-head${title === void 0 ? " tdb-section-head--actions-only" : ""}`
|
|
16436
16257
|
},
|
|
16437
|
-
title === void 0 ? null : (0,
|
|
16438
|
-
actions === void 0 ? null : (0,
|
|
16258
|
+
title === void 0 ? null : (0, import_react54.createElement)("h2", { className: "tdb-section-title" }, title),
|
|
16259
|
+
actions === void 0 ? null : (0, import_react54.createElement)("div", { className: "tdb-section-actions" }, actions)
|
|
16439
16260
|
) : null,
|
|
16440
16261
|
children
|
|
16441
16262
|
);
|
|
16442
16263
|
}
|
|
16443
16264
|
|
|
16444
16265
|
// src/client/components/ui/DataTable.tsx
|
|
16445
|
-
var
|
|
16266
|
+
var import_react55 = require("react");
|
|
16446
16267
|
function DataTable({
|
|
16447
16268
|
rows,
|
|
16448
16269
|
columns,
|
|
@@ -16452,23 +16273,23 @@ window.__ModuleLoader__.load({
|
|
|
16452
16273
|
onRowActivate
|
|
16453
16274
|
}) {
|
|
16454
16275
|
const activate = onRowActivate;
|
|
16455
|
-
return (0,
|
|
16276
|
+
return (0, import_react55.createElement)(
|
|
16456
16277
|
"div",
|
|
16457
16278
|
{ className: "tdb-table-wrap" },
|
|
16458
|
-
(0,
|
|
16279
|
+
(0, import_react55.createElement)(
|
|
16459
16280
|
"table",
|
|
16460
16281
|
{ className: "tdb-table", "aria-label": ariaLabel },
|
|
16461
|
-
(0,
|
|
16282
|
+
(0, import_react55.createElement)(
|
|
16462
16283
|
"thead",
|
|
16463
16284
|
{},
|
|
16464
|
-
(0,
|
|
16285
|
+
(0, import_react55.createElement)("tr", {}, columns.map((column) => (0, import_react55.createElement)("th", {
|
|
16465
16286
|
key: column.key,
|
|
16466
16287
|
className: column.headerClassName,
|
|
16467
16288
|
style: column.style,
|
|
16468
16289
|
...column.headerProps
|
|
16469
16290
|
}, column.header)))
|
|
16470
16291
|
),
|
|
16471
|
-
(0,
|
|
16292
|
+
(0, import_react55.createElement)("tbody", {}, rows.map((row) => (0, import_react55.createElement)("tr", {
|
|
16472
16293
|
key: rowKey(row),
|
|
16473
16294
|
className: rowClassName ?? (activate === void 0 ? void 0 : "tdb-row"),
|
|
16474
16295
|
tabIndex: activate === void 0 ? void 0 : 0,
|
|
@@ -16478,7 +16299,7 @@ window.__ModuleLoader__.load({
|
|
|
16478
16299
|
event.preventDefault();
|
|
16479
16300
|
activate(row);
|
|
16480
16301
|
}
|
|
16481
|
-
}, columns.map((column) => (0,
|
|
16302
|
+
}, columns.map((column) => (0, import_react55.createElement)("td", {
|
|
16482
16303
|
key: column.key,
|
|
16483
16304
|
className: typeof column.cellClassName === "function" ? column.cellClassName(row) : column.cellClassName
|
|
16484
16305
|
}, column.render(row))))))
|
|
@@ -16487,7 +16308,7 @@ window.__ModuleLoader__.load({
|
|
|
16487
16308
|
}
|
|
16488
16309
|
|
|
16489
16310
|
// src/shared/builtin-prices.generated.ts
|
|
16490
|
-
var GENERATED_PRICE_UPDATED = "2026-
|
|
16311
|
+
var GENERATED_PRICE_UPDATED = "2026-11-09";
|
|
16491
16312
|
var GENERATED_PRICES = [
|
|
16492
16313
|
{
|
|
16493
16314
|
id: "~anthropic/claude-fable-latest",
|
|
@@ -16507,15 +16328,15 @@ window.__ModuleLoader__.load({
|
|
|
16507
16328
|
},
|
|
16508
16329
|
{
|
|
16509
16330
|
id: "~deepseek/deepseek-flash-latest",
|
|
16510
|
-
price: { "currency": "USD", "input":
|
|
16331
|
+
price: { "currency": "USD", "input": 6e-3, "output": 0.5, "cacheRead": 5e-3, "cacheWrite": 0 }
|
|
16511
16332
|
},
|
|
16512
16333
|
{
|
|
16513
16334
|
id: "~deepseek/deepseek-pro-latest",
|
|
16514
|
-
price: { "currency": "USD", "input": 0.
|
|
16335
|
+
price: { "currency": "USD", "input": 0.0999, "output": 8, "cacheRead": 0.0999, "cacheWrite": 0 }
|
|
16515
16336
|
},
|
|
16516
16337
|
{
|
|
16517
16338
|
id: "~deepseek/deepseek-v4-flash-latest",
|
|
16518
|
-
price: { "currency": "USD", "input": 0.
|
|
16339
|
+
price: { "currency": "USD", "input": 0.0434, "output": 0.3, "cacheRead": 0.035, "cacheWrite": 0 }
|
|
16519
16340
|
},
|
|
16520
16341
|
{
|
|
16521
16342
|
id: "~google/gemini-flash-latest",
|
|
@@ -16527,7 +16348,7 @@ window.__ModuleLoader__.load({
|
|
|
16527
16348
|
},
|
|
16528
16349
|
{
|
|
16529
16350
|
id: "~moonshotai/kimi-latest",
|
|
16530
|
-
price: { "currency": "USD", "input": 0.
|
|
16351
|
+
price: { "currency": "USD", "input": 0.1824, "output": 9.3388, "cacheRead": 0.18, "cacheWrite": 0 }
|
|
16531
16352
|
},
|
|
16532
16353
|
{
|
|
16533
16354
|
id: "~openai/gpt-astra-latest",
|
|
@@ -16559,7 +16380,7 @@ window.__ModuleLoader__.load({
|
|
|
16559
16380
|
},
|
|
16560
16381
|
{
|
|
16561
16382
|
id: "~z-ai/glm-flash-latest",
|
|
16562
|
-
price: { "currency": "USD", "input": 0.
|
|
16383
|
+
price: { "currency": "USD", "input": 0.0335, "output": 0.083, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
16563
16384
|
},
|
|
16564
16385
|
{
|
|
16565
16386
|
id: "~z-ai/glm-latest",
|
|
@@ -16611,68 +16432,128 @@ window.__ModuleLoader__.load({
|
|
|
16611
16432
|
},
|
|
16612
16433
|
{
|
|
16613
16434
|
id: "anthracite-org/magnum-v4-72b",
|
|
16614
|
-
price: { "currency": "USD", "input": 2.5, "output": 5, "cacheRead":
|
|
16435
|
+
price: { "currency": "USD", "input": 2.5, "output": 5, "cacheRead": 2.5, "cacheWrite": 0 }
|
|
16615
16436
|
},
|
|
16616
16437
|
{
|
|
16617
16438
|
id: "anthropic/claude-fable-5",
|
|
16618
16439
|
price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 1, "cacheWrite": 12.5 }
|
|
16619
16440
|
},
|
|
16441
|
+
{
|
|
16442
|
+
id: "anthropic/claude-fable-5:batch",
|
|
16443
|
+
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
16444
|
+
},
|
|
16620
16445
|
{
|
|
16621
16446
|
id: "anthropic/claude-fable-5.1",
|
|
16622
16447
|
price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 0.25, "cacheWrite": 12.5 }
|
|
16623
16448
|
},
|
|
16449
|
+
{
|
|
16450
|
+
id: "anthropic/claude-fable-5.1:batch",
|
|
16451
|
+
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.125, "cacheWrite": 6.25 }
|
|
16452
|
+
},
|
|
16624
16453
|
{
|
|
16625
16454
|
id: "anthropic/claude-haiku-4.5",
|
|
16626
16455
|
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
|
|
16627
16456
|
},
|
|
16457
|
+
{
|
|
16458
|
+
id: "anthropic/claude-haiku-4.5:batch",
|
|
16459
|
+
price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.05, "cacheWrite": 0.625 }
|
|
16460
|
+
},
|
|
16628
16461
|
{
|
|
16629
16462
|
id: "anthropic/claude-haiku-5.5",
|
|
16630
16463
|
price: { "currency": "USD", "input": 0.1, "output": 0.5, "cacheRead": 0.01, "cacheWrite": 0.125 }
|
|
16631
16464
|
},
|
|
16465
|
+
{
|
|
16466
|
+
id: "anthropic/claude-haiku-5.5:batch",
|
|
16467
|
+
price: { "currency": "USD", "input": 0.05, "output": 0.25, "cacheRead": 5e-3, "cacheWrite": 0.0625 }
|
|
16468
|
+
},
|
|
16632
16469
|
{
|
|
16633
16470
|
id: "anthropic/claude-opus-4.1",
|
|
16634
16471
|
price: { "currency": "USD", "input": 15, "output": 75, "cacheRead": 1.5, "cacheWrite": 18.75 }
|
|
16635
16472
|
},
|
|
16473
|
+
{
|
|
16474
|
+
id: "anthropic/claude-opus-4.1:batch",
|
|
16475
|
+
price: { "currency": "USD", "input": 7.5, "output": 37.5, "cacheRead": 0.75, "cacheWrite": 9.375 }
|
|
16476
|
+
},
|
|
16636
16477
|
{
|
|
16637
16478
|
id: "anthropic/claude-opus-4.5",
|
|
16638
16479
|
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
16639
16480
|
},
|
|
16481
|
+
{
|
|
16482
|
+
id: "anthropic/claude-opus-4.5:batch",
|
|
16483
|
+
price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
|
|
16484
|
+
},
|
|
16640
16485
|
{
|
|
16641
16486
|
id: "anthropic/claude-opus-4.6",
|
|
16642
16487
|
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
16643
16488
|
},
|
|
16489
|
+
{
|
|
16490
|
+
id: "anthropic/claude-opus-4.6:batch",
|
|
16491
|
+
price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
|
|
16492
|
+
},
|
|
16644
16493
|
{
|
|
16645
16494
|
id: "anthropic/claude-opus-4.7",
|
|
16646
16495
|
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
16647
16496
|
},
|
|
16497
|
+
{
|
|
16498
|
+
id: "anthropic/claude-opus-4.7:batch",
|
|
16499
|
+
price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
|
|
16500
|
+
},
|
|
16648
16501
|
{
|
|
16649
16502
|
id: "anthropic/claude-opus-4.8",
|
|
16650
16503
|
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
16651
16504
|
},
|
|
16505
|
+
{
|
|
16506
|
+
id: "anthropic/claude-opus-4.8:batch",
|
|
16507
|
+
price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
|
|
16508
|
+
},
|
|
16652
16509
|
{
|
|
16653
16510
|
id: "anthropic/claude-opus-5",
|
|
16654
16511
|
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
16655
16512
|
},
|
|
16513
|
+
{
|
|
16514
|
+
id: "anthropic/claude-opus-5:batch",
|
|
16515
|
+
price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
|
|
16516
|
+
},
|
|
16656
16517
|
{
|
|
16657
16518
|
id: "anthropic/claude-opus-5.5",
|
|
16658
16519
|
price: { "currency": "USD", "input": 4, "output": 20, "cacheRead": 0.2, "cacheWrite": 5 }
|
|
16659
16520
|
},
|
|
16521
|
+
{
|
|
16522
|
+
id: "anthropic/claude-opus-5.5:batch",
|
|
16523
|
+
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
|
|
16524
|
+
},
|
|
16660
16525
|
{
|
|
16661
16526
|
id: "anthropic/claude-sonnet-4.5",
|
|
16662
16527
|
price: { "currency": "USD", "input": 3, "output": 15, "cacheRead": 0.3, "cacheWrite": 3.75 }
|
|
16663
16528
|
},
|
|
16529
|
+
{
|
|
16530
|
+
id: "anthropic/claude-sonnet-4.5:batch",
|
|
16531
|
+
price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0.15, "cacheWrite": 1.875 }
|
|
16532
|
+
},
|
|
16664
16533
|
{
|
|
16665
16534
|
id: "anthropic/claude-sonnet-4.6",
|
|
16666
16535
|
price: { "currency": "USD", "input": 3, "output": 15, "cacheRead": 0.3, "cacheWrite": 3.75 }
|
|
16667
16536
|
},
|
|
16537
|
+
{
|
|
16538
|
+
id: "anthropic/claude-sonnet-4.6:batch",
|
|
16539
|
+
price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0.15, "cacheWrite": 1.875 }
|
|
16540
|
+
},
|
|
16668
16541
|
{
|
|
16669
16542
|
id: "anthropic/claude-sonnet-5",
|
|
16670
16543
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
16671
16544
|
},
|
|
16545
|
+
{
|
|
16546
|
+
id: "anthropic/claude-sonnet-5:batch",
|
|
16547
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
|
|
16548
|
+
},
|
|
16672
16549
|
{
|
|
16673
16550
|
id: "anthropic/claude-sonnet-5.5",
|
|
16674
16551
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
|
|
16675
16552
|
},
|
|
16553
|
+
{
|
|
16554
|
+
id: "anthropic/claude-sonnet-5.5:batch",
|
|
16555
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
|
|
16556
|
+
},
|
|
16676
16557
|
{
|
|
16677
16558
|
id: "bytedance-seed/seed-1.6",
|
|
16678
16559
|
price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -16731,7 +16612,7 @@ window.__ModuleLoader__.load({
|
|
|
16731
16612
|
},
|
|
16732
16613
|
{
|
|
16733
16614
|
id: "deepseek/deepseek-chat",
|
|
16734
|
-
price: { "currency": "USD", "input": 0.
|
|
16615
|
+
price: { "currency": "USD", "input": 0.32, "output": 0.89, "cacheRead": 0, "cacheWrite": 0 }
|
|
16735
16616
|
},
|
|
16736
16617
|
{
|
|
16737
16618
|
id: "deepseek/deepseek-chat-v3-0324",
|
|
@@ -16751,27 +16632,51 @@ window.__ModuleLoader__.load({
|
|
|
16751
16632
|
},
|
|
16752
16633
|
{
|
|
16753
16634
|
id: "deepseek/deepseek-v3.2",
|
|
16754
|
-
price: { "currency": "USD", "input": 0.
|
|
16635
|
+
price: { "currency": "USD", "input": 0.26, "output": 0.38, "cacheRead": 0.13, "cacheWrite": 0 }
|
|
16755
16636
|
},
|
|
16756
16637
|
{
|
|
16757
16638
|
id: "deepseek/deepseek-v3.2-exp",
|
|
16758
16639
|
price: { "currency": "USD", "input": 0.27, "output": 0.41, "cacheRead": 0, "cacheWrite": 0 }
|
|
16759
16640
|
},
|
|
16641
|
+
{
|
|
16642
|
+
id: "deepseek/deepseek-v4-flash",
|
|
16643
|
+
price: { "currency": "USD", "input": 0.091, "output": 0.182, "cacheRead": 0.0182, "cacheWrite": 0 }
|
|
16644
|
+
},
|
|
16760
16645
|
{
|
|
16761
16646
|
id: "deepseek/deepseek-v4-flash-0731",
|
|
16762
|
-
price: { "currency": "USD", "input": 0.
|
|
16647
|
+
price: { "currency": "USD", "input": 0.0434, "output": 0.3, "cacheRead": 0.035, "cacheWrite": 0 }
|
|
16648
|
+
},
|
|
16649
|
+
{
|
|
16650
|
+
id: "deepseek/deepseek-v4-flash-0731:batch",
|
|
16651
|
+
price: { "currency": "USD", "input": 0.048, "output": 0.144, "cacheRead": 0.012, "cacheWrite": 0 }
|
|
16763
16652
|
},
|
|
16764
16653
|
{
|
|
16765
16654
|
id: "deepseek/deepseek-v4-flash-vision-exp",
|
|
16766
|
-
price: { "currency": "USD", "input": 0.
|
|
16655
|
+
price: { "currency": "USD", "input": 0.44, "output": 1.32, "cacheRead": 0.014, "cacheWrite": 0 }
|
|
16656
|
+
},
|
|
16657
|
+
{
|
|
16658
|
+
id: "deepseek/deepseek-v4-pro",
|
|
16659
|
+
price: { "currency": "USD", "input": 0.894012, "output": 1.788024, "cacheRead": 0.074501, "cacheWrite": 0 }
|
|
16767
16660
|
},
|
|
16768
16661
|
{
|
|
16769
16662
|
id: "deepseek/deepseek-v4-pro-0813",
|
|
16770
|
-
price: { "currency": "USD", "input":
|
|
16663
|
+
price: { "currency": "USD", "input": 0.111, "output": 4.44, "cacheRead": 0.097, "cacheWrite": 0 }
|
|
16664
|
+
},
|
|
16665
|
+
{
|
|
16666
|
+
id: "deepseek/deepseek-v4.1-flash",
|
|
16667
|
+
price: { "currency": "USD", "input": 0.051, "output": 0.567, "cacheRead": 0.018, "cacheWrite": 0 }
|
|
16771
16668
|
},
|
|
16772
16669
|
{
|
|
16773
16670
|
id: "deepseek/deepseek-v4.1-flash-1017",
|
|
16774
|
-
price: { "currency": "USD", "input":
|
|
16671
|
+
price: { "currency": "USD", "input": 6e-3, "output": 0.5, "cacheRead": 5e-3, "cacheWrite": 0 }
|
|
16672
|
+
},
|
|
16673
|
+
{
|
|
16674
|
+
id: "deepseek/deepseek-v4.1-flash-1017:batch",
|
|
16675
|
+
price: { "currency": "USD", "input": 0.011, "output": 0.2, "cacheRead": 2e-3, "cacheWrite": 0 }
|
|
16676
|
+
},
|
|
16677
|
+
{
|
|
16678
|
+
id: "deepseek/deepseek-v4.1-flash:batch",
|
|
16679
|
+
price: { "currency": "USD", "input": 0.011, "output": 0.2, "cacheRead": 2e-3, "cacheWrite": 0 }
|
|
16775
16680
|
},
|
|
16776
16681
|
{
|
|
16777
16682
|
id: "dots-studio/dots-3-note-preview:free",
|
|
@@ -16809,6 +16714,10 @@ window.__ModuleLoader__.load({
|
|
|
16809
16714
|
id: "google/gemini-3-flash-preview",
|
|
16810
16715
|
price: { "currency": "USD", "input": 0.5, "output": 3, "cacheRead": 0.05, "cacheWrite": 0.083333 }
|
|
16811
16716
|
},
|
|
16717
|
+
{
|
|
16718
|
+
id: "google/gemini-3-flash-preview:batch",
|
|
16719
|
+
price: { "currency": "USD", "input": 0.25, "output": 1.5, "cacheRead": 0, "cacheWrite": 0 }
|
|
16720
|
+
},
|
|
16812
16721
|
{
|
|
16813
16722
|
id: "google/gemini-3-pro-image",
|
|
16814
16723
|
price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0.375 }
|
|
@@ -16837,6 +16746,10 @@ window.__ModuleLoader__.load({
|
|
|
16837
16746
|
id: "google/gemini-3.1-flash-lite-preview",
|
|
16838
16747
|
price: { "currency": "USD", "input": 0.25, "output": 1.5, "cacheRead": 0.025, "cacheWrite": 0.083333 }
|
|
16839
16748
|
},
|
|
16749
|
+
{
|
|
16750
|
+
id: "google/gemini-3.1-flash-lite:batch",
|
|
16751
|
+
price: { "currency": "USD", "input": 0.125, "output": 0.75, "cacheRead": 0.0125, "cacheWrite": 0 }
|
|
16752
|
+
},
|
|
16840
16753
|
{
|
|
16841
16754
|
id: "google/gemini-3.1-pro-preview",
|
|
16842
16755
|
price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0.375 }
|
|
@@ -16845,6 +16758,10 @@ window.__ModuleLoader__.load({
|
|
|
16845
16758
|
id: "google/gemini-3.1-pro-preview-customtools",
|
|
16846
16759
|
price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0.375 }
|
|
16847
16760
|
},
|
|
16761
|
+
{
|
|
16762
|
+
id: "google/gemini-3.1-pro-preview:batch",
|
|
16763
|
+
price: { "currency": "USD", "input": 1, "output": 6, "cacheRead": 0, "cacheWrite": 0 }
|
|
16764
|
+
},
|
|
16848
16765
|
{
|
|
16849
16766
|
id: "google/gemini-3.5-flash",
|
|
16850
16767
|
price: { "currency": "USD", "input": 1.5, "output": 9, "cacheRead": 0.15, "cacheWrite": 0.083333 }
|
|
@@ -16853,26 +16770,58 @@ window.__ModuleLoader__.load({
|
|
|
16853
16770
|
id: "google/gemini-3.5-flash-lite",
|
|
16854
16771
|
price: { "currency": "USD", "input": 0.3, "output": 2.5, "cacheRead": 0.03, "cacheWrite": 0.083333 }
|
|
16855
16772
|
},
|
|
16773
|
+
{
|
|
16774
|
+
id: "google/gemini-3.5-flash-lite:batch",
|
|
16775
|
+
price: { "currency": "USD", "input": 0.15, "output": 1.25, "cacheRead": 0.015, "cacheWrite": 0 }
|
|
16776
|
+
},
|
|
16777
|
+
{
|
|
16778
|
+
id: "google/gemini-3.5-flash:batch",
|
|
16779
|
+
price: { "currency": "USD", "input": 0.75, "output": 4.5, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
16780
|
+
},
|
|
16856
16781
|
{
|
|
16857
16782
|
id: "google/gemini-3.6-flash",
|
|
16858
16783
|
price: { "currency": "USD", "input": 0.75, "output": 3.75, "cacheRead": 0.075, "cacheWrite": 0.041667 }
|
|
16859
16784
|
},
|
|
16785
|
+
{
|
|
16786
|
+
id: "google/gemini-3.6-flash:batch",
|
|
16787
|
+
price: { "currency": "USD", "input": 0.375, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0.041667 }
|
|
16788
|
+
},
|
|
16860
16789
|
{
|
|
16861
16790
|
id: "google/gemini-3.7-flash",
|
|
16862
16791
|
price: { "currency": "USD", "input": 0.75, "output": 3.75, "cacheRead": 0.075, "cacheWrite": 0.041667 }
|
|
16863
16792
|
},
|
|
16793
|
+
{
|
|
16794
|
+
id: "google/gemini-3.7-flash:batch",
|
|
16795
|
+
price: { "currency": "USD", "input": 0.375, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0.041667 }
|
|
16796
|
+
},
|
|
16864
16797
|
{
|
|
16865
16798
|
id: "google/gemini-3.8-flash",
|
|
16866
16799
|
price: { "currency": "USD", "input": 0.825, "output": 4.125, "cacheRead": 0.0825, "cacheWrite": 0.041667 }
|
|
16867
16800
|
},
|
|
16801
|
+
{
|
|
16802
|
+
id: "google/gemini-3.8-flash:batch",
|
|
16803
|
+
price: { "currency": "USD", "input": 0.375, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0.041667 }
|
|
16804
|
+
},
|
|
16868
16805
|
{
|
|
16869
16806
|
id: "google/gemini-4-argon",
|
|
16870
16807
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 0.1875 }
|
|
16871
16808
|
},
|
|
16809
|
+
{
|
|
16810
|
+
id: "google/gemini-4-argon:batch",
|
|
16811
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 0.1875 }
|
|
16812
|
+
},
|
|
16872
16813
|
{
|
|
16873
16814
|
id: "google/gemini-nano-banana-2.1",
|
|
16874
16815
|
price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0, "cacheWrite": 0 }
|
|
16875
16816
|
},
|
|
16817
|
+
{
|
|
16818
|
+
id: "google/gemini-omni-1.1-flash",
|
|
16819
|
+
price: { "currency": "USD", "input": 1.5, "output": 9, "cacheRead": 0, "cacheWrite": 0 }
|
|
16820
|
+
},
|
|
16821
|
+
{
|
|
16822
|
+
id: "google/gemini-omni-1.2-flash",
|
|
16823
|
+
price: { "currency": "USD", "input": 1.5, "output": 9, "cacheRead": 0, "cacheWrite": 0 }
|
|
16824
|
+
},
|
|
16876
16825
|
{
|
|
16877
16826
|
id: "google/gemma-2-27b-it",
|
|
16878
16827
|
price: { "currency": "USD", "input": 0.65, "output": 0.65, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -16883,7 +16832,7 @@ window.__ModuleLoader__.load({
|
|
|
16883
16832
|
},
|
|
16884
16833
|
{
|
|
16885
16834
|
id: "google/gemma-3-27b-it",
|
|
16886
|
-
price: { "currency": "USD", "input": 0.08, "output": 0.
|
|
16835
|
+
price: { "currency": "USD", "input": 0.08, "output": 0.45, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
16887
16836
|
},
|
|
16888
16837
|
{
|
|
16889
16838
|
id: "google/gemma-3-4b-it",
|
|
@@ -16891,12 +16840,20 @@ window.__ModuleLoader__.load({
|
|
|
16891
16840
|
},
|
|
16892
16841
|
{
|
|
16893
16842
|
id: "google/gemma-4-26b-a4b-it",
|
|
16894
|
-
price: { "currency": "USD", "input": 0.
|
|
16843
|
+
price: { "currency": "USD", "input": 0.09, "output": 0.3, "cacheRead": 0.05, "cacheWrite": 0 }
|
|
16844
|
+
},
|
|
16845
|
+
{
|
|
16846
|
+
id: "google/gemma-4-26b-a4b-it:free",
|
|
16847
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
16895
16848
|
},
|
|
16896
16849
|
{
|
|
16897
16850
|
id: "google/gemma-4-31b-it",
|
|
16898
16851
|
price: { "currency": "USD", "input": 0.2, "output": 0.4, "cacheRead": 0, "cacheWrite": 0 }
|
|
16899
16852
|
},
|
|
16853
|
+
{
|
|
16854
|
+
id: "google/gemma-4-31b-it:free",
|
|
16855
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
16856
|
+
},
|
|
16900
16857
|
{
|
|
16901
16858
|
id: "google/lyria-3-clip-preview",
|
|
16902
16859
|
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -16911,19 +16868,7 @@ window.__ModuleLoader__.load({
|
|
|
16911
16868
|
},
|
|
16912
16869
|
{
|
|
16913
16870
|
id: "ibm-granite/granite-4.2-8b",
|
|
16914
|
-
price: { "currency": "USD", "input": 0.06, "output": 0.
|
|
16915
|
-
},
|
|
16916
|
-
{
|
|
16917
|
-
id: "inception/mercury-2",
|
|
16918
|
-
price: { "currency": "USD", "input": 0.25, "output": 0.75, "cacheRead": 0.025, "cacheWrite": 0 }
|
|
16919
|
-
},
|
|
16920
|
-
{
|
|
16921
|
-
id: "inception/mercury-2.5",
|
|
16922
|
-
price: { "currency": "USD", "input": 0.04, "output": 0.15, "cacheRead": 4e-3, "cacheWrite": 0 }
|
|
16923
|
-
},
|
|
16924
|
-
{
|
|
16925
|
-
id: "inception/mercury-3",
|
|
16926
|
-
price: { "currency": "USD", "input": 0.1, "output": 0.35, "cacheRead": 0.01, "cacheWrite": 0 }
|
|
16871
|
+
price: { "currency": "USD", "input": 0.06, "output": 0.25, "cacheRead": 0.015, "cacheWrite": 0 }
|
|
16927
16872
|
},
|
|
16928
16873
|
{
|
|
16929
16874
|
id: "inclusionai/ling-3.0-flash",
|
|
@@ -16933,9 +16878,13 @@ window.__ModuleLoader__.load({
|
|
|
16933
16878
|
id: "inclusionai/ling-3.0-flash-vl",
|
|
16934
16879
|
price: { "currency": "USD", "input": 0.06, "output": 0.18, "cacheRead": 0.012, "cacheWrite": 0 }
|
|
16935
16880
|
},
|
|
16881
|
+
{
|
|
16882
|
+
id: "inclusionai/ling-3.0-tiny",
|
|
16883
|
+
price: { "currency": "USD", "input": 0.015, "output": 0.045, "cacheRead": 3e-3, "cacheWrite": 0 }
|
|
16884
|
+
},
|
|
16936
16885
|
{
|
|
16937
16886
|
id: "inclusionai/ling-3.1-flash",
|
|
16938
|
-
price: { "currency": "USD", "input": 0.
|
|
16887
|
+
price: { "currency": "USD", "input": 0.045, "output": 0.135, "cacheRead": 9e-3, "cacheWrite": 0 }
|
|
16939
16888
|
},
|
|
16940
16889
|
{
|
|
16941
16890
|
id: "inference-net/schematron-v2-small",
|
|
@@ -16949,13 +16898,25 @@ window.__ModuleLoader__.load({
|
|
|
16949
16898
|
id: "liquid/lfm-2.5-2.6b",
|
|
16950
16899
|
price: { "currency": "USD", "input": 0.35, "output": 0.5, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
16951
16900
|
},
|
|
16901
|
+
{
|
|
16902
|
+
id: "liquid/lfm-2.5-2.6b:free",
|
|
16903
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
16904
|
+
},
|
|
16952
16905
|
{
|
|
16953
16906
|
id: "liquid/lfm-2.5-24b-a2b",
|
|
16954
16907
|
price: { "currency": "USD", "input": 0.05, "output": 0.7, "cacheRead": 0.025, "cacheWrite": 0 }
|
|
16955
16908
|
},
|
|
16909
|
+
{
|
|
16910
|
+
id: "liquid/lfm-3-1.7b",
|
|
16911
|
+
price: { "currency": "USD", "input": 0.08, "output": 0.2, "cacheRead": 0.02, "cacheWrite": 0 }
|
|
16912
|
+
},
|
|
16913
|
+
{
|
|
16914
|
+
id: "liquid/lfm-3-1.7b:free",
|
|
16915
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
16916
|
+
},
|
|
16956
16917
|
{
|
|
16957
16918
|
id: "mancer/weaver",
|
|
16958
|
-
price: { "currency": "USD", "input": 0.4, "output": 0.75, "cacheRead": 0, "cacheWrite": 0 }
|
|
16919
|
+
price: { "currency": "USD", "input": 0.4, "output": 0.75, "cacheRead": 0.4, "cacheWrite": 0 }
|
|
16959
16920
|
},
|
|
16960
16921
|
{
|
|
16961
16922
|
id: "meituan/longcat-2.0",
|
|
@@ -16963,11 +16924,11 @@ window.__ModuleLoader__.load({
|
|
|
16963
16924
|
},
|
|
16964
16925
|
{
|
|
16965
16926
|
id: "meta-llama/llama-3.1-70b-instruct",
|
|
16966
|
-
price: { "currency": "USD", "input": 0.
|
|
16927
|
+
price: { "currency": "USD", "input": 0.72, "output": 0.72, "cacheRead": 0, "cacheWrite": 0 }
|
|
16967
16928
|
},
|
|
16968
16929
|
{
|
|
16969
16930
|
id: "meta-llama/llama-3.1-8b-instruct",
|
|
16970
|
-
price: { "currency": "USD", "input": 0.
|
|
16931
|
+
price: { "currency": "USD", "input": 0.02, "output": 0.04, "cacheRead": 0, "cacheWrite": 0 }
|
|
16971
16932
|
},
|
|
16972
16933
|
{
|
|
16973
16934
|
id: "meta-llama/llama-3.2-1b-instruct",
|
|
@@ -16979,11 +16940,11 @@ window.__ModuleLoader__.load({
|
|
|
16979
16940
|
},
|
|
16980
16941
|
{
|
|
16981
16942
|
id: "meta-llama/llama-3.3-70b-instruct",
|
|
16982
|
-
price: { "currency": "USD", "input": 0.
|
|
16943
|
+
price: { "currency": "USD", "input": 0.59, "output": 0.79, "cacheRead": 0.295, "cacheWrite": 0 }
|
|
16983
16944
|
},
|
|
16984
16945
|
{
|
|
16985
16946
|
id: "meta-llama/llama-4-maverick",
|
|
16986
|
-
price: { "currency": "USD", "input": 0.
|
|
16947
|
+
price: { "currency": "USD", "input": 0.35, "output": 1, "cacheRead": 0.17, "cacheWrite": 0 }
|
|
16987
16948
|
},
|
|
16988
16949
|
{
|
|
16989
16950
|
id: "meta-llama/llama-4-scout",
|
|
@@ -16997,6 +16958,10 @@ window.__ModuleLoader__.load({
|
|
|
16997
16958
|
id: "meta/muse-glimmer-30b",
|
|
16998
16959
|
price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
16999
16960
|
},
|
|
16961
|
+
{
|
|
16962
|
+
id: "meta/muse-glimmer-30b:batch",
|
|
16963
|
+
price: { "currency": "USD", "input": 0.24, "output": 0.96, "cacheRead": 0.032, "cacheWrite": 0 }
|
|
16964
|
+
},
|
|
17000
16965
|
{
|
|
17001
16966
|
id: "meta/muse-spark-1.1",
|
|
17002
16967
|
price: { "currency": "USD", "input": 1.25, "output": 4.25, "cacheRead": 0.15, "cacheWrite": 0 }
|
|
@@ -17029,41 +16994,25 @@ window.__ModuleLoader__.load({
|
|
|
17029
16994
|
id: "microsoft/phi-4",
|
|
17030
16995
|
price: { "currency": "USD", "input": 0.07, "output": 0.14, "cacheRead": 0, "cacheWrite": 0 }
|
|
17031
16996
|
},
|
|
17032
|
-
{
|
|
17033
|
-
id: "minimax/minimax-01",
|
|
17034
|
-
price: { "currency": "USD", "input": 0.2, "output": 1.1, "cacheRead": 0, "cacheWrite": 0 }
|
|
17035
|
-
},
|
|
17036
|
-
{
|
|
17037
|
-
id: "minimax/minimax-m1",
|
|
17038
|
-
price: { "currency": "USD", "input": 0.55, "output": 2.2, "cacheRead": 0, "cacheWrite": 0 }
|
|
17039
|
-
},
|
|
17040
|
-
{
|
|
17041
|
-
id: "minimax/minimax-m2",
|
|
17042
|
-
price: { "currency": "USD", "input": 0.255, "output": 1.02, "cacheRead": 0, "cacheWrite": 0 }
|
|
17043
|
-
},
|
|
17044
|
-
{
|
|
17045
|
-
id: "minimax/minimax-m2-her",
|
|
17046
|
-
price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17047
|
-
},
|
|
17048
|
-
{
|
|
17049
|
-
id: "minimax/minimax-m2.1",
|
|
17050
|
-
price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17051
|
-
},
|
|
17052
16997
|
{
|
|
17053
16998
|
id: "minimax/minimax-m2.5",
|
|
17054
|
-
price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.
|
|
16999
|
+
price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.06, "cacheWrite": 0 }
|
|
17055
17000
|
},
|
|
17056
17001
|
{
|
|
17057
17002
|
id: "minimax/minimax-m2.7",
|
|
17058
|
-
price: { "currency": "USD", "input": 0.
|
|
17003
|
+
price: { "currency": "USD", "input": 0.21, "output": 0.84, "cacheRead": 0.042, "cacheWrite": 0 }
|
|
17059
17004
|
},
|
|
17060
17005
|
{
|
|
17061
17006
|
id: "minimax/minimax-m3",
|
|
17062
17007
|
price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.06, "cacheWrite": 0 }
|
|
17063
17008
|
},
|
|
17009
|
+
{
|
|
17010
|
+
id: "minimax/minimax-m3:batch",
|
|
17011
|
+
price: { "currency": "USD", "input": 0.224, "output": 0.88, "cacheRead": 0.0448, "cacheWrite": 0 }
|
|
17012
|
+
},
|
|
17064
17013
|
{
|
|
17065
17014
|
id: "minimax/minimax-m3.1-flash",
|
|
17066
|
-
price: { "currency": "USD", "input": 0.
|
|
17015
|
+
price: { "currency": "USD", "input": 0.075, "output": 0.3, "cacheRead": 75e-4, "cacheWrite": 0 }
|
|
17067
17016
|
},
|
|
17068
17017
|
{
|
|
17069
17018
|
id: "mistralai/codestral-2508",
|
|
@@ -17085,6 +17034,14 @@ window.__ModuleLoader__.load({
|
|
|
17085
17034
|
id: "mistralai/ministral-8b-2512",
|
|
17086
17035
|
price: { "currency": "USD", "input": 0.15, "output": 0.15, "cacheRead": 0.015, "cacheWrite": 0 }
|
|
17087
17036
|
},
|
|
17037
|
+
{
|
|
17038
|
+
id: "mistralai/mistral-large",
|
|
17039
|
+
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.2, "cacheWrite": 0 }
|
|
17040
|
+
},
|
|
17041
|
+
{
|
|
17042
|
+
id: "mistralai/mistral-large-2407",
|
|
17043
|
+
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.2, "cacheWrite": 0 }
|
|
17044
|
+
},
|
|
17088
17045
|
{
|
|
17089
17046
|
id: "mistralai/mistral-large-2512",
|
|
17090
17047
|
price: { "currency": "USD", "input": 0.5, "output": 1.5, "cacheRead": 0.05, "cacheWrite": 0 }
|
|
@@ -17101,6 +17058,10 @@ window.__ModuleLoader__.load({
|
|
|
17101
17058
|
id: "mistralai/mistral-medium-3-5",
|
|
17102
17059
|
price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0, "cacheWrite": 0 }
|
|
17103
17060
|
},
|
|
17061
|
+
{
|
|
17062
|
+
id: "mistralai/mistral-medium-3-5:batch",
|
|
17063
|
+
price: { "currency": "USD", "input": 0.75, "output": 3.75, "cacheRead": 0, "cacheWrite": 0 }
|
|
17064
|
+
},
|
|
17104
17065
|
{
|
|
17105
17066
|
id: "mistralai/mistral-medium-3.1",
|
|
17106
17067
|
price: { "currency": "USD", "input": 0.4, "output": 2, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
@@ -17127,7 +17088,7 @@ window.__ModuleLoader__.load({
|
|
|
17127
17088
|
},
|
|
17128
17089
|
{
|
|
17129
17090
|
id: "mistralai/mistral-small-3.2-24b-instruct",
|
|
17130
|
-
price: { "currency": "USD", "input": 0.
|
|
17091
|
+
price: { "currency": "USD", "input": 0.1, "output": 0.3, "cacheRead": 0.01, "cacheWrite": 0 }
|
|
17131
17092
|
},
|
|
17132
17093
|
{
|
|
17133
17094
|
id: "mistralai/mixtral-8x22b-instruct",
|
|
@@ -17145,6 +17106,10 @@ window.__ModuleLoader__.load({
|
|
|
17145
17106
|
id: "moondream/moondream3.1-9b-a2b",
|
|
17146
17107
|
price: { "currency": "USD", "input": 0.3, "output": 2.5, "cacheRead": 0, "cacheWrite": 0 }
|
|
17147
17108
|
},
|
|
17109
|
+
{
|
|
17110
|
+
id: "moonshotai/kimi-k2",
|
|
17111
|
+
price: { "currency": "USD", "input": 0.57, "output": 2.3, "cacheRead": 0, "cacheWrite": 0 }
|
|
17112
|
+
},
|
|
17148
17113
|
{
|
|
17149
17114
|
id: "moonshotai/kimi-k2-0905",
|
|
17150
17115
|
price: { "currency": "USD", "input": 0.6, "output": 2.5, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -17155,7 +17120,7 @@ window.__ModuleLoader__.load({
|
|
|
17155
17120
|
},
|
|
17156
17121
|
{
|
|
17157
17122
|
id: "moonshotai/kimi-k2.5",
|
|
17158
|
-
price: { "currency": "USD", "input": 0.
|
|
17123
|
+
price: { "currency": "USD", "input": 0.532, "output": 3.325, "cacheRead": 0.209, "cacheWrite": 0 }
|
|
17159
17124
|
},
|
|
17160
17125
|
{
|
|
17161
17126
|
id: "moonshotai/kimi-k2.6",
|
|
@@ -17163,11 +17128,15 @@ window.__ModuleLoader__.load({
|
|
|
17163
17128
|
},
|
|
17164
17129
|
{
|
|
17165
17130
|
id: "moonshotai/kimi-k2.7-code",
|
|
17166
|
-
price: { "currency": "USD", "input": 0.
|
|
17131
|
+
price: { "currency": "USD", "input": 0.6, "output": 3.5, "cacheRead": 0.16, "cacheWrite": 0 }
|
|
17167
17132
|
},
|
|
17168
17133
|
{
|
|
17169
17134
|
id: "moonshotai/kimi-k3",
|
|
17170
|
-
price: { "currency": "USD", "input": 0.192, "output":
|
|
17135
|
+
price: { "currency": "USD", "input": 0.192, "output": 16, "cacheRead": 0.182, "cacheWrite": 0 }
|
|
17136
|
+
},
|
|
17137
|
+
{
|
|
17138
|
+
id: "moonshotai/kimi-k3:batch",
|
|
17139
|
+
price: { "currency": "USD", "input": 0.883, "output": 6, "cacheRead": 0.218, "cacheWrite": 0 }
|
|
17171
17140
|
},
|
|
17172
17141
|
{
|
|
17173
17142
|
id: "moonshotai/kimi-k3.1-pro",
|
|
@@ -17177,10 +17146,18 @@ window.__ModuleLoader__.load({
|
|
|
17177
17146
|
id: "morph/morph-v3-fast",
|
|
17178
17147
|
price: { "currency": "USD", "input": 0.8, "output": 1.2, "cacheRead": 0, "cacheWrite": 0 }
|
|
17179
17148
|
},
|
|
17149
|
+
{
|
|
17150
|
+
id: "morph/morph-v3-fast:batch",
|
|
17151
|
+
price: { "currency": "USD", "input": 0.4, "output": 0.6, "cacheRead": 0, "cacheWrite": 0 }
|
|
17152
|
+
},
|
|
17180
17153
|
{
|
|
17181
17154
|
id: "morph/morph-v3-large",
|
|
17182
17155
|
price: { "currency": "USD", "input": 0.9, "output": 1.9, "cacheRead": 0, "cacheWrite": 0 }
|
|
17183
17156
|
},
|
|
17157
|
+
{
|
|
17158
|
+
id: "morph/morph-v3-large:batch",
|
|
17159
|
+
price: { "currency": "USD", "input": 0.45, "output": 0.95, "cacheRead": 0, "cacheWrite": 0 }
|
|
17160
|
+
},
|
|
17184
17161
|
{
|
|
17185
17162
|
id: "nex-agi/nex-n2.5-mini",
|
|
17186
17163
|
price: { "currency": "USD", "input": 0.025, "output": 0.1, "cacheRead": 25e-4, "cacheWrite": 0 }
|
|
@@ -17189,14 +17166,6 @@ window.__ModuleLoader__.load({
|
|
|
17189
17166
|
id: "nex-agi/nex-n2.5-pro",
|
|
17190
17167
|
price: { "currency": "USD", "input": 0.075, "output": 0.25, "cacheRead": 0.015, "cacheWrite": 0 }
|
|
17191
17168
|
},
|
|
17192
|
-
{
|
|
17193
|
-
id: "nousresearch/hermes-3-llama-3.1-405b",
|
|
17194
|
-
price: { "currency": "USD", "input": 1, "output": 1, "cacheRead": 0, "cacheWrite": 0 }
|
|
17195
|
-
},
|
|
17196
|
-
{
|
|
17197
|
-
id: "nousresearch/hermes-3-llama-3.1-70b",
|
|
17198
|
-
price: { "currency": "USD", "input": 0.7, "output": 0.7, "cacheRead": 0, "cacheWrite": 0 }
|
|
17199
|
-
},
|
|
17200
17169
|
{
|
|
17201
17170
|
id: "nousresearch/hermes-4-405b",
|
|
17202
17171
|
price: { "currency": "USD", "input": 1, "output": 3, "cacheRead": 0.2, "cacheWrite": 0 }
|
|
@@ -17211,12 +17180,16 @@ window.__ModuleLoader__.load({
|
|
|
17211
17180
|
},
|
|
17212
17181
|
{
|
|
17213
17182
|
id: "nvidia/nemotron-3-super-120b-a12b",
|
|
17214
|
-
price: { "currency": "USD", "input": 0.
|
|
17183
|
+
price: { "currency": "USD", "input": 0.075, "output": 0.4, "cacheRead": 0, "cacheWrite": 0 }
|
|
17215
17184
|
},
|
|
17216
17185
|
{
|
|
17217
17186
|
id: "nvidia/nemotron-3-ultra-550b-a55b",
|
|
17218
17187
|
price: { "currency": "USD", "input": 0.6, "output": 2.4, "cacheRead": 0.12, "cacheWrite": 0 }
|
|
17219
17188
|
},
|
|
17189
|
+
{
|
|
17190
|
+
id: "nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
17191
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
17192
|
+
},
|
|
17220
17193
|
{
|
|
17221
17194
|
id: "nvidia/nemotron-3.5-content-safety",
|
|
17222
17195
|
price: { "currency": "USD", "input": 0.2, "output": 0.2, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -17225,10 +17198,18 @@ window.__ModuleLoader__.load({
|
|
|
17225
17198
|
id: "nvidia/nemotron-3.5-lightning",
|
|
17226
17199
|
price: { "currency": "USD", "input": 0.07, "output": 0.2, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
17227
17200
|
},
|
|
17201
|
+
{
|
|
17202
|
+
id: "nvidia/nemotron-3.5-lightning:free",
|
|
17203
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
17204
|
+
},
|
|
17228
17205
|
{
|
|
17229
17206
|
id: "nvidia/nemotron-3.5-super-vl",
|
|
17230
17207
|
price: { "currency": "USD", "input": 0.15, "output": 0.5, "cacheRead": 0.02, "cacheWrite": 0 }
|
|
17231
17208
|
},
|
|
17209
|
+
{
|
|
17210
|
+
id: "nvidia/nemotron-3.5-super-vl:free",
|
|
17211
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
17212
|
+
},
|
|
17232
17213
|
{
|
|
17233
17214
|
id: "openai/gpt-3.5-turbo-0613",
|
|
17234
17215
|
price: { "currency": "USD", "input": 1, "output": 2, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -17241,6 +17222,10 @@ window.__ModuleLoader__.load({
|
|
|
17241
17222
|
id: "openai/gpt-4",
|
|
17242
17223
|
price: { "currency": "USD", "input": 30, "output": 60, "cacheRead": 0, "cacheWrite": 0 }
|
|
17243
17224
|
},
|
|
17225
|
+
{
|
|
17226
|
+
id: "openai/gpt-4-turbo:batch",
|
|
17227
|
+
price: { "currency": "USD", "input": 5, "output": 15, "cacheRead": 0, "cacheWrite": 0 }
|
|
17228
|
+
},
|
|
17244
17229
|
{
|
|
17245
17230
|
id: "openai/gpt-4.1",
|
|
17246
17231
|
price: { "currency": "USD", "input": 2, "output": 8, "cacheRead": 0.5, "cacheWrite": 0 }
|
|
@@ -17249,42 +17234,94 @@ window.__ModuleLoader__.load({
|
|
|
17249
17234
|
id: "openai/gpt-4.1-mini",
|
|
17250
17235
|
price: { "currency": "USD", "input": 0.4, "output": 1.6, "cacheRead": 0.1, "cacheWrite": 0 }
|
|
17251
17236
|
},
|
|
17237
|
+
{
|
|
17238
|
+
id: "openai/gpt-4.1-mini:batch",
|
|
17239
|
+
price: { "currency": "USD", "input": 0.2, "output": 0.8, "cacheRead": 0.05, "cacheWrite": 0 }
|
|
17240
|
+
},
|
|
17252
17241
|
{
|
|
17253
17242
|
id: "openai/gpt-4.1-nano",
|
|
17254
17243
|
price: { "currency": "USD", "input": 0.1, "output": 0.4, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17255
17244
|
},
|
|
17256
17245
|
{
|
|
17257
|
-
id: "openai/gpt-
|
|
17258
|
-
price: { "currency": "USD", "input":
|
|
17246
|
+
id: "openai/gpt-4.1-nano:batch",
|
|
17247
|
+
price: { "currency": "USD", "input": 0.05, "output": 0.2, "cacheRead": 0.0125, "cacheWrite": 0 }
|
|
17259
17248
|
},
|
|
17260
17249
|
{
|
|
17261
|
-
id: "openai/gpt-
|
|
17262
|
-
price: { "currency": "USD", "input":
|
|
17250
|
+
id: "openai/gpt-4.1:batch",
|
|
17251
|
+
price: { "currency": "USD", "input": 1, "output": 4, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
17263
17252
|
},
|
|
17264
17253
|
{
|
|
17265
|
-
id: "openai/gpt-
|
|
17266
|
-
price: { "currency": "USD", "input":
|
|
17254
|
+
id: "openai/gpt-4o",
|
|
17255
|
+
price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
|
|
17267
17256
|
},
|
|
17268
17257
|
{
|
|
17269
|
-
id: "openai/gpt-
|
|
17270
|
-
price: { "currency": "USD", "input":
|
|
17258
|
+
id: "openai/gpt-4o-2024-05-13",
|
|
17259
|
+
price: { "currency": "USD", "input": 5, "output": 15, "cacheRead": 0, "cacheWrite": 0 }
|
|
17271
17260
|
},
|
|
17272
17261
|
{
|
|
17273
|
-
id: "openai/gpt-
|
|
17274
|
-
price: { "currency": "USD", "input": 2.5, "output":
|
|
17262
|
+
id: "openai/gpt-4o-2024-08-06",
|
|
17263
|
+
price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
|
|
17275
17264
|
},
|
|
17276
17265
|
{
|
|
17277
|
-
id: "openai/gpt-
|
|
17278
|
-
price: { "currency": "USD", "input":
|
|
17266
|
+
id: "openai/gpt-4o-2024-11-20",
|
|
17267
|
+
price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
|
|
17279
17268
|
},
|
|
17280
17269
|
{
|
|
17281
|
-
id: "openai/gpt-
|
|
17282
|
-
price: { "currency": "USD", "input": 0.
|
|
17283
|
-
},
|
|
17270
|
+
id: "openai/gpt-4o-mini",
|
|
17271
|
+
price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
17272
|
+
},
|
|
17273
|
+
{
|
|
17274
|
+
id: "openai/gpt-4o-mini-2024-07-18",
|
|
17275
|
+
price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
17276
|
+
},
|
|
17277
|
+
{
|
|
17278
|
+
id: "openai/gpt-4o-mini:batch",
|
|
17279
|
+
price: { "currency": "USD", "input": 0.075, "output": 0.3, "cacheRead": 0.0375, "cacheWrite": 0 }
|
|
17280
|
+
},
|
|
17281
|
+
{
|
|
17282
|
+
id: "openai/gpt-4o:batch",
|
|
17283
|
+
price: { "currency": "USD", "input": 1.25, "output": 5, "cacheRead": 0.625, "cacheWrite": 0 }
|
|
17284
|
+
},
|
|
17285
|
+
{
|
|
17286
|
+
id: "openai/gpt-5",
|
|
17287
|
+
price: { "currency": "USD", "input": 1.25, "output": 10, "cacheRead": 0.125, "cacheWrite": 0 }
|
|
17288
|
+
},
|
|
17289
|
+
{
|
|
17290
|
+
id: "openai/gpt-5-image",
|
|
17291
|
+
price: { "currency": "USD", "input": 10, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
|
|
17292
|
+
},
|
|
17293
|
+
{
|
|
17294
|
+
id: "openai/gpt-5-image-mini",
|
|
17295
|
+
price: { "currency": "USD", "input": 2.5, "output": 2, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
17296
|
+
},
|
|
17297
|
+
{
|
|
17298
|
+
id: "openai/gpt-5-mini",
|
|
17299
|
+
price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0.025, "cacheWrite": 0 }
|
|
17300
|
+
},
|
|
17301
|
+
{
|
|
17302
|
+
id: "openai/gpt-5-mini:batch",
|
|
17303
|
+
price: { "currency": "USD", "input": 0.125, "output": 1, "cacheRead": 0.0125, "cacheWrite": 0 }
|
|
17304
|
+
},
|
|
17305
|
+
{
|
|
17306
|
+
id: "openai/gpt-5-nano",
|
|
17307
|
+
price: { "currency": "USD", "input": 0.05, "output": 0.4, "cacheRead": 5e-3, "cacheWrite": 0 }
|
|
17308
|
+
},
|
|
17309
|
+
{
|
|
17310
|
+
id: "openai/gpt-5-nano:batch",
|
|
17311
|
+
price: { "currency": "USD", "input": 0.025, "output": 0.2, "cacheRead": 25e-4, "cacheWrite": 0 }
|
|
17312
|
+
},
|
|
17284
17313
|
{
|
|
17285
17314
|
id: "openai/gpt-5-pro",
|
|
17286
17315
|
price: { "currency": "USD", "input": 15, "output": 120, "cacheRead": 0, "cacheWrite": 0 }
|
|
17287
17316
|
},
|
|
17317
|
+
{
|
|
17318
|
+
id: "openai/gpt-5-pro:batch",
|
|
17319
|
+
price: { "currency": "USD", "input": 7.5, "output": 60, "cacheRead": 0, "cacheWrite": 0 }
|
|
17320
|
+
},
|
|
17321
|
+
{
|
|
17322
|
+
id: "openai/gpt-5:batch",
|
|
17323
|
+
price: { "currency": "USD", "input": 0.625, "output": 5, "cacheRead": 0.0625, "cacheWrite": 0 }
|
|
17324
|
+
},
|
|
17288
17325
|
{
|
|
17289
17326
|
id: "openai/gpt-5.1",
|
|
17290
17327
|
price: { "currency": "USD", "input": 1.25, "output": 10, "cacheRead": 0.125, "cacheWrite": 0 }
|
|
@@ -17301,6 +17338,10 @@ window.__ModuleLoader__.load({
|
|
|
17301
17338
|
id: "openai/gpt-5.1-codex-mini",
|
|
17302
17339
|
price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17303
17340
|
},
|
|
17341
|
+
{
|
|
17342
|
+
id: "openai/gpt-5.1:batch",
|
|
17343
|
+
price: { "currency": "USD", "input": 0.625, "output": 5, "cacheRead": 0.0625, "cacheWrite": 0 }
|
|
17344
|
+
},
|
|
17304
17345
|
{
|
|
17305
17346
|
id: "openai/gpt-5.2",
|
|
17306
17347
|
price: { "currency": "USD", "input": 1.75, "output": 14, "cacheRead": 0.175, "cacheWrite": 0 }
|
|
@@ -17317,6 +17358,14 @@ window.__ModuleLoader__.load({
|
|
|
17317
17358
|
id: "openai/gpt-5.2-pro",
|
|
17318
17359
|
price: { "currency": "USD", "input": 21, "output": 168, "cacheRead": 0, "cacheWrite": 0 }
|
|
17319
17360
|
},
|
|
17361
|
+
{
|
|
17362
|
+
id: "openai/gpt-5.2-pro:batch",
|
|
17363
|
+
price: { "currency": "USD", "input": 10.5, "output": 84, "cacheRead": 0, "cacheWrite": 0 }
|
|
17364
|
+
},
|
|
17365
|
+
{
|
|
17366
|
+
id: "openai/gpt-5.2:batch",
|
|
17367
|
+
price: { "currency": "USD", "input": 0.875, "output": 7, "cacheRead": 0.0875, "cacheWrite": 0 }
|
|
17368
|
+
},
|
|
17320
17369
|
{
|
|
17321
17370
|
id: "openai/gpt-5.3-codex",
|
|
17322
17371
|
price: { "currency": "USD", "input": 1.75, "output": 14, "cacheRead": 0.175, "cacheWrite": 0 }
|
|
@@ -17333,14 +17382,30 @@ window.__ModuleLoader__.load({
|
|
|
17333
17382
|
id: "openai/gpt-5.4-mini",
|
|
17334
17383
|
price: { "currency": "USD", "input": 0.75, "output": 4.5, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
17335
17384
|
},
|
|
17385
|
+
{
|
|
17386
|
+
id: "openai/gpt-5.4-mini:batch",
|
|
17387
|
+
price: { "currency": "USD", "input": 0.375, "output": 2.25, "cacheRead": 0.0375, "cacheWrite": 0 }
|
|
17388
|
+
},
|
|
17336
17389
|
{
|
|
17337
17390
|
id: "openai/gpt-5.4-nano",
|
|
17338
17391
|
price: { "currency": "USD", "input": 0.2, "output": 1.25, "cacheRead": 0.02, "cacheWrite": 0 }
|
|
17339
17392
|
},
|
|
17393
|
+
{
|
|
17394
|
+
id: "openai/gpt-5.4-nano:batch",
|
|
17395
|
+
price: { "currency": "USD", "input": 0.1, "output": 0.625, "cacheRead": 0.01, "cacheWrite": 0 }
|
|
17396
|
+
},
|
|
17340
17397
|
{
|
|
17341
17398
|
id: "openai/gpt-5.4-pro",
|
|
17342
17399
|
price: { "currency": "USD", "input": 30, "output": 180, "cacheRead": 0, "cacheWrite": 0 }
|
|
17343
17400
|
},
|
|
17401
|
+
{
|
|
17402
|
+
id: "openai/gpt-5.4-pro:batch",
|
|
17403
|
+
price: { "currency": "USD", "input": 15, "output": 90, "cacheRead": 0, "cacheWrite": 0 }
|
|
17404
|
+
},
|
|
17405
|
+
{
|
|
17406
|
+
id: "openai/gpt-5.4:batch",
|
|
17407
|
+
price: { "currency": "USD", "input": 1.25, "output": 7.5, "cacheRead": 0.125, "cacheWrite": 0 }
|
|
17408
|
+
},
|
|
17344
17409
|
{
|
|
17345
17410
|
id: "openai/gpt-5.5",
|
|
17346
17411
|
price: { "currency": "USD", "input": 5, "output": 30, "cacheRead": 0.5, "cacheWrite": 0 }
|
|
@@ -17349,6 +17414,14 @@ window.__ModuleLoader__.load({
|
|
|
17349
17414
|
id: "openai/gpt-5.5-pro",
|
|
17350
17415
|
price: { "currency": "USD", "input": 30, "output": 180, "cacheRead": 0, "cacheWrite": 0 }
|
|
17351
17416
|
},
|
|
17417
|
+
{
|
|
17418
|
+
id: "openai/gpt-5.5-pro:batch",
|
|
17419
|
+
price: { "currency": "USD", "input": 15, "output": 90, "cacheRead": 0, "cacheWrite": 0 }
|
|
17420
|
+
},
|
|
17421
|
+
{
|
|
17422
|
+
id: "openai/gpt-5.5:batch",
|
|
17423
|
+
price: { "currency": "USD", "input": 2.5, "output": 15, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
17424
|
+
},
|
|
17352
17425
|
{
|
|
17353
17426
|
id: "openai/gpt-5.6-luna",
|
|
17354
17427
|
price: { "currency": "USD", "input": 0.2, "output": 1.2, "cacheRead": 0.02, "cacheWrite": 0.25 }
|
|
@@ -17357,6 +17430,14 @@ window.__ModuleLoader__.load({
|
|
|
17357
17430
|
id: "openai/gpt-5.6-luna-pro",
|
|
17358
17431
|
price: { "currency": "USD", "input": 0.2, "output": 1.2, "cacheRead": 0.02, "cacheWrite": 0.25 }
|
|
17359
17432
|
},
|
|
17433
|
+
{
|
|
17434
|
+
id: "openai/gpt-5.6-luna-pro:batch",
|
|
17435
|
+
price: { "currency": "USD", "input": 0.1, "output": 0.6, "cacheRead": 0.01, "cacheWrite": 0 }
|
|
17436
|
+
},
|
|
17437
|
+
{
|
|
17438
|
+
id: "openai/gpt-5.6-luna:batch",
|
|
17439
|
+
price: { "currency": "USD", "input": 0.1, "output": 0.6, "cacheRead": 0.01, "cacheWrite": 0 }
|
|
17440
|
+
},
|
|
17360
17441
|
{
|
|
17361
17442
|
id: "openai/gpt-5.6-sol",
|
|
17362
17443
|
price: { "currency": "USD", "input": 4, "output": 20, "cacheRead": 0.4, "cacheWrite": 5 }
|
|
@@ -17365,6 +17446,14 @@ window.__ModuleLoader__.load({
|
|
|
17365
17446
|
id: "openai/gpt-5.6-sol-pro",
|
|
17366
17447
|
price: { "currency": "USD", "input": 4, "output": 20, "cacheRead": 0.4, "cacheWrite": 5 }
|
|
17367
17448
|
},
|
|
17449
|
+
{
|
|
17450
|
+
id: "openai/gpt-5.6-sol-pro:batch",
|
|
17451
|
+
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
17452
|
+
},
|
|
17453
|
+
{
|
|
17454
|
+
id: "openai/gpt-5.6-sol:batch",
|
|
17455
|
+
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
17456
|
+
},
|
|
17368
17457
|
{
|
|
17369
17458
|
id: "openai/gpt-5.6-terra",
|
|
17370
17459
|
price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
@@ -17373,6 +17462,14 @@ window.__ModuleLoader__.load({
|
|
|
17373
17462
|
id: "openai/gpt-5.6-terra-pro",
|
|
17374
17463
|
price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
17375
17464
|
},
|
|
17465
|
+
{
|
|
17466
|
+
id: "openai/gpt-5.6-terra-pro:batch",
|
|
17467
|
+
price: { "currency": "USD", "input": 1, "output": 6, "cacheRead": 0.1, "cacheWrite": 0 }
|
|
17468
|
+
},
|
|
17469
|
+
{
|
|
17470
|
+
id: "openai/gpt-5.6-terra:batch",
|
|
17471
|
+
price: { "currency": "USD", "input": 1, "output": 6, "cacheRead": 0.1, "cacheWrite": 0 }
|
|
17472
|
+
},
|
|
17376
17473
|
{
|
|
17377
17474
|
id: "openai/gpt-6-astra",
|
|
17378
17475
|
price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 1, "cacheWrite": 12.5 }
|
|
@@ -17381,6 +17478,14 @@ window.__ModuleLoader__.load({
|
|
|
17381
17478
|
id: "openai/gpt-6-astra-pro",
|
|
17382
17479
|
price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 1, "cacheWrite": 12.5 }
|
|
17383
17480
|
},
|
|
17481
|
+
{
|
|
17482
|
+
id: "openai/gpt-6-astra-pro:batch",
|
|
17483
|
+
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
17484
|
+
},
|
|
17485
|
+
{
|
|
17486
|
+
id: "openai/gpt-6-astra:batch",
|
|
17487
|
+
price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
|
|
17488
|
+
},
|
|
17384
17489
|
{
|
|
17385
17490
|
id: "openai/gpt-6-luna",
|
|
17386
17491
|
price: { "currency": "USD", "input": 0.1, "output": 0.5, "cacheRead": 0.01, "cacheWrite": 0.125 }
|
|
@@ -17389,6 +17494,14 @@ window.__ModuleLoader__.load({
|
|
|
17389
17494
|
id: "openai/gpt-6-luna-pro",
|
|
17390
17495
|
price: { "currency": "USD", "input": 0.1, "output": 0.5, "cacheRead": 0.01, "cacheWrite": 0.125 }
|
|
17391
17496
|
},
|
|
17497
|
+
{
|
|
17498
|
+
id: "openai/gpt-6-luna-pro:batch",
|
|
17499
|
+
price: { "currency": "USD", "input": 0.05, "output": 0.25, "cacheRead": 5e-3, "cacheWrite": 0.0625 }
|
|
17500
|
+
},
|
|
17501
|
+
{
|
|
17502
|
+
id: "openai/gpt-6-luna:batch",
|
|
17503
|
+
price: { "currency": "USD", "input": 0.05, "output": 0.25, "cacheRead": 5e-3, "cacheWrite": 0.0625 }
|
|
17504
|
+
},
|
|
17392
17505
|
{
|
|
17393
17506
|
id: "openai/gpt-6-sol",
|
|
17394
17507
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
@@ -17397,6 +17510,14 @@ window.__ModuleLoader__.load({
|
|
|
17397
17510
|
id: "openai/gpt-6-sol-pro",
|
|
17398
17511
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
|
|
17399
17512
|
},
|
|
17513
|
+
{
|
|
17514
|
+
id: "openai/gpt-6-sol-pro:batch",
|
|
17515
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
|
|
17516
|
+
},
|
|
17517
|
+
{
|
|
17518
|
+
id: "openai/gpt-6-sol:batch",
|
|
17519
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
|
|
17520
|
+
},
|
|
17400
17521
|
{
|
|
17401
17522
|
id: "openai/gpt-6.1-sol",
|
|
17402
17523
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
|
|
@@ -17405,6 +17526,14 @@ window.__ModuleLoader__.load({
|
|
|
17405
17526
|
id: "openai/gpt-6.1-sol-pro",
|
|
17406
17527
|
price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
|
|
17407
17528
|
},
|
|
17529
|
+
{
|
|
17530
|
+
id: "openai/gpt-6.1-sol-pro:batch",
|
|
17531
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
|
|
17532
|
+
},
|
|
17533
|
+
{
|
|
17534
|
+
id: "openai/gpt-6.1-sol:batch",
|
|
17535
|
+
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
|
|
17536
|
+
},
|
|
17408
17537
|
{
|
|
17409
17538
|
id: "openai/gpt-6.1-terra",
|
|
17410
17539
|
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
|
|
@@ -17413,6 +17542,14 @@ window.__ModuleLoader__.load({
|
|
|
17413
17542
|
id: "openai/gpt-6.1-terra-pro",
|
|
17414
17543
|
price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
|
|
17415
17544
|
},
|
|
17545
|
+
{
|
|
17546
|
+
id: "openai/gpt-6.1-terra-pro:batch",
|
|
17547
|
+
price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.025, "cacheWrite": 0.625 }
|
|
17548
|
+
},
|
|
17549
|
+
{
|
|
17550
|
+
id: "openai/gpt-6.1-terra:batch",
|
|
17551
|
+
price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.025, "cacheWrite": 0.625 }
|
|
17552
|
+
},
|
|
17416
17553
|
{
|
|
17417
17554
|
id: "openai/gpt-audio",
|
|
17418
17555
|
price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -17429,9 +17566,17 @@ window.__ModuleLoader__.load({
|
|
|
17429
17566
|
id: "openai/gpt-oss-120b",
|
|
17430
17567
|
price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
17431
17568
|
},
|
|
17569
|
+
{
|
|
17570
|
+
id: "openai/gpt-oss-120b:batch",
|
|
17571
|
+
price: { "currency": "USD", "input": 0.0296, "output": 0.136, "cacheRead": 0, "cacheWrite": 0 }
|
|
17572
|
+
},
|
|
17432
17573
|
{
|
|
17433
17574
|
id: "openai/gpt-oss-20b",
|
|
17434
|
-
price: { "currency": "USD", "input": 0.
|
|
17575
|
+
price: { "currency": "USD", "input": 0.03, "output": 0.13, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17576
|
+
},
|
|
17577
|
+
{
|
|
17578
|
+
id: "openai/gpt-oss-20b:batch",
|
|
17579
|
+
price: { "currency": "USD", "input": 0.024, "output": 0.112, "cacheRead": 0, "cacheWrite": 0 }
|
|
17435
17580
|
},
|
|
17436
17581
|
{
|
|
17437
17582
|
id: "openai/gpt-oss-safeguard-20b",
|
|
@@ -17441,17 +17586,29 @@ window.__ModuleLoader__.load({
|
|
|
17441
17586
|
id: "openai/o3",
|
|
17442
17587
|
price: { "currency": "USD", "input": 2, "output": 8, "cacheRead": 0.5, "cacheWrite": 0 }
|
|
17443
17588
|
},
|
|
17589
|
+
{
|
|
17590
|
+
id: "openai/o3-mini:batch",
|
|
17591
|
+
price: { "currency": "USD", "input": 0.55, "output": 2.2, "cacheRead": 0.275, "cacheWrite": 0 }
|
|
17592
|
+
},
|
|
17444
17593
|
{
|
|
17445
17594
|
id: "openai/o3-pro",
|
|
17446
17595
|
price: { "currency": "USD", "input": 20, "output": 80, "cacheRead": 0, "cacheWrite": 0 }
|
|
17447
17596
|
},
|
|
17597
|
+
{
|
|
17598
|
+
id: "openai/o3:batch",
|
|
17599
|
+
price: { "currency": "USD", "input": 1, "output": 4, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
17600
|
+
},
|
|
17601
|
+
{
|
|
17602
|
+
id: "openai/o4-mini:batch",
|
|
17603
|
+
price: { "currency": "USD", "input": 0.55, "output": 2.2, "cacheRead": 0.1375, "cacheWrite": 0 }
|
|
17604
|
+
},
|
|
17448
17605
|
{
|
|
17449
17606
|
id: "openrouter/free",
|
|
17450
17607
|
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
17451
17608
|
},
|
|
17452
17609
|
{
|
|
17453
17610
|
id: "particle-ai/particle-1",
|
|
17454
|
-
price: { "currency": "USD", "input": 0.
|
|
17611
|
+
price: { "currency": "USD", "input": 0.05, "output": 0.5, "cacheRead": 3e-3, "cacheWrite": 0 }
|
|
17455
17612
|
},
|
|
17456
17613
|
{
|
|
17457
17614
|
id: "perceptron/perceptron-mk1",
|
|
@@ -17481,14 +17638,6 @@ window.__ModuleLoader__.load({
|
|
|
17481
17638
|
id: "perplexity/sonar-reasoning-pro",
|
|
17482
17639
|
price: { "currency": "USD", "input": 2, "output": 8, "cacheRead": 0, "cacheWrite": 0 }
|
|
17483
17640
|
},
|
|
17484
|
-
{
|
|
17485
|
-
id: "poolside/laguna-s-2.1",
|
|
17486
|
-
price: { "currency": "USD", "input": 0.09, "output": 0.18, "cacheRead": 9e-3, "cacheWrite": 0 }
|
|
17487
|
-
},
|
|
17488
|
-
{
|
|
17489
|
-
id: "poolside/laguna-xs-2.1",
|
|
17490
|
-
price: { "currency": "USD", "input": 0.06, "output": 0.12, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17491
|
-
},
|
|
17492
17641
|
{
|
|
17493
17642
|
id: "prism-ml/ternary-bonsai-2-27b",
|
|
17494
17643
|
price: { "currency": "USD", "input": 0.075, "output": 0.5, "cacheRead": 0.0375, "cacheWrite": 0 }
|
|
@@ -17523,7 +17672,7 @@ window.__ModuleLoader__.load({
|
|
|
17523
17672
|
},
|
|
17524
17673
|
{
|
|
17525
17674
|
id: "qwen/qwen3-235b-a22b-2507",
|
|
17526
|
-
price: { "currency": "USD", "input": 0.
|
|
17675
|
+
price: { "currency": "USD", "input": 0.14, "output": 0.8, "cacheRead": 0.05, "cacheWrite": 0 }
|
|
17527
17676
|
},
|
|
17528
17677
|
{
|
|
17529
17678
|
id: "qwen/qwen3-235b-a22b-thinking-2507",
|
|
@@ -17547,7 +17696,7 @@ window.__ModuleLoader__.load({
|
|
|
17547
17696
|
},
|
|
17548
17697
|
{
|
|
17549
17698
|
id: "qwen/qwen3-coder-30b-a3b-instruct",
|
|
17550
|
-
price: { "currency": "USD", "input": 0.
|
|
17699
|
+
price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0, "cacheWrite": 0 }
|
|
17551
17700
|
},
|
|
17552
17701
|
{
|
|
17553
17702
|
id: "qwen/qwen3-coder-flash",
|
|
@@ -17591,7 +17740,7 @@ window.__ModuleLoader__.load({
|
|
|
17591
17740
|
},
|
|
17592
17741
|
{
|
|
17593
17742
|
id: "qwen/qwen3.5-397b-a17b",
|
|
17594
|
-
price: { "currency": "USD", "input": 0.
|
|
17743
|
+
price: { "currency": "USD", "input": 0.6, "output": 3.6, "cacheRead": 0.12, "cacheWrite": 0 }
|
|
17595
17744
|
},
|
|
17596
17745
|
{
|
|
17597
17746
|
id: "qwen/qwen3.5-9b",
|
|
@@ -17637,13 +17786,21 @@ window.__ModuleLoader__.load({
|
|
|
17637
17786
|
id: "qwen/qwen3.7-plus",
|
|
17638
17787
|
price: { "currency": "USD", "input": 0.32, "output": 1.28, "cacheRead": 0.064, "cacheWrite": 0.4 }
|
|
17639
17788
|
},
|
|
17789
|
+
{
|
|
17790
|
+
id: "qwen/qwen3.7-plus:batch",
|
|
17791
|
+
price: { "currency": "USD", "input": 0.23, "output": 0.92, "cacheRead": 0, "cacheWrite": 0 }
|
|
17792
|
+
},
|
|
17640
17793
|
{
|
|
17641
17794
|
id: "qwen/qwen3.8-2.4t-a95b",
|
|
17642
17795
|
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
17643
17796
|
},
|
|
17644
17797
|
{
|
|
17645
17798
|
id: "qwen/qwen3.8-27b",
|
|
17646
|
-
price: { "currency": "USD", "input": 0.
|
|
17799
|
+
price: { "currency": "USD", "input": 0.15, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0 }
|
|
17800
|
+
},
|
|
17801
|
+
{
|
|
17802
|
+
id: "qwen/qwen3.8-27b:batch",
|
|
17803
|
+
price: { "currency": "USD", "input": 0.16, "output": 2, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
17647
17804
|
},
|
|
17648
17805
|
{
|
|
17649
17806
|
id: "qwen/qwen3.8-flash",
|
|
@@ -17653,6 +17810,10 @@ window.__ModuleLoader__.load({
|
|
|
17653
17810
|
id: "qwen/qwen3.8-max-0902",
|
|
17654
17811
|
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
17655
17812
|
},
|
|
17813
|
+
{
|
|
17814
|
+
id: "qwen/qwen3.8-max-0902:batch",
|
|
17815
|
+
price: { "currency": "USD", "input": 1.15, "output": 3.45, "cacheRead": 0, "cacheWrite": 0 }
|
|
17816
|
+
},
|
|
17656
17817
|
{
|
|
17657
17818
|
id: "qwen/qwen3.8-max-prime",
|
|
17658
17819
|
price: { "currency": "USD", "input": 4, "output": 12, "cacheRead": 0.5, "cacheWrite": 0 }
|
|
@@ -17667,7 +17828,7 @@ window.__ModuleLoader__.load({
|
|
|
17667
17828
|
},
|
|
17668
17829
|
{
|
|
17669
17830
|
id: "reflection/beam-1.0-501b-a23b",
|
|
17670
|
-
price: { "currency": "USD", "input": 0.
|
|
17831
|
+
price: { "currency": "USD", "input": 0.3, "output": 1, "cacheRead": 0.04, "cacheWrite": 0 }
|
|
17671
17832
|
},
|
|
17672
17833
|
{
|
|
17673
17834
|
id: "rekaai/reka-edge",
|
|
@@ -17685,6 +17846,10 @@ window.__ModuleLoader__.load({
|
|
|
17685
17846
|
id: "relace/relace-search",
|
|
17686
17847
|
price: { "currency": "USD", "input": 1, "output": 3, "cacheRead": 0, "cacheWrite": 0 }
|
|
17687
17848
|
},
|
|
17849
|
+
{
|
|
17850
|
+
id: "ricursiveai/ripple-65b-preview",
|
|
17851
|
+
price: { "currency": "USD", "input": 0.2, "output": 0.6, "cacheRead": 0.05, "cacheWrite": 0 }
|
|
17852
|
+
},
|
|
17688
17853
|
{
|
|
17689
17854
|
id: "sakana/fugu-max",
|
|
17690
17855
|
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.25, "cacheWrite": 0 }
|
|
@@ -17717,6 +17882,10 @@ window.__ModuleLoader__.load({
|
|
|
17717
17882
|
id: "scaledown/summarize",
|
|
17718
17883
|
price: { "currency": "USD", "input": 0.04, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
17719
17884
|
},
|
|
17885
|
+
{
|
|
17886
|
+
id: "stealth/crouton-alpha",
|
|
17887
|
+
price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
|
|
17888
|
+
},
|
|
17720
17889
|
{
|
|
17721
17890
|
id: "stepfun/step-3.5-flash",
|
|
17722
17891
|
price: { "currency": "USD", "input": 0.1, "output": 0.3, "cacheRead": 0, "cacheWrite": 0 }
|
|
@@ -17747,15 +17916,19 @@ window.__ModuleLoader__.load({
|
|
|
17747
17916
|
},
|
|
17748
17917
|
{
|
|
17749
17918
|
id: "tencent/hy3",
|
|
17750
|
-
price: { "currency": "USD", "input": 0.
|
|
17919
|
+
price: { "currency": "USD", "input": 0.0825, "output": 0.33, "cacheRead": 0.020625, "cacheWrite": 0 }
|
|
17751
17920
|
},
|
|
17752
17921
|
{
|
|
17753
17922
|
id: "tencent/hy3-preview",
|
|
17754
17923
|
price: { "currency": "USD", "input": 0.18, "output": 0.6, "cacheRead": 0.06, "cacheWrite": 0 }
|
|
17755
17924
|
},
|
|
17925
|
+
{
|
|
17926
|
+
id: "tencent/hy4",
|
|
17927
|
+
price: { "currency": "USD", "input": 0.417, "output": 1.2505, "cacheRead": 0.021, "cacheWrite": 0 }
|
|
17928
|
+
},
|
|
17756
17929
|
{
|
|
17757
17930
|
id: "tencent/hy4-preview",
|
|
17758
|
-
price: { "currency": "USD", "input": 0.
|
|
17931
|
+
price: { "currency": "USD", "input": 0.7506, "output": 2.2509, "cacheRead": 0.0378, "cacheWrite": 0 }
|
|
17759
17932
|
},
|
|
17760
17933
|
{
|
|
17761
17934
|
id: "thedrummer/cydonia-24b-v4.1",
|
|
@@ -17777,6 +17950,10 @@ window.__ModuleLoader__.load({
|
|
|
17777
17950
|
id: "thinkingmachines/inkling-small",
|
|
17778
17951
|
price: { "currency": "USD", "input": 0.45, "output": 1.2, "cacheRead": 0.1, "cacheWrite": 0 }
|
|
17779
17952
|
},
|
|
17953
|
+
{
|
|
17954
|
+
id: "thinkingmachines/inkling-small:batch",
|
|
17955
|
+
price: { "currency": "USD", "input": 0.36, "output": 0.96, "cacheRead": 0.08, "cacheWrite": 0 }
|
|
17956
|
+
},
|
|
17780
17957
|
{
|
|
17781
17958
|
id: "unbiased/pareto-26.10",
|
|
17782
17959
|
price: { "currency": "USD", "input": 0.8, "output": 3.2, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
@@ -17787,7 +17964,7 @@ window.__ModuleLoader__.load({
|
|
|
17787
17964
|
},
|
|
17788
17965
|
{
|
|
17789
17966
|
id: "undi95/remm-slerp-l2-13b",
|
|
17790
|
-
price: { "currency": "USD", "input": 0.35, "output": 0.65, "cacheRead": 0, "cacheWrite": 0 }
|
|
17967
|
+
price: { "currency": "USD", "input": 0.35, "output": 0.65, "cacheRead": 0.35, "cacheWrite": 0 }
|
|
17791
17968
|
},
|
|
17792
17969
|
{
|
|
17793
17970
|
id: "upstage/solar-mini4",
|
|
@@ -17813,6 +17990,10 @@ window.__ModuleLoader__.load({
|
|
|
17813
17990
|
id: "x-ai/grok-4.3",
|
|
17814
17991
|
price: { "currency": "USD", "input": 1.25, "output": 2.5, "cacheRead": 0.2, "cacheWrite": 0 }
|
|
17815
17992
|
},
|
|
17993
|
+
{
|
|
17994
|
+
id: "x-ai/grok-4.3:batch",
|
|
17995
|
+
price: { "currency": "USD", "input": 1, "output": 2, "cacheRead": 0.16, "cacheWrite": 0 }
|
|
17996
|
+
},
|
|
17816
17997
|
{
|
|
17817
17998
|
id: "x-ai/grok-4.5",
|
|
17818
17999
|
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.3, "cacheWrite": 0 }
|
|
@@ -17821,10 +18002,18 @@ window.__ModuleLoader__.load({
|
|
|
17821
18002
|
id: "x-ai/grok-4.6",
|
|
17822
18003
|
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.5, "cacheWrite": 0 }
|
|
17823
18004
|
},
|
|
18005
|
+
{
|
|
18006
|
+
id: "x-ai/grok-4.6:batch",
|
|
18007
|
+
price: { "currency": "USD", "input": 1.6, "output": 4.8, "cacheRead": 0.4, "cacheWrite": 0 }
|
|
18008
|
+
},
|
|
17824
18009
|
{
|
|
17825
18010
|
id: "x-ai/grok-4.7",
|
|
17826
18011
|
price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.5, "cacheWrite": 0 }
|
|
17827
18012
|
},
|
|
18013
|
+
{
|
|
18014
|
+
id: "x-ai/grok-4.7:batch",
|
|
18015
|
+
price: { "currency": "USD", "input": 1.6, "output": 4.8, "cacheRead": 0.4, "cacheWrite": 0 }
|
|
18016
|
+
},
|
|
17828
18017
|
{
|
|
17829
18018
|
id: "x-ai/grok-build-0.1",
|
|
17830
18019
|
price: { "currency": "USD", "input": 1, "output": 2, "cacheRead": 0.2, "cacheWrite": 0 }
|
|
@@ -17859,7 +18048,7 @@ window.__ModuleLoader__.load({
|
|
|
17859
18048
|
},
|
|
17860
18049
|
{
|
|
17861
18050
|
id: "z-ai/glm-4.5-air",
|
|
17862
|
-
price: { "currency": "USD", "input": 0.
|
|
18051
|
+
price: { "currency": "USD", "input": 0.2, "output": 1.1, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
17863
18052
|
},
|
|
17864
18053
|
{
|
|
17865
18054
|
id: "z-ai/glm-4.5v",
|
|
@@ -17875,7 +18064,7 @@ window.__ModuleLoader__.load({
|
|
|
17875
18064
|
},
|
|
17876
18065
|
{
|
|
17877
18066
|
id: "z-ai/glm-4.7",
|
|
17878
|
-
price: { "currency": "USD", "input": 0.
|
|
18067
|
+
price: { "currency": "USD", "input": 0.6, "output": 2.2, "cacheRead": 0.11, "cacheWrite": 0 }
|
|
17879
18068
|
},
|
|
17880
18069
|
{
|
|
17881
18070
|
id: "z-ai/glm-4.7-flash",
|
|
@@ -17895,24 +18084,40 @@ window.__ModuleLoader__.load({
|
|
|
17895
18084
|
},
|
|
17896
18085
|
{
|
|
17897
18086
|
id: "z-ai/glm-5.2",
|
|
17898
|
-
price: { "currency": "USD", "input": 6e-3, "output":
|
|
18087
|
+
price: { "currency": "USD", "input": 6e-3, "output": 6.8, "cacheRead": 5e-3, "cacheWrite": 0 }
|
|
18088
|
+
},
|
|
18089
|
+
{
|
|
18090
|
+
id: "z-ai/glm-5.2:batch",
|
|
18091
|
+
price: { "currency": "USD", "input": 0.623, "output": 1.271, "cacheRead": 0.21, "cacheWrite": 0 }
|
|
17899
18092
|
},
|
|
17900
18093
|
{
|
|
17901
18094
|
id: "z-ai/glm-5.3",
|
|
17902
|
-
price: { "currency": "USD", "input": 0.
|
|
18095
|
+
price: { "currency": "USD", "input": 0.0699, "output": 1.4, "cacheRead": 0.0689, "cacheWrite": 0 }
|
|
17903
18096
|
},
|
|
17904
18097
|
{
|
|
17905
18098
|
id: "z-ai/glm-5.3-flash",
|
|
17906
|
-
price: { "currency": "USD", "input": 0.
|
|
18099
|
+
price: { "currency": "USD", "input": 0.0335, "output": 0.083, "cacheRead": 0.03, "cacheWrite": 0 }
|
|
18100
|
+
},
|
|
18101
|
+
{
|
|
18102
|
+
id: "z-ai/glm-5.3-flash:batch",
|
|
18103
|
+
price: { "currency": "USD", "input": 0.043, "output": 0.087, "cacheRead": 0.018, "cacheWrite": 0 }
|
|
17907
18104
|
},
|
|
17908
18105
|
{
|
|
17909
18106
|
id: "z-ai/glm-5.3-flashx",
|
|
17910
|
-
price: { "currency": "USD", "input": 0.37, "output": 1.25, "cacheRead": 0.
|
|
18107
|
+
price: { "currency": "USD", "input": 0.37, "output": 1.25, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
18108
|
+
},
|
|
18109
|
+
{
|
|
18110
|
+
id: "z-ai/glm-5.3-flashx-legal",
|
|
18111
|
+
price: { "currency": "USD", "input": 0.37, "output": 1.25, "cacheRead": 0.075, "cacheWrite": 0 }
|
|
17911
18112
|
},
|
|
17912
18113
|
{
|
|
17913
18114
|
id: "z-ai/glm-5.3-prime",
|
|
17914
18115
|
price: { "currency": "USD", "input": 2.8, "output": 8.8, "cacheRead": 0.56, "cacheWrite": 0 }
|
|
17915
18116
|
},
|
|
18117
|
+
{
|
|
18118
|
+
id: "z-ai/glm-5.3:batch",
|
|
18119
|
+
price: { "currency": "USD", "input": 0.45, "output": 2, "cacheRead": 0.1, "cacheWrite": 0 }
|
|
18120
|
+
},
|
|
17916
18121
|
{
|
|
17917
18122
|
id: "z-ai/glm-5v-turbo",
|
|
17918
18123
|
price: { "currency": "USD", "input": 1.2, "output": 4, "cacheRead": 0.24, "cacheWrite": 0 }
|
|
@@ -17985,10 +18190,30 @@ window.__ModuleLoader__.load({
|
|
|
17985
18190
|
}
|
|
17986
18191
|
}
|
|
17987
18192
|
for (const entry of GENERATED_PRICES) {
|
|
17988
|
-
|
|
18193
|
+
const candidates = modelKeyCandidates(entry.id);
|
|
18194
|
+
if (candidates.some((candidate) => BUILTIN_BY_KEY.has(candidate))) continue;
|
|
18195
|
+
for (const candidate of candidates) {
|
|
17989
18196
|
if (!BUILTIN_BY_KEY.has(candidate)) BUILTIN_BY_KEY.set(candidate, entry.price);
|
|
17990
18197
|
}
|
|
17991
18198
|
}
|
|
18199
|
+
function builtinPriceRows() {
|
|
18200
|
+
const rows = BUILTIN_PRICES.map((entry) => ({
|
|
18201
|
+
key: entry.id,
|
|
18202
|
+
provider: "DeepSeek official",
|
|
18203
|
+
model: entry.id,
|
|
18204
|
+
price: entry.price
|
|
18205
|
+
}));
|
|
18206
|
+
for (const entry of GENERATED_PRICES) {
|
|
18207
|
+
const slash = entry.id.indexOf("/");
|
|
18208
|
+
rows.push({
|
|
18209
|
+
key: entry.id,
|
|
18210
|
+
provider: slash === -1 ? "OpenRouter" : entry.id.slice(0, slash).replace(/^~/, ""),
|
|
18211
|
+
model: entry.id,
|
|
18212
|
+
price: entry.price
|
|
18213
|
+
});
|
|
18214
|
+
}
|
|
18215
|
+
return rows.sort((left, right) => left.key.localeCompare(right.key));
|
|
18216
|
+
}
|
|
17992
18217
|
function builtinPriceFor(model) {
|
|
17993
18218
|
for (const key of modelKeyCandidates(model)) {
|
|
17994
18219
|
const price = BUILTIN_BY_KEY.get(key);
|
|
@@ -18048,13 +18273,22 @@ window.__ModuleLoader__.load({
|
|
|
18048
18273
|
const amount = (usage.uncachedInputTokens * price.input + usage.cacheReadTokens * price.cacheRead + usage.cacheWriteTokens * price.cacheWrite + usage.outputTokens * price.output) / 1e6;
|
|
18049
18274
|
return Number.isFinite(amount) ? amount : null;
|
|
18050
18275
|
}
|
|
18276
|
+
function priceForModel(table, key, model) {
|
|
18277
|
+
const direct = table[key];
|
|
18278
|
+
if (direct !== void 0) return direct;
|
|
18279
|
+
for (const candidate of modelKeyCandidates(model)) {
|
|
18280
|
+
const price = table[candidate];
|
|
18281
|
+
if (price !== void 0) return price;
|
|
18282
|
+
}
|
|
18283
|
+
return void 0;
|
|
18284
|
+
}
|
|
18051
18285
|
function estimateCost(models, table) {
|
|
18052
18286
|
const rows = [];
|
|
18053
18287
|
const totals = /* @__PURE__ */ new Map();
|
|
18054
18288
|
let pricedModels = 0;
|
|
18055
18289
|
let unpricedModels = 0;
|
|
18056
18290
|
for (const model of models) {
|
|
18057
|
-
const price = table
|
|
18291
|
+
const price = priceForModel(table, model.key, model.model);
|
|
18058
18292
|
const configured = isPriceConfigured(price);
|
|
18059
18293
|
const amount = configured ? costOf(model, price) : null;
|
|
18060
18294
|
if (configured && amount !== null) {
|
|
@@ -18158,60 +18392,58 @@ window.__ModuleLoader__.load({
|
|
|
18158
18392
|
refreshingPrices,
|
|
18159
18393
|
priceError,
|
|
18160
18394
|
onRefreshPrices,
|
|
18161
|
-
onConfigure,
|
|
18162
18395
|
autoSync
|
|
18163
18396
|
} = props;
|
|
18164
18397
|
const estimate = estimateCost([...models], pricing);
|
|
18165
18398
|
const totalLabel = totalLabelOf(estimate);
|
|
18166
18399
|
const refreshLabel = refreshingPrices ? t("cost.refreshing") : t("cost.refresh");
|
|
18167
|
-
return (0,
|
|
18400
|
+
return (0, import_react56.createElement)(
|
|
18168
18401
|
Section,
|
|
18169
18402
|
{ ariaLabel: t("cost.title") },
|
|
18170
|
-
models.length === 0 ? (0,
|
|
18403
|
+
models.length === 0 ? (0, import_react56.createElement)(EmptyState, { icon: (0, import_react56.createElement)(ChartIcon, { size: 20 }), title: t("models.empty") }) : (0, import_react56.createElement)(
|
|
18171
18404
|
"div",
|
|
18172
18405
|
{ className: "tdb-cost-page" },
|
|
18173
|
-
(0,
|
|
18406
|
+
(0, import_react56.createElement)(
|
|
18174
18407
|
"div",
|
|
18175
18408
|
{ className: "tdb-cost-summary" },
|
|
18176
|
-
(0,
|
|
18409
|
+
(0, import_react56.createElement)(
|
|
18177
18410
|
"div",
|
|
18178
18411
|
{ className: "tdb-cost-summary-main" },
|
|
18179
|
-
(0,
|
|
18180
|
-
(0,
|
|
18412
|
+
(0, import_react56.createElement)("div", { className: "tdb-cost-summary-value" }, totalLabel ?? "\u2014"),
|
|
18413
|
+
(0, import_react56.createElement)(
|
|
18181
18414
|
"div",
|
|
18182
18415
|
{ className: "tdb-cost-summary-meta" },
|
|
18183
|
-
(0,
|
|
18184
|
-
estimate.unpricedModels > 0 ? (0,
|
|
18416
|
+
(0, import_react56.createElement)("span", { className: "tdb-cost-meta" }, sourceText(t, intl, onlineAt, onlineSource, autoSync === true)),
|
|
18417
|
+
estimate.unpricedModels > 0 ? (0, import_react56.createElement)("span", { className: "tdb-cost-hint" }, t("cost.unpriced", { count: estimate.unpricedModels })) : null
|
|
18185
18418
|
)
|
|
18186
18419
|
),
|
|
18187
|
-
(0,
|
|
18420
|
+
(0, import_react56.createElement)(
|
|
18188
18421
|
"div",
|
|
18189
18422
|
{ className: "tdb-cost-actions tdb-cost-summary-actions" },
|
|
18190
|
-
(0,
|
|
18191
|
-
(0, import_react57.createElement)(Button3, { onClick: onConfigure }, t("cost.manage"))
|
|
18423
|
+
(0, import_react56.createElement)(Button3, { variant: "ghost", busy: refreshingPrices, onClick: onRefreshPrices }, refreshLabel)
|
|
18192
18424
|
)
|
|
18193
18425
|
),
|
|
18194
|
-
priceError ? (0,
|
|
18195
|
-
(0,
|
|
18426
|
+
priceError ? (0, import_react56.createElement)("div", { className: "tdb-error-text", style: { marginTop: "6px" } }, t("cost.refreshError")) : null,
|
|
18427
|
+
(0, import_react56.createElement)(CostTable, { rows: estimate.rows, t, intl })
|
|
18196
18428
|
)
|
|
18197
18429
|
);
|
|
18198
18430
|
}
|
|
18199
18431
|
function CostTable({ rows, t, intl }) {
|
|
18200
18432
|
const pageSize = TABLE_PAGE_SIZE;
|
|
18201
|
-
const [page, setPage] = (0,
|
|
18433
|
+
const [page, setPage] = (0, import_react56.useState)(0);
|
|
18202
18434
|
const pages = Math.max(1, Math.ceil(rows.length / pageSize));
|
|
18203
18435
|
const current2 = Math.min(page, pages - 1);
|
|
18204
18436
|
const visible = rows.slice(current2 * pageSize, current2 * pageSize + pageSize);
|
|
18205
|
-
return (0,
|
|
18437
|
+
return (0, import_react56.createElement)(
|
|
18206
18438
|
"div",
|
|
18207
18439
|
{ className: "tdb-table-panel" },
|
|
18208
|
-
(0,
|
|
18440
|
+
(0, import_react56.createElement)(DataTable, {
|
|
18209
18441
|
rows: visible,
|
|
18210
18442
|
columns: costColumns(t, intl),
|
|
18211
18443
|
rowKey: (row) => row.key,
|
|
18212
18444
|
ariaLabel: t("cost.title")
|
|
18213
18445
|
}),
|
|
18214
|
-
pages > 1 ? (0,
|
|
18446
|
+
pages > 1 ? (0, import_react56.createElement)(Pager, {
|
|
18215
18447
|
page: current2 + 1,
|
|
18216
18448
|
pages,
|
|
18217
18449
|
onChange: (next) => setPage(next - 1),
|
|
@@ -18225,15 +18457,15 @@ window.__ModuleLoader__.load({
|
|
|
18225
18457
|
{
|
|
18226
18458
|
key: "model",
|
|
18227
18459
|
header: t("models.model"),
|
|
18228
|
-
render: (row) => (0,
|
|
18460
|
+
render: (row) => (0, import_react56.createElement)(
|
|
18229
18461
|
"div",
|
|
18230
18462
|
{},
|
|
18231
|
-
(0,
|
|
18463
|
+
(0, import_react56.createElement)(
|
|
18232
18464
|
"div",
|
|
18233
18465
|
{ className: `tdb-model-name${row.model === "" ? " tdb-model-unknown" : ""}` },
|
|
18234
18466
|
row.model === "" ? t("models.unknown") : row.model
|
|
18235
18467
|
),
|
|
18236
|
-
(0,
|
|
18468
|
+
(0, import_react56.createElement)("div", { className: "tdb-model-provider" }, row.provider === "" ? "\u2014" : row.provider)
|
|
18237
18469
|
)
|
|
18238
18470
|
},
|
|
18239
18471
|
{
|
|
@@ -18248,7 +18480,7 @@ window.__ModuleLoader__.load({
|
|
|
18248
18480
|
header: t("cost.title"),
|
|
18249
18481
|
headerClassName: "tdb-num",
|
|
18250
18482
|
cellClassName: "tdb-num",
|
|
18251
|
-
render: (row) => row.priced && row.amount !== null && row.currency !== null ? formatAmount(row.amount, row.currency) : (0,
|
|
18483
|
+
render: (row) => row.priced && row.amount !== null && row.currency !== null ? formatAmount(row.amount, row.currency) : (0, import_react56.createElement)("span", { className: "tdb-cost-hint" }, t("cost.notSet"))
|
|
18252
18484
|
}
|
|
18253
18485
|
];
|
|
18254
18486
|
}
|
|
@@ -18267,10 +18499,10 @@ window.__ModuleLoader__.load({
|
|
|
18267
18499
|
}
|
|
18268
18500
|
|
|
18269
18501
|
// src/client/components/DashboardHeader.tsx
|
|
18270
|
-
var
|
|
18502
|
+
var import_react65 = require("react");
|
|
18271
18503
|
|
|
18272
18504
|
// src/client/components/ExportMenu.tsx
|
|
18273
|
-
var
|
|
18505
|
+
var import_react57 = require("react");
|
|
18274
18506
|
|
|
18275
18507
|
// src/client/lib.ts
|
|
18276
18508
|
var NS = "dsh-token-dashboard";
|
|
@@ -18482,8 +18714,8 @@ window.__ModuleLoader__.load({
|
|
|
18482
18714
|
|
|
18483
18715
|
// src/client/components/ExportMenu.tsx
|
|
18484
18716
|
function ExportMenu({ data, t }) {
|
|
18485
|
-
const [open, setOpen] = (0,
|
|
18486
|
-
const anchor = (0,
|
|
18717
|
+
const [open, setOpen] = (0, import_react57.useState)(false);
|
|
18718
|
+
const anchor = (0, import_react57.useRef)(null);
|
|
18487
18719
|
const close = () => setOpen(false);
|
|
18488
18720
|
const stamp = data.today;
|
|
18489
18721
|
const run = (kind) => {
|
|
@@ -18503,38 +18735,38 @@ window.__ModuleLoader__.load({
|
|
|
18503
18735
|
close();
|
|
18504
18736
|
}
|
|
18505
18737
|
};
|
|
18506
|
-
return (0,
|
|
18738
|
+
return (0, import_react57.createElement)(
|
|
18507
18739
|
"div",
|
|
18508
18740
|
{ className: "tdb-menu-anchor", ref: anchor },
|
|
18509
|
-
(0,
|
|
18741
|
+
(0, import_react57.createElement)(Button3, {
|
|
18510
18742
|
onClick: () => setOpen((current2) => !current2),
|
|
18511
18743
|
"aria-haspopup": "menu",
|
|
18512
18744
|
"aria-expanded": open
|
|
18513
|
-
}, (0,
|
|
18514
|
-
(0,
|
|
18745
|
+
}, (0, import_react57.createElement)(DownloadIcon, { size: 14 }), t("actions.export")),
|
|
18746
|
+
(0, import_react57.createElement)(
|
|
18515
18747
|
Menu,
|
|
18516
18748
|
{ open, onClose: close, triggerRef: anchor },
|
|
18517
|
-
(0,
|
|
18518
|
-
(0,
|
|
18519
|
-
(0,
|
|
18749
|
+
(0, import_react57.createElement)(MenuItem, { onClick: () => run("summary"), title: t("export.summary") }),
|
|
18750
|
+
(0, import_react57.createElement)(MenuItem, { onClick: () => run("sessions"), title: t("export.sessions") }),
|
|
18751
|
+
(0, import_react57.createElement)(MenuItem, { onClick: () => run("json"), title: t("export.json") })
|
|
18520
18752
|
)
|
|
18521
18753
|
);
|
|
18522
18754
|
}
|
|
18523
18755
|
|
|
18524
18756
|
// src/client/components/ui/Select.tsx
|
|
18525
|
-
var
|
|
18757
|
+
var import_react64 = require("react");
|
|
18526
18758
|
|
|
18527
18759
|
// src/client/beui/components/motion/select.tsx
|
|
18528
|
-
var
|
|
18529
|
-
var
|
|
18760
|
+
var import_react61 = require("react");
|
|
18761
|
+
var import_react63 = require("react");
|
|
18530
18762
|
|
|
18531
18763
|
// src/client/beui/lib/hooks/use-listbox.ts
|
|
18532
|
-
var
|
|
18764
|
+
var import_react60 = require("react");
|
|
18533
18765
|
|
|
18534
18766
|
// src/client/beui/lib/hooks/use-on-open.ts
|
|
18535
|
-
var
|
|
18767
|
+
var import_react58 = require("react");
|
|
18536
18768
|
function useOnOpen(open, start) {
|
|
18537
|
-
const [wasOpen, setWasOpen] = (0,
|
|
18769
|
+
const [wasOpen, setWasOpen] = (0, import_react58.useState)(open);
|
|
18538
18770
|
if (open !== wasOpen) {
|
|
18539
18771
|
setWasOpen(open);
|
|
18540
18772
|
if (open) start();
|
|
@@ -18542,24 +18774,24 @@ window.__ModuleLoader__.load({
|
|
|
18542
18774
|
}
|
|
18543
18775
|
|
|
18544
18776
|
// src/client/beui/lib/hooks/use-row-cursor.ts
|
|
18545
|
-
var
|
|
18777
|
+
var import_react59 = require("react");
|
|
18546
18778
|
function indexOfCursor(rows, query, cursor) {
|
|
18547
18779
|
if (cursor === null || cursor.query !== query) return -1;
|
|
18548
18780
|
return rows.findIndex((row) => row.id === cursor.id);
|
|
18549
18781
|
}
|
|
18550
18782
|
function useRowCursor(rows, query) {
|
|
18551
|
-
const [cursor, setCursor] = (0,
|
|
18552
|
-
const latest = (0,
|
|
18553
|
-
(0,
|
|
18783
|
+
const [cursor, setCursor] = (0, import_react59.useState)(null);
|
|
18784
|
+
const latest = (0, import_react59.useRef)({ rows, query });
|
|
18785
|
+
(0, import_react59.useLayoutEffect)(() => {
|
|
18554
18786
|
latest.current = { rows, query };
|
|
18555
18787
|
});
|
|
18556
18788
|
const cursorRow = indexOfCursor(rows, query, cursor);
|
|
18557
18789
|
if (cursor !== null && cursorRow < 0) setCursor(null);
|
|
18558
|
-
const moveTo = (0,
|
|
18790
|
+
const moveTo = (0, import_react59.useCallback)(
|
|
18559
18791
|
(id3) => setCursor(id3 === null ? null : { id: id3, query: latest.current.query }),
|
|
18560
18792
|
[]
|
|
18561
18793
|
);
|
|
18562
|
-
const moveActive = (0,
|
|
18794
|
+
const moveActive = (0, import_react59.useCallback)((direction) => {
|
|
18563
18795
|
const { rows: live, query: liveQuery } = latest.current;
|
|
18564
18796
|
const last = live.length - 1;
|
|
18565
18797
|
if (last < 0) return;
|
|
@@ -18580,19 +18812,19 @@ window.__ModuleLoader__.load({
|
|
|
18580
18812
|
selected,
|
|
18581
18813
|
list
|
|
18582
18814
|
}) {
|
|
18583
|
-
const enabled = (0,
|
|
18815
|
+
const enabled = (0, import_react60.useMemo)(() => rows.filter((row) => !row.disabled), [rows]);
|
|
18584
18816
|
const { activeIndex, moveTo, moveActive } = useRowCursor(enabled, "");
|
|
18585
18817
|
useOnOpen(
|
|
18586
18818
|
open,
|
|
18587
18819
|
() => moveTo(enabled.some((row) => row.id === selected) ? selected ?? null : null)
|
|
18588
18820
|
);
|
|
18589
18821
|
const activeId = enabled[activeIndex]?.id;
|
|
18590
|
-
const typed = (0,
|
|
18591
|
-
const openedOnMount = (0,
|
|
18592
|
-
(0,
|
|
18822
|
+
const typed = (0, import_react60.useRef)({ text: "", at: 0 });
|
|
18823
|
+
const openedOnMount = (0, import_react60.useRef)(open);
|
|
18824
|
+
(0, import_react60.useEffect)(() => {
|
|
18593
18825
|
if (!open) openedOnMount.current = false;
|
|
18594
18826
|
}, [open]);
|
|
18595
|
-
(0,
|
|
18827
|
+
(0, import_react60.useEffect)(() => {
|
|
18596
18828
|
if (!open || activeId === void 0) return;
|
|
18597
18829
|
if (openedOnMount.current && !list.current?.contains(document.activeElement))
|
|
18598
18830
|
return;
|
|
@@ -18645,10 +18877,10 @@ window.__ModuleLoader__.load({
|
|
|
18645
18877
|
hidden: { opacity: 0, y: -4, transition: { duration: 0.08, ease: EASE_OUT } },
|
|
18646
18878
|
show: { opacity: 1, y: 0, transition: { duration: 0.12, ease: EASE_OUT } }
|
|
18647
18879
|
};
|
|
18648
|
-
var SelectContext = (0,
|
|
18649
|
-
var ActiveOptionContext = (0,
|
|
18880
|
+
var SelectContext = (0, import_react63.createContext)(null);
|
|
18881
|
+
var ActiveOptionContext = (0, import_react63.createContext)(void 0);
|
|
18650
18882
|
function useSelectContext(component) {
|
|
18651
|
-
const ctx = (0,
|
|
18883
|
+
const ctx = (0, import_react63.useContext)(SelectContext);
|
|
18652
18884
|
if (!ctx) throw new Error(`${component} must be used within <Select>`);
|
|
18653
18885
|
return ctx;
|
|
18654
18886
|
}
|
|
@@ -18664,31 +18896,31 @@ window.__ModuleLoader__.load({
|
|
|
18664
18896
|
children
|
|
18665
18897
|
}) {
|
|
18666
18898
|
const reduce = useReducedMotion() ?? false;
|
|
18667
|
-
const baseId = (0,
|
|
18668
|
-
const rootRef = (0,
|
|
18669
|
-
const [internalOpen, setInternalOpen] = (0,
|
|
18670
|
-
const [internal, setInternal] = (0,
|
|
18671
|
-
const [labels, setLabels] = (0,
|
|
18672
|
-
const [placement, setPlacement] = (0,
|
|
18899
|
+
const baseId = (0, import_react63.useId)();
|
|
18900
|
+
const rootRef = (0, import_react63.useRef)(null);
|
|
18901
|
+
const [internalOpen, setInternalOpen] = (0, import_react63.useState)(defaultOpen);
|
|
18902
|
+
const [internal, setInternal] = (0, import_react63.useState)(defaultValue);
|
|
18903
|
+
const [labels, setLabels] = (0, import_react63.useState)(/* @__PURE__ */ new Map());
|
|
18904
|
+
const [placement, setPlacement] = (0, import_react63.useState)("bottom");
|
|
18673
18905
|
const controlled = value !== void 0;
|
|
18674
18906
|
const current2 = controlled ? value : internal;
|
|
18675
18907
|
const openControlled = openProp !== void 0;
|
|
18676
18908
|
const open = openControlled ? openProp : internalOpen;
|
|
18677
18909
|
const progress2 = useMotionValue(open ? 1 : 0);
|
|
18678
|
-
const setOpen = (0,
|
|
18910
|
+
const setOpen = (0, import_react63.useCallback)(
|
|
18679
18911
|
(next) => {
|
|
18680
18912
|
if (!openControlled) setInternalOpen(next);
|
|
18681
18913
|
onOpenChange?.(next);
|
|
18682
18914
|
},
|
|
18683
18915
|
[onOpenChange, openControlled]
|
|
18684
18916
|
);
|
|
18685
|
-
const close = (0,
|
|
18917
|
+
const close = (0, import_react63.useCallback)(() => {
|
|
18686
18918
|
const trigger = document.getElementById(`${baseId}-trigger`);
|
|
18687
18919
|
if (rootRef.current?.contains(document.activeElement) && document.activeElement !== trigger)
|
|
18688
18920
|
trigger?.focus();
|
|
18689
18921
|
setOpen(false);
|
|
18690
18922
|
}, [baseId, setOpen]);
|
|
18691
|
-
const select = (0,
|
|
18923
|
+
const select = (0, import_react63.useCallback)(
|
|
18692
18924
|
(next) => {
|
|
18693
18925
|
if (!controlled) setInternal(next);
|
|
18694
18926
|
onValueChange?.(next);
|
|
@@ -18696,14 +18928,14 @@ window.__ModuleLoader__.load({
|
|
|
18696
18928
|
},
|
|
18697
18929
|
[controlled, onValueChange, close]
|
|
18698
18930
|
);
|
|
18699
|
-
const register = (0,
|
|
18931
|
+
const register = (0, import_react63.useCallback)((v, label2, disabled2) => {
|
|
18700
18932
|
setLabels((m2) => {
|
|
18701
18933
|
const entry = m2.get(v);
|
|
18702
18934
|
if (entry?.label === label2 && entry.disabled === disabled2) return m2;
|
|
18703
18935
|
return new Map(m2).set(v, { label: label2, disabled: disabled2 });
|
|
18704
18936
|
});
|
|
18705
18937
|
}, []);
|
|
18706
|
-
const unregister = (0,
|
|
18938
|
+
const unregister = (0, import_react63.useCallback)((v) => {
|
|
18707
18939
|
setLabels((m2) => {
|
|
18708
18940
|
if (!m2.has(v)) return m2;
|
|
18709
18941
|
const next = new Map(m2);
|
|
@@ -18711,7 +18943,7 @@ window.__ModuleLoader__.load({
|
|
|
18711
18943
|
return next;
|
|
18712
18944
|
});
|
|
18713
18945
|
}, []);
|
|
18714
|
-
(0,
|
|
18946
|
+
(0, import_react63.useEffect)(() => {
|
|
18715
18947
|
const animation = animate(
|
|
18716
18948
|
progress2,
|
|
18717
18949
|
open ? 1 : 0,
|
|
@@ -18719,7 +18951,7 @@ window.__ModuleLoader__.load({
|
|
|
18719
18951
|
);
|
|
18720
18952
|
return () => animation.stop();
|
|
18721
18953
|
}, [open, progress2, reduce]);
|
|
18722
|
-
(0,
|
|
18954
|
+
(0, import_react63.useEffect)(() => {
|
|
18723
18955
|
if (!open) return;
|
|
18724
18956
|
const onKey = (e) => e.key === "Escape" && close();
|
|
18725
18957
|
const onPointer = (e) => {
|
|
@@ -18733,7 +18965,7 @@ window.__ModuleLoader__.load({
|
|
|
18733
18965
|
window.removeEventListener("pointerdown", onPointer);
|
|
18734
18966
|
};
|
|
18735
18967
|
}, [open, setOpen, close]);
|
|
18736
|
-
const rows = (0,
|
|
18968
|
+
const rows = (0, import_react63.useMemo)(
|
|
18737
18969
|
() => Array.from(labels, ([id3, entry]) => ({
|
|
18738
18970
|
id: id3,
|
|
18739
18971
|
label: entry.label,
|
|
@@ -18741,7 +18973,7 @@ window.__ModuleLoader__.load({
|
|
|
18741
18973
|
})),
|
|
18742
18974
|
[labels]
|
|
18743
18975
|
);
|
|
18744
|
-
const ctx = (0,
|
|
18976
|
+
const ctx = (0, import_react63.useMemo)(
|
|
18745
18977
|
() => ({
|
|
18746
18978
|
value: current2,
|
|
18747
18979
|
open,
|
|
@@ -18777,7 +19009,7 @@ window.__ModuleLoader__.load({
|
|
|
18777
19009
|
placement
|
|
18778
19010
|
]
|
|
18779
19011
|
);
|
|
18780
|
-
return /* @__PURE__ */ (0,
|
|
19012
|
+
return /* @__PURE__ */ (0, import_react61.createElement)(SelectContext.Provider, { value: ctx }, /* @__PURE__ */ (0, import_react61.createElement)("div", { ref: rootRef, className: cn("relative", className) }, children));
|
|
18781
19013
|
}
|
|
18782
19014
|
function SelectTrigger({ className, ariaLabel, children }) {
|
|
18783
19015
|
const ctx = useSelectContext("SelectTrigger");
|
|
@@ -18791,7 +19023,7 @@ window.__ModuleLoader__.load({
|
|
|
18791
19023
|
ctx.progress,
|
|
18792
19024
|
(p) => ctx.reduce ? ctx.open ? 180 : 0 : Math.min(1, Math.max(0, p)) * 180
|
|
18793
19025
|
);
|
|
18794
|
-
return /* @__PURE__ */ (0,
|
|
19026
|
+
return /* @__PURE__ */ (0, import_react61.createElement)(
|
|
18795
19027
|
motion2.button,
|
|
18796
19028
|
{
|
|
18797
19029
|
type: "button",
|
|
@@ -18822,21 +19054,21 @@ window.__ModuleLoader__.load({
|
|
|
18822
19054
|
)
|
|
18823
19055
|
},
|
|
18824
19056
|
children,
|
|
18825
|
-
/* @__PURE__ */ (0,
|
|
19057
|
+
/* @__PURE__ */ (0, import_react61.createElement)(
|
|
18826
19058
|
motion2.span,
|
|
18827
19059
|
{
|
|
18828
19060
|
"aria-hidden": true,
|
|
18829
19061
|
style: { rotate: rotate2 },
|
|
18830
19062
|
className: "text-muted-foreground"
|
|
18831
19063
|
},
|
|
18832
|
-
/* @__PURE__ */ (0,
|
|
19064
|
+
/* @__PURE__ */ (0, import_react61.createElement)(ChevronDown, { className: "h-4 w-4" })
|
|
18833
19065
|
)
|
|
18834
19066
|
);
|
|
18835
19067
|
}
|
|
18836
19068
|
function SelectValue({ placeholder, className }) {
|
|
18837
19069
|
const ctx = useSelectContext("SelectValue");
|
|
18838
19070
|
const label2 = ctx.labelFor(ctx.value);
|
|
18839
|
-
return /* @__PURE__ */ (0,
|
|
19071
|
+
return /* @__PURE__ */ (0, import_react61.createElement)(
|
|
18840
19072
|
"span",
|
|
18841
19073
|
{
|
|
18842
19074
|
className: cn(label2 ? "text-foreground" : "text-muted-foreground", className)
|
|
@@ -18846,8 +19078,8 @@ window.__ModuleLoader__.load({
|
|
|
18846
19078
|
}
|
|
18847
19079
|
function SelectContent({ className, children }) {
|
|
18848
19080
|
const ctx = useSelectContext("SelectContent");
|
|
18849
|
-
const panelRef = (0,
|
|
18850
|
-
const [height, setHeight] = (0,
|
|
19081
|
+
const panelRef = (0, import_react63.useRef)(null);
|
|
19082
|
+
const [height, setHeight] = (0, import_react63.useState)(0);
|
|
18851
19083
|
const { open, progress: progress2, reduce, setPlacement } = ctx;
|
|
18852
19084
|
const { activeId, onKeyDown } = useListbox({
|
|
18853
19085
|
open,
|
|
@@ -18855,8 +19087,8 @@ window.__ModuleLoader__.load({
|
|
|
18855
19087
|
selected: ctx.value,
|
|
18856
19088
|
list: panelRef
|
|
18857
19089
|
});
|
|
18858
|
-
const [exiting, setExiting] = (0,
|
|
18859
|
-
const [wasOpen, setWasOpen] = (0,
|
|
19090
|
+
const [exiting, setExiting] = (0, import_react63.useState)(false);
|
|
19091
|
+
const [wasOpen, setWasOpen] = (0, import_react63.useState)(open);
|
|
18860
19092
|
if (open !== wasOpen) {
|
|
18861
19093
|
setWasOpen(open);
|
|
18862
19094
|
if (!open) setExiting(true);
|
|
@@ -18865,7 +19097,7 @@ window.__ModuleLoader__.load({
|
|
|
18865
19097
|
useMotionValueEvent(progress2, "animationComplete", () => {
|
|
18866
19098
|
if (progress2.get() === 0) setExiting(false);
|
|
18867
19099
|
});
|
|
18868
|
-
(0,
|
|
19100
|
+
(0, import_react63.useLayoutEffect)(() => {
|
|
18869
19101
|
const node = panelRef.current;
|
|
18870
19102
|
if (!node || !present) return;
|
|
18871
19103
|
const measure = () => setHeight(node.offsetHeight);
|
|
@@ -18874,7 +19106,7 @@ window.__ModuleLoader__.load({
|
|
|
18874
19106
|
observer2.observe(node);
|
|
18875
19107
|
return () => observer2.disconnect();
|
|
18876
19108
|
}, [present]);
|
|
18877
|
-
(0,
|
|
19109
|
+
(0, import_react63.useLayoutEffect)(() => {
|
|
18878
19110
|
if (!open) return;
|
|
18879
19111
|
const trigger = document.getElementById(ctx.triggerId);
|
|
18880
19112
|
const node = panelRef.current;
|
|
@@ -18905,7 +19137,7 @@ window.__ModuleLoader__.load({
|
|
|
18905
19137
|
return `inset(${inset} round ${corners})`;
|
|
18906
19138
|
});
|
|
18907
19139
|
const opacity = useTransform(progress2, reduce ? [0, 1] : [0, 0.12], [0, 1]);
|
|
18908
|
-
return /* @__PURE__ */ (0,
|
|
19140
|
+
return /* @__PURE__ */ (0, import_react61.createElement)(
|
|
18909
19141
|
motion2.div,
|
|
18910
19142
|
{
|
|
18911
19143
|
ref: panelRef,
|
|
@@ -18936,7 +19168,7 @@ window.__ModuleLoader__.load({
|
|
|
18936
19168
|
className
|
|
18937
19169
|
)
|
|
18938
19170
|
},
|
|
18939
|
-
/* @__PURE__ */ (0,
|
|
19171
|
+
/* @__PURE__ */ (0, import_react61.createElement)(ActiveOptionContext.Provider, { value: activeId }, /* @__PURE__ */ (0, import_react61.createElement)(
|
|
18940
19172
|
motion2.div,
|
|
18941
19173
|
{
|
|
18942
19174
|
initial: false,
|
|
@@ -18954,14 +19186,14 @@ window.__ModuleLoader__.load({
|
|
|
18954
19186
|
children
|
|
18955
19187
|
}) {
|
|
18956
19188
|
const ctx = useSelectContext("SelectItem");
|
|
18957
|
-
const activeId = (0,
|
|
19189
|
+
const activeId = (0, import_react63.useContext)(ActiveOptionContext);
|
|
18958
19190
|
const selected = ctx.value === value;
|
|
18959
19191
|
const label2 = typeof children === "string" ? children : value;
|
|
18960
|
-
(0,
|
|
19192
|
+
(0, import_react63.useLayoutEffect)(() => {
|
|
18961
19193
|
ctx.register(value, label2, disabled);
|
|
18962
19194
|
}, [ctx.register, value, label2, disabled]);
|
|
18963
|
-
(0,
|
|
18964
|
-
return /* @__PURE__ */ (0,
|
|
19195
|
+
(0, import_react63.useLayoutEffect)(() => () => ctx.unregister(value), [ctx.unregister, value]);
|
|
19196
|
+
return /* @__PURE__ */ (0, import_react61.createElement)(motion2.div, { variants: ctx.reduce ? void 0 : ITEM_VARIANTS }, /* @__PURE__ */ (0, import_react61.createElement)(
|
|
18965
19197
|
"button",
|
|
18966
19198
|
{
|
|
18967
19199
|
type: "button",
|
|
@@ -18979,30 +19211,30 @@ window.__ModuleLoader__.load({
|
|
|
18979
19211
|
)
|
|
18980
19212
|
},
|
|
18981
19213
|
children,
|
|
18982
|
-
selected ? /* @__PURE__ */ (0,
|
|
19214
|
+
selected ? /* @__PURE__ */ (0, import_react61.createElement)(Check, { className: "h-3.5 w-3.5 shrink-0" }) : null
|
|
18983
19215
|
));
|
|
18984
19216
|
}
|
|
18985
19217
|
|
|
18986
19218
|
// src/client/components/ui/Select.tsx
|
|
18987
19219
|
function Select2({ value, options, onChange, ariaLabel, className = "" }) {
|
|
18988
19220
|
const selected = options.find((option) => option.value === value) ?? options[0];
|
|
18989
|
-
return (0,
|
|
19221
|
+
return (0, import_react64.createElement)(Select, {
|
|
18990
19222
|
value,
|
|
18991
19223
|
onValueChange: onChange,
|
|
18992
19224
|
className: `tdb-select-wrap ${className}`.trim(),
|
|
18993
19225
|
children: [
|
|
18994
|
-
(0,
|
|
19226
|
+
(0, import_react64.createElement)(SelectTrigger, {
|
|
18995
19227
|
key: "trigger",
|
|
18996
19228
|
className: "tdb-select-trigger",
|
|
18997
19229
|
ariaLabel,
|
|
18998
|
-
children: (0,
|
|
19230
|
+
children: (0, import_react64.createElement)(SelectValue, {
|
|
18999
19231
|
placeholder: selected?.label ?? value
|
|
19000
19232
|
})
|
|
19001
19233
|
}),
|
|
19002
|
-
(0,
|
|
19234
|
+
(0, import_react64.createElement)(SelectContent, {
|
|
19003
19235
|
key: "content",
|
|
19004
19236
|
className: "tdb-select-menu",
|
|
19005
|
-
children: options.map((option) => (0,
|
|
19237
|
+
children: options.map((option) => (0, import_react64.createElement)(SelectItem, {
|
|
19006
19238
|
key: option.value,
|
|
19007
19239
|
value: option.value,
|
|
19008
19240
|
className: "tdb-select-option",
|
|
@@ -19050,33 +19282,33 @@ window.__ModuleLoader__.load({
|
|
|
19050
19282
|
scanInterval,
|
|
19051
19283
|
onScanIntervalChange
|
|
19052
19284
|
}) {
|
|
19053
|
-
return (0,
|
|
19285
|
+
return (0, import_react65.createElement)(
|
|
19054
19286
|
"header",
|
|
19055
19287
|
{ className: "tdb-head" },
|
|
19056
|
-
(0,
|
|
19057
|
-
(0,
|
|
19288
|
+
(0, import_react65.createElement)("h1", { className: "tdb-title" }, t("panel.title")),
|
|
19289
|
+
(0, import_react65.createElement)(
|
|
19058
19290
|
"div",
|
|
19059
19291
|
{ className: "tdb-actions" },
|
|
19060
|
-
(0,
|
|
19292
|
+
(0, import_react65.createElement)(
|
|
19061
19293
|
"div",
|
|
19062
19294
|
{ className: "tdb-lang-switch", role: "group", "aria-label": t("language.switch") },
|
|
19063
|
-
(0,
|
|
19295
|
+
(0, import_react65.createElement)("button", {
|
|
19064
19296
|
type: "button",
|
|
19065
19297
|
className: "tdb-lang-choice",
|
|
19066
19298
|
"aria-pressed": language === "zh",
|
|
19067
19299
|
onClick: () => onChangeLanguage("zh")
|
|
19068
19300
|
}, "\u4E2D\u6587"),
|
|
19069
|
-
(0,
|
|
19301
|
+
(0, import_react65.createElement)("button", {
|
|
19070
19302
|
type: "button",
|
|
19071
19303
|
className: "tdb-lang-choice",
|
|
19072
19304
|
"aria-pressed": language === "en",
|
|
19073
19305
|
onClick: () => onChangeLanguage("en")
|
|
19074
19306
|
}, "EN")
|
|
19075
19307
|
),
|
|
19076
|
-
(0,
|
|
19308
|
+
(0, import_react65.createElement)(
|
|
19077
19309
|
"div",
|
|
19078
19310
|
{ className: "tdb-scan-top" },
|
|
19079
|
-
(0,
|
|
19311
|
+
(0, import_react65.createElement)(Select2, {
|
|
19080
19312
|
value: scanInterval,
|
|
19081
19313
|
options: SCAN_INTERVALS.map((value) => ({ value, label: t(`scan.${value}`) })),
|
|
19082
19314
|
onChange: (value) => onScanIntervalChange(value),
|
|
@@ -19084,7 +19316,7 @@ window.__ModuleLoader__.load({
|
|
|
19084
19316
|
className: "tdb-scan-top-select"
|
|
19085
19317
|
})
|
|
19086
19318
|
),
|
|
19087
|
-
(0,
|
|
19319
|
+
(0, import_react65.createElement)(
|
|
19088
19320
|
Button3,
|
|
19089
19321
|
{
|
|
19090
19322
|
variant: "ghost",
|
|
@@ -19093,19 +19325,19 @@ window.__ModuleLoader__.load({
|
|
|
19093
19325
|
"aria-label": t("actions.syncNow"),
|
|
19094
19326
|
title: t("actions.syncNow")
|
|
19095
19327
|
},
|
|
19096
|
-
(0,
|
|
19097
|
-
(0,
|
|
19328
|
+
(0, import_react65.createElement)("span", { className: refreshing ? "tdb-spin" : "" }, (0, import_react65.createElement)(RefreshIcon, { size: 15 })),
|
|
19329
|
+
(0, import_react65.createElement)("span", { className: "tdb-sync-now-label" }, t("actions.syncNow"))
|
|
19098
19330
|
),
|
|
19099
|
-
showExport && data !== null ? (0,
|
|
19331
|
+
showExport && data !== null ? (0, import_react65.createElement)(ExportMenu, { data, t }) : null
|
|
19100
19332
|
)
|
|
19101
19333
|
);
|
|
19102
19334
|
}
|
|
19103
19335
|
|
|
19104
19336
|
// src/client/components/Models.tsx
|
|
19105
|
-
var
|
|
19337
|
+
var import_react66 = require("react");
|
|
19106
19338
|
function ModelTable({ models, total, t, intl }) {
|
|
19107
19339
|
const pageSize = TABLE_PAGE_SIZE;
|
|
19108
|
-
const [page, setPage] = (0,
|
|
19340
|
+
const [page, setPage] = (0, import_react66.useState)(0);
|
|
19109
19341
|
const pages = Math.max(1, Math.ceil(models.length / pageSize));
|
|
19110
19342
|
const current2 = Math.min(page, pages - 1);
|
|
19111
19343
|
const visible = models.slice(current2 * pageSize, current2 * pageSize + pageSize);
|
|
@@ -19113,15 +19345,15 @@ window.__ModuleLoader__.load({
|
|
|
19113
19345
|
{
|
|
19114
19346
|
key: "model",
|
|
19115
19347
|
header: t("models.model"),
|
|
19116
|
-
render: (model) => (0,
|
|
19348
|
+
render: (model) => (0, import_react66.createElement)(
|
|
19117
19349
|
"div",
|
|
19118
19350
|
{},
|
|
19119
|
-
(0,
|
|
19351
|
+
(0, import_react66.createElement)(
|
|
19120
19352
|
"div",
|
|
19121
19353
|
{ className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
|
|
19122
19354
|
model.model === "" ? t("models.unknown") : model.model
|
|
19123
19355
|
),
|
|
19124
|
-
(0,
|
|
19356
|
+
(0, import_react66.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
|
|
19125
19357
|
)
|
|
19126
19358
|
},
|
|
19127
19359
|
{
|
|
@@ -19166,23 +19398,23 @@ window.__ModuleLoader__.load({
|
|
|
19166
19398
|
cellClassName: "tdb-hide-sm",
|
|
19167
19399
|
render: (model) => {
|
|
19168
19400
|
const share = total <= 0 ? 0 : totalTokens(model) / total;
|
|
19169
|
-
return (0,
|
|
19401
|
+
return (0, import_react66.createElement)(ShareBar, { ratio: share, label: formatPercent(share) });
|
|
19170
19402
|
}
|
|
19171
19403
|
}
|
|
19172
19404
|
];
|
|
19173
|
-
return (0,
|
|
19405
|
+
return (0, import_react66.createElement)(
|
|
19174
19406
|
Section,
|
|
19175
19407
|
{ ariaLabel: t("models.title") },
|
|
19176
|
-
models.length === 0 ? (0,
|
|
19408
|
+
models.length === 0 ? (0, import_react66.createElement)(EmptyState, { icon: (0, import_react66.createElement)(ChartIcon, { size: 20 }), title: t("models.empty") }) : (0, import_react66.createElement)(
|
|
19177
19409
|
"div",
|
|
19178
19410
|
{ className: "tdb-table-panel" },
|
|
19179
|
-
(0,
|
|
19411
|
+
(0, import_react66.createElement)(DataTable, {
|
|
19180
19412
|
rows: visible,
|
|
19181
19413
|
columns,
|
|
19182
19414
|
rowKey: (model) => model.key,
|
|
19183
19415
|
ariaLabel: t("models.title")
|
|
19184
19416
|
}),
|
|
19185
|
-
pages > 1 ? (0,
|
|
19417
|
+
pages > 1 ? (0, import_react66.createElement)(Pager, {
|
|
19186
19418
|
page: current2 + 1,
|
|
19187
19419
|
pages,
|
|
19188
19420
|
onChange: (next) => setPage(next - 1),
|
|
@@ -19193,35 +19425,35 @@ window.__ModuleLoader__.load({
|
|
|
19193
19425
|
);
|
|
19194
19426
|
}
|
|
19195
19427
|
|
|
19196
|
-
// src/client/components/
|
|
19197
|
-
var
|
|
19198
|
-
|
|
19199
|
-
|
|
19200
|
-
const
|
|
19201
|
-
|
|
19202
|
-
|
|
19203
|
-
|
|
19204
|
-
|
|
19205
|
-
|
|
19206
|
-
|
|
19207
|
-
|
|
19208
|
-
|
|
19209
|
-
|
|
19210
|
-
|
|
19211
|
-
|
|
19212
|
-
|
|
19213
|
-
|
|
19214
|
-
|
|
19215
|
-
|
|
19216
|
-
|
|
19217
|
-
|
|
19428
|
+
// src/client/components/PricingPage.tsx
|
|
19429
|
+
var import_react67 = require("react");
|
|
19430
|
+
function seed(models, pricing, defaults) {
|
|
19431
|
+
const next = {};
|
|
19432
|
+
for (const model of models) {
|
|
19433
|
+
const price = pricing[model.key] ?? defaults[model.key];
|
|
19434
|
+
next[model.key] = price === void 0 ? { currency: "USD", input: "", output: "", cacheRead: "", cacheWrite: "" } : {
|
|
19435
|
+
currency: price.currency,
|
|
19436
|
+
input: String(price.input),
|
|
19437
|
+
output: String(price.output),
|
|
19438
|
+
cacheRead: String(price.cacheRead),
|
|
19439
|
+
cacheWrite: String(price.cacheWrite)
|
|
19440
|
+
};
|
|
19441
|
+
}
|
|
19442
|
+
return next;
|
|
19443
|
+
}
|
|
19444
|
+
function PricingPage({ models, pricing, defaults, t, onSave }) {
|
|
19445
|
+
const [draft, setDraft] = (0, import_react67.useState)(() => seed(models, pricing, defaults));
|
|
19446
|
+
const [errors, setErrors] = (0, import_react67.useState)({});
|
|
19447
|
+
const [page, setPage] = (0, import_react67.useState)(0);
|
|
19448
|
+
const signature = (0, import_react67.useMemo)(() => models.map((model) => model.key).join("|"), [models]);
|
|
19449
|
+
(0, import_react67.useEffect)(() => {
|
|
19450
|
+
setDraft(seed(models, pricing, defaults));
|
|
19218
19451
|
setErrors({});
|
|
19219
19452
|
setPage(0);
|
|
19220
|
-
}, [
|
|
19221
|
-
|
|
19222
|
-
const pages = Math.max(1, Math.ceil(models.length / PAGE_SIZE));
|
|
19453
|
+
}, [signature]);
|
|
19454
|
+
const pages = Math.max(1, Math.ceil(models.length / TABLE_PAGE_SIZE));
|
|
19223
19455
|
const current2 = Math.min(page, pages - 1);
|
|
19224
|
-
const visible = models.slice(current2 *
|
|
19456
|
+
const visible = models.slice(current2 * TABLE_PAGE_SIZE, current2 * TABLE_PAGE_SIZE + TABLE_PAGE_SIZE);
|
|
19225
19457
|
const update = (key, field, value) => {
|
|
19226
19458
|
setDraft((current3) => ({
|
|
19227
19459
|
...current3,
|
|
@@ -19232,7 +19464,7 @@ window.__ModuleLoader__.load({
|
|
|
19232
19464
|
}));
|
|
19233
19465
|
};
|
|
19234
19466
|
const save = () => {
|
|
19235
|
-
const next = {};
|
|
19467
|
+
const next = { ...pricing };
|
|
19236
19468
|
const invalid = {};
|
|
19237
19469
|
for (const model of models) {
|
|
19238
19470
|
const row = draft[model.key];
|
|
@@ -19252,112 +19484,95 @@ window.__ModuleLoader__.load({
|
|
|
19252
19484
|
cacheRead: parsed[2] ?? 0,
|
|
19253
19485
|
cacheWrite: parsed[3] ?? 0
|
|
19254
19486
|
};
|
|
19255
|
-
|
|
19487
|
+
const keys = /* @__PURE__ */ new Set([model.key, ...modelKeyCandidates(model.model)]);
|
|
19488
|
+
if (!samePrice(candidate, defaults[model.key])) {
|
|
19489
|
+
for (const key of keys) next[key] = candidate;
|
|
19490
|
+
} else {
|
|
19491
|
+
for (const key of keys) delete next[key];
|
|
19492
|
+
}
|
|
19256
19493
|
}
|
|
19257
19494
|
const firstInvalid = models.findIndex((model) => invalid[model.key] === true);
|
|
19258
19495
|
if (firstInvalid >= 0) {
|
|
19259
19496
|
setErrors(invalid);
|
|
19260
|
-
setPage(Math.floor(firstInvalid /
|
|
19497
|
+
setPage(Math.floor(firstInvalid / TABLE_PAGE_SIZE));
|
|
19261
19498
|
return;
|
|
19262
19499
|
}
|
|
19263
19500
|
onSave(next);
|
|
19264
|
-
|
|
19501
|
+
setErrors({});
|
|
19265
19502
|
};
|
|
19266
19503
|
const clear = () => {
|
|
19267
19504
|
onSave({});
|
|
19268
|
-
|
|
19505
|
+
setDraft(seed(models, {}, defaults));
|
|
19506
|
+
setErrors({});
|
|
19269
19507
|
};
|
|
19270
|
-
const
|
|
19271
|
-
|
|
19272
|
-
{
|
|
19273
|
-
(0,
|
|
19274
|
-
(0, import_react68.createElement)(
|
|
19508
|
+
const body = models.length === 0 ? (0, import_react67.createElement)("div", { className: "tdb-empty" }, t("models.empty")) : (0, import_react67.createElement)(
|
|
19509
|
+
import_react67.Fragment,
|
|
19510
|
+
{},
|
|
19511
|
+
(0, import_react67.createElement)(
|
|
19275
19512
|
"div",
|
|
19276
|
-
{
|
|
19277
|
-
(0,
|
|
19278
|
-
(0, import_react68.createElement)(Button3, { variant: "primary", onClick: save }, t("cost.save"))
|
|
19279
|
-
)
|
|
19280
|
-
);
|
|
19281
|
-
return (0, import_react68.createElement)(
|
|
19282
|
-
Modal,
|
|
19283
|
-
{
|
|
19284
|
-
open: true,
|
|
19285
|
-
title: t("cost.manage"),
|
|
19286
|
-
subtitle: t("cost.perMillion"),
|
|
19287
|
-
onClose,
|
|
19288
|
-
closeLabel: t("common.close"),
|
|
19289
|
-
footer
|
|
19290
|
-
},
|
|
19291
|
-
models.length === 0 ? (0, import_react68.createElement)("div", { className: "tdb-empty" }, t("models.empty")) : (0, import_react68.createElement)(
|
|
19292
|
-
import_react68.Fragment,
|
|
19293
|
-
{},
|
|
19294
|
-
(0, import_react68.createElement)("div", { key: "hint", className: "tdb-pricing-note" }, t("cost.pricingHint")),
|
|
19295
|
-
(0, import_react68.createElement)(
|
|
19513
|
+
{ className: "tdb-pricing-wrap" },
|
|
19514
|
+
(0, import_react67.createElement)(
|
|
19296
19515
|
"div",
|
|
19297
|
-
{
|
|
19298
|
-
(0,
|
|
19299
|
-
|
|
19300
|
-
|
|
19301
|
-
|
|
19302
|
-
|
|
19303
|
-
|
|
19304
|
-
|
|
19305
|
-
|
|
19306
|
-
|
|
19307
|
-
|
|
19308
|
-
|
|
19309
|
-
|
|
19310
|
-
|
|
19311
|
-
(0,
|
|
19516
|
+
{ className: "tdb-pricing-grid" },
|
|
19517
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("models.model")),
|
|
19518
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("cost.currency")),
|
|
19519
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("cost.input")),
|
|
19520
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("cost.output")),
|
|
19521
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-head tdb-pricing-head--extra" }, t("cost.cacheRead")),
|
|
19522
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-head tdb-pricing-head--extra" }, t("cost.cacheWrite")),
|
|
19523
|
+
visible.map((model) => {
|
|
19524
|
+
const row = draft[model.key] ?? { currency: "USD", input: "", output: "", cacheRead: "", cacheWrite: "" };
|
|
19525
|
+
const invalid = errors[model.key] === true;
|
|
19526
|
+
return [
|
|
19527
|
+
(0, import_react67.createElement)(
|
|
19528
|
+
"div",
|
|
19529
|
+
{ key: `${model.key}:name`, className: "tdb-pricing-model" },
|
|
19530
|
+
(0, import_react67.createElement)(
|
|
19312
19531
|
"div",
|
|
19313
|
-
{
|
|
19314
|
-
(
|
|
19315
|
-
"div",
|
|
19316
|
-
{ className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
|
|
19317
|
-
model.model === "" ? t("models.unknown") : model.model
|
|
19318
|
-
),
|
|
19319
|
-
(0, import_react68.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
|
|
19532
|
+
{ className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
|
|
19533
|
+
model.model === "" ? t("models.unknown") : model.model
|
|
19320
19534
|
),
|
|
19321
|
-
(0,
|
|
19322
|
-
|
|
19323
|
-
|
|
19324
|
-
|
|
19325
|
-
|
|
19326
|
-
|
|
19327
|
-
|
|
19328
|
-
}
|
|
19329
|
-
|
|
19330
|
-
|
|
19331
|
-
|
|
19332
|
-
|
|
19333
|
-
|
|
19334
|
-
|
|
19335
|
-
|
|
19336
|
-
|
|
19337
|
-
|
|
19338
|
-
|
|
19535
|
+
(0, import_react67.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
|
|
19536
|
+
),
|
|
19537
|
+
(0, import_react67.createElement)(Select2, {
|
|
19538
|
+
key: `${model.key}:currency`,
|
|
19539
|
+
value: row.currency,
|
|
19540
|
+
options: currencyOptions(row.currency),
|
|
19541
|
+
className: "tdb-pricing-currency",
|
|
19542
|
+
ariaLabel: `${t("cost.currency")} ${model.model}`,
|
|
19543
|
+
onChange: (value) => update(model.key, "currency", value)
|
|
19544
|
+
}),
|
|
19545
|
+
rateInput(model.key, "input", row.input, t("cost.input"), invalid, (value) => update(model.key, "input", value)),
|
|
19546
|
+
rateInput(model.key, "output", row.output, t("cost.output"), invalid, (value) => update(model.key, "output", value)),
|
|
19547
|
+
rateInput(model.key, "cacheRead", row.cacheRead, t("cost.cacheRead"), invalid, (value) => update(model.key, "cacheRead", value), true),
|
|
19548
|
+
rateInput(model.key, "cacheWrite", row.cacheWrite, t("cost.cacheWrite"), invalid, (value) => update(model.key, "cacheWrite", value), true),
|
|
19549
|
+
invalid ? (0, import_react67.createElement)("div", { key: `${model.key}:error`, className: "tdb-error-text", style: { gridColumn: "1 / -1" } }, t("cost.invalid")) : null
|
|
19550
|
+
];
|
|
19551
|
+
})
|
|
19552
|
+
)
|
|
19553
|
+
),
|
|
19554
|
+
pages > 1 ? (0, import_react67.createElement)(Pager, {
|
|
19555
|
+
page: current2 + 1,
|
|
19556
|
+
pages,
|
|
19557
|
+
onChange: (next) => setPage(next - 1),
|
|
19558
|
+
label: t("sessions.page", { page: current2 + 1, pages }),
|
|
19559
|
+
ariaLabel: t("tabs.pricing")
|
|
19560
|
+
}) : null
|
|
19561
|
+
);
|
|
19562
|
+
return (0, import_react67.createElement)(
|
|
19563
|
+
Section,
|
|
19564
|
+
{ ariaLabel: t("tabs.pricing") },
|
|
19565
|
+
(0, import_react67.createElement)(
|
|
19566
|
+
"div",
|
|
19567
|
+
{ className: "tdb-pricing-page" },
|
|
19568
|
+
(0, import_react67.createElement)("div", { className: "tdb-pricing-note" }, t("cost.pricingHint")),
|
|
19569
|
+
body,
|
|
19570
|
+
(0, import_react67.createElement)(
|
|
19339
19571
|
"div",
|
|
19340
|
-
{
|
|
19341
|
-
(0,
|
|
19342
|
-
(0,
|
|
19343
|
-
|
|
19344
|
-
{ className: "tdb-pager-actions" },
|
|
19345
|
-
(0, import_react68.createElement)(Button3, {
|
|
19346
|
-
variant: "ghost",
|
|
19347
|
-
iconOnly: true,
|
|
19348
|
-
disabled: current2 <= 0,
|
|
19349
|
-
"aria-label": t("sessions.previous"),
|
|
19350
|
-
onClick: () => setPage(Math.max(0, current2 - 1))
|
|
19351
|
-
}, (0, import_react68.createElement)(ChevronLeftIcon, { size: 15 })),
|
|
19352
|
-
(0, import_react68.createElement)(Button3, {
|
|
19353
|
-
variant: "ghost",
|
|
19354
|
-
iconOnly: true,
|
|
19355
|
-
disabled: current2 >= pages - 1,
|
|
19356
|
-
"aria-label": t("sessions.next"),
|
|
19357
|
-
onClick: () => setPage(Math.min(pages - 1, current2 + 1))
|
|
19358
|
-
}, (0, import_react68.createElement)(ChevronRightIcon, { size: 15 }))
|
|
19359
|
-
)
|
|
19360
|
-
) : null
|
|
19572
|
+
{ className: "tdb-pricing-actions" },
|
|
19573
|
+
(0, import_react67.createElement)(Button3, { variant: "ghost", onClick: clear }, t("cost.clear")),
|
|
19574
|
+
(0, import_react67.createElement)(Button3, { variant: "primary", onClick: save }, t("cost.save"))
|
|
19575
|
+
)
|
|
19361
19576
|
)
|
|
19362
19577
|
);
|
|
19363
19578
|
}
|
|
@@ -19368,7 +19583,7 @@ window.__ModuleLoader__.load({
|
|
|
19368
19583
|
return [...values].map((value) => ({ value, label: value }));
|
|
19369
19584
|
}
|
|
19370
19585
|
function rateInput(key, field, value, label2, invalid, onChange, extra = false) {
|
|
19371
|
-
return (0,
|
|
19586
|
+
return (0, import_react67.createElement)("input", {
|
|
19372
19587
|
key: `${key}:${field}`,
|
|
19373
19588
|
className: `tdb-input tdb-pricing-input${invalid ? " tdb-pricing-row-error" : ""}${extra ? " tdb-pricing-cell--extra" : ""}`,
|
|
19374
19589
|
type: "text",
|
|
@@ -19381,14 +19596,14 @@ window.__ModuleLoader__.load({
|
|
|
19381
19596
|
}
|
|
19382
19597
|
|
|
19383
19598
|
// src/client/components/SessionDetail.tsx
|
|
19384
|
-
var
|
|
19599
|
+
var import_react73 = require("react");
|
|
19385
19600
|
|
|
19386
19601
|
// src/client/components/ui/Drawer.tsx
|
|
19387
|
-
var
|
|
19602
|
+
var import_react71 = require("react");
|
|
19388
19603
|
|
|
19389
19604
|
// src/client/beui/components/motion/drawer.tsx
|
|
19390
|
-
var
|
|
19391
|
-
var
|
|
19605
|
+
var import_react68 = require("react");
|
|
19606
|
+
var import_react70 = require("react");
|
|
19392
19607
|
function Drawer({
|
|
19393
19608
|
open,
|
|
19394
19609
|
onOpenChange,
|
|
@@ -19400,11 +19615,11 @@ window.__ModuleLoader__.load({
|
|
|
19400
19615
|
dismissable = true
|
|
19401
19616
|
}) {
|
|
19402
19617
|
const reduce = useReducedMotion();
|
|
19403
|
-
const panelRef = (0,
|
|
19618
|
+
const panelRef = (0, import_react70.useRef)(null);
|
|
19404
19619
|
useFocusTrap(open, panelRef, {
|
|
19405
19620
|
onEscape: dismissable ? () => onOpenChange(false) : void 0
|
|
19406
19621
|
});
|
|
19407
|
-
(0,
|
|
19622
|
+
(0, import_react70.useEffect)(() => {
|
|
19408
19623
|
if (!open) return;
|
|
19409
19624
|
const prevOverflow = document.body.style.overflow;
|
|
19410
19625
|
document.body.style.overflow = "hidden";
|
|
@@ -19413,7 +19628,7 @@ window.__ModuleLoader__.load({
|
|
|
19413
19628
|
};
|
|
19414
19629
|
}, [open]);
|
|
19415
19630
|
const offscreen = side === "right" ? "100%" : "-100%";
|
|
19416
|
-
return /* @__PURE__ */ (0,
|
|
19631
|
+
return /* @__PURE__ */ (0, import_react68.createElement)(AnimatePresence, null, open ? /* @__PURE__ */ (0, import_react68.createElement)(PresenceGate, { key: "backdrop" }, ({ gate }) => /* @__PURE__ */ (0, import_react68.createElement)(
|
|
19417
19632
|
motion2.button,
|
|
19418
19633
|
{
|
|
19419
19634
|
type: "button",
|
|
@@ -19430,7 +19645,7 @@ window.__ModuleLoader__.load({
|
|
|
19430
19645
|
backdropClassName
|
|
19431
19646
|
)
|
|
19432
19647
|
}
|
|
19433
|
-
)) : null, open ? /* @__PURE__ */ (0,
|
|
19648
|
+
)) : null, open ? /* @__PURE__ */ (0, import_react68.createElement)(PresenceGate, { key: "panel" }, ({ gate }) => /* @__PURE__ */ (0, import_react68.createElement)(
|
|
19434
19649
|
motion2.div,
|
|
19435
19650
|
{
|
|
19436
19651
|
ref: panelRef,
|
|
@@ -19465,7 +19680,7 @@ window.__ModuleLoader__.load({
|
|
|
19465
19680
|
footer
|
|
19466
19681
|
}) {
|
|
19467
19682
|
if (!open) return null;
|
|
19468
|
-
return (0,
|
|
19683
|
+
return (0, import_react71.createElement)(Drawer, {
|
|
19469
19684
|
open: true,
|
|
19470
19685
|
side: "right",
|
|
19471
19686
|
ariaLabel: typeof title === "string" ? title : closeLabel,
|
|
@@ -19474,46 +19689,46 @@ window.__ModuleLoader__.load({
|
|
|
19474
19689
|
if (!next) onClose();
|
|
19475
19690
|
},
|
|
19476
19691
|
children: [
|
|
19477
|
-
(0,
|
|
19692
|
+
(0, import_react71.createElement)(
|
|
19478
19693
|
"div",
|
|
19479
19694
|
{ key: "head", className: "tdb-drawer-head" },
|
|
19480
|
-
(0,
|
|
19695
|
+
(0, import_react71.createElement)(
|
|
19481
19696
|
"div",
|
|
19482
19697
|
{ style: { minWidth: 0 } },
|
|
19483
|
-
(0,
|
|
19484
|
-
subtitle === void 0 ? null : (0,
|
|
19485
|
-
badges === void 0 ? null : (0,
|
|
19698
|
+
(0, import_react71.createElement)("h2", { className: "tdb-drawer-title" }, title),
|
|
19699
|
+
subtitle === void 0 ? null : (0, import_react71.createElement)("p", { className: "tdb-drawer-sub" }, subtitle),
|
|
19700
|
+
badges === void 0 ? null : (0, import_react71.createElement)("div", { className: "tdb-session-badges" }, badges)
|
|
19486
19701
|
),
|
|
19487
|
-
(0,
|
|
19702
|
+
(0, import_react71.createElement)(Button3, {
|
|
19488
19703
|
variant: "ghost",
|
|
19489
19704
|
iconOnly: true,
|
|
19490
19705
|
"data-autofocus": true,
|
|
19491
19706
|
"aria-label": closeLabel,
|
|
19492
19707
|
onClick: onClose
|
|
19493
|
-
}, (0,
|
|
19708
|
+
}, (0, import_react71.createElement)(CloseIcon, { size: 16 }))
|
|
19494
19709
|
),
|
|
19495
|
-
(0,
|
|
19496
|
-
footer === void 0 ? null : (0,
|
|
19710
|
+
(0, import_react71.createElement)("div", { key: "body", className: "tdb-drawer-body" }, children),
|
|
19711
|
+
footer === void 0 ? null : (0, import_react71.createElement)("div", { key: "footer", className: "tdb-drawer-foot" }, footer)
|
|
19497
19712
|
]
|
|
19498
19713
|
});
|
|
19499
19714
|
}
|
|
19500
19715
|
|
|
19501
19716
|
// src/client/components/ui/Stat.tsx
|
|
19502
|
-
var
|
|
19717
|
+
var import_react72 = require("react");
|
|
19503
19718
|
function Stat({ label: label2, value, total = false }) {
|
|
19504
|
-
return (0,
|
|
19719
|
+
return (0, import_react72.createElement)(
|
|
19505
19720
|
"div",
|
|
19506
19721
|
{ className: `tdb-detail-stat${total ? " tdb-detail-stat--total" : ""}` },
|
|
19507
|
-
(0,
|
|
19508
|
-
(0,
|
|
19722
|
+
(0, import_react72.createElement)("div", { className: "tdb-detail-label" }, label2),
|
|
19723
|
+
(0, import_react72.createElement)("div", { className: "tdb-detail-value" }, value)
|
|
19509
19724
|
);
|
|
19510
19725
|
}
|
|
19511
19726
|
function Field({ label: label2, value }) {
|
|
19512
|
-
return (0,
|
|
19727
|
+
return (0, import_react72.createElement)(
|
|
19513
19728
|
"div",
|
|
19514
19729
|
{ className: "tdb-field" },
|
|
19515
|
-
(0,
|
|
19516
|
-
(0,
|
|
19730
|
+
(0, import_react72.createElement)("div", { className: "tdb-field-label" }, label2),
|
|
19731
|
+
(0, import_react72.createElement)("div", { className: "tdb-field-value" }, value)
|
|
19517
19732
|
);
|
|
19518
19733
|
}
|
|
19519
19734
|
|
|
@@ -19522,46 +19737,46 @@ window.__ModuleLoader__.load({
|
|
|
19522
19737
|
if (session === null) return null;
|
|
19523
19738
|
const title = session.title ?? t("sessions.untitled");
|
|
19524
19739
|
const badges = [
|
|
19525
|
-
session.live ? (0,
|
|
19526
|
-
session.origin === "subagent" ? (0,
|
|
19527
|
-
session.seeded ? (0,
|
|
19528
|
-
session.stale ? (0,
|
|
19740
|
+
session.live ? (0, import_react73.createElement)(Tag, { key: "live", tone: "live" }, t("sessions.live")) : null,
|
|
19741
|
+
session.origin === "subagent" ? (0, import_react73.createElement)(Tag, { key: "sub", tone: "sub" }, t("sessions.subagent")) : null,
|
|
19742
|
+
session.seeded ? (0, import_react73.createElement)(Tag, { key: "fork" }, t("sessions.fork")) : null,
|
|
19743
|
+
session.stale ? (0, import_react73.createElement)(Tag, { key: "stale", tone: "stale" }, t("sessions.stale")) : null
|
|
19529
19744
|
];
|
|
19530
|
-
const models = session.models.length === 0 ? (0,
|
|
19745
|
+
const models = session.models.length === 0 ? (0, import_react73.createElement)("div", { className: "tdb-empty", style: { padding: "20px 0" } }, t("detail.none")) : (0, import_react73.createElement)(
|
|
19531
19746
|
"div",
|
|
19532
19747
|
{ className: "tdb-detail-models" },
|
|
19533
|
-
session.models.map((model) => (0,
|
|
19748
|
+
session.models.map((model) => (0, import_react73.createElement)(
|
|
19534
19749
|
"div",
|
|
19535
19750
|
{ key: model.key, className: "tdb-detail-model" },
|
|
19536
|
-
(0,
|
|
19751
|
+
(0, import_react73.createElement)(
|
|
19537
19752
|
"div",
|
|
19538
19753
|
{ className: "tdb-detail-model-head" },
|
|
19539
|
-
(0,
|
|
19754
|
+
(0, import_react73.createElement)(
|
|
19540
19755
|
"div",
|
|
19541
19756
|
{ style: { minWidth: 0 } },
|
|
19542
|
-
(0,
|
|
19757
|
+
(0, import_react73.createElement)(
|
|
19543
19758
|
"div",
|
|
19544
19759
|
{ className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
|
|
19545
19760
|
model.model === "" ? t("models.unknown") : model.model
|
|
19546
19761
|
),
|
|
19547
|
-
(0,
|
|
19762
|
+
(0, import_react73.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
|
|
19548
19763
|
),
|
|
19549
|
-
(0,
|
|
19764
|
+
(0, import_react73.createElement)("div", { className: "tdb-detail-model-total" }, formatNumber(totalTokens(model), intl))
|
|
19550
19765
|
),
|
|
19551
|
-
(0,
|
|
19766
|
+
(0, import_react73.createElement)(
|
|
19552
19767
|
"div",
|
|
19553
19768
|
{ className: "tdb-detail-model-meta" },
|
|
19554
19769
|
`${t("detail.input")} ${formatCompact(model.uncachedInputTokens, intl)} \xB7 ${t("detail.output")} ${formatCompact(model.outputTokens, intl)} \xB7 ${t("detail.cache")} ${formatCompact(cacheTokens(model), intl)} \xB7 ${formatNumber(model.requests, intl)} ${t("detail.requests").toLowerCase()}`
|
|
19555
19770
|
)
|
|
19556
19771
|
))
|
|
19557
19772
|
);
|
|
19558
|
-
const footer = onOpen === void 0 ? (0,
|
|
19773
|
+
const footer = onOpen === void 0 ? (0, import_react73.createElement)(Button3, { variant: "primary", onClick: onClose }, t("detail.close")) : (0, import_react73.createElement)(
|
|
19559
19774
|
Button3,
|
|
19560
19775
|
{ variant: "primary", onClick: () => onOpen(session.id) },
|
|
19561
|
-
(0,
|
|
19776
|
+
(0, import_react73.createElement)(ArrowRightIcon, { size: 14 }),
|
|
19562
19777
|
t("detail.open")
|
|
19563
19778
|
);
|
|
19564
|
-
return (0,
|
|
19779
|
+
return (0, import_react73.createElement)(
|
|
19565
19780
|
Drawer2,
|
|
19566
19781
|
{
|
|
19567
19782
|
open: true,
|
|
@@ -19571,39 +19786,39 @@ window.__ModuleLoader__.load({
|
|
|
19571
19786
|
onClose,
|
|
19572
19787
|
footer
|
|
19573
19788
|
},
|
|
19574
|
-
(0,
|
|
19789
|
+
(0, import_react73.createElement)(
|
|
19575
19790
|
"div",
|
|
19576
19791
|
{ key: "stats", className: "tdb-detail-stats" },
|
|
19577
|
-
(0,
|
|
19578
|
-
(0,
|
|
19579
|
-
(0,
|
|
19580
|
-
(0,
|
|
19581
|
-
(0,
|
|
19792
|
+
(0, import_react73.createElement)(Stat, { label: t("detail.total"), value: formatNumber(totalTokens(session.totals), intl), total: true }),
|
|
19793
|
+
(0, import_react73.createElement)(Stat, { label: t("detail.input"), value: formatNumber(session.totals.uncachedInputTokens, intl) }),
|
|
19794
|
+
(0, import_react73.createElement)(Stat, { label: t("detail.output"), value: formatNumber(session.totals.outputTokens, intl) }),
|
|
19795
|
+
(0, import_react73.createElement)(Stat, { label: t("detail.cache"), value: formatNumber(cacheTokens(session.totals), intl) }),
|
|
19796
|
+
(0, import_react73.createElement)(Stat, { label: t("detail.requests"), value: formatNumber(session.requests, intl) })
|
|
19582
19797
|
),
|
|
19583
|
-
(0,
|
|
19798
|
+
(0, import_react73.createElement)(
|
|
19584
19799
|
"div",
|
|
19585
19800
|
{ key: "fields", className: "tdb-fields" },
|
|
19586
|
-
(0,
|
|
19587
|
-
(0,
|
|
19588
|
-
(0,
|
|
19589
|
-
(0,
|
|
19801
|
+
(0, import_react73.createElement)(Field, { label: t("detail.created"), value: formatDateTime(session.createdAt, intl) }),
|
|
19802
|
+
(0, import_react73.createElement)(Field, { label: t("detail.last"), value: formatDateTime(session.lastActivity, intl) }),
|
|
19803
|
+
(0, import_react73.createElement)(Field, { label: t("sessions.project"), value: session.project === "" ? "\u2014" : session.project }),
|
|
19804
|
+
(0, import_react73.createElement)(Field, { label: t("detail.hitRate"), value: formatPercent(session.cacheHitRate) })
|
|
19590
19805
|
),
|
|
19591
|
-
(0,
|
|
19806
|
+
(0, import_react73.createElement)(
|
|
19592
19807
|
"div",
|
|
19593
19808
|
{ key: "models" },
|
|
19594
|
-
(0,
|
|
19809
|
+
(0, import_react73.createElement)("h3", { className: "tdb-section-title", style: { marginBottom: "10px" } }, t("detail.models")),
|
|
19595
19810
|
models
|
|
19596
19811
|
)
|
|
19597
19812
|
);
|
|
19598
19813
|
}
|
|
19599
19814
|
|
|
19600
19815
|
// src/client/components/Sessions.tsx
|
|
19601
|
-
var
|
|
19816
|
+
var import_react77 = require("react");
|
|
19602
19817
|
|
|
19603
19818
|
// src/client/beui/components/motion/input.tsx
|
|
19604
|
-
var
|
|
19605
|
-
var
|
|
19606
|
-
var Input = (0,
|
|
19819
|
+
var import_react74 = require("react");
|
|
19820
|
+
var import_react76 = require("react");
|
|
19821
|
+
var Input = (0, import_react76.forwardRef)(function Input2({
|
|
19607
19822
|
label: label2,
|
|
19608
19823
|
value: valueProp,
|
|
19609
19824
|
defaultValue,
|
|
@@ -19622,18 +19837,18 @@ window.__ModuleLoader__.load({
|
|
|
19622
19837
|
type,
|
|
19623
19838
|
...rest
|
|
19624
19839
|
}, ref) {
|
|
19625
|
-
const reactId = (0,
|
|
19840
|
+
const reactId = (0, import_react76.useId)();
|
|
19626
19841
|
const id3 = idProp ?? reactId;
|
|
19627
19842
|
const reduce = useReducedMotion();
|
|
19628
19843
|
const controlled = valueProp !== void 0;
|
|
19629
|
-
const [internal, setInternal] = (0,
|
|
19844
|
+
const [internal, setInternal] = (0, import_react76.useState)(defaultValue ?? "");
|
|
19630
19845
|
const value = controlled ? valueProp ?? "" : internal;
|
|
19631
|
-
const [focused, setFocused] = (0,
|
|
19632
|
-
const fieldRef = (0,
|
|
19846
|
+
const [focused, setFocused] = (0, import_react76.useState)(false);
|
|
19847
|
+
const fieldRef = (0, import_react76.useRef)(null);
|
|
19633
19848
|
const hasError = Boolean(error);
|
|
19634
19849
|
const errorMessage = typeof error === "string" ? error : null;
|
|
19635
19850
|
const rightSlot = success ? null : rightIcon;
|
|
19636
|
-
(0,
|
|
19851
|
+
(0, import_react76.useEffect)(() => {
|
|
19637
19852
|
if (!fieldRef.current || reduce || !hasError) return;
|
|
19638
19853
|
animate(
|
|
19639
19854
|
fieldRef.current,
|
|
@@ -19645,12 +19860,12 @@ window.__ModuleLoader__.load({
|
|
|
19645
19860
|
if (!controlled) setInternal(next);
|
|
19646
19861
|
onChange?.(next);
|
|
19647
19862
|
};
|
|
19648
|
-
return /* @__PURE__ */ (0,
|
|
19863
|
+
return /* @__PURE__ */ (0, import_react74.createElement)(
|
|
19649
19864
|
"div",
|
|
19650
19865
|
{
|
|
19651
19866
|
className: cn("flex flex-col gap-1.5", className, classNames?.root)
|
|
19652
19867
|
},
|
|
19653
|
-
label2 ? /* @__PURE__ */ (0,
|
|
19868
|
+
label2 ? /* @__PURE__ */ (0, import_react74.createElement)(
|
|
19654
19869
|
"label",
|
|
19655
19870
|
{
|
|
19656
19871
|
htmlFor: id3,
|
|
@@ -19661,7 +19876,7 @@ window.__ModuleLoader__.load({
|
|
|
19661
19876
|
},
|
|
19662
19877
|
label2
|
|
19663
19878
|
) : null,
|
|
19664
|
-
/* @__PURE__ */ (0,
|
|
19879
|
+
/* @__PURE__ */ (0, import_react74.createElement)(
|
|
19665
19880
|
"div",
|
|
19666
19881
|
{
|
|
19667
19882
|
ref: fieldRef,
|
|
@@ -19675,7 +19890,7 @@ window.__ModuleLoader__.load({
|
|
|
19675
19890
|
classNames?.field
|
|
19676
19891
|
)
|
|
19677
19892
|
},
|
|
19678
|
-
leftIcon ? /* @__PURE__ */ (0,
|
|
19893
|
+
leftIcon ? /* @__PURE__ */ (0, import_react74.createElement)(
|
|
19679
19894
|
"span",
|
|
19680
19895
|
{
|
|
19681
19896
|
className: cn(
|
|
@@ -19685,7 +19900,7 @@ window.__ModuleLoader__.load({
|
|
|
19685
19900
|
},
|
|
19686
19901
|
leftIcon
|
|
19687
19902
|
) : null,
|
|
19688
|
-
/* @__PURE__ */ (0,
|
|
19903
|
+
/* @__PURE__ */ (0, import_react74.createElement)(
|
|
19689
19904
|
"input",
|
|
19690
19905
|
{
|
|
19691
19906
|
ref,
|
|
@@ -19715,7 +19930,7 @@ window.__ModuleLoader__.load({
|
|
|
19715
19930
|
)
|
|
19716
19931
|
}
|
|
19717
19932
|
),
|
|
19718
|
-
success ? /* @__PURE__ */ (0,
|
|
19933
|
+
success ? /* @__PURE__ */ (0, import_react74.createElement)(
|
|
19719
19934
|
motion2.svg,
|
|
19720
19935
|
{
|
|
19721
19936
|
viewBox: "0 0 24 24",
|
|
@@ -19725,7 +19940,7 @@ window.__ModuleLoader__.load({
|
|
|
19725
19940
|
classNames?.successIcon
|
|
19726
19941
|
)
|
|
19727
19942
|
},
|
|
19728
|
-
/* @__PURE__ */ (0,
|
|
19943
|
+
/* @__PURE__ */ (0, import_react74.createElement)(
|
|
19729
19944
|
motion2.path,
|
|
19730
19945
|
{
|
|
19731
19946
|
d: "M5 12.5l4.5 4.5L19 7.5",
|
|
@@ -19738,7 +19953,7 @@ window.__ModuleLoader__.load({
|
|
|
19738
19953
|
transition: { duration: 0.35, ease: "easeOut" }
|
|
19739
19954
|
}
|
|
19740
19955
|
)
|
|
19741
|
-
) : rightSlot ? /* @__PURE__ */ (0,
|
|
19956
|
+
) : rightSlot ? /* @__PURE__ */ (0, import_react74.createElement)(
|
|
19742
19957
|
"span",
|
|
19743
19958
|
{
|
|
19744
19959
|
className: cn(
|
|
@@ -19749,7 +19964,7 @@ window.__ModuleLoader__.load({
|
|
|
19749
19964
|
rightSlot
|
|
19750
19965
|
) : null
|
|
19751
19966
|
),
|
|
19752
|
-
/* @__PURE__ */ (0,
|
|
19967
|
+
/* @__PURE__ */ (0, import_react74.createElement)("div", { className: reserveErrorLine ? "min-h-4" : "contents" }, /* @__PURE__ */ (0, import_react74.createElement)(AnimatePresence, { initial: false }, errorMessage ? /* @__PURE__ */ (0, import_react74.createElement)(
|
|
19753
19968
|
motion2.p,
|
|
19754
19969
|
{
|
|
19755
19970
|
id: `${id3}-error`,
|
|
@@ -19771,18 +19986,18 @@ window.__ModuleLoader__.load({
|
|
|
19771
19986
|
// src/client/components/Sessions.tsx
|
|
19772
19987
|
function SessionTable({ rows, t, intl, now: now2, onSelect }) {
|
|
19773
19988
|
const pageSize = TABLE_PAGE_SIZE;
|
|
19774
|
-
const [query, setQuery] = (0,
|
|
19775
|
-
const [project, setProject] = (0,
|
|
19776
|
-
const [model, setModel] = (0,
|
|
19777
|
-
const [sortKey, setSortKey] = (0,
|
|
19778
|
-
const [sortDir, setSortDir] = (0,
|
|
19779
|
-
const [page, setPage] = (0,
|
|
19780
|
-
const projects = (0,
|
|
19989
|
+
const [query, setQuery] = (0, import_react77.useState)("");
|
|
19990
|
+
const [project, setProject] = (0, import_react77.useState)("");
|
|
19991
|
+
const [model, setModel] = (0, import_react77.useState)("");
|
|
19992
|
+
const [sortKey, setSortKey] = (0, import_react77.useState)("last");
|
|
19993
|
+
const [sortDir, setSortDir] = (0, import_react77.useState)("desc");
|
|
19994
|
+
const [page, setPage] = (0, import_react77.useState)(0);
|
|
19995
|
+
const projects = (0, import_react77.useMemo)(() => {
|
|
19781
19996
|
const values = /* @__PURE__ */ new Set();
|
|
19782
19997
|
for (const row of rows) if (row.project !== "") values.add(row.project);
|
|
19783
19998
|
return [...values].sort((left, right) => left.localeCompare(right));
|
|
19784
19999
|
}, [rows]);
|
|
19785
|
-
const modelOptions = (0,
|
|
20000
|
+
const modelOptions = (0, import_react77.useMemo)(() => {
|
|
19786
20001
|
const values = /* @__PURE__ */ new Map();
|
|
19787
20002
|
for (const row of rows) {
|
|
19788
20003
|
for (const item of row.models) {
|
|
@@ -19791,7 +20006,7 @@ window.__ModuleLoader__.load({
|
|
|
19791
20006
|
}
|
|
19792
20007
|
return [...values.entries()].map(([value, label2]) => ({ value, label: label2 })).sort((left, right) => left.label.localeCompare(right.label));
|
|
19793
20008
|
}, [rows, t]);
|
|
19794
|
-
const filtered = (0,
|
|
20009
|
+
const filtered = (0, import_react77.useMemo)(() => {
|
|
19795
20010
|
const needle = query.trim().toLowerCase();
|
|
19796
20011
|
const result = rows.filter((row) => {
|
|
19797
20012
|
if (project !== "" && row.project !== project) return false;
|
|
@@ -19824,18 +20039,18 @@ window.__ModuleLoader__.load({
|
|
|
19824
20039
|
key: "session",
|
|
19825
20040
|
header: t("sessions.session"),
|
|
19826
20041
|
headerClassName: "tdb-session-cell",
|
|
19827
|
-
render: (row) => (0,
|
|
20042
|
+
render: (row) => (0, import_react77.createElement)(
|
|
19828
20043
|
"div",
|
|
19829
20044
|
{},
|
|
19830
|
-
(0,
|
|
19831
|
-
(0,
|
|
20045
|
+
(0, import_react77.createElement)("div", { className: "tdb-session-title" }, row.title ?? t("sessions.untitled")),
|
|
20046
|
+
(0, import_react77.createElement)(
|
|
19832
20047
|
"div",
|
|
19833
20048
|
{ className: "tdb-session-badges" },
|
|
19834
|
-
row.project === "" ? null : (0,
|
|
19835
|
-
row.live ? (0,
|
|
19836
|
-
row.origin === "subagent" ? (0,
|
|
19837
|
-
row.seeded ? (0,
|
|
19838
|
-
row.stale ? (0,
|
|
20049
|
+
row.project === "" ? null : (0, import_react77.createElement)("span", { className: "tdb-session-sub" }, row.project),
|
|
20050
|
+
row.live ? (0, import_react77.createElement)(Tag, { tone: "live" }, t("sessions.live")) : null,
|
|
20051
|
+
row.origin === "subagent" ? (0, import_react77.createElement)(Tag, { tone: "sub" }, t("sessions.subagent")) : null,
|
|
20052
|
+
row.seeded ? (0, import_react77.createElement)(Tag, {}, t("sessions.fork")) : null,
|
|
20053
|
+
row.stale ? (0, import_react77.createElement)(Tag, { tone: "stale" }, t("sessions.stale")) : null
|
|
19839
20054
|
)
|
|
19840
20055
|
)
|
|
19841
20056
|
},
|
|
@@ -19846,11 +20061,11 @@ window.__ModuleLoader__.load({
|
|
|
19846
20061
|
cellClassName: "tdb-hide-sm",
|
|
19847
20062
|
render: (row) => {
|
|
19848
20063
|
const first = row.models[0];
|
|
19849
|
-
return first === void 0 ? "\u2014" : (0,
|
|
20064
|
+
return first === void 0 ? "\u2014" : (0, import_react77.createElement)(
|
|
19850
20065
|
"span",
|
|
19851
20066
|
{ className: "tdb-session-model" },
|
|
19852
20067
|
first.model === "" ? t("models.unknown") : first.model,
|
|
19853
|
-
row.models.length > 1 ? (0,
|
|
20068
|
+
row.models.length > 1 ? (0, import_react77.createElement)(
|
|
19854
20069
|
"span",
|
|
19855
20070
|
{ className: "tdb-model-provider" },
|
|
19856
20071
|
` ${t("sessions.modelsMore", { count: row.models.length - 1 })}`
|
|
@@ -19860,7 +20075,7 @@ window.__ModuleLoader__.load({
|
|
|
19860
20075
|
},
|
|
19861
20076
|
{
|
|
19862
20077
|
key: "last",
|
|
19863
|
-
header: (0,
|
|
20078
|
+
header: (0, import_react77.createElement)(SortHeader, {
|
|
19864
20079
|
label: t("sessions.last"),
|
|
19865
20080
|
title: t("sessions.sortLast"),
|
|
19866
20081
|
active: sortKey === "last",
|
|
@@ -19869,7 +20084,7 @@ window.__ModuleLoader__.load({
|
|
|
19869
20084
|
}),
|
|
19870
20085
|
headerProps: { "aria-sort": activeSort(sortKey === "last", sortDir) },
|
|
19871
20086
|
cellClassName: "tdb-nowrap",
|
|
19872
|
-
render: (row) => (0,
|
|
20087
|
+
render: (row) => (0, import_react77.createElement)(
|
|
19873
20088
|
"span",
|
|
19874
20089
|
{ title: formatDateTime(row.lastActivity, intl) },
|
|
19875
20090
|
formatRelative(row.lastActivity, now2, intl)
|
|
@@ -19877,7 +20092,7 @@ window.__ModuleLoader__.load({
|
|
|
19877
20092
|
},
|
|
19878
20093
|
{
|
|
19879
20094
|
key: "total",
|
|
19880
|
-
header: (0,
|
|
20095
|
+
header: (0, import_react77.createElement)(SortHeader, {
|
|
19881
20096
|
label: t("sessions.total"),
|
|
19882
20097
|
title: t("sessions.sortTotal"),
|
|
19883
20098
|
active: sortKey === "total",
|
|
@@ -19887,13 +20102,13 @@ window.__ModuleLoader__.load({
|
|
|
19887
20102
|
headerClassName: "tdb-num",
|
|
19888
20103
|
headerProps: { "aria-sort": activeSort(sortKey === "total", sortDir) },
|
|
19889
20104
|
cellClassName: "tdb-num",
|
|
19890
|
-
render: (row) => (0,
|
|
20105
|
+
render: (row) => (0, import_react77.createElement)("span", { style: { fontWeight: 600 } }, formatNumber(totalTokens(row.totals), intl))
|
|
19891
20106
|
}
|
|
19892
20107
|
];
|
|
19893
|
-
const body = rows.length === 0 ? (0,
|
|
20108
|
+
const body = rows.length === 0 ? (0, import_react77.createElement)(EmptyState, { icon: (0, import_react77.createElement)(DatabaseIcon, { size: 20 }), title: t("sessions.empty") }) : filtered.length === 0 ? (0, import_react77.createElement)(EmptyState, { icon: (0, import_react77.createElement)(SearchIcon, { size: 20 }), title: t("sessions.emptyFiltered") }) : (0, import_react77.createElement)(
|
|
19894
20109
|
"div",
|
|
19895
20110
|
{ className: "tdb-table-panel" },
|
|
19896
|
-
(0,
|
|
20111
|
+
(0, import_react77.createElement)(DataTable, {
|
|
19897
20112
|
rows: visible,
|
|
19898
20113
|
columns,
|
|
19899
20114
|
rowKey: (row) => row.id,
|
|
@@ -19901,7 +20116,7 @@ window.__ModuleLoader__.load({
|
|
|
19901
20116
|
rowClassName: "tdb-row",
|
|
19902
20117
|
onRowActivate: onSelect
|
|
19903
20118
|
}),
|
|
19904
|
-
(0,
|
|
20119
|
+
(0, import_react77.createElement)(Pager, {
|
|
19905
20120
|
page: current2 + 1,
|
|
19906
20121
|
pages,
|
|
19907
20122
|
onChange: (next) => setPage(next - 1),
|
|
@@ -19909,16 +20124,16 @@ window.__ModuleLoader__.load({
|
|
|
19909
20124
|
ariaLabel: t("sessions.page", { page: current2 + 1, pages })
|
|
19910
20125
|
})
|
|
19911
20126
|
);
|
|
19912
|
-
return (0,
|
|
20127
|
+
return (0, import_react77.createElement)(
|
|
19913
20128
|
Section,
|
|
19914
20129
|
{ ariaLabel: t("sessions.title") },
|
|
19915
|
-
rows.length === 0 ? body : (0,
|
|
19916
|
-
|
|
20130
|
+
rows.length === 0 ? body : (0, import_react77.createElement)(
|
|
20131
|
+
import_react77.Fragment,
|
|
19917
20132
|
{},
|
|
19918
|
-
(0,
|
|
20133
|
+
(0, import_react77.createElement)(
|
|
19919
20134
|
"div",
|
|
19920
20135
|
{ className: "tdb-filters" },
|
|
19921
|
-
(0,
|
|
20136
|
+
(0, import_react77.createElement)(Input, {
|
|
19922
20137
|
className: "tdb-search",
|
|
19923
20138
|
type: "search",
|
|
19924
20139
|
value: query,
|
|
@@ -19928,10 +20143,10 @@ window.__ModuleLoader__.load({
|
|
|
19928
20143
|
},
|
|
19929
20144
|
placeholder: t("sessions.search"),
|
|
19930
20145
|
"aria-label": t("sessions.search"),
|
|
19931
|
-
leftIcon: (0,
|
|
20146
|
+
leftIcon: (0, import_react77.createElement)(SearchIcon, { size: 14 }),
|
|
19932
20147
|
classNames: { field: "h-8 rounded-lg", input: "text-xs" }
|
|
19933
20148
|
}),
|
|
19934
|
-
(0,
|
|
20149
|
+
(0, import_react77.createElement)(Select2, {
|
|
19935
20150
|
value: project,
|
|
19936
20151
|
ariaLabel: t("sessions.project"),
|
|
19937
20152
|
options: [{ value: "", label: t("sessions.projectAll") }, ...projects.map((value) => ({ value, label: value }))],
|
|
@@ -19940,7 +20155,7 @@ window.__ModuleLoader__.load({
|
|
|
19940
20155
|
resetPage();
|
|
19941
20156
|
}
|
|
19942
20157
|
}),
|
|
19943
|
-
(0,
|
|
20158
|
+
(0, import_react77.createElement)(Select2, {
|
|
19944
20159
|
value: model,
|
|
19945
20160
|
ariaLabel: t("models.model"),
|
|
19946
20161
|
options: [{ value: "", label: t("sessions.modelAll") }, ...modelOptions],
|
|
@@ -19955,7 +20170,7 @@ window.__ModuleLoader__.load({
|
|
|
19955
20170
|
);
|
|
19956
20171
|
}
|
|
19957
20172
|
function SortHeader({ label: label2, title, active: active2, direction, onClick }) {
|
|
19958
|
-
return (0,
|
|
20173
|
+
return (0, import_react77.createElement)(
|
|
19959
20174
|
"button",
|
|
19960
20175
|
{
|
|
19961
20176
|
type: "button",
|
|
@@ -19964,7 +20179,7 @@ window.__ModuleLoader__.load({
|
|
|
19964
20179
|
onClick
|
|
19965
20180
|
},
|
|
19966
20181
|
label2,
|
|
19967
|
-
active2 ? (0,
|
|
20182
|
+
active2 ? (0, import_react77.createElement)("span", { className: "tdb-sort-arrow", "aria-hidden": "true" }, direction === "asc" ? "\u25B2" : "\u25BC") : null
|
|
19968
20183
|
);
|
|
19969
20184
|
}
|
|
19970
20185
|
function activeSort(active2, direction) {
|
|
@@ -19973,13 +20188,13 @@ window.__ModuleLoader__.load({
|
|
|
19973
20188
|
}
|
|
19974
20189
|
|
|
19975
20190
|
// src/client/components/RequestLog.tsx
|
|
19976
|
-
var
|
|
20191
|
+
var import_react78 = require("react");
|
|
19977
20192
|
function RequestLog({ pricing, t, intl, refreshToken }) {
|
|
19978
|
-
const [page, setPage] = (0,
|
|
19979
|
-
const [data, setData] = (0,
|
|
19980
|
-
const [loading, setLoading] = (0,
|
|
19981
|
-
const [failed, setFailed] = (0,
|
|
19982
|
-
(0,
|
|
20193
|
+
const [page, setPage] = (0, import_react78.useState)(0);
|
|
20194
|
+
const [data, setData] = (0, import_react78.useState)(null);
|
|
20195
|
+
const [loading, setLoading] = (0, import_react78.useState)(true);
|
|
20196
|
+
const [failed, setFailed] = (0, import_react78.useState)(false);
|
|
20197
|
+
(0, import_react78.useEffect)(() => {
|
|
19983
20198
|
let stopped = false;
|
|
19984
20199
|
setLoading(true);
|
|
19985
20200
|
setFailed(false);
|
|
@@ -20002,40 +20217,40 @@ window.__ModuleLoader__.load({
|
|
|
20002
20217
|
const pages = Math.max(1, Math.ceil(total / TABLE_PAGE_SIZE));
|
|
20003
20218
|
const current2 = Math.min(page, pages - 1);
|
|
20004
20219
|
if (loading && data === null) {
|
|
20005
|
-
return (0,
|
|
20220
|
+
return (0, import_react78.createElement)(
|
|
20006
20221
|
Section,
|
|
20007
20222
|
{ ariaLabel: t("tabs.requests") },
|
|
20008
|
-
(0,
|
|
20223
|
+
(0, import_react78.createElement)("div", { className: "tdb-empty" }, t("requests.loading"))
|
|
20009
20224
|
);
|
|
20010
20225
|
}
|
|
20011
20226
|
if (failed) {
|
|
20012
|
-
return (0,
|
|
20227
|
+
return (0, import_react78.createElement)(
|
|
20013
20228
|
Section,
|
|
20014
20229
|
{ ariaLabel: t("tabs.requests") },
|
|
20015
|
-
(0,
|
|
20230
|
+
(0, import_react78.createElement)("div", { className: "tdb-empty" }, t("requests.failed"))
|
|
20016
20231
|
);
|
|
20017
20232
|
}
|
|
20018
20233
|
if (total === 0) {
|
|
20019
|
-
return (0,
|
|
20234
|
+
return (0, import_react78.createElement)(
|
|
20020
20235
|
Section,
|
|
20021
20236
|
{ ariaLabel: t("tabs.requests") },
|
|
20022
|
-
(0,
|
|
20237
|
+
(0, import_react78.createElement)(EmptyState, { icon: (0, import_react78.createElement)(ChartIcon, { size: 20 }), title: t("requests.empty") })
|
|
20023
20238
|
);
|
|
20024
20239
|
}
|
|
20025
20240
|
const rows = data?.rows ?? [];
|
|
20026
|
-
return (0,
|
|
20241
|
+
return (0, import_react78.createElement)(
|
|
20027
20242
|
Section,
|
|
20028
20243
|
{ ariaLabel: t("tabs.requests") },
|
|
20029
|
-
(0,
|
|
20244
|
+
(0, import_react78.createElement)(
|
|
20030
20245
|
"div",
|
|
20031
20246
|
{ className: "tdb-table-panel" },
|
|
20032
|
-
(0,
|
|
20247
|
+
(0, import_react78.createElement)(DataTable, {
|
|
20033
20248
|
rows,
|
|
20034
20249
|
columns: requestColumns(pricing, t, intl),
|
|
20035
20250
|
rowKey: (row) => row.id,
|
|
20036
20251
|
ariaLabel: t("tabs.requests")
|
|
20037
20252
|
}),
|
|
20038
|
-
(0,
|
|
20253
|
+
(0, import_react78.createElement)(Pager, {
|
|
20039
20254
|
page: current2 + 1,
|
|
20040
20255
|
pages,
|
|
20041
20256
|
onChange: (next) => setPage(next - 1),
|
|
@@ -20069,7 +20284,7 @@ window.__ModuleLoader__.load({
|
|
|
20069
20284
|
{
|
|
20070
20285
|
key: "model",
|
|
20071
20286
|
header: t("requests.model"),
|
|
20072
|
-
render: (row) => (0,
|
|
20287
|
+
render: (row) => (0, import_react78.createElement)(
|
|
20073
20288
|
"span",
|
|
20074
20289
|
{ className: "tdb-session-model", title: row.model },
|
|
20075
20290
|
row.model === "" ? t("models.unknown") : row.model
|
|
@@ -20105,14 +20320,14 @@ window.__ModuleLoader__.load({
|
|
|
20105
20320
|
},
|
|
20106
20321
|
{
|
|
20107
20322
|
key: "speed",
|
|
20108
|
-
header: (0,
|
|
20323
|
+
header: (0, import_react78.createElement)("span", { title: t("sessions.speedHint") }, t("sessions.speed")),
|
|
20109
20324
|
headerClassName: "tdb-num tdb-hide-sm",
|
|
20110
20325
|
cellClassName: "tdb-num tdb-hide-sm",
|
|
20111
20326
|
render: (row) => formatSpeed(row.speed)
|
|
20112
20327
|
},
|
|
20113
20328
|
{
|
|
20114
20329
|
key: "firstToken",
|
|
20115
|
-
header: (0,
|
|
20330
|
+
header: (0, import_react78.createElement)("span", { title: t("sessions.firstTokenHint") }, t("sessions.firstToken")),
|
|
20116
20331
|
headerClassName: "tdb-num tdb-hide-sm",
|
|
20117
20332
|
cellClassName: "tdb-num tdb-hide-sm",
|
|
20118
20333
|
render: (row) => formatFirstToken(row.firstToken)
|
|
@@ -20120,7 +20335,7 @@ window.__ModuleLoader__.load({
|
|
|
20120
20335
|
];
|
|
20121
20336
|
}
|
|
20122
20337
|
function requestCost(row, pricing) {
|
|
20123
|
-
const price = pricing
|
|
20338
|
+
const price = priceForModel(pricing, row.modelKey, row.model);
|
|
20124
20339
|
const amount = costOf({
|
|
20125
20340
|
uncachedInputTokens: row.inputTokens,
|
|
20126
20341
|
cacheReadTokens: row.cacheReadTokens,
|
|
@@ -20145,17 +20360,17 @@ window.__ModuleLoader__.load({
|
|
|
20145
20360
|
}
|
|
20146
20361
|
|
|
20147
20362
|
// src/client/components/Trends.tsx
|
|
20148
|
-
var
|
|
20363
|
+
var import_react88 = require("react");
|
|
20149
20364
|
|
|
20150
20365
|
// src/client/components/charts.tsx
|
|
20151
|
-
var
|
|
20366
|
+
var import_react82 = require("react");
|
|
20152
20367
|
|
|
20153
20368
|
// src/client/hooks.ts
|
|
20154
|
-
var
|
|
20369
|
+
var import_react79 = require("react");
|
|
20155
20370
|
function useElementSize() {
|
|
20156
|
-
const ref = (0,
|
|
20157
|
-
const [size, setSize] = (0,
|
|
20158
|
-
(0,
|
|
20371
|
+
const ref = (0, import_react79.useRef)(null);
|
|
20372
|
+
const [size, setSize] = (0, import_react79.useState)({ width: 0, height: 0 });
|
|
20373
|
+
(0, import_react79.useEffect)(() => {
|
|
20159
20374
|
const node = ref.current;
|
|
20160
20375
|
if (node === null || typeof ResizeObserver === "undefined") return;
|
|
20161
20376
|
const update = () => {
|
|
@@ -20170,24 +20385,24 @@ window.__ModuleLoader__.load({
|
|
|
20170
20385
|
return [ref, size];
|
|
20171
20386
|
}
|
|
20172
20387
|
function useNow(intervalMs = 3e4) {
|
|
20173
|
-
const [now2, setNow] = (0,
|
|
20174
|
-
(0,
|
|
20388
|
+
const [now2, setNow] = (0, import_react79.useState)(() => Date.now());
|
|
20389
|
+
(0, import_react79.useEffect)(() => {
|
|
20175
20390
|
const timer = setInterval(() => setNow(Date.now()), intervalMs);
|
|
20176
20391
|
return () => clearInterval(timer);
|
|
20177
20392
|
}, [intervalMs]);
|
|
20178
20393
|
return now2;
|
|
20179
20394
|
}
|
|
20180
20395
|
function useStats(intervalMs = POLL_INTERVAL_MS) {
|
|
20181
|
-
const [data, setData] = (0,
|
|
20182
|
-
const [loading, setLoading] = (0,
|
|
20183
|
-
const [refreshing, setRefreshing] = (0,
|
|
20184
|
-
const [error, setError] = (0,
|
|
20185
|
-
const [pollError, setPollError] = (0,
|
|
20186
|
-
const [lastUpdated, setLastUpdated] = (0,
|
|
20187
|
-
const etag = (0,
|
|
20188
|
-
const inflight = (0,
|
|
20189
|
-
const hasData = (0,
|
|
20190
|
-
const load = (0,
|
|
20396
|
+
const [data, setData] = (0, import_react79.useState)(null);
|
|
20397
|
+
const [loading, setLoading] = (0, import_react79.useState)(true);
|
|
20398
|
+
const [refreshing, setRefreshing] = (0, import_react79.useState)(false);
|
|
20399
|
+
const [error, setError] = (0, import_react79.useState)(null);
|
|
20400
|
+
const [pollError, setPollError] = (0, import_react79.useState)(null);
|
|
20401
|
+
const [lastUpdated, setLastUpdated] = (0, import_react79.useState)(null);
|
|
20402
|
+
const etag = (0, import_react79.useRef)(null);
|
|
20403
|
+
const inflight = (0, import_react79.useRef)(null);
|
|
20404
|
+
const hasData = (0, import_react79.useRef)(false);
|
|
20405
|
+
const load = (0, import_react79.useCallback)(async (mode) => {
|
|
20191
20406
|
if (mode === "poll" && inflight.current !== null) return;
|
|
20192
20407
|
if (mode === "manual" && inflight.current !== null) inflight.current.abort();
|
|
20193
20408
|
const controller = new AbortController();
|
|
@@ -20213,10 +20428,10 @@ window.__ModuleLoader__.load({
|
|
|
20213
20428
|
if (inflight.current === controller) inflight.current = null;
|
|
20214
20429
|
}
|
|
20215
20430
|
}, []);
|
|
20216
|
-
(0,
|
|
20431
|
+
(0, import_react79.useEffect)(() => {
|
|
20217
20432
|
void load("initial");
|
|
20218
20433
|
}, [load]);
|
|
20219
|
-
(0,
|
|
20434
|
+
(0, import_react79.useEffect)(() => {
|
|
20220
20435
|
const tick = () => {
|
|
20221
20436
|
if (typeof document !== "undefined" && document.visibilityState !== "visible") return;
|
|
20222
20437
|
void load("poll");
|
|
@@ -20232,14 +20447,14 @@ window.__ModuleLoader__.load({
|
|
|
20232
20447
|
inflight.current?.abort();
|
|
20233
20448
|
};
|
|
20234
20449
|
}, [load, intervalMs]);
|
|
20235
|
-
const refresh = (0,
|
|
20450
|
+
const refresh = (0, import_react79.useCallback)(() => {
|
|
20236
20451
|
void load("manual");
|
|
20237
20452
|
}, [load]);
|
|
20238
20453
|
return { data, loading, refreshing, error, pollError, lastUpdated, refresh };
|
|
20239
20454
|
}
|
|
20240
20455
|
|
|
20241
20456
|
// src/client/beui/components/motion/tooltip-surface.tsx
|
|
20242
|
-
var
|
|
20457
|
+
var import_react80 = require("react");
|
|
20243
20458
|
function TooltipSurface({
|
|
20244
20459
|
children,
|
|
20245
20460
|
side: _side = "top",
|
|
@@ -20251,7 +20466,7 @@ window.__ModuleLoader__.load({
|
|
|
20251
20466
|
}) {
|
|
20252
20467
|
const reduce = useReducedMotion();
|
|
20253
20468
|
const closed = { opacity: 0, scale: reduce ? 1 : 0.94 };
|
|
20254
|
-
return /* @__PURE__ */ (0,
|
|
20469
|
+
return /* @__PURE__ */ (0, import_react80.createElement)(
|
|
20255
20470
|
motion2.span,
|
|
20256
20471
|
{
|
|
20257
20472
|
ref,
|
|
@@ -20285,7 +20500,7 @@ window.__ModuleLoader__.load({
|
|
|
20285
20500
|
const [ref, size] = useElementSize();
|
|
20286
20501
|
const width = Math.max(1, Math.round(size.width || 520));
|
|
20287
20502
|
const height = Math.max(MIN_HEIGHT, Math.round(size.height || DEFAULT_HEIGHT));
|
|
20288
|
-
const [hover2, setHover] = (0,
|
|
20503
|
+
const [hover2, setHover] = (0, import_react82.useState)(null);
|
|
20289
20504
|
const innerWidth = Math.max(20, width - LEFT - RIGHT);
|
|
20290
20505
|
const innerHeight = height - TOP - BOTTOM;
|
|
20291
20506
|
const band = innerWidth / Math.max(1, buckets.length);
|
|
@@ -20311,10 +20526,10 @@ window.__ModuleLoader__.load({
|
|
|
20311
20526
|
setHover({ index, x: LEFT + band * index + band / 2, y });
|
|
20312
20527
|
};
|
|
20313
20528
|
const hovered = hover2 === null ? void 0 : buckets[hover2.index];
|
|
20314
|
-
return (0,
|
|
20529
|
+
return (0, import_react82.createElement)(
|
|
20315
20530
|
"div",
|
|
20316
20531
|
{ className: "tdb-chart", ref },
|
|
20317
|
-
(0,
|
|
20532
|
+
(0, import_react82.createElement)(
|
|
20318
20533
|
"svg",
|
|
20319
20534
|
{
|
|
20320
20535
|
width,
|
|
@@ -20326,8 +20541,8 @@ window.__ModuleLoader__.load({
|
|
|
20326
20541
|
onMouseLeave: () => setHover(null)
|
|
20327
20542
|
},
|
|
20328
20543
|
...grid(width, scale2, toY, intl),
|
|
20329
|
-
(0,
|
|
20330
|
-
hover2 === null ? null : (0,
|
|
20544
|
+
(0, import_react82.createElement)("line", { x1: LEFT, y1: bottom, x2: width - RIGHT, y2: bottom, className: "tdb-axis-line" }),
|
|
20545
|
+
hover2 === null ? null : (0, import_react82.createElement)("rect", {
|
|
20331
20546
|
className: "tdb-hover-band",
|
|
20332
20547
|
x: LEFT + band * hover2.index,
|
|
20333
20548
|
y: TOP,
|
|
@@ -20339,10 +20554,10 @@ window.__ModuleLoader__.load({
|
|
|
20339
20554
|
const center = LEFT + band * index + band / 2;
|
|
20340
20555
|
const inputHeight = visibleHeight(bucket.uncachedInputTokens, toY, bottom);
|
|
20341
20556
|
const outputHeight = visibleHeight(bucket.outputTokens, toY, bottom);
|
|
20342
|
-
return (0,
|
|
20557
|
+
return (0, import_react82.createElement)(
|
|
20343
20558
|
"g",
|
|
20344
20559
|
{ key: bucket.bucket },
|
|
20345
|
-
inputHeight <= 0 ? null : (0,
|
|
20560
|
+
inputHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
|
|
20346
20561
|
x: center - gap / 2 - barWidth,
|
|
20347
20562
|
y: bottom - inputHeight,
|
|
20348
20563
|
width: barWidth,
|
|
@@ -20350,7 +20565,7 @@ window.__ModuleLoader__.load({
|
|
|
20350
20565
|
rx: Math.min(2.5, barWidth / 2),
|
|
20351
20566
|
className: "tdb-bar tdb-bar--input"
|
|
20352
20567
|
}),
|
|
20353
|
-
outputHeight <= 0 ? null : (0,
|
|
20568
|
+
outputHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
|
|
20354
20569
|
x: center + gap / 2,
|
|
20355
20570
|
y: bottom - outputHeight,
|
|
20356
20571
|
width: barWidth,
|
|
@@ -20362,7 +20577,7 @@ window.__ModuleLoader__.load({
|
|
|
20362
20577
|
}),
|
|
20363
20578
|
...xLabels(buckets, band, width, bottom, labelOf)
|
|
20364
20579
|
),
|
|
20365
|
-
hover2 === null || hovered === void 0 ? null : (0,
|
|
20580
|
+
hover2 === null || hovered === void 0 ? null : (0, import_react82.createElement)(Tooltip, {
|
|
20366
20581
|
x: tooltipX(hover2.x, width),
|
|
20367
20582
|
y: tooltipY(hover2.y, height),
|
|
20368
20583
|
title: labelOf(hovered),
|
|
@@ -20373,14 +20588,14 @@ window.__ModuleLoader__.load({
|
|
|
20373
20588
|
{ label: t("sessions.requests"), value: String(hovered.requests), color: void 0 }
|
|
20374
20589
|
]
|
|
20375
20590
|
}),
|
|
20376
|
-
empty ? (0,
|
|
20591
|
+
empty ? (0, import_react82.createElement)("div", { className: "tdb-chart-empty" }, t("trend.emptyIo")) : null
|
|
20377
20592
|
);
|
|
20378
20593
|
}
|
|
20379
20594
|
function CacheChart({ buckets, granularity, t, intl }) {
|
|
20380
20595
|
const [ref, size] = useElementSize();
|
|
20381
20596
|
const width = Math.max(1, Math.round(size.width || 520));
|
|
20382
20597
|
const height = Math.max(MIN_HEIGHT, Math.round(size.height || DEFAULT_HEIGHT));
|
|
20383
|
-
const [hover2, setHover] = (0,
|
|
20598
|
+
const [hover2, setHover] = (0, import_react82.useState)(null);
|
|
20384
20599
|
const right = 42;
|
|
20385
20600
|
const innerWidth = Math.max(20, width - LEFT - right);
|
|
20386
20601
|
const innerHeight = height - TOP - BOTTOM;
|
|
@@ -20421,10 +20636,10 @@ window.__ModuleLoader__.load({
|
|
|
20421
20636
|
const prompt = promptOf(hovered);
|
|
20422
20637
|
return prompt === 0 ? null : hovered.cacheReadTokens / prompt;
|
|
20423
20638
|
})();
|
|
20424
|
-
return (0,
|
|
20639
|
+
return (0, import_react82.createElement)(
|
|
20425
20640
|
"div",
|
|
20426
20641
|
{ className: "tdb-chart", ref },
|
|
20427
|
-
(0,
|
|
20642
|
+
(0, import_react82.createElement)(
|
|
20428
20643
|
"svg",
|
|
20429
20644
|
{
|
|
20430
20645
|
width,
|
|
@@ -20436,11 +20651,11 @@ window.__ModuleLoader__.load({
|
|
|
20436
20651
|
onMouseLeave: () => setHover(null)
|
|
20437
20652
|
},
|
|
20438
20653
|
...grid(width, scale2, toY, intl, right),
|
|
20439
|
-
(0,
|
|
20440
|
-
(0,
|
|
20441
|
-
(0,
|
|
20442
|
-
(0,
|
|
20443
|
-
hover2 === null ? null : (0,
|
|
20654
|
+
(0, import_react82.createElement)("text", { x: width - right + 6, y: TOP + 3, className: "tdb-axis-text" }, "100%"),
|
|
20655
|
+
(0, import_react82.createElement)("text", { x: width - right + 6, y: TOP + innerHeight / 2, className: "tdb-axis-text" }, "50%"),
|
|
20656
|
+
(0, import_react82.createElement)("text", { x: width - right + 6, y: bottom, className: "tdb-axis-text" }, "0%"),
|
|
20657
|
+
(0, import_react82.createElement)("line", { x1: LEFT, y1: bottom, x2: width - right, y2: bottom, className: "tdb-axis-line" }),
|
|
20658
|
+
hover2 === null ? null : (0, import_react82.createElement)("rect", {
|
|
20444
20659
|
className: "tdb-hover-band",
|
|
20445
20660
|
x: LEFT + band * hover2.index,
|
|
20446
20661
|
y: TOP,
|
|
@@ -20451,10 +20666,10 @@ window.__ModuleLoader__.load({
|
|
|
20451
20666
|
...buckets.map((bucket, index) => {
|
|
20452
20667
|
const readHeight = visibleHeight(bucket.cacheReadTokens, toY, bottom);
|
|
20453
20668
|
const writeHeight = visibleHeight(bucket.cacheWriteTokens, toY, bottom);
|
|
20454
|
-
return (0,
|
|
20669
|
+
return (0, import_react82.createElement)(
|
|
20455
20670
|
"g",
|
|
20456
20671
|
{ key: bucket.bucket },
|
|
20457
|
-
readHeight <= 0 ? null : (0,
|
|
20672
|
+
readHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
|
|
20458
20673
|
x: LEFT + band * index + (band - barWidth) / 2,
|
|
20459
20674
|
y: bottom - readHeight,
|
|
20460
20675
|
width: barWidth,
|
|
@@ -20462,7 +20677,7 @@ window.__ModuleLoader__.load({
|
|
|
20462
20677
|
rx: Math.min(2.5, barWidth / 2),
|
|
20463
20678
|
className: "tdb-bar tdb-bar--cache-read"
|
|
20464
20679
|
}),
|
|
20465
|
-
writeHeight <= 0 ? null : (0,
|
|
20680
|
+
writeHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
|
|
20466
20681
|
x: LEFT + band * index + (band - barWidth) / 2,
|
|
20467
20682
|
y: bottom - readHeight - writeHeight,
|
|
20468
20683
|
width: barWidth,
|
|
@@ -20472,12 +20687,12 @@ window.__ModuleLoader__.load({
|
|
|
20472
20687
|
})
|
|
20473
20688
|
);
|
|
20474
20689
|
}),
|
|
20475
|
-
...segments.map((points, index) => (0,
|
|
20690
|
+
...segments.map((points, index) => (0, import_react82.createElement)("polyline", {
|
|
20476
20691
|
key: `hit-${index}`,
|
|
20477
20692
|
points,
|
|
20478
20693
|
className: "tdb-line-hit"
|
|
20479
20694
|
})),
|
|
20480
|
-
...hitPoints.map((point) => point === null ? null : (0,
|
|
20695
|
+
...hitPoints.map((point) => point === null ? null : (0, import_react82.createElement)("circle", {
|
|
20481
20696
|
key: `dot-${point.index}`,
|
|
20482
20697
|
cx: point.x,
|
|
20483
20698
|
cy: point.y,
|
|
@@ -20486,7 +20701,7 @@ window.__ModuleLoader__.load({
|
|
|
20486
20701
|
})),
|
|
20487
20702
|
...xLabels(buckets, band, width, bottom, labelOf)
|
|
20488
20703
|
),
|
|
20489
|
-
hover2 === null || hovered === void 0 ? null : (0,
|
|
20704
|
+
hover2 === null || hovered === void 0 ? null : (0, import_react82.createElement)(Tooltip, {
|
|
20490
20705
|
x: tooltipX(hover2.x, width),
|
|
20491
20706
|
y: tooltipY(hover2.y, height),
|
|
20492
20707
|
title: labelOf(hovered),
|
|
@@ -20496,30 +20711,30 @@ window.__ModuleLoader__.load({
|
|
|
20496
20711
|
{ label: t("legend.hitRate"), value: hoveredRatio === null ? "\u2014" : formatPercent(hoveredRatio), color: "var(--tdb-cat-hit)" }
|
|
20497
20712
|
]
|
|
20498
20713
|
}),
|
|
20499
|
-
empty ? (0,
|
|
20714
|
+
empty ? (0, import_react82.createElement)("div", { className: "tdb-chart-empty" }, t("trend.emptyCache")) : null
|
|
20500
20715
|
);
|
|
20501
20716
|
}
|
|
20502
20717
|
function Tooltip({ x, y, title, rows }) {
|
|
20503
|
-
return (0,
|
|
20718
|
+
return (0, import_react82.createElement)(
|
|
20504
20719
|
"div",
|
|
20505
20720
|
{ className: "tdb-tooltip", style: { left: x, top: y } },
|
|
20506
|
-
(0,
|
|
20721
|
+
(0, import_react82.createElement)(TooltipSurface, {
|
|
20507
20722
|
ready: true,
|
|
20508
20723
|
className: "tdb-tooltip-surface",
|
|
20509
|
-
children: (0,
|
|
20724
|
+
children: (0, import_react82.createElement)(
|
|
20510
20725
|
"div",
|
|
20511
20726
|
{ className: "tdb-tooltip-content" },
|
|
20512
|
-
(0,
|
|
20513
|
-
rows.map((row) => (0,
|
|
20727
|
+
(0, import_react82.createElement)("div", { className: "tdb-tooltip-title" }, title),
|
|
20728
|
+
rows.map((row) => (0, import_react82.createElement)(
|
|
20514
20729
|
"div",
|
|
20515
20730
|
{ key: row.label, className: "tdb-tooltip-row" },
|
|
20516
|
-
(0,
|
|
20731
|
+
(0, import_react82.createElement)(
|
|
20517
20732
|
"span",
|
|
20518
20733
|
{ style: { display: "inline-flex", alignItems: "center", gap: 5 } },
|
|
20519
|
-
row.color === void 0 ? null : (0,
|
|
20734
|
+
row.color === void 0 ? null : (0, import_react82.createElement)("span", { className: "tdb-legend-dot", style: { background: row.color } }),
|
|
20520
20735
|
row.label
|
|
20521
20736
|
),
|
|
20522
|
-
(0,
|
|
20737
|
+
(0, import_react82.createElement)("b", {}, row.value)
|
|
20523
20738
|
))
|
|
20524
20739
|
)
|
|
20525
20740
|
})
|
|
@@ -20530,7 +20745,7 @@ window.__ModuleLoader__.load({
|
|
|
20530
20745
|
for (let index = 0; index <= INTERVALS; index += 1) {
|
|
20531
20746
|
const value = scale2.step * index;
|
|
20532
20747
|
const y = toY(value);
|
|
20533
|
-
lines.push((0,
|
|
20748
|
+
lines.push((0, import_react82.createElement)("line", {
|
|
20534
20749
|
key: `grid-${index}`,
|
|
20535
20750
|
x1: LEFT,
|
|
20536
20751
|
y1: y,
|
|
@@ -20538,7 +20753,7 @@ window.__ModuleLoader__.load({
|
|
|
20538
20753
|
y2: y,
|
|
20539
20754
|
className: "tdb-grid-line"
|
|
20540
20755
|
}));
|
|
20541
|
-
lines.push((0,
|
|
20756
|
+
lines.push((0, import_react82.createElement)("text", {
|
|
20542
20757
|
key: `axis-${index}`,
|
|
20543
20758
|
x: LEFT - 8,
|
|
20544
20759
|
y: y + 3,
|
|
@@ -20559,7 +20774,7 @@ window.__ModuleLoader__.load({
|
|
|
20559
20774
|
const previousX = LEFT + band * (index - step) + band / 2;
|
|
20560
20775
|
if (x - previousX < 46) return;
|
|
20561
20776
|
}
|
|
20562
|
-
labels.push((0,
|
|
20777
|
+
labels.push((0, import_react82.createElement)("text", {
|
|
20563
20778
|
key: `x-${bucket.bucket}`,
|
|
20564
20779
|
x,
|
|
20565
20780
|
y: bottom + 16,
|
|
@@ -20595,13 +20810,13 @@ window.__ModuleLoader__.load({
|
|
|
20595
20810
|
}
|
|
20596
20811
|
|
|
20597
20812
|
// src/client/components/ui/DatePicker.tsx
|
|
20598
|
-
var
|
|
20813
|
+
var import_react83 = require("react");
|
|
20599
20814
|
function DatePicker({ value, onChange, ariaLabel, intl, min, max, previousLabel, nextLabel }) {
|
|
20600
|
-
const [open, setOpen] = (0,
|
|
20601
|
-
const [position, setPosition] = (0,
|
|
20602
|
-
const [view, setView] = (0,
|
|
20603
|
-
const trigger = (0,
|
|
20604
|
-
const layer = (0,
|
|
20815
|
+
const [open, setOpen] = (0, import_react83.useState)(false);
|
|
20816
|
+
const [position, setPosition] = (0, import_react83.useState)(null);
|
|
20817
|
+
const [view, setView] = (0, import_react83.useState)(() => monthStart(selectedDate(value) ?? /* @__PURE__ */ new Date()));
|
|
20818
|
+
const trigger = (0, import_react83.useRef)(null);
|
|
20819
|
+
const layer = (0, import_react83.useRef)(null);
|
|
20605
20820
|
const selected = selectedDate(value);
|
|
20606
20821
|
const today = isoDate(/* @__PURE__ */ new Date());
|
|
20607
20822
|
const place = () => {
|
|
@@ -20616,7 +20831,7 @@ window.__ModuleLoader__.load({
|
|
|
20616
20831
|
top: openUp ? Math.max(8, box.top - 336) : box.bottom + 4
|
|
20617
20832
|
});
|
|
20618
20833
|
};
|
|
20619
|
-
(0,
|
|
20834
|
+
(0, import_react83.useEffect)(() => {
|
|
20620
20835
|
if (!open) return;
|
|
20621
20836
|
setView(monthStart(selected ?? /* @__PURE__ */ new Date()));
|
|
20622
20837
|
place();
|
|
@@ -20649,7 +20864,7 @@ window.__ModuleLoader__.load({
|
|
|
20649
20864
|
window.removeEventListener("scroll", onScroll, true);
|
|
20650
20865
|
};
|
|
20651
20866
|
}, [open]);
|
|
20652
|
-
(0,
|
|
20867
|
+
(0, import_react83.useEffect)(() => {
|
|
20653
20868
|
if (!open) return;
|
|
20654
20869
|
layer.current?.querySelector('[aria-pressed="true"]')?.focus();
|
|
20655
20870
|
}, [open, view]);
|
|
@@ -20666,10 +20881,10 @@ window.__ModuleLoader__.load({
|
|
|
20666
20881
|
...Array.from({ length: days }, (_, index) => new Date(view.getFullYear(), view.getMonth(), index + 1))
|
|
20667
20882
|
];
|
|
20668
20883
|
while (cells.length % 7 !== 0) cells.push(null);
|
|
20669
|
-
return (0,
|
|
20884
|
+
return (0, import_react83.createElement)(
|
|
20670
20885
|
"div",
|
|
20671
20886
|
{ className: "tdb-date-picker" },
|
|
20672
|
-
(0,
|
|
20887
|
+
(0, import_react83.createElement)(
|
|
20673
20888
|
"button",
|
|
20674
20889
|
{
|
|
20675
20890
|
ref: trigger,
|
|
@@ -20680,10 +20895,10 @@ window.__ModuleLoader__.load({
|
|
|
20680
20895
|
"aria-expanded": open,
|
|
20681
20896
|
onClick: () => setOpen((current2) => !current2)
|
|
20682
20897
|
},
|
|
20683
|
-
(0,
|
|
20684
|
-
(0,
|
|
20898
|
+
(0, import_react83.createElement)(CalendarIcon, { size: 14 }),
|
|
20899
|
+
(0, import_react83.createElement)("span", { className: "tdb-date-value" }, selected === null ? "\u2014" : formatDate(selected, intl))
|
|
20685
20900
|
),
|
|
20686
|
-
open && position !== null ? (0,
|
|
20901
|
+
open && position !== null ? (0, import_react83.createElement)(
|
|
20687
20902
|
"div",
|
|
20688
20903
|
{
|
|
20689
20904
|
ref: layer,
|
|
@@ -20692,32 +20907,32 @@ window.__ModuleLoader__.load({
|
|
|
20692
20907
|
"aria-label": ariaLabel,
|
|
20693
20908
|
style: { left: `${position.left}px`, top: `${position.top}px` }
|
|
20694
20909
|
},
|
|
20695
|
-
(0,
|
|
20910
|
+
(0, import_react83.createElement)(
|
|
20696
20911
|
"div",
|
|
20697
20912
|
{ className: "tdb-cal-head" },
|
|
20698
|
-
(0,
|
|
20913
|
+
(0, import_react83.createElement)(Button3, {
|
|
20699
20914
|
variant: "ghost",
|
|
20700
20915
|
iconOnly: true,
|
|
20701
20916
|
"aria-label": previousLabel,
|
|
20702
20917
|
onClick: () => setView(new Date(view.getFullYear(), view.getMonth() - 1, 1))
|
|
20703
|
-
}, (0,
|
|
20704
|
-
(0,
|
|
20705
|
-
(0,
|
|
20918
|
+
}, (0, import_react83.createElement)(ChevronLeftIcon, { size: 14 })),
|
|
20919
|
+
(0, import_react83.createElement)("span", { className: "tdb-cal-title" }, formatMonth(view, intl)),
|
|
20920
|
+
(0, import_react83.createElement)(Button3, {
|
|
20706
20921
|
variant: "ghost",
|
|
20707
20922
|
iconOnly: true,
|
|
20708
20923
|
"aria-label": nextLabel,
|
|
20709
20924
|
onClick: () => setView(new Date(view.getFullYear(), view.getMonth() + 1, 1))
|
|
20710
|
-
}, (0,
|
|
20925
|
+
}, (0, import_react83.createElement)(ChevronRightIcon, { size: 14 }))
|
|
20711
20926
|
),
|
|
20712
|
-
(0,
|
|
20927
|
+
(0, import_react83.createElement)(
|
|
20713
20928
|
"div",
|
|
20714
20929
|
{ className: "tdb-cal-grid" },
|
|
20715
|
-
...weekdayLabels(intl).map((label2) => (0,
|
|
20930
|
+
...weekdayLabels(intl).map((label2) => (0, import_react83.createElement)("span", { key: `w-${label2}`, className: "tdb-cal-weekday" }, label2)),
|
|
20716
20931
|
...cells.map((date, index) => {
|
|
20717
|
-
if (date === null) return (0,
|
|
20932
|
+
if (date === null) return (0, import_react83.createElement)("span", { key: `blank-${index}`, className: "tdb-cal-blank" });
|
|
20718
20933
|
const iso = isoDate(date);
|
|
20719
20934
|
const disabled = min !== void 0 && iso < min || max !== void 0 && iso > max;
|
|
20720
|
-
return (0,
|
|
20935
|
+
return (0, import_react83.createElement)("button", {
|
|
20721
20936
|
key: iso,
|
|
20722
20937
|
type: "button",
|
|
20723
20938
|
className: "tdb-cal-day",
|
|
@@ -20771,14 +20986,14 @@ window.__ModuleLoader__.load({
|
|
|
20771
20986
|
}
|
|
20772
20987
|
|
|
20773
20988
|
// src/client/components/ui/Tabs.tsx
|
|
20774
|
-
var
|
|
20989
|
+
var import_react87 = require("react");
|
|
20775
20990
|
|
|
20776
20991
|
// src/client/beui/components/motion/tabs.tsx
|
|
20777
|
-
var
|
|
20778
|
-
var
|
|
20779
|
-
var TabsCtx = (0,
|
|
20992
|
+
var import_react84 = require("react");
|
|
20993
|
+
var import_react86 = require("react");
|
|
20994
|
+
var TabsCtx = (0, import_react86.createContext)(null);
|
|
20780
20995
|
function useTabs() {
|
|
20781
|
-
const ctx = (0,
|
|
20996
|
+
const ctx = (0, import_react86.useContext)(TabsCtx);
|
|
20782
20997
|
if (!ctx) throw new Error("Tabs.* must be used inside <Tabs>");
|
|
20783
20998
|
return ctx;
|
|
20784
20999
|
}
|
|
@@ -20797,12 +21012,12 @@ window.__ModuleLoader__.load({
|
|
|
20797
21012
|
children,
|
|
20798
21013
|
className
|
|
20799
21014
|
}) {
|
|
20800
|
-
const [internal, setInternal] = (0,
|
|
20801
|
-
const layoutId = (0,
|
|
21015
|
+
const [internal, setInternal] = (0, import_react86.useState)(defaultValue ?? "");
|
|
21016
|
+
const layoutId = (0, import_react86.useId)();
|
|
20802
21017
|
const reduce = useReducedMotion();
|
|
20803
21018
|
const controlled = value !== void 0;
|
|
20804
21019
|
const current2 = controlled ? value : internal;
|
|
20805
|
-
const setValue = (0,
|
|
21020
|
+
const setValue = (0, import_react86.useCallback)(
|
|
20806
21021
|
(v) => {
|
|
20807
21022
|
if (!controlled) setInternal(v);
|
|
20808
21023
|
onValueChange?.(v);
|
|
@@ -20813,13 +21028,13 @@ window.__ModuleLoader__.load({
|
|
|
20813
21028
|
const y = useSpring(0, transition);
|
|
20814
21029
|
const width = useSpring(0, transition);
|
|
20815
21030
|
const height = useSpring(0, transition);
|
|
20816
|
-
const track = (0,
|
|
20817
|
-
const [placed, setPlaced] = (0,
|
|
20818
|
-
const [tabs, setTabs] = (0,
|
|
20819
|
-
const registerTab = (0,
|
|
21031
|
+
const track = (0, import_react86.useMemo)(() => ({ x, y, width, height }), [x, y, width, height]);
|
|
21032
|
+
const [placed, setPlaced] = (0, import_react86.useState)(false);
|
|
21033
|
+
const [tabs, setTabs] = (0, import_react86.useState)(/* @__PURE__ */ new Map());
|
|
21034
|
+
const registerTab = (0, import_react86.useCallback)((tab, disabled) => {
|
|
20820
21035
|
setTabs((map) => map.get(tab) === disabled ? map : new Map(map).set(tab, disabled));
|
|
20821
21036
|
}, []);
|
|
20822
|
-
const unregisterTab = (0,
|
|
21037
|
+
const unregisterTab = (0, import_react86.useCallback)((tab) => {
|
|
20823
21038
|
setTabs((map) => {
|
|
20824
21039
|
if (!map.has(tab)) return map;
|
|
20825
21040
|
const next = new Map(map);
|
|
@@ -20827,11 +21042,11 @@ window.__ModuleLoader__.load({
|
|
|
20827
21042
|
return next;
|
|
20828
21043
|
});
|
|
20829
21044
|
}, []);
|
|
20830
|
-
const [panels, setPanels] = (0,
|
|
20831
|
-
const registerPanel = (0,
|
|
21045
|
+
const [panels, setPanels] = (0, import_react86.useState)(/* @__PURE__ */ new Set());
|
|
21046
|
+
const registerPanel = (0, import_react86.useCallback)((panel) => {
|
|
20832
21047
|
setPanels((set) => set.has(panel) ? set : new Set(set).add(panel));
|
|
20833
21048
|
}, []);
|
|
20834
|
-
const unregisterPanel = (0,
|
|
21049
|
+
const unregisterPanel = (0, import_react86.useCallback)((panel) => {
|
|
20835
21050
|
setPanels((set) => {
|
|
20836
21051
|
if (!set.has(panel)) return set;
|
|
20837
21052
|
const next = new Set(set);
|
|
@@ -20844,10 +21059,10 @@ window.__ModuleLoader__.load({
|
|
|
20844
21059
|
const enabled = Array.from(tabs).filter(([, disabled]) => !disabled);
|
|
20845
21060
|
tabStop = enabled.some(([tab]) => tab === current2) ? current2 : enabled[0]?.[0] ?? "";
|
|
20846
21061
|
}
|
|
20847
|
-
const baseId = (0,
|
|
20848
|
-
const tabId = (0,
|
|
20849
|
-
const panelId = (0,
|
|
20850
|
-
const contextValue = (0,
|
|
21062
|
+
const baseId = (0, import_react86.useId)();
|
|
21063
|
+
const tabId = (0, import_react86.useCallback)((tab) => `${baseId}-tab-${tab.replace(/[^\w-]/g, "_")}`, [baseId]);
|
|
21064
|
+
const panelId = (0, import_react86.useCallback)((tab) => `${baseId}-panel-${tab.replace(/[^\w-]/g, "_")}`, [baseId]);
|
|
21065
|
+
const contextValue = (0, import_react86.useMemo)(
|
|
20851
21066
|
() => ({
|
|
20852
21067
|
value: current2,
|
|
20853
21068
|
setValue,
|
|
@@ -20868,7 +21083,7 @@ window.__ModuleLoader__.load({
|
|
|
20868
21083
|
}),
|
|
20869
21084
|
[current2, icons, layoutId, setValue, variant, track, placed, tabStop, registerTab, unregisterTab, panels, registerPanel, unregisterPanel, tabId, panelId]
|
|
20870
21085
|
);
|
|
20871
|
-
return /* @__PURE__ */ (0,
|
|
21086
|
+
return /* @__PURE__ */ (0, import_react84.createElement)(MotionConfig, { transition: reduce ? { duration: 0 } : transition }, /* @__PURE__ */ (0, import_react84.createElement)(TabsCtx.Provider, { value: contextValue }, /* @__PURE__ */ (0, import_react84.createElement)(motion2.div, { layoutRoot: true, className }, children)));
|
|
20872
21087
|
}
|
|
20873
21088
|
var listClasses = {
|
|
20874
21089
|
pill: "inline-flex items-center gap-1 rounded-full bg-card p-1",
|
|
@@ -20885,12 +21100,12 @@ window.__ModuleLoader__.load({
|
|
|
20885
21100
|
const { variant, value, icons, track, placed, setPlaced } = useTabs();
|
|
20886
21101
|
const reduce = useReducedMotion();
|
|
20887
21102
|
const tracked = icons === "selected" && variant !== "underline";
|
|
20888
|
-
const rootRef = (0,
|
|
20889
|
-
const viewportRef = (0,
|
|
20890
|
-
const listRef = (0,
|
|
20891
|
-
const viewportId = (0,
|
|
20892
|
-
const [edges, setEdges] = (0,
|
|
20893
|
-
const measure = (0,
|
|
21103
|
+
const rootRef = (0, import_react86.useRef)(null);
|
|
21104
|
+
const viewportRef = (0, import_react86.useRef)(null);
|
|
21105
|
+
const listRef = (0, import_react86.useRef)(null);
|
|
21106
|
+
const viewportId = (0, import_react86.useId)();
|
|
21107
|
+
const [edges, setEdges] = (0, import_react86.useState)({ overflow: false, left: false, right: false });
|
|
21108
|
+
const measure = (0, import_react86.useCallback)(() => {
|
|
20894
21109
|
const root = rootRef.current;
|
|
20895
21110
|
const viewport = viewportRef.current;
|
|
20896
21111
|
if (!root || !viewport) return;
|
|
@@ -20901,7 +21116,7 @@ window.__ModuleLoader__.load({
|
|
|
20901
21116
|
const next = { overflow, left: fromLeft > 1, right: fromLeft < max - 1 };
|
|
20902
21117
|
setEdges((previous) => previous.overflow === next.overflow && previous.left === next.left && previous.right === next.right ? previous : next);
|
|
20903
21118
|
}, []);
|
|
20904
|
-
const reveal = (0,
|
|
21119
|
+
const reveal = (0, import_react86.useCallback)((tab) => {
|
|
20905
21120
|
const viewport = viewportRef.current;
|
|
20906
21121
|
if (!viewport || !tab) return;
|
|
20907
21122
|
const frame2 = viewport.getBoundingClientRect();
|
|
@@ -20914,7 +21129,7 @@ window.__ModuleLoader__.load({
|
|
|
20914
21129
|
const delta = item.left < left ? item.left - left : item.right > right ? item.right - right : 0;
|
|
20915
21130
|
if (delta) viewport.scrollBy({ left: delta, behavior: reduce ? "instant" : "smooth" });
|
|
20916
21131
|
}, [reduce]);
|
|
20917
|
-
(0,
|
|
21132
|
+
(0, import_react86.useLayoutEffect)(() => {
|
|
20918
21133
|
const root = rootRef.current;
|
|
20919
21134
|
const viewport = viewportRef.current;
|
|
20920
21135
|
const list = listRef.current;
|
|
@@ -20934,14 +21149,14 @@ window.__ModuleLoader__.load({
|
|
|
20934
21149
|
viewport.removeEventListener("scroll", measure);
|
|
20935
21150
|
};
|
|
20936
21151
|
}, [measure, reveal]);
|
|
20937
|
-
(0,
|
|
21152
|
+
(0, import_react86.useLayoutEffect)(() => {
|
|
20938
21153
|
void children;
|
|
20939
21154
|
void value;
|
|
20940
21155
|
void edges.overflow;
|
|
20941
21156
|
measure();
|
|
20942
21157
|
reveal(listRef.current?.querySelector('[role="tab"][aria-selected="true"]') ?? null);
|
|
20943
21158
|
}, [children, value, edges.overflow, measure, reveal]);
|
|
20944
|
-
(0,
|
|
21159
|
+
(0, import_react86.useLayoutEffect)(() => {
|
|
20945
21160
|
if (!tracked) return;
|
|
20946
21161
|
const list = listRef.current;
|
|
20947
21162
|
if (!list) return;
|
|
@@ -20979,7 +21194,7 @@ window.__ModuleLoader__.load({
|
|
|
20979
21194
|
for (const tab of list.querySelectorAll('[role="tab"]')) if (tab.parentElement) observer2.observe(tab.parentElement);
|
|
20980
21195
|
return () => observer2.disconnect();
|
|
20981
21196
|
}, [tracked, value, children, reduce, track, setPlaced]);
|
|
20982
|
-
(0,
|
|
21197
|
+
(0, import_react86.useLayoutEffect)(() => {
|
|
20983
21198
|
if (variant === "underline") return;
|
|
20984
21199
|
const list = listRef.current;
|
|
20985
21200
|
if (!list) return;
|
|
@@ -21051,7 +21266,7 @@ window.__ModuleLoader__.load({
|
|
|
21051
21266
|
};
|
|
21052
21267
|
const controlClass = "absolute inset-y-0 z-20 inline-flex w-9 items-center justify-center text-foreground transition-opacity hover:opacity-70 focus-visible:outline-2 focus-visible:-outline-offset-4 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-0";
|
|
21053
21268
|
const surfaceClass = variant === "pill" ? "rounded-full bg-card" : variant === "segment" ? "rounded-lg bg-card" : "";
|
|
21054
|
-
return /* @__PURE__ */ (0,
|
|
21269
|
+
return /* @__PURE__ */ (0, import_react84.createElement)("div", { ref: rootRef, className: cn("relative isolate flex w-full max-w-full min-w-0 items-center", edges.overflow && surfaceClass, wrapperClassName) }, edges.overflow && /* @__PURE__ */ (0, import_react84.createElement)("button", { type: "button", "aria-label": "Scroll tabs left", "aria-controls": viewportId, disabled: !edges.left, onClick: () => scroll(-1), className: cn(controlClass, "left-0 rounded-l-full") }, /* @__PURE__ */ (0, import_react84.createElement)(ChevronLeft, { size: 20, "aria-hidden": "true" })), /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21055
21270
|
motion2.div,
|
|
21056
21271
|
{
|
|
21057
21272
|
ref: viewportRef,
|
|
@@ -21065,17 +21280,17 @@ window.__ModuleLoader__.load({
|
|
|
21065
21280
|
if (event.target instanceof HTMLElement && event.target.getAttribute("role") === "tab") reveal(event.target);
|
|
21066
21281
|
}
|
|
21067
21282
|
},
|
|
21068
|
-
/* @__PURE__ */ (0,
|
|
21069
|
-
), edges.overflow && edges.left && /* @__PURE__ */ (0,
|
|
21283
|
+
/* @__PURE__ */ (0, import_react84.createElement)("div", { ...props, ref: listRef, role: "tablist", onKeyDown: onListKeyDown, className: cn(listClasses[variant], "w-max", tracked && "relative", className) }, children)
|
|
21284
|
+
), edges.overflow && edges.left && /* @__PURE__ */ (0, import_react84.createElement)("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 left-0 z-10 w-10 rounded-l-[inherit] backdrop-blur-[2px] [mask-image:linear-gradient(to_right,black,transparent)]" }), edges.overflow && edges.right && /* @__PURE__ */ (0, import_react84.createElement)("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 right-0 z-10 w-10 rounded-r-[inherit] backdrop-blur-[2px] [mask-image:linear-gradient(to_left,black,transparent)]" }), edges.overflow && /* @__PURE__ */ (0, import_react84.createElement)("button", { type: "button", "aria-label": "Scroll tabs right", "aria-controls": viewportId, disabled: !edges.right, onClick: () => scroll(1), className: cn(controlClass, "right-0 rounded-r-full") }, /* @__PURE__ */ (0, import_react84.createElement)(ChevronRight, { size: 20, "aria-hidden": "true" })));
|
|
21070
21285
|
}
|
|
21071
21286
|
var ICON_GAP = 6;
|
|
21072
21287
|
function TriggerIcon({ icon, active: active2 }) {
|
|
21073
21288
|
const { icons } = useTabs();
|
|
21074
21289
|
const reduce = useReducedMotion();
|
|
21075
21290
|
if (icons === "always") {
|
|
21076
|
-
return /* @__PURE__ */ (0,
|
|
21291
|
+
return /* @__PURE__ */ (0, import_react84.createElement)("span", { "aria-hidden": "true", className: "mr-1.5 inline-flex shrink-0 items-center" }, icon);
|
|
21077
21292
|
}
|
|
21078
|
-
return /* @__PURE__ */ (0,
|
|
21293
|
+
return /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21079
21294
|
motion2.span,
|
|
21080
21295
|
{
|
|
21081
21296
|
"aria-hidden": "true",
|
|
@@ -21119,19 +21334,19 @@ window.__ModuleLoader__.load({
|
|
|
21119
21334
|
} = useTabs();
|
|
21120
21335
|
const active2 = current2 === value;
|
|
21121
21336
|
const disabled = Boolean(props.disabled);
|
|
21122
|
-
(0,
|
|
21337
|
+
(0, import_react86.useLayoutEffect)(() => {
|
|
21123
21338
|
registerTab(value, disabled);
|
|
21124
21339
|
}, [registerTab, value, disabled]);
|
|
21125
|
-
(0,
|
|
21340
|
+
(0, import_react86.useLayoutEffect)(() => () => unregisterTab(value), [unregisterTab, value]);
|
|
21126
21341
|
const a11y = {
|
|
21127
21342
|
id: tabId(value),
|
|
21128
21343
|
"aria-controls": panels.has(value) ? panelId(value) : void 0,
|
|
21129
21344
|
tabIndex: !disabled && (tabStop === null || tabStop === value) ? 0 : -1
|
|
21130
21345
|
};
|
|
21131
|
-
const content = icon ? /* @__PURE__ */ (0,
|
|
21132
|
-
const [initialClip] = (0,
|
|
21346
|
+
const content = icon ? /* @__PURE__ */ (0, import_react84.createElement)(import_react84.Fragment, null, /* @__PURE__ */ (0, import_react84.createElement)(TriggerIcon, { icon, active: active2 }), children) : children;
|
|
21347
|
+
const [initialClip] = (0, import_react86.useState)(() => active2 ? "inset(0)" : "inset(0 100% 0 0)");
|
|
21133
21348
|
if (variant === "underline") {
|
|
21134
|
-
return /* @__PURE__ */ (0,
|
|
21349
|
+
return /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21135
21350
|
"button",
|
|
21136
21351
|
{
|
|
21137
21352
|
...a11y,
|
|
@@ -21150,7 +21365,7 @@ window.__ModuleLoader__.load({
|
|
|
21150
21365
|
)
|
|
21151
21366
|
},
|
|
21152
21367
|
content,
|
|
21153
|
-
active2 ? /* @__PURE__ */ (0,
|
|
21368
|
+
active2 ? /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21154
21369
|
motion2.span,
|
|
21155
21370
|
{
|
|
21156
21371
|
layoutId,
|
|
@@ -21165,7 +21380,7 @@ window.__ModuleLoader__.load({
|
|
|
21165
21380
|
}
|
|
21166
21381
|
const radius = variant === "pill" ? "rounded-full" : "rounded-md";
|
|
21167
21382
|
const tracked = icons === "selected" && placed;
|
|
21168
|
-
return /* @__PURE__ */ (0,
|
|
21383
|
+
return /* @__PURE__ */ (0, import_react84.createElement)("div", { className: cn("shrink-0", !tracked && "relative") }, active2 && tracked ? /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21169
21384
|
motion2.span,
|
|
21170
21385
|
{
|
|
21171
21386
|
key: "tracked",
|
|
@@ -21173,7 +21388,7 @@ window.__ModuleLoader__.load({
|
|
|
21173
21388
|
style: { ...track, borderRadius: variant === "pill" ? 9999 : 8 },
|
|
21174
21389
|
className: cn("absolute top-0 left-0 bg-primary", radius, indicatorClassName)
|
|
21175
21390
|
}
|
|
21176
|
-
) : active2 ? /* @__PURE__ */ (0,
|
|
21391
|
+
) : active2 ? /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21177
21392
|
motion2.span,
|
|
21178
21393
|
{
|
|
21179
21394
|
key: "layout",
|
|
@@ -21187,7 +21402,7 @@ window.__ModuleLoader__.load({
|
|
|
21187
21402
|
indicatorClassName
|
|
21188
21403
|
)
|
|
21189
21404
|
}
|
|
21190
|
-
) : null, /* @__PURE__ */ (0,
|
|
21405
|
+
) : null, /* @__PURE__ */ (0, import_react84.createElement)(
|
|
21191
21406
|
"button",
|
|
21192
21407
|
{
|
|
21193
21408
|
...a11y,
|
|
@@ -21208,7 +21423,7 @@ window.__ModuleLoader__.load({
|
|
|
21208
21423
|
)
|
|
21209
21424
|
},
|
|
21210
21425
|
content,
|
|
21211
|
-
/* @__PURE__ */ (0,
|
|
21426
|
+
/* @__PURE__ */ (0, import_react84.createElement)(
|
|
21212
21427
|
"span",
|
|
21213
21428
|
{
|
|
21214
21429
|
"data-tabs-label": "",
|
|
@@ -21230,14 +21445,14 @@ window.__ModuleLoader__.load({
|
|
|
21230
21445
|
ariaLabel,
|
|
21231
21446
|
kind = "range"
|
|
21232
21447
|
}) {
|
|
21233
|
-
return (0,
|
|
21448
|
+
return (0, import_react87.createElement)(Tabs, {
|
|
21234
21449
|
value,
|
|
21235
21450
|
onValueChange: (next) => onChange(next),
|
|
21236
21451
|
variant: kind === "view" ? "segment" : "pill",
|
|
21237
|
-
children: (0,
|
|
21452
|
+
children: (0, import_react87.createElement)(TabsList, {
|
|
21238
21453
|
className: kind === "view" ? "tdb-view" : "tdb-range",
|
|
21239
21454
|
"aria-label": ariaLabel,
|
|
21240
|
-
children: items.map((item) => (0,
|
|
21455
|
+
children: items.map((item) => (0, import_react87.createElement)(TabsTrigger, {
|
|
21241
21456
|
key: item.id,
|
|
21242
21457
|
value: item.id,
|
|
21243
21458
|
className: kind === "view" ? "tdb-view-btn" : "tdb-range-btn",
|
|
@@ -21282,25 +21497,25 @@ window.__ModuleLoader__.load({
|
|
|
21282
21497
|
}
|
|
21283
21498
|
onRangeChange({ id: id3, from: range.from, to: range.to });
|
|
21284
21499
|
};
|
|
21285
|
-
return (0,
|
|
21500
|
+
return (0, import_react88.createElement)(
|
|
21286
21501
|
Section,
|
|
21287
21502
|
{
|
|
21288
21503
|
ariaLabel: t("trend.title"),
|
|
21289
|
-
actions: (0,
|
|
21504
|
+
actions: (0, import_react88.createElement)(SegmentedTabs, {
|
|
21290
21505
|
items: rangeTabs,
|
|
21291
21506
|
value: range.id,
|
|
21292
21507
|
onChange: chooseRange,
|
|
21293
21508
|
ariaLabel: t("range.label")
|
|
21294
21509
|
})
|
|
21295
21510
|
},
|
|
21296
|
-
range.id === "custom" ? (0,
|
|
21511
|
+
range.id === "custom" ? (0, import_react88.createElement)(
|
|
21297
21512
|
"div",
|
|
21298
21513
|
{ className: "tdb-custom-range" },
|
|
21299
|
-
(0,
|
|
21514
|
+
(0, import_react88.createElement)(
|
|
21300
21515
|
"label",
|
|
21301
21516
|
{ className: "tdb-date" },
|
|
21302
21517
|
t("range.from"),
|
|
21303
|
-
(0,
|
|
21518
|
+
(0, import_react88.createElement)(DatePicker, {
|
|
21304
21519
|
value: range.from,
|
|
21305
21520
|
ariaLabel: t("range.from"),
|
|
21306
21521
|
intl,
|
|
@@ -21310,11 +21525,11 @@ window.__ModuleLoader__.load({
|
|
|
21310
21525
|
onChange: (value) => onRangeChange({ ...range, id: "custom", from: value })
|
|
21311
21526
|
})
|
|
21312
21527
|
),
|
|
21313
|
-
(0,
|
|
21528
|
+
(0, import_react88.createElement)(
|
|
21314
21529
|
"label",
|
|
21315
21530
|
{ className: "tdb-date" },
|
|
21316
21531
|
t("range.to"),
|
|
21317
|
-
(0,
|
|
21532
|
+
(0, import_react88.createElement)(DatePicker, {
|
|
21318
21533
|
value: range.to,
|
|
21319
21534
|
ariaLabel: t("range.to"),
|
|
21320
21535
|
intl,
|
|
@@ -21325,17 +21540,17 @@ window.__ModuleLoader__.load({
|
|
|
21325
21540
|
})
|
|
21326
21541
|
)
|
|
21327
21542
|
) : null,
|
|
21328
|
-
(0,
|
|
21543
|
+
(0, import_react88.createElement)(
|
|
21329
21544
|
"div",
|
|
21330
21545
|
{ className: "tdb-chart-toolbar" },
|
|
21331
|
-
(0,
|
|
21546
|
+
(0, import_react88.createElement)(SegmentedTabs, {
|
|
21332
21547
|
items: views,
|
|
21333
21548
|
value: view,
|
|
21334
21549
|
onChange: onViewChange,
|
|
21335
21550
|
ariaLabel: t("trend.views"),
|
|
21336
21551
|
kind: "view"
|
|
21337
21552
|
}),
|
|
21338
|
-
(0,
|
|
21553
|
+
(0, import_react88.createElement)(
|
|
21339
21554
|
"div",
|
|
21340
21555
|
{ className: "tdb-chart-summary" },
|
|
21341
21556
|
t("trend.rangeTotal", {
|
|
@@ -21344,8 +21559,8 @@ window.__ModuleLoader__.load({
|
|
|
21344
21559
|
})
|
|
21345
21560
|
)
|
|
21346
21561
|
),
|
|
21347
|
-
view === "io" ? (0,
|
|
21348
|
-
(0,
|
|
21562
|
+
view === "io" ? (0, import_react88.createElement)(GroupedBars, { buckets: result.buckets, granularity: result.granularity, t, intl }) : (0, import_react88.createElement)(CacheChart, { buckets: result.buckets, granularity: result.granularity, t, intl }),
|
|
21563
|
+
(0, import_react88.createElement)(Legend, {
|
|
21349
21564
|
items: view === "io" ? [
|
|
21350
21565
|
{ label: t("legend.input"), color: "var(--tdb-cat-input)" },
|
|
21351
21566
|
{ label: t("legend.output"), color: "var(--tdb-cat-output)" }
|
|
@@ -21358,13 +21573,13 @@ window.__ModuleLoader__.load({
|
|
|
21358
21573
|
);
|
|
21359
21574
|
}
|
|
21360
21575
|
function Legend({ items }) {
|
|
21361
|
-
return (0,
|
|
21576
|
+
return (0, import_react88.createElement)(
|
|
21362
21577
|
"div",
|
|
21363
21578
|
{ className: "tdb-legend" },
|
|
21364
|
-
items.map((item) => (0,
|
|
21579
|
+
items.map((item) => (0, import_react88.createElement)(
|
|
21365
21580
|
"span",
|
|
21366
21581
|
{ key: item.label, className: "tdb-legend-item" },
|
|
21367
|
-
(0,
|
|
21582
|
+
(0, import_react88.createElement)("span", {
|
|
21368
21583
|
className: `tdb-legend-dot${item.line === true ? " tdb-legend-dot--line" : ""}`,
|
|
21369
21584
|
style: { background: item.color }
|
|
21370
21585
|
}),
|
|
@@ -21374,16 +21589,16 @@ window.__ModuleLoader__.load({
|
|
|
21374
21589
|
}
|
|
21375
21590
|
|
|
21376
21591
|
// src/client/components/ui/PageTabs.tsx
|
|
21377
|
-
var
|
|
21592
|
+
var import_react89 = require("react");
|
|
21378
21593
|
function PageTabs({ items, value, onChange, ariaLabel }) {
|
|
21379
|
-
return (0,
|
|
21594
|
+
return (0, import_react89.createElement)(Tabs, {
|
|
21380
21595
|
value,
|
|
21381
21596
|
onValueChange: (next) => onChange(next),
|
|
21382
21597
|
variant: "underline",
|
|
21383
|
-
children: (0,
|
|
21598
|
+
children: (0, import_react89.createElement)(TabsList, {
|
|
21384
21599
|
className: "tdb-pagetabs",
|
|
21385
21600
|
"aria-label": ariaLabel,
|
|
21386
|
-
children: items.map((item) => (0,
|
|
21601
|
+
children: items.map((item) => (0, import_react89.createElement)(TabsTrigger, {
|
|
21387
21602
|
key: item.id,
|
|
21388
21603
|
value: item.id,
|
|
21389
21604
|
id: `tdb-tab-${item.id}`,
|
|
@@ -21396,7 +21611,7 @@ window.__ModuleLoader__.load({
|
|
|
21396
21611
|
}
|
|
21397
21612
|
|
|
21398
21613
|
// src/client/usePricing.ts
|
|
21399
|
-
var
|
|
21614
|
+
var import_react90 = require("react");
|
|
21400
21615
|
var EMPTY_ONLINE = { prices: {}, source: "", fetchedAt: 0 };
|
|
21401
21616
|
function loadOnline() {
|
|
21402
21617
|
try {
|
|
@@ -21406,24 +21621,24 @@ window.__ModuleLoader__.load({
|
|
|
21406
21621
|
}
|
|
21407
21622
|
}
|
|
21408
21623
|
function usePricing() {
|
|
21409
|
-
const [pricing, setPricing] = (0,
|
|
21624
|
+
const [pricing, setPricing] = (0, import_react90.useState)(() => {
|
|
21410
21625
|
try {
|
|
21411
21626
|
return parsePricing(localStorage.getItem(PRICING_KEY));
|
|
21412
21627
|
} catch {
|
|
21413
21628
|
return {};
|
|
21414
21629
|
}
|
|
21415
21630
|
});
|
|
21416
|
-
const [onlineState, setOnlineState] = (0,
|
|
21417
|
-
const [refreshingOnline, setRefreshingOnline] = (0,
|
|
21418
|
-
const [onlineError, setOnlineError] = (0,
|
|
21419
|
-
const savePricing = (0,
|
|
21631
|
+
const [onlineState, setOnlineState] = (0, import_react90.useState)(loadOnline);
|
|
21632
|
+
const [refreshingOnline, setRefreshingOnline] = (0, import_react90.useState)(false);
|
|
21633
|
+
const [onlineError, setOnlineError] = (0, import_react90.useState)(false);
|
|
21634
|
+
const savePricing = (0, import_react90.useCallback)((table) => {
|
|
21420
21635
|
setPricing(table);
|
|
21421
21636
|
try {
|
|
21422
21637
|
localStorage.setItem(PRICING_KEY, serializePricing(table));
|
|
21423
21638
|
} catch {
|
|
21424
21639
|
}
|
|
21425
21640
|
}, []);
|
|
21426
|
-
const refreshOnline = (0,
|
|
21641
|
+
const refreshOnline = (0, import_react90.useCallback)(async (models, options = {}) => {
|
|
21427
21642
|
const names = [...new Set(
|
|
21428
21643
|
models.map((model) => model.model.trim()).filter((model) => model !== "")
|
|
21429
21644
|
)].slice(0, 100);
|
|
@@ -21465,7 +21680,7 @@ window.__ModuleLoader__.load({
|
|
|
21465
21680
|
}
|
|
21466
21681
|
|
|
21467
21682
|
// src/client/language.ts
|
|
21468
|
-
var
|
|
21683
|
+
var import_react91 = require("react");
|
|
21469
21684
|
var LANGUAGE_KEY = "dsh-token-dashboard:language:v1";
|
|
21470
21685
|
var current = "en";
|
|
21471
21686
|
var initialized = false;
|
|
@@ -21520,7 +21735,7 @@ window.__ModuleLoader__.load({
|
|
|
21520
21735
|
return () => listeners.delete(listener);
|
|
21521
21736
|
}
|
|
21522
21737
|
function useLanguage() {
|
|
21523
|
-
return (0,
|
|
21738
|
+
return (0, import_react91.useSyncExternalStore)(subscribeLanguage, getLanguage, getLanguage);
|
|
21524
21739
|
}
|
|
21525
21740
|
|
|
21526
21741
|
// src/client/locales.ts
|
|
@@ -21555,6 +21770,7 @@ window.__ModuleLoader__.load({
|
|
|
21555
21770
|
"tabs.models": "Models",
|
|
21556
21771
|
"tabs.sessions": "Sessions",
|
|
21557
21772
|
"tabs.costs": "Costs",
|
|
21773
|
+
"tabs.pricing": "Rates",
|
|
21558
21774
|
"tabs.requests": "Request log",
|
|
21559
21775
|
"trend.title": "Usage",
|
|
21560
21776
|
"trend.views": "Chart view",
|
|
@@ -21699,6 +21915,7 @@ window.__ModuleLoader__.load({
|
|
|
21699
21915
|
"tabs.models": "\u6A21\u578B",
|
|
21700
21916
|
"tabs.sessions": "\u4F1A\u8BDD",
|
|
21701
21917
|
"tabs.costs": "\u8D39\u7528",
|
|
21918
|
+
"tabs.pricing": "\u5355\u4EF7",
|
|
21702
21919
|
"tabs.requests": "\u8BF7\u6C42\u65E5\u5FD7",
|
|
21703
21920
|
"trend.title": "\u7528\u91CF",
|
|
21704
21921
|
"trend.views": "\u56FE\u8868\u89C6\u56FE",
|
|
@@ -22224,6 +22441,8 @@ window.__ModuleLoader__.load({
|
|
|
22224
22441
|
color: var(--tdb-ink-2);
|
|
22225
22442
|
}
|
|
22226
22443
|
.tdb-pager-actions { display: flex; align-items: center; gap: 4px; }
|
|
22444
|
+
.tdb-pager ul, .tdb-pager li { margin: 0; padding: 0; list-style: none; }
|
|
22445
|
+
.tdb-pager li::marker { content: ''; }
|
|
22227
22446
|
|
|
22228
22447
|
.tdb-empty {
|
|
22229
22448
|
display: flex;
|
|
@@ -22398,7 +22617,9 @@ window.__ModuleLoader__.load({
|
|
|
22398
22617
|
}
|
|
22399
22618
|
.tdb-menu-item:hover { background: var(--tdb-surface-2); }
|
|
22400
22619
|
|
|
22401
|
-
.tdb-pricing-
|
|
22620
|
+
.tdb-pricing-page { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
|
|
22621
|
+
.tdb-pricing-wrap { flex: 0 1 auto; min-height: 0; overflow: hidden; }
|
|
22622
|
+
.tdb-pricing-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap; margin-top: auto; padding-top: 14px; }
|
|
22402
22623
|
.tdb-pricing-grid {
|
|
22403
22624
|
display: grid;
|
|
22404
22625
|
grid-template-columns: 1.6fr 0.7fr repeat(4, minmax(0, 0.6fr));
|
|
@@ -22537,20 +22758,20 @@ window.__ModuleLoader__.load({
|
|
|
22537
22758
|
`;
|
|
22538
22759
|
|
|
22539
22760
|
// src/client/beui-css.ts
|
|
22540
|
-
var BEUI_CSS = "/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-success:var(--tdb-success)}}@layer base{.tdb-root button,.tdb-root input{color:inherit;font:inherit;background:0 0;border:0}.tdb-root *,.tdb-root :before,.tdb-root :after{border-style:solid;border-width:0}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-4{inset:calc(var(--spacing) * 4)}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\\/2{top:50%}.top-full{top:100%}.right-0{right:0}.right-3\\.5{right:calc(var(--spacing) * 3.5)}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\\[80\\]{z-index:80}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1\\.5{margin:calc(var(--spacing) * -1.5)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.-mb-px{margin-bottom:-1px}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.h-px{height:1px}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\\[44px\\]{min-height:44px}.w-3\\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[85vw\\]{max-width:85vw}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-8{min-width:calc(var(--spacing) * 8)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, )}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.\\[gap\\:inherit\\]{gap:inherit}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.\\[border-radius\\:inherit\\]{border-radius:inherit}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\[inherit\\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-\\[inherit\\]{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.rounded-l-full{border-top-left-radius:2147483647px;border-bottom-left-radius:2147483647px}.rounded-r-\\[inherit\\]{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.rounded-r-full{border-top-right-radius:2147483647px;border-bottom-right-radius:2147483647px}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--tdb-line)}.border-destructive{border-color:var(--tdb-error)}.border-foreground\\/40{border-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/40{border-color:color-mix(in oklab, var(--tdb-ink) 40%, transparent)}}.bg-amber-500\\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background,.bg-background\\/5{background-color:var(--tdb-surface)}@supports (color:color-mix(in lab, red, red)){.bg-background\\/5{background-color:color-mix(in oklab, var(--tdb-surface) 5%, transparent)}}.bg-black\\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-card{background-color:var(--tdb-surface)}.bg-current{background-color:currentColor}.bg-destructive\\/5{background-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/5{background-color:color-mix(in oklab, var(--tdb-error) 5%, transparent)}}.bg-emerald-500\\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-foreground{background-color:var(--tdb-ink)}.bg-muted{background-color:var(--tdb-surface-2)}.bg-primary,.bg-primary\\/5{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/5{background-color:color-mix(in oklab, var(--tdb-brand) 5%, transparent)}}.bg-transparent{background-color:#0000}.\\[mask-image\\:linear-gradient\\(to_left\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(270deg,#000,#0000);mask-image:linear-gradient(270deg,#000,#0000)}.\\[mask-image\\:linear-gradient\\(to_right\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000,#0000);mask-image:linear-gradient(90deg,#000,#0000)}.\\[padding\\:inherit\\]{padding:inherit}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pr-3\\.5{padding-right:calc(var(--spacing) * 3.5)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2\\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3\\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-left{text-align:left}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-pretty{text-wrap:pretty}.whitespace-nowrap{white-space:nowrap}.text-\\(--color-success\\){color:var(--color-success)}.text-amber-800{color:var(--color-amber-800)}.text-background{color:var(--tdb-surface)}.text-destructive{color:var(--tdb-error)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--tdb-ink)}.text-muted-foreground{color:var(--tdb-ink-2)}.text-primary{color:var(--tdb-brand)}.text-primary-foreground{color:var(--dsw-alias-bg-base,#fff)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.underline{text-decoration-line:underline}.caret-foreground{caret-color:var(--tdb-ink)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-destructive\\/25{--tw-ring-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.ring-destructive\\/25{--tw-ring-color:color-mix(in oklab, var(--tdb-error) 25%, transparent)}}.ring-ring\\/40{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.ring-ring\\/40{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, )}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.\\[backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%);backdrop-filter:blur(14px)saturate(140%)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\,transform\\]{transition-property:color,background-color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-webkit-backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%)}@media (hover:hover){:is(:where(.group):hover .group-hover\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:opacity-0){opacity:0}:is(:where(.group):hover .group-hover\\:opacity-100){opacity:1}}:is(:where(.group):focus-visible .group-focus-visible\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-0){opacity:0}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-100){opacity:1}.placeholder\\:text-muted-foreground\\/60::placeholder{color:var(--tdb-ink-2)}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-muted-foreground\\/60::placeholder{color:color-mix(in oklab, var(--tdb-ink-2) 60%, transparent)}}@media (hover:hover){.hover\\:border-\\(--color-border-strong\\):hover{border-color:var(--color-border-strong)}.hover\\:border-border:hover{border-color:var(--tdb-line)}.hover\\:bg-foreground\\/5:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/5:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-muted:hover,.hover\\:bg-muted\\/60:hover{background-color:var(--tdb-surface-2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/60:hover{background-color:color-mix(in oklab, var(--tdb-surface-2) 60%, transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--tdb-brand) 90%, transparent)}}.hover\\:text-foreground:hover{color:var(--tdb-ink)}.hover\\:opacity-70:hover{opacity:.7}}.focus-visible\\:bg-muted:focus-visible{background-color:var(--tdb-surface-2)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-ink) 20%, transparent)}}.focus-visible\\:ring-ring:focus-visible,.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:-outline-offset-4:focus-visible{outline-offset:calc(4px * -1)}.focus-visible\\:outline-ring:focus-visible{outline-color:var(--tdb-brand)}.active\\:scale-\\[0\\.94\\]:active{scale:.94}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:opacity-0:disabled{opacity:0}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transform-none{transform:none}.motion-reduce\\:active\\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@media (min-width:40rem){.sm\\:h-9{height:calc(var(--spacing) * 9)}.sm\\:min-w-9{min-width:calc(var(--spacing) * 9)}.sm\\:gap-1{gap:var(--spacing)}}@media (prefers-color-scheme:dark){.dark\\:text-amber-300{color:var(--color-amber-300)}.dark\\:text-emerald-400{color:var(--color-emerald-400)}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}.\\[\\&_button\\]\\:grid button{display:grid}.\\[\\&_button\\]\\:size-11 button{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.\\[\\&_button\\]\\:place-items-center button{place-items:center}.\\[\\&_svg\\]\\:h-4 svg{height:calc(var(--spacing) * 4)}.\\[\\&_svg\\]\\:w-4 svg{width:calc(var(--spacing) * 4)}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.tdb-root button,.tdb-root input{font:inherit}.tdb-root{--color-background:var(--tdb-surface);--color-foreground:var(--tdb-ink);--color-card:var(--tdb-surface);--color-card-foreground:var(--tdb-ink);--color-popover:var(--tdb-surface);--color-popover-foreground:var(--tdb-ink);--color-primary:var(--tdb-brand);--color-primary-foreground:var(--dsw-alias-bg-base,#fff);--color-secondary:var(--tdb-surface-2);--color-secondary-foreground:var(--tdb-ink);--color-muted:var(--tdb-surface-2);--color-muted-foreground:var(--tdb-ink-2);--color-accent:var(--tdb-surface-2);--color-accent-foreground:var(--tdb-ink);--color-border:var(--tdb-line);--color-input:var(--tdb-line-strong);--color-ring:var(--tdb-brand);--color-destructive:var(--tdb-error);--color-success:var(--tdb-success)}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}";
|
|
22761
|
+
var BEUI_CSS = "/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-success:var(--tdb-success)}}@layer base{.tdb-root button,.tdb-root input{color:inherit;font:inherit;background:0 0;border:0}.tdb-root *,.tdb-root :before,.tdb-root :after{border-style:solid;border-width:0}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-4{inset:calc(var(--spacing) * 4)}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\\/2{top:50%}.top-full{top:100%}.right-0{right:0}.right-3\\.5{right:calc(var(--spacing) * 3.5)}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\\[80\\]{z-index:80}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1\\.5{margin:calc(var(--spacing) * -1.5)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.-mb-px{margin-bottom:-1px}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.h-px{height:1px}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\\[44px\\]{min-height:44px}.w-3\\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[85vw\\]{max-width:85vw}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-8{min-width:calc(var(--spacing) * 8)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, )}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.\\[gap\\:inherit\\]{gap:inherit}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.\\[border-radius\\:inherit\\]{border-radius:inherit}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\[inherit\\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-\\[inherit\\]{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.rounded-l-full{border-top-left-radius:2147483647px;border-bottom-left-radius:2147483647px}.rounded-r-\\[inherit\\]{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.rounded-r-full{border-top-right-radius:2147483647px;border-bottom-right-radius:2147483647px}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--tdb-line)}.border-destructive{border-color:var(--tdb-error)}.border-foreground\\/40{border-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/40{border-color:color-mix(in oklab, var(--tdb-ink) 40%, transparent)}}.bg-amber-500\\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background,.bg-background\\/5{background-color:var(--tdb-surface)}@supports (color:color-mix(in lab, red, red)){.bg-background\\/5{background-color:color-mix(in oklab, var(--tdb-surface) 5%, transparent)}}.bg-black\\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-card{background-color:var(--tdb-surface)}.bg-current{background-color:currentColor}.bg-destructive\\/5{background-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/5{background-color:color-mix(in oklab, var(--tdb-error) 5%, transparent)}}.bg-emerald-500\\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-foreground{background-color:var(--tdb-ink)}.bg-muted{background-color:var(--tdb-surface-2)}.bg-primary,.bg-primary\\/5{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/5{background-color:color-mix(in oklab, var(--tdb-brand) 5%, transparent)}}.bg-transparent{background-color:#0000}.\\[mask-image\\:linear-gradient\\(to_left\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(270deg,#000,#0000);mask-image:linear-gradient(270deg,#000,#0000)}.\\[mask-image\\:linear-gradient\\(to_right\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000,#0000);mask-image:linear-gradient(90deg,#000,#0000)}.\\[padding\\:inherit\\]{padding:inherit}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pr-3\\.5{padding-right:calc(var(--spacing) * 3.5)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2\\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3\\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-left{text-align:left}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-pretty{text-wrap:pretty}.whitespace-nowrap{white-space:nowrap}.text-\\(--color-success\\){color:var(--color-success)}.text-amber-800{color:var(--color-amber-800)}.text-background{color:var(--tdb-surface)}.text-destructive{color:var(--tdb-error)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--tdb-ink)}.text-muted-foreground{color:var(--tdb-ink-2)}.text-primary{color:var(--tdb-brand)}.text-primary-foreground{color:var(--dsw-alias-bg-base,#fff)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.underline{text-decoration-line:underline}.caret-foreground{caret-color:var(--tdb-ink)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-destructive\\/25{--tw-ring-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.ring-destructive\\/25{--tw-ring-color:color-mix(in oklab, var(--tdb-error) 25%, transparent)}}.ring-ring\\/40{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.ring-ring\\/40{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, )}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.\\[backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%);backdrop-filter:blur(14px)saturate(140%)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\,transform\\]{transition-property:color,background-color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-webkit-backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%)}@media (hover:hover){:is(:where(.group):hover .group-hover\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:opacity-0){opacity:0}:is(:where(.group):hover .group-hover\\:opacity-100){opacity:1}}:is(:where(.group):focus-visible .group-focus-visible\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-0){opacity:0}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-100){opacity:1}.placeholder\\:text-muted-foreground\\/60::placeholder{color:var(--tdb-ink-2)}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-muted-foreground\\/60::placeholder{color:color-mix(in oklab, var(--tdb-ink-2) 60%, transparent)}}@media (hover:hover){.hover\\:border-\\(--color-border-strong\\):hover{border-color:var(--color-border-strong)}.hover\\:border-border:hover{border-color:var(--tdb-line)}.hover\\:bg-foreground\\/5:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/5:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-muted:hover,.hover\\:bg-muted\\/60:hover{background-color:var(--tdb-surface-2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/60:hover{background-color:color-mix(in oklab, var(--tdb-surface-2) 60%, transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--tdb-brand) 90%, transparent)}}.hover\\:text-foreground:hover{color:var(--tdb-ink)}.hover\\:opacity-70:hover{opacity:.7}}.focus-visible\\:bg-muted:focus-visible{background-color:var(--tdb-surface-2)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-ink) 20%, transparent)}}.focus-visible\\:ring-ring:focus-visible,.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:-outline-offset-4:focus-visible{outline-offset:calc(4px * -1)}.focus-visible\\:outline-ring:focus-visible{outline-color:var(--tdb-brand)}.active\\:scale-\\[0\\.94\\]:active{scale:.94}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:opacity-0:disabled{opacity:0}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transform-none{transform:none}.motion-reduce\\:active\\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@media (min-width:40rem){.sm\\:h-9{height:calc(var(--spacing) * 9)}.sm\\:min-w-9{min-width:calc(var(--spacing) * 9)}.sm\\:gap-1{gap:var(--spacing)}}@media (prefers-color-scheme:dark){.dark\\:text-amber-300{color:var(--color-amber-300)}.dark\\:text-emerald-400{color:var(--color-emerald-400)}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}.\\[\\&_button\\]\\:grid button{display:grid}.\\[\\&_button\\]\\:size-11 button{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.\\[\\&_button\\]\\:place-items-center button{place-items:center}.\\[\\&_svg\\]\\:h-4 svg{height:calc(var(--spacing) * 4)}.\\[\\&_svg\\]\\:w-4 svg{width:calc(var(--spacing) * 4)}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.tdb-root button,.tdb-root input{font:inherit}.tdb-root{--color-background:var(--tdb-surface);--color-foreground:var(--tdb-ink);--color-card:var(--tdb-surface);--color-card-foreground:var(--tdb-ink);--color-popover:var(--tdb-surface);--color-popover-foreground:var(--tdb-ink);--color-primary:var(--tdb-brand);--color-primary-foreground:var(--dsw-alias-bg-base,#fff);--color-secondary:var(--tdb-surface-2);--color-secondary-foreground:var(--tdb-ink);--color-muted:var(--tdb-surface-2);--color-muted-foreground:var(--tdb-ink-2);--color-accent:var(--tdb-surface-2);--color-accent-foreground:var(--tdb-ink);--color-border:var(--tdb-line);--color-input:var(--tdb-line-strong);--color-ring:var(--tdb-brand);--color-destructive:var(--tdb-error);--color-success:var(--tdb-success)}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}";
|
|
22541
22762
|
|
|
22542
22763
|
// src/client/App.tsx
|
|
22543
22764
|
var AUTO_PRICE_SYNC_MS = 6 * 60 * 60 * 1e3;
|
|
22544
22765
|
var AUTO_PRICE_INITIAL_DELAY_MS = 3e3;
|
|
22545
22766
|
function Dashboard({ onOpenSession }) {
|
|
22546
22767
|
const language = useLanguage();
|
|
22547
|
-
const t = (0,
|
|
22768
|
+
const t = (0, import_react92.useMemo)(
|
|
22548
22769
|
() => makeT((key) => (language === "zh" ? zh : en)[key] ?? key),
|
|
22549
22770
|
[language]
|
|
22550
22771
|
);
|
|
22551
22772
|
const intl = language === "zh" ? "zh-CN" : "en-US";
|
|
22552
22773
|
const now2 = useNow(6e4);
|
|
22553
|
-
const [scanInterval, setScanInterval] = (0,
|
|
22774
|
+
const [scanInterval, setScanInterval] = (0, import_react92.useState)(readScanInterval);
|
|
22554
22775
|
const stats = useStats(SCAN_INTERVAL_MS[scanInterval]);
|
|
22555
22776
|
const data = stats.data;
|
|
22556
22777
|
const {
|
|
@@ -22563,28 +22784,41 @@ window.__ModuleLoader__.load({
|
|
|
22563
22784
|
onlineError,
|
|
22564
22785
|
refreshOnline
|
|
22565
22786
|
} = usePricing();
|
|
22566
|
-
const models = (0,
|
|
22567
|
-
const defaults = (0,
|
|
22568
|
-
const effectivePricing = (0,
|
|
22569
|
-
const
|
|
22570
|
-
const
|
|
22571
|
-
|
|
22572
|
-
|
|
22573
|
-
|
|
22574
|
-
|
|
22575
|
-
|
|
22576
|
-
|
|
22577
|
-
|
|
22578
|
-
|
|
22787
|
+
const models = (0, import_react92.useMemo)(() => data?.models ?? [], [data]);
|
|
22788
|
+
const defaults = (0, import_react92.useMemo)(() => defaultsForModels(models, online), [models, online]);
|
|
22789
|
+
const effectivePricing = (0, import_react92.useMemo)(() => mergePricing(defaults, pricing), [defaults, pricing]);
|
|
22790
|
+
const builtinRows = (0, import_react92.useMemo)(() => builtinPriceRows(), []);
|
|
22791
|
+
const builtinModels = (0, import_react92.useMemo)(() => builtinRows.map((row) => ({
|
|
22792
|
+
key: row.key,
|
|
22793
|
+
provider: row.provider,
|
|
22794
|
+
model: row.model,
|
|
22795
|
+
requests: 0,
|
|
22796
|
+
uncachedInputTokens: 0,
|
|
22797
|
+
cacheReadTokens: 0,
|
|
22798
|
+
cacheWriteTokens: 0,
|
|
22799
|
+
outputTokens: 0
|
|
22800
|
+
})), [builtinRows]);
|
|
22801
|
+
const builtinDefaults = (0, import_react92.useMemo)(() => Object.fromEntries(
|
|
22802
|
+
builtinRows.map((row) => [row.key, row.price])
|
|
22803
|
+
), [builtinRows]);
|
|
22804
|
+
const [selectedId, setSelectedId] = (0, import_react92.useState)(null);
|
|
22805
|
+
const [page, setPage] = (0, import_react92.useState)("overview");
|
|
22806
|
+
const [requestRefresh, setRequestRefresh] = (0, import_react92.useState)(0);
|
|
22807
|
+
const [range, setRange] = (0, import_react92.useState)({ id: "30d", from: "", to: "" });
|
|
22808
|
+
const [chartView, setChartView] = (0, import_react92.useState)("io");
|
|
22809
|
+
const priceModelsRef = (0, import_react92.useRef)(models);
|
|
22810
|
+
const onlineRef = (0, import_react92.useRef)(online);
|
|
22811
|
+
const onlineAtRef = (0, import_react92.useRef)(onlineAt);
|
|
22812
|
+
const refreshPricesRef = (0, import_react92.useRef)(refreshOnline);
|
|
22579
22813
|
priceModelsRef.current = models;
|
|
22580
22814
|
onlineRef.current = online;
|
|
22581
22815
|
onlineAtRef.current = onlineAt;
|
|
22582
22816
|
refreshPricesRef.current = refreshOnline;
|
|
22583
|
-
const priceModelKey = (0,
|
|
22817
|
+
const priceModelKey = (0, import_react92.useMemo)(
|
|
22584
22818
|
() => [...new Set(models.map((model) => model.model))].sort().join("|"),
|
|
22585
22819
|
[models]
|
|
22586
22820
|
);
|
|
22587
|
-
(0,
|
|
22821
|
+
(0, import_react92.useEffect)(() => {
|
|
22588
22822
|
if (priceModelsRef.current.length === 0) return;
|
|
22589
22823
|
let stopped = false;
|
|
22590
22824
|
let inFlight = false;
|
|
@@ -22615,7 +22849,7 @@ window.__ModuleLoader__.load({
|
|
|
22615
22849
|
clearInterval(timer);
|
|
22616
22850
|
};
|
|
22617
22851
|
}, [priceModelKey]);
|
|
22618
|
-
const rangeResult = (0,
|
|
22852
|
+
const rangeResult = (0, import_react92.useMemo)(() => selectRange({
|
|
22619
22853
|
days: data?.days ?? [],
|
|
22620
22854
|
hours: data?.hours ?? [],
|
|
22621
22855
|
today: data?.today ?? ""
|
|
@@ -22626,7 +22860,8 @@ window.__ModuleLoader__.load({
|
|
|
22626
22860
|
{ id: "models", label: t("tabs.models") },
|
|
22627
22861
|
{ id: "sessions", label: t("tabs.sessions") },
|
|
22628
22862
|
{ id: "requests", label: t("tabs.requests") },
|
|
22629
|
-
{ id: "costs", label: t("tabs.costs") }
|
|
22863
|
+
{ id: "costs", label: t("tabs.costs") },
|
|
22864
|
+
{ id: "pricing", label: t("tabs.pricing") }
|
|
22630
22865
|
];
|
|
22631
22866
|
const refreshAll = () => {
|
|
22632
22867
|
stats.refresh();
|
|
@@ -22636,7 +22871,7 @@ window.__ModuleLoader__.load({
|
|
|
22636
22871
|
setPage(next);
|
|
22637
22872
|
if (next !== "sessions") setSelectedId(null);
|
|
22638
22873
|
};
|
|
22639
|
-
const header = (showExport) => (0,
|
|
22874
|
+
const header = (showExport) => (0, import_react92.createElement)(DashboardHeader, {
|
|
22640
22875
|
t,
|
|
22641
22876
|
data,
|
|
22642
22877
|
language,
|
|
@@ -22651,35 +22886,35 @@ window.__ModuleLoader__.load({
|
|
|
22651
22886
|
}
|
|
22652
22887
|
});
|
|
22653
22888
|
if (stats.loading && data === null) {
|
|
22654
|
-
return (0,
|
|
22889
|
+
return (0, import_react92.createElement)(
|
|
22655
22890
|
"div",
|
|
22656
22891
|
{ className: "tdb-root" },
|
|
22657
|
-
(0,
|
|
22658
|
-
(0,
|
|
22892
|
+
(0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
|
|
22893
|
+
(0, import_react92.createElement)("div", { className: "tdb-scroll" }, (0, import_react92.createElement)(SkeletonDashboard))
|
|
22659
22894
|
);
|
|
22660
22895
|
}
|
|
22661
22896
|
if (data === null) {
|
|
22662
|
-
return (0,
|
|
22897
|
+
return (0, import_react92.createElement)(
|
|
22663
22898
|
"div",
|
|
22664
22899
|
{ className: "tdb-root" },
|
|
22665
|
-
(0,
|
|
22666
|
-
(0,
|
|
22900
|
+
(0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
|
|
22901
|
+
(0, import_react92.createElement)(
|
|
22667
22902
|
"div",
|
|
22668
22903
|
{ className: "tdb-scroll" },
|
|
22669
|
-
(0,
|
|
22904
|
+
(0, import_react92.createElement)(
|
|
22670
22905
|
"div",
|
|
22671
22906
|
{ className: "tdb-container" },
|
|
22672
22907
|
header(false),
|
|
22673
|
-
(0,
|
|
22908
|
+
(0, import_react92.createElement)(
|
|
22674
22909
|
"div",
|
|
22675
22910
|
{ className: "tdb-surface" },
|
|
22676
|
-
(0,
|
|
22911
|
+
(0, import_react92.createElement)(
|
|
22677
22912
|
"div",
|
|
22678
22913
|
{ className: "tdb-section" },
|
|
22679
|
-
(0,
|
|
22914
|
+
(0, import_react92.createElement)(Notice, {
|
|
22680
22915
|
tone: "error",
|
|
22681
|
-
icon: (0,
|
|
22682
|
-
action: (0,
|
|
22916
|
+
icon: (0, import_react92.createElement)(AlertIcon, { size: 16 }),
|
|
22917
|
+
action: (0, import_react92.createElement)(Button3, { onClick: stats.refresh }, t("errors.retry"))
|
|
22683
22918
|
}, t("errors.title"))
|
|
22684
22919
|
)
|
|
22685
22920
|
)
|
|
@@ -22688,24 +22923,24 @@ window.__ModuleLoader__.load({
|
|
|
22688
22923
|
);
|
|
22689
22924
|
}
|
|
22690
22925
|
if (data.sessions.total === 0) {
|
|
22691
|
-
return (0,
|
|
22926
|
+
return (0, import_react92.createElement)(
|
|
22692
22927
|
"div",
|
|
22693
22928
|
{ className: "tdb-root" },
|
|
22694
|
-
(0,
|
|
22695
|
-
(0,
|
|
22929
|
+
(0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
|
|
22930
|
+
(0, import_react92.createElement)(
|
|
22696
22931
|
"div",
|
|
22697
22932
|
{ className: "tdb-scroll" },
|
|
22698
|
-
(0,
|
|
22933
|
+
(0, import_react92.createElement)(
|
|
22699
22934
|
"div",
|
|
22700
22935
|
{ className: "tdb-container" },
|
|
22701
22936
|
header(false),
|
|
22702
|
-
(0,
|
|
22937
|
+
(0, import_react92.createElement)(
|
|
22703
22938
|
"div",
|
|
22704
22939
|
{ className: "tdb-surface" },
|
|
22705
|
-
(0,
|
|
22940
|
+
(0, import_react92.createElement)(
|
|
22706
22941
|
"div",
|
|
22707
22942
|
{ className: "tdb-section" },
|
|
22708
|
-
(0,
|
|
22943
|
+
(0, import_react92.createElement)(EmptyState, { icon: (0, import_react92.createElement)(DatabaseIcon, { size: 22 }), title: t("sessions.empty") })
|
|
22709
22944
|
)
|
|
22710
22945
|
)
|
|
22711
22946
|
)
|
|
@@ -22713,28 +22948,28 @@ window.__ModuleLoader__.load({
|
|
|
22713
22948
|
);
|
|
22714
22949
|
}
|
|
22715
22950
|
const problem = data.errors.length > 0 ? t("errors.partial", { count: data.errors.length }) : stats.pollError !== null ? t("errors.poll") : null;
|
|
22716
|
-
return (0,
|
|
22951
|
+
return (0, import_react92.createElement)(
|
|
22717
22952
|
"div",
|
|
22718
22953
|
{ className: "tdb-root" },
|
|
22719
|
-
(0,
|
|
22720
|
-
(0,
|
|
22954
|
+
(0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
|
|
22955
|
+
(0, import_react92.createElement)(
|
|
22721
22956
|
"div",
|
|
22722
22957
|
{ className: "tdb-scroll" },
|
|
22723
|
-
(0,
|
|
22958
|
+
(0, import_react92.createElement)(
|
|
22724
22959
|
"div",
|
|
22725
22960
|
{ className: "tdb-container" },
|
|
22726
22961
|
header(true),
|
|
22727
|
-
problem === null ? null : (0,
|
|
22728
|
-
(0,
|
|
22962
|
+
problem === null ? null : (0, import_react92.createElement)(Notice, { tone: "warn", icon: (0, import_react92.createElement)(AlertIcon, { size: 15 }) }, problem),
|
|
22963
|
+
(0, import_react92.createElement)(
|
|
22729
22964
|
"div",
|
|
22730
22965
|
{ className: "tdb-surface tdb-surface--pages" },
|
|
22731
|
-
(0,
|
|
22966
|
+
(0, import_react92.createElement)(PageTabs, {
|
|
22732
22967
|
items: pageTabs,
|
|
22733
22968
|
value: page,
|
|
22734
22969
|
onChange: changePage,
|
|
22735
22970
|
ariaLabel: t("tabs.label")
|
|
22736
22971
|
}),
|
|
22737
|
-
(0,
|
|
22972
|
+
(0, import_react92.createElement)(
|
|
22738
22973
|
"div",
|
|
22739
22974
|
{
|
|
22740
22975
|
key: page,
|
|
@@ -22743,12 +22978,12 @@ window.__ModuleLoader__.load({
|
|
|
22743
22978
|
role: "tabpanel",
|
|
22744
22979
|
"aria-labelledby": `tdb-tab-${page}`
|
|
22745
22980
|
},
|
|
22746
|
-
page === "overview" ? (0,
|
|
22747
|
-
|
|
22981
|
+
page === "overview" ? (0, import_react92.createElement)(
|
|
22982
|
+
import_react92.Fragment,
|
|
22748
22983
|
{},
|
|
22749
|
-
(0,
|
|
22750
|
-
(0,
|
|
22751
|
-
(0,
|
|
22984
|
+
(0, import_react92.createElement)(KpiCards, { data, result: rangeResult, t, intl }),
|
|
22985
|
+
(0, import_react92.createElement)("div", { className: "tdb-rule" }),
|
|
22986
|
+
(0, import_react92.createElement)(Trends, {
|
|
22752
22987
|
data,
|
|
22753
22988
|
result: rangeResult,
|
|
22754
22989
|
range,
|
|
@@ -22758,18 +22993,24 @@ window.__ModuleLoader__.load({
|
|
|
22758
22993
|
t,
|
|
22759
22994
|
intl
|
|
22760
22995
|
})
|
|
22761
|
-
) : page === "models" ? (0,
|
|
22996
|
+
) : page === "models" ? (0, import_react92.createElement)(ModelTable, { models: data.models, total: totalTokens(data.totals), t, intl }) : page === "sessions" ? (0, import_react92.createElement)(SessionTable, {
|
|
22762
22997
|
rows: data.sessionRows,
|
|
22763
22998
|
t,
|
|
22764
22999
|
intl,
|
|
22765
23000
|
now: now2,
|
|
22766
23001
|
onSelect: (session) => setSelectedId(session.id)
|
|
22767
|
-
}) : page === "requests" ? (0,
|
|
23002
|
+
}) : page === "requests" ? (0, import_react92.createElement)(RequestLog, {
|
|
22768
23003
|
pricing: effectivePricing,
|
|
22769
23004
|
t,
|
|
22770
23005
|
intl,
|
|
22771
23006
|
refreshToken: `${data.revision}:${requestRefresh}`
|
|
22772
|
-
}) : (0,
|
|
23007
|
+
}) : page === "pricing" ? (0, import_react92.createElement)(PricingPage, {
|
|
23008
|
+
models: builtinModels,
|
|
23009
|
+
pricing,
|
|
23010
|
+
defaults: builtinDefaults,
|
|
23011
|
+
t,
|
|
23012
|
+
onSave: savePricing
|
|
23013
|
+
}) : (0, import_react92.createElement)(CostPage, {
|
|
22773
23014
|
models: data.models,
|
|
22774
23015
|
pricing: effectivePricing,
|
|
22775
23016
|
t,
|
|
@@ -22781,14 +23022,13 @@ window.__ModuleLoader__.load({
|
|
|
22781
23022
|
onRefreshPrices: () => {
|
|
22782
23023
|
void refreshOnline(data.models);
|
|
22783
23024
|
},
|
|
22784
|
-
onConfigure: () => setPricingOpen(true),
|
|
22785
23025
|
autoSync: true
|
|
22786
23026
|
})
|
|
22787
23027
|
)
|
|
22788
23028
|
)
|
|
22789
23029
|
)
|
|
22790
23030
|
),
|
|
22791
|
-
(0,
|
|
23031
|
+
(0, import_react92.createElement)(SessionDetail, {
|
|
22792
23032
|
session: selected,
|
|
22793
23033
|
t,
|
|
22794
23034
|
intl,
|
|
@@ -22797,15 +23037,6 @@ window.__ModuleLoader__.load({
|
|
|
22797
23037
|
onOpenSession(id3);
|
|
22798
23038
|
setSelectedId(null);
|
|
22799
23039
|
}
|
|
22800
|
-
}),
|
|
22801
|
-
(0, import_react93.createElement)(PricingEditor, {
|
|
22802
|
-
open: pricingOpen,
|
|
22803
|
-
models: data.models,
|
|
22804
|
-
pricing,
|
|
22805
|
-
defaults,
|
|
22806
|
-
t,
|
|
22807
|
-
onClose: () => setPricingOpen(false),
|
|
22808
|
-
onSave: savePricing
|
|
22809
23040
|
})
|
|
22810
23041
|
);
|
|
22811
23042
|
}
|
|
@@ -22847,18 +23078,18 @@ window.__ModuleLoader__.load({
|
|
|
22847
23078
|
name: "main",
|
|
22848
23079
|
key: PANEL_ID,
|
|
22849
23080
|
locale: NS
|
|
22850
|
-
}, () => (0,
|
|
23081
|
+
}, () => (0, import_react93.createElement)(Dashboard, {
|
|
22851
23082
|
...canOpen ? { onOpenSession: openSession } : {}
|
|
22852
23083
|
})));
|
|
22853
23084
|
const FooterEntry = (owner = {}) => {
|
|
22854
23085
|
const language = useLanguage();
|
|
22855
23086
|
const wide = owner.wide !== false;
|
|
22856
23087
|
const label2 = (language === "zh" ? zh : en)["panel.title"] ?? "Token usage";
|
|
22857
|
-
return (0,
|
|
22858
|
-
|
|
23088
|
+
return (0, import_react93.createElement)(
|
|
23089
|
+
import_react93.Fragment,
|
|
22859
23090
|
{},
|
|
22860
|
-
(0,
|
|
22861
|
-
(0,
|
|
23091
|
+
(0, import_react93.createElement)("style", { key: "tdb-footer-style" }, FOOTER_CSS),
|
|
23092
|
+
(0, import_react93.createElement)(
|
|
22862
23093
|
"button",
|
|
22863
23094
|
{
|
|
22864
23095
|
key: "tdb-footer-button",
|
|
@@ -22873,8 +23104,8 @@ window.__ModuleLoader__.load({
|
|
|
22873
23104
|
}
|
|
22874
23105
|
}
|
|
22875
23106
|
},
|
|
22876
|
-
(0,
|
|
22877
|
-
wide ? (0,
|
|
23107
|
+
(0, import_react93.createElement)(ChartIcon, { size: wide ? 16 : 18 }),
|
|
23108
|
+
wide ? (0, import_react93.createElement)("span", { className: "tdb-footer-action-label" }, label2) : null
|
|
22878
23109
|
)
|
|
22879
23110
|
);
|
|
22880
23111
|
};
|