@oh-my-pi/omp-stats 18.6.1 → 18.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/client/index.css +1 -1
- package/dist/types/types.d.ts +8 -0
- package/package.json +4 -4
- package/src/client/styles.css +4 -2
- package/src/db.ts +17 -5
- package/src/parser.ts +17 -9
- package/src/types.ts +8 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [18.7.0] - 2026-10-06
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Fixed Ultrafast turns not being counted toward the Premium Requests statistic.
|
|
10
|
+
- Fixed the desktop stats dashboard menu button so it no longer appears unnecessarily or dims the page without opening navigation.
|
|
11
|
+
|
|
5
12
|
## [18.6.0] - 2026-10-03
|
|
6
13
|
|
|
7
14
|
### Fixed
|
package/dist/client/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root,[data-theme=dark]{--buncss-light: ;--buncss-dark:initial;color-scheme:dark;--bg:#000;--panel:#09090a;--card:#0e0e10;--raised:#17171a;--overlay:#0e0e10c7;--hover:#ffffff09;--press:#ffffff0f;--selected:#ffffff13;--line-1:#ffffff0f;--line-2:#ffffff17;--line-3:#ffffff24;--line-4:#ffffff38;--ink-1:#ededef;--ink-2:#a0a0a8;--ink-3:#6c6c74;--ink-4:#46464c;--ink-inverse:#0a0a0b;--accent-a:#5ad8e6;--accent-b:#ed4abf;--accent:#f068c8;--accent-soft:#ed4abf24;--accent-line:#ed4abf59;--accent-gradient:linear-gradient(100deg,var(--accent-a),var(--accent-b));--focus:#5ad8e6;--ok:#3ecf8e;--ok-soft:#3ecf8e21;--warn:#f5a524;--warn-soft:#f5a52421;--bad:#ff6166;--bad-soft:#ff616621;--live:#3ecf8e;--chart-grid:#ffffff0e;--chart-axis:#5c5c64;--chart-cursor:#ffffff0d;--chart-primary:#5ad8e6;--chart-secondary:#ed4abf;--shadow-1:0 1px 0 #ffffff08 inset,0 1px 2px #00000080;--shadow-2:0 8px 24px #0000008c,0 1px 0 #ffffff0d inset;--shadow-3:0 24px 64px #000000b3,0 1px 0 #ffffff0f inset}[data-theme=light]{--buncss-light:initial;--buncss-dark: ;color-scheme:light;--bg:#f2f2f3;--panel:#fff;--card:#fff;--raised:#f6f6f7;--overlay:#fffc;--hover:#00000008;--press:#0000000d;--selected:#0000000f;--line-1:#0000000f;--line-2:#00000017;--line-3:#00000024;--line-4:#00000038;--ink-1:#151518;--ink-2:#5a5a63;--ink-3:#8b8b94;--ink-4:#b9b9c0;--ink-inverse:#fff;--accent-a:#1fa9bb;--accent-b:#d42ea3;--accent:#c42596;--accent-soft:#d42ea31a;--accent-line:#d42ea34d;--focus:#1fa9bb;--ok:#12a36b;--ok-soft:#12a36b1c;--warn:#c77c02;--warn-soft:#c77c021c;--bad:#dc3a40;--bad-soft:#dc3a401a;--live:#12a36b;--chart-grid:#0000000f;--chart-axis:#9a9aa2;--chart-cursor:#0000000a;--chart-primary:#1fa9bb;--chart-secondary:#d42ea3;--shadow-1:0 1px 2px #0000000a;--shadow-2:0 8px 24px #0000001a;--shadow-3:0 24px 64px #00000029}:root{--font-sans:"Inter var","Inter",ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--font-mono:ui-monospace,"SF Mono","JetBrains Mono","Fira Code",Menlo,Consolas,monospace;--r-chip:6px;--r-control:8px;--r-card:12px;--r-panel:16px;--r-pill:999px;--topbar-h:52px;--sidebar-w:224px;--gutter:28px;--ease:cubic-bezier(.2,0,0,1);--ease-out:cubic-bezier(.16,1,.3,1);--dur-1:.12s;--dur-2:.2s;--dur-3:.36s;--stagger:40ms}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;background:var(--bg)}body{font-family:var(--font-sans);color:var(--ink-1);background:var(--bg);font-feature-settings:"cv11","ss01";min-height:100dvh;font-size:13.5px;line-height:1.5}h1,h2,h3,h4,p,ul,ol,figure{margin:0;padding:0}ul,ol{list-style:none}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer;background:0 0;border:0;padding:0}button:disabled{cursor:default}a{color:inherit;text-decoration:none}svg{display:block;flex-shrink:0}table{border-collapse:collapse;border-spacing:0}code,pre,kbd{font-family:var(--font-mono)}::selection{background:var(--accent-soft);color:var(--ink-1)}:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:4px}[hidden]{display:none!important}*{scrollbar-width:thin;scrollbar-color:var(--line-3)transparent}.mono{font-family:var(--font-mono);font-size:.93em}.num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:.93em}.muted{color:var(--ink-2)}.dim{color:var(--ink-3)}.micro{color:var(--ink-3);font-size:12px;font-weight:500;line-height:1.4}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.tone-ok{color:var(--ok)}.tone-warn{color:var(--warn)}.tone-bad{color:var(--bad)}.tone-accent{color:var(--accent)}.gradient-text{background:var(--accent-gradient);color:#0000;-webkit-background-clip:text;background-clip:text}@keyframes rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes fade{0%{opacity:0}to{opacity:1}}@keyframes ping{0%{transform:scale(1);opacity:.7}80%,to{transform:scale(2.6);opacity:0}}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes indeterminate{0%{transform:translate(-100%)}to{transform:translate(250%)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes flash{0%{color:var(--accent-a)}to{color:inherit}}.rise{animation:rise var(--dur-3)var(--ease-out)backwards;animation-delay:calc(var(--i,0)*var(--stagger))}.spin{animation:.9s linear infinite spin}@media (prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:1ms!important;animation-delay:0s!important;transition-duration:1ms!important}}.shell-ambient{position:fixed;pointer-events:none;z-index:0;background:radial-gradient(60rem 28rem at 12% -10%,color-mix(in srgb,var(--accent-a)7%,transparent),transparent 70%),radial-gradient(50rem 26rem at 95% -12%,color-mix(in srgb,var(--accent-b)6%,transparent),transparent 70%);inset:0}.topbar{position:fixed;height:var(--topbar-h);z-index:40;display:flex;background:color-mix(in srgb,var(--bg)72%,transparent);backdrop-filter:blur(14px)saturate(160%);-webkit-backdrop-filter:blur(14px)saturate(160%);transition:border-color var(--dur-2)var(--ease);border-bottom:1px solid #0000;align-items: center;gap:12px;padding:0 14px 0 18px;top:0;left:0;right:0}.topbar[data-scrolled=true]{border-bottom-color:var(--line-1)}.topbar-brand{display:flex;min-width:calc(var(--sidebar-w) - 18px);letter-spacing:-.01em;align-items: center;gap:10px;font-weight:600}.topbar-mark{display:block;flex:none}.topbar-slash{color:var(--ink-4);font-size:18px;font-weight:300}.topbar-title{color:var(--ink-1);white-space:nowrap;font-weight:500}.topbar-spacer{flex:1}.topbar-actions{display:flex;align-items: center;gap:8px}.topbar-menu{display:none}.topbar-progress{position:absolute;overflow:hidden;pointer-events:none;height:2px;bottom:-1px;left:0;right:0}.topbar-progress-fill{background:var(--accent-gradient);transition:width var(--dur-3)var(--ease);box-shadow:0 0 12px var(--accent-b);height:100%}.topbar-progress-fill[data-indeterminate=true]{animation:indeterminate 1.2s var(--ease)infinite;width:40%!important}.sidebar{position:fixed;top:var(--topbar-h);width:var(--sidebar-w);overflow-y:auto;scrollbar-width:none;display:flex;z-index:30;flex-direction:column;gap:18px;padding:8px 10px 14px;bottom:0;left:0}.sidebar::-webkit-scrollbar{display:none}.nav-group{display:flex;flex-direction:column;gap:1px}.nav-heading{color:var(--ink-3);padding:0 10px 6px;font-size:12px;font-weight:500}.nav-row{display:flex;border-radius:var(--r-control);color:var(--ink-2);text-align:left;transition:background var(--dur-1)var(--ease),color var(--dur-1)var(--ease);align-items: center;gap:10px;width:100%;height:32px;padding:0 10px;font-weight:450}.nav-row:hover{background:var(--hover);color:var(--ink-1)}.nav-row:active{transform:scale(.99)}.nav-row[data-active=true]{background:var(--selected);color:var(--ink-1)}.nav-row svg{color:var(--ink-3);transition:color var(--dur-1)var(--ease)}.nav-row[data-active=true] svg{color:var(--accent)}.nav-row-label{flex:1}.nav-row kbd{color:var(--ink-4);opacity:0;transition:opacity var(--dur-1)var(--ease);font-size:10.5px}.nav-row:hover kbd{opacity:1}.sidebar-foot{border-radius:var(--r-card);border:1px solid var(--line-1);background:var(--card);display:flex;flex-direction:column;gap:6px;margin-top:auto;padding:10px}.shell-panel{position:relative;z-index:1;margin:var(--topbar-h)8px 8px var(--sidebar-w);min-height:calc(100dvh - var(--topbar-h) - 8px);background:var(--panel);border-radius:var(--r-panel);border:1px solid var(--line-1);box-shadow:var(--shadow-1);overflow:clip}.shell-content{padding:26px var(--gutter)48px;max-width:1560px;margin:0 auto}.drawer-scrim{position:fixed;z-index:60;animation:fade var(--dur-2)var(--ease)both;background:#00000080;inset:0}@media (max-width:1360px){:root{--sidebar-w:204px;--gutter:22px}}@media (max-width:900px){:root{--gutter:16px}.topbar-brand{min-width:0}.topbar-menu{display:inline-flex}.sidebar{z-index:70;background:var(--overlay);backdrop-filter:blur(18px)saturate(160%);-webkit-backdrop-filter:blur(18px)saturate(160%);border-right:1px solid var(--line-2);transition:transform var(--dur-3)var(--ease-out);width:260px;padding-top:16px;top:0;transform:translate(-102%)}.sidebar[data-open=true]{box-shadow:var(--shadow-3);transform:none}.shell-panel{margin-left:8px}.topbar-hide-narrow{display:none!important}}.page{display:flex;flex-direction:column;gap:20px}.page-header{display:flex;flex-wrap:wrap;justify-content:space-between;align-items: flex-end;gap:16px;padding-bottom:4px}.page-title{letter-spacing:-.02em;font-size:22px;font-weight:600;line-height:1.2}.page-description{color:var(--ink-2);max-width:72ch;margin-top:4px}.page-actions{display:flex;flex-wrap:wrap;align-items: center;gap:8px}.grid{display:grid;gap:16px}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-main-side{grid-template-columns:minmax(0,2fr)minmax(0,1fr)}@media (max-width:1100px){.grid-2,.grid-3,.grid-main-side{grid-template-columns:minmax(0,1fr)}}.row{display:flex;align-items: center;gap:8px;min-width:0}.stack{display:flex;flex-direction:column;gap:4px;min-width:0}.card{position:relative;border-radius:var(--r-card);background:linear-gradient(var(--card),var(--card))padding-box,linear-gradient(180deg,var(--line-3),var(--line-1)40%)border-box;box-shadow:var(--shadow-1);display:flex;border:1px solid #0000;flex-direction:column;min-width:0}.card-header{display:flex;flex-wrap:wrap;justify-content:space-between;align-items: flex-start;gap:12px;padding:14px 16px 0}.card-titles{display:flex;flex-direction:column;gap:2px;min-width:0}.card-title{letter-spacing:-.005em;display:flex;align-items: center;gap:8px;font-size:14px;font-weight:550}.card-description{color:var(--ink-3);font-size:12.5px}.card-actions{display:flex;flex-wrap:wrap;align-items: center;gap:6px}.card-body{flex:1;min-width:0;padding:14px 16px 16px}.card-body[data-flush=true]{padding:10px 0 0}.card-footer{border-top:1px solid var(--line-1);color:var(--ink-3);display:flex;justify-content:space-between;align-items: center;gap:8px;padding:10px 16px;font-size:12.5px}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(var(--stat-min,170px),1fr));border-radius:var(--r-card);background:linear-gradient(var(--card),var(--card))padding-box,linear-gradient(180deg,var(--line-3),var(--line-1)40%)border-box;box-shadow:var(--shadow-1);overflow:hidden;border:1px solid #0000}.stat{position:relative;display:flex;box-shadow:1px 0 0 var(--line-1),0 1px 0 var(--line-1);flex-direction:column;gap:6px;min-width:0;padding:14px 16px 12px}.stat-label{color:var(--ink-2);display:flex;align-items: center;gap:6px;font-size:12.5px;font-weight:500}.stat-value{letter-spacing:-.025em;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:24px;font-weight:550;line-height:1.15}.stat[data-size=sm] .stat-value{font-size:18px}.stat-value[data-flash=true]{animation:flash .9s var(--ease)both}.stat-foot{display:flex;color:var(--ink-3);align-items: center;gap:8px;min-height:18px;font-size:12px}.stat-spark{height:28px;margin-top:2px}.delta{display:inline-flex;font-family:var(--font-mono);border-radius:var(--r-pill);background:var(--raised);color:var(--ink-2);align-items: center;gap:2px;padding:1px 6px;font-size:11.5px;font-weight:500}.delta[data-tone=good]{color:var(--ok);background:var(--ok-soft)}.delta[data-tone=bad]{color:var(--bad);background:var(--bad-soft)}.btn{display:inline-flex;border-radius:var(--r-control);white-space:nowrap;border:1px solid var(--line-2);background:var(--raised);color:var(--ink-1);transition:background var(--dur-1)var(--ease),border-color var(--dur-1)var(--ease),transform var(--dur-1)var(--ease);justify-content:center;align-items: center;gap:6px;height:30px;padding:0 12px;font-size:13px;font-weight:500}.btn:hover:not(:disabled){border-color:var(--line-3);background:color-mix(in srgb,var(--raised)80%,var(--ink-1)6%)}.btn:active:not(:disabled){transform:scale(.97)}.btn:disabled{opacity:.5}.btn[data-variant=primary]{background:var(--ink-1);color:var(--ink-inverse);border-color:#0000}.btn[data-variant=primary]:hover:not(:disabled){background:color-mix(in srgb,var(--ink-1)88%,transparent)}.btn[data-variant=accent]{background:var(--accent-gradient);color:#fff;background-origin:border-box;border-color:#0000}.btn[data-variant=ghost]{color:var(--ink-2);background:0 0;border-color:#0000}.btn[data-variant=ghost]:hover:not(:disabled){background:var(--hover);color:var(--ink-1)}.btn[data-variant=danger]{background:var(--bad-soft);color:var(--bad);border-color:color-mix(in srgb,var(--bad)30%,transparent)}.btn[data-size=sm]{height:26px;padding:0 9px;font-size:12.5px}.btn[data-icon=true]{width:30px;padding:0}.btn[data-icon=true][data-size=sm]{width:26px}.input{border-radius:var(--r-control);border:1px solid var(--line-2);background:var(--card);color:var(--ink-1);transition:border-color var(--dur-1)var(--ease);min-width:0;height:30px;padding:0 10px;font-size:13px}.input::placeholder{color:var(--ink-3)}.input:hover{border-color:var(--line-3)}.input:focus{outline:none;border-color:var(--focus);box-shadow:0 0 0 3px color-mix(in srgb,var(--focus)18%,transparent)}.search{position:relative;display:inline-flex;align-items: center}.search svg{position:absolute;color:var(--ink-3);pointer-events:none;left:9px}.search .input{width:240px;padding-left:30px}select.input{appearance:none;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;padding-right:28px}.check{display:inline-flex;color:var(--ink-2);cursor:pointer;user-select:none;align-items: center;gap:6px;font-size:12.5px}.check input{accent-color:var(--accent)}.segmented{position:relative;display:inline-flex;border-radius:var(--r-control);background:var(--card);border:1px solid var(--line-2);isolation:isolate;align-items: center;gap:0;padding:2px}.segmented-thumb{position:absolute;background:var(--raised);border:1px solid var(--line-3);transition:left var(--dur-2)var(--ease-out),width var(--dur-2)var(--ease-out);z-index:-1;border-radius:6px;top:2px;bottom:2px;box-shadow:0 1px 2px #00000040}.segmented-option{color:var(--ink-3);white-space:nowrap;display:inline-flex;transition:color var(--dur-1)var(--ease);border-radius:6px;align-items: center;gap:6px;height:24px;padding:0 10px;font-size:12.5px;font-weight:500}.segmented-option:hover,.segmented-option[data-active=true]{color:var(--ink-1)}.segmented[data-size=sm] .segmented-option{height:22px;padding:0 8px;font-size:12px}.tabs{display:flex;border-bottom:1px solid var(--line-1);align-items: center;gap:16px;padding:0 16px}.tab{position:relative;color:var(--ink-3);display:inline-flex;align-items: center;gap:6px;height:36px;font-size:13px;font-weight:500}.tab:hover,.tab[data-active=true]{color:var(--ink-1)}.tab[data-active=true]:after{content:"";position:absolute;background:var(--accent-gradient);border-radius:2px;height:2px;bottom:-1px;left:0;right:0}.kbd{display:inline-flex;border:1px solid var(--line-2);background:var(--card);font-family:var(--font-mono);color:var(--ink-3);border-radius:5px;justify-content:center;align-items: center;min-width:18px;height:18px;padding:0 4px;font-size:10.5px}.badge{display:inline-flex;border-radius:var(--r-pill);white-space:nowrap;background:var(--raised);color:var(--ink-2);border:1px solid var(--line-1);align-items: center;gap:5px;height:20px;padding:0 8px;font-size:11.5px;font-weight:500}.badge[data-tone=ok]{background:var(--ok-soft);color:var(--ok);border-color:#0000}.badge[data-tone=warn]{background:var(--warn-soft);color:var(--warn);border-color:#0000}.badge[data-tone=bad]{background:var(--bad-soft);color:var(--bad);border-color:#0000}.badge[data-tone=accent]{background:var(--accent-soft);color:var(--accent);border-color:#0000}.badge[data-mono=true]{font-family:var(--font-mono);font-size:11px}.dot{position:relative;display:inline-block;background:var(--ink-3);border-radius:50%;flex-shrink:0;width:8px;height:8px}.dot[data-tone=ok],.dot[data-tone=live]{background:var(--live)}.dot[data-tone=warn]{background:var(--warn)}.dot[data-tone=bad]{background:var(--bad)}.dot[data-tone=accent]{background:var(--accent)}.dot[data-pulse=true]:after{content:"";position:absolute;background:inherit;animation:ping 1.6s var(--ease-out)infinite;border-radius:50%;inset:0}.swatch{display:inline-block;border-radius:2px;flex-shrink:0;width:8px;height:8px}.table-wrap{overflow-x:auto;min-width:0}.table{width:100%;font-size:13px}.table th{position:sticky;z-index:1;text-align:left;color:var(--ink-3);white-space:nowrap;background:var(--card);border-bottom:1px solid var(--line-1);user-select:none;padding:8px 12px;font-size:12px;font-weight:500;top:0}.table th:first-child,.table td:first-child{padding-left:16px}.table th:last-child,.table td:last-child{padding-right:16px}.table th[data-sortable=true]{cursor:pointer}.table th[data-sortable=true]:hover,.table th[data-sorted]{color:var(--ink-1)}.table th .sort-arrow{display:inline-block;opacity:.8;vertical-align:-1px;margin-left:4px}.table td{border-bottom:1px solid var(--line-1);vertical-align:middle;white-space:nowrap;padding:9px 12px}.table tbody tr:last-child td{border-bottom:0}.table tbody tr{transition:background var(--dur-1)var(--ease)}.table tbody tr:hover{background:var(--hover)}.table tbody tr[data-clickable=true]{cursor:pointer}.table tbody tr[data-selected=true]{background:var(--selected)}.table [data-align=right]{text-align:right}.table [data-align=center]{text-align:center}.table td[data-wrap=true]{white-space:normal}.table[data-dense=true] td{padding-top:6px;padding-bottom:6px}.table-more{display:flex;border-top:1px solid var(--line-1);justify-content:center;align-items: center;gap:8px;padding:10px}.cell-primary{color:var(--ink-1);font-weight:500}.cell-secondary{color:var(--ink-3);font-size:12px}.meter{position:relative;background:var(--line-1);overflow:hidden;border-radius:2px;min-width:48px;height:4px}.meter-fill{position:absolute;background:var(--chart-primary);transition:width var(--dur-3)var(--ease-out);border-radius:2px;inset:0 auto 0 0}.meter-cell{display:flex;justify-content:flex-end;align-items: center;gap:10px}.meter-cell .meter{width:64px}.empty{display:flex;text-align:center;color:var(--ink-3);flex-direction:column;justify-content:center;align-items: center;gap:6px;min-height:140px;padding:40px 16px}.empty svg{color:var(--ink-4);margin-bottom:4px}.empty-title{color:var(--ink-2);font-weight:500}.empty-hint{max-width:44ch;font-size:12.5px}.error-state{display:flex;border-radius:var(--r-control);background:var(--bad-soft);color:var(--bad);align-items: center;gap:12px;margin:12px 16px;padding:12px 14px;font-size:13px}.error-state-message{overflow-wrap:anywhere;flex:1;min-width:0}.skeleton{background:linear-gradient(90deg,var(--line-1)0%,var(--line-2)50%,var(--line-1)100%);animation:1.6s linear infinite shimmer;background-size:200% 100%;border-radius:6px}[data-stale=true]{opacity:.55;transition:opacity var(--dur-2)var(--ease)}[data-stale=false]{transition:opacity var(--dur-2)var(--ease)}.drawer{position:fixed;width:min(var(--drawer-w,560px),calc(100vw - 16px));z-index:61;display:flex;border-radius:var(--r-panel);border:1px solid var(--line-2);background:var(--overlay);backdrop-filter:blur(20px)saturate(170%);-webkit-backdrop-filter:blur(20px)saturate(170%);box-shadow:var(--shadow-3);animation:drawer-in var(--dur-3)var(--ease-out)both;overflow:hidden;flex-direction:column;top:8px;bottom:8px;right:8px}@keyframes drawer-in{0%{transform:translate(24px);opacity:0}to{transform:none;opacity:1}}.drawer-header{display:flex;border-bottom:1px solid var(--line-1);align-items: flex-start;gap:12px;padding:16px 16px 12px 20px}.drawer-titles{overflow-wrap:anywhere;flex:1;min-width:0}.drawer-title{letter-spacing:-.01em;font-size:15px;font-weight:600}.drawer-subtitle{color:var(--ink-3);margin-top:2px;font-size:12.5px}.drawer-body{overflow-y:auto;display:flex;flex-direction:column;flex:1;gap:18px;padding:16px 20px 24px}.kv{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px 16px}.kv-item{display:flex;flex-direction:column;gap:2px;min-width:0}.kv-key{color:var(--ink-3);font-size:12px}.kv-value{font-family:var(--font-mono);color:var(--ink-1);overflow-wrap:anywhere;font-size:12.5px}.section-label{color:var(--ink-3);margin-bottom:8px;font-size:12px;font-weight:500}.code-block{border-radius:var(--r-control);border:1px solid var(--line-1);background:var(--card);font-family:var(--font-mono);color:var(--ink-2);overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;max-height:480px;margin:0;padding:12px 14px;font-size:12px;line-height:1.55}.live-chip{display:inline-flex;border-radius:var(--r-pill);border:1px solid var(--line-2);background:var(--card);color:var(--ink-2);white-space:nowrap;transition:border-color var(--dur-1)var(--ease);align-items: center;gap:8px;height:30px;padding:0 10px 0 11px;font-size:12.5px}.live-chip:hover{border-color:var(--line-3);color:var(--ink-1)}.live-chip-count{font-family:var(--font-mono);color:var(--ink-3);font-size:11.5px}.chart{position:relative;user-select:none;width:100%;min-width:0}.chart svg{overflow:visible}.chart-axis text{fill:var(--chart-axis);font-family:var(--font-mono);font-size:10.5px}.chart-grid line{stroke:var(--chart-grid);shape-rendering:crispEdges}.chart-baseline{stroke:var(--line-3);shape-rendering:crispEdges}.chart-cursor{fill:var(--chart-cursor)}.chart-bar{shape-rendering:crispEdges;transition:opacity var(--dur-1)var(--ease)}.chart[data-hovering=true] .chart-bar[data-hover=false]{opacity:.45}.chart-line{fill:none;stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}.chart-empty{position:absolute;display:flex;color:var(--ink-3);justify-content:center;align-items: center;font-size:12.5px;inset:0}.chart-tooltip{position:absolute;z-index:20;pointer-events:none;border-radius:var(--r-control);border:1px solid var(--line-2);background:var(--overlay);backdrop-filter:blur(14px)saturate(160%);-webkit-backdrop-filter:blur(14px)saturate(160%);box-shadow:var(--shadow-2);min-width:160px;max-width:280px;padding:8px 10px;transition:left 60ms linear,top 60ms linear;font-size:12px;top:0}.chart-tooltip-title{font-family:var(--font-mono);color:var(--ink-3);margin-bottom:6px;font-size:11px}.chart-tooltip-row{display:flex;align-items: center;gap:8px;line-height:1.7}.chart-tooltip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-2);flex:1;min-width:0}.chart-tooltip-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--ink-1)}.chart-tooltip-total{border-top:1px solid var(--line-1);margin-top:4px;padding-top:4px}.legend{display:flex;color:var(--ink-2);flex-wrap:wrap;gap:4px 14px;font-size:12px}.legend-item{display:inline-flex;transition:opacity var(--dur-1)var(--ease);align-items: center;gap:6px;max-width:240px}button.legend-item:hover{color:var(--ink-1)}.legend-item[data-off=true]{opacity:.38}.legend-value{font-family:var(--font-mono);color:var(--ink-3);font-size:11.5px}.sparkline path.area{opacity:.16}.share-bar{display:flex;overflow:hidden;background:var(--line-1);border-radius:3px;gap:2px;width:100%;height:8px}.share-bar-seg{transition:flex-grow var(--dur-3)var(--ease-out);min-width:2px;height:100%}.bar-list{display:flex;flex-direction:column;gap:2px}.bar-list-row{position:relative;display:flex;text-align:left;isolation:isolate;border-radius:6px;align-items: center;gap:10px;width:100%;height:30px;padding:0 8px}button.bar-list-row:hover{background:var(--hover)}.bar-list-fill{position:absolute;z-index:-1;opacity:.16;transition:width var(--dur-3)var(--ease-out);border-radius:5px;top:3px;bottom:3px;left:0}.bar-list-label{display:flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;align-items: center;gap:8px;min-width:0}.bar-list-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--ink-2);font-size:12px}.modal-overlay{position:fixed;z-index:80;display:flex;animation:fade var(--dur-2)var(--ease)both;background:#0000008c;justify-content:center;align-items: center;padding:16px;inset:0}.modal{border-radius:var(--r-panel);border:1px solid var(--line-2);background:var(--overlay);backdrop-filter:blur(20px)saturate(170%);-webkit-backdrop-filter:blur(20px)saturate(170%);box-shadow:var(--shadow-3);animation:rise var(--dur-3)var(--ease-out)both;overflow:hidden;width:min(480px,100%)}.modal-header{display:flex;justify-content:space-between;align-items: center;gap:12px;padding:14px 14px 10px 18px}.modal-title{letter-spacing:-.01em;font-size:15px;font-weight:600}.modal-body{color:var(--ink-2);display:flex;flex-direction:column;gap:10px;padding:4px 18px 16px}.modal-footer{display:flex;border-top:1px solid var(--line-1);background:color-mix(in srgb,var(--card)60%,transparent);justify-content:flex-end;gap:8px;padding:12px 18px}.costs-components{display:flex;flex-direction:column}.costs-component-row{display:grid;grid-template-columns:minmax(0,1fr)auto 56px;border-bottom:1px solid var(--line-1);align-items: center;gap:12px;padding:7px 0}.costs-component-share{text-align:right}.costs-component-total{border-bottom:0;font-weight:500}.errors-signature{display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;font-family:var(--font-mono);color:var(--ink-1);overflow-wrap:anywhere;-webkit-box-orient:vertical;font-size:12px;line-height:1.5}.errors-message{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);color:var(--bad);max-width:520px;font-size:12px}.errors-filter{max-width:260px}.errors-filter .truncate{min-width:0}.errors-detail{display:flex;background:var(--hover);border-bottom:1px solid var(--line-1);flex-direction:column;gap:10px;padding:4px 16px 14px}.errors-detail-message{color:var(--ink-1);max-height:200px}.errors-detail-meta{display:flex;flex-wrap:wrap;justify-content:space-between;align-items: center;gap:8px;font-size:12.5px}.errors-detail-models{display:flex;flex-wrap:wrap;gap:6px}.frustration-judge{gap:10px;font-size:13px}.frustration-spacer{flex:1}.frustration-progress{gap:8px}.frustration-progress-head{gap:10px}.frustration-progress-track{border-radius:3px;height:6px}.frustration-progress-fill{background:var(--accent-gradient);border-radius:3px}.frustration-progress-meta{flex-wrap:wrap;gap:4px 18px}.frustration-quote{display:flex;border:1px solid var(--line-2);border-radius:var(--r-control);background:var(--hover);flex-direction:column;gap:2px;padding:12px 14px}.frustration-quote-value{color:var(--ink-1);font-size:22px;font-weight:600}.frustration-chart-body{gap:14px}.frustration-classes{overflow-x:auto;scrollbar-width:none}.frustration-filters{flex-wrap:wrap;align-items: flex-start;gap:8px 16px}.frustration-filters .legend{flex:320px}.frustration-key{border-top:1px solid var(--line-1);color:var(--ink-3);padding-top:10px}.frustration-key .frustration-key-wide{max-width:none}.frustration-key-swatch[data-variant=assistant]{background:var(--ink-2)}.frustration-key-swatch[data-variant=angry]{background:color-mix(in srgb,var(--ink-2)55%,black)}.frustration-key-swatch[data-variant=other]{background:color-mix(in srgb,var(--ink-2)32%,transparent)}.frustration-key-swatch[data-variant=hatch]{background:repeating-linear-gradient(45deg,var(--ink-2)0 1.6px,color-mix(in srgb,var(--ink-2)14%,transparent)1.6px 3.5px)}.frustration-key-line{background:var(--ink-1);border-radius:1px;width:12px;height:2px}.frustration-chart-empty{display:flex;justify-content:center;align-items: center;height:340px}.frustration-tooltip-extra{display:flex;flex-direction:column;gap:2px}.frustration-judged{justify-content:flex-end;gap:6px}.models-chevron{display:inline-flex;color:var(--ink-3);transition:transform var(--dur-2)var(--ease)}.models-chevron[data-open=true]{color:var(--ink-1);transform:rotate(90deg)}.models-detail{display:grid;grid-template-columns:minmax(260px,340px)minmax(0,1fr);background:var(--panel);border-bottom:1px solid var(--line-1);animation:rise var(--dur-3)var(--ease-out)both;gap:24px;padding:16px 16px 18px 44px}.models-detail-facts{display:flex;flex-direction:column;gap:16px;min-width:0}.models-detail-chart{display:flex;flex-direction:column;gap:10px;min-width:0}@media (max-width:1100px){.models-detail{grid-template-columns:minmax(0,1fr);padding-left:16px}}.projects-folder{gap:8px;min-width:0;max-width:280px}.providers-select{max-width:220px}.providers-mix{display:flex;background:var(--bg);border-top:1px solid var(--line-1);flex-direction:column;gap:10px;padding:12px 16px 14px}.providers-swatch-slot{display:inline-flex;flex:none;width:10px}.providers-account{max-width:280px}.providers-accounts{border-top:1px solid var(--line-1);margin:0 -16px -16px}.request-drawer-error{--rd-tone:var(--bad);--rd-tone-soft:var(--bad-soft);border-radius:var(--r-control);border:1px solid color-mix(in srgb,var(--rd-tone)35%,transparent);background:var(--rd-tone-soft);padding:10px 12px 12px}.request-drawer-error[data-tone=warn]{--rd-tone:var(--warn);--rd-tone-soft:var(--warn-soft)}.request-drawer-error-label{color:var(--rd-tone);margin-bottom:6px;font-size:12px;font-weight:550}.request-drawer-error-text{font-family:var(--font-mono);color:var(--ink-1);white-space:pre-wrap;overflow-wrap:anywhere;overflow:auto;max-height:240px;margin:0;font-size:12px;line-height:1.55}.request-drawer-file{display:flex;flex-direction:column;gap:2px;margin-top:12px}.tools-filter{width:200px}.tools-name{max-width:220px}.tools-share{display:inline-block;text-align:right;min-width:32px;margin-left:8px}.traces-models{display:inline-flex;color:var(--ink-2);align-items: center;gap:6px;min-width:0;max-width:220px}.traces-title{display:block;max-width:720px}.traces-spin{animation:.9s linear infinite traces-spin}@keyframes traces-spin{to{transform:rotate(360deg)}}.traces-toolbar{display:flex;flex-wrap:wrap;align-items: center;gap:12px}.traces-check{display:inline-flex;color:var(--ink-2);cursor:pointer;user-select:none;align-items: center;gap:6px;font-size:12.5px}.traces-check input{accent-color:var(--accent);margin:0}.traces-search{display:inline-flex;align-items: center;gap:4px}.traces-match-count{text-align:center;min-width:36px;font-size:12px}.traces-legend{display:inline-flex;color:var(--ink-2);flex-wrap:wrap;gap:12px;margin-left:auto;font-size:12px}.traces-legend-item{display:inline-flex;align-items: center;gap:6px}.traces-minimap{display:block;cursor:crosshair;border-radius:var(--r-chip);border:1px solid var(--line-2);background:var(--panel);touch-action:none;width:100%}.traces-timeline{position:relative;display:flex;overflow-y:auto;overflow-x:hidden;border-top:1px solid var(--line-1);max-height:560px}.traces-canvas{cursor:grab;outline:none;touch-action:none}.traces-canvas:focus-visible{outline:1px solid var(--focus);outline-offset:-1px;border-radius:var(--r-chip)}.traces-canvas:active{cursor:grabbing}.traces-chevron{display:inline-flex;cursor:pointer;color:var(--ink-3);background:0 0;border:none;border-radius:4px;padding:0}.traces-chevron:hover{color:var(--ink-1)}.traces-chevron:focus-visible{outline:2px solid var(--focus)}.traces-gutter-track{color:var(--ink-1);font-size:12px;font-weight:500}.traces-gutter-model{color:var(--ink-3);font-size:10.5px}.traces-gutter-lane{position:absolute;color:var(--ink-3);font-size:10.5px}.traces-tooltip{position:fixed;z-index:60;pointer-events:none;background:var(--overlay);backdrop-filter:blur(12px);border:1px solid var(--line-3);border-radius:var(--r-control);box-shadow:var(--shadow-2);max-width:300px;padding:8px 10px;font-size:12px;line-height:1.5}.traces-tooltip-title{color:var(--ink-1);font-weight:500}.traces-tooltip-detail{color:var(--ink-2);word-break:break-word}.traces-list{overflow-y:auto;height:340px}.traces-row{display:flex;border:none;border-bottom:1px solid var(--line-1);color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background var(--dur-1)var(--ease);background:0 0;align-items: center;gap:10px;width:100%;height:28px;padding:0 16px}.traces-row:hover{background:var(--hover)}.traces-row:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.traces-row[data-selected=true]{background:var(--selected);box-shadow:inset 2px 0 0 var(--accent)}.traces-row[data-static=true]{cursor:default}.traces-row[data-static=true]:hover{background:0 0}.traces-kind{border-radius:var(--r-chip);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-1);background:color-mix(in srgb,var(--traces-kind-color)18%,transparent);box-shadow:inset 2px 0 0 var(--traces-kind-color);flex-shrink:0;width:72px;padding:1px 0;font-size:11px;font-weight:500}.traces-row-track{color:var(--ink-3);flex-shrink:0;max-width:110px;font-size:11px}.traces-row-label{color:var(--ink-1);flex-shrink:1;min-width:0;font-size:12.5px}.traces-row-detail{color:var(--ink-3);flex:1;min-width:0;font-size:12px}.traces-row-meta{display:inline-flex;color:var(--ink-3);flex-shrink:0;gap:12px;margin-left:auto;font-size:11.5px}.traces-drawer{gap:16px}.traces-pre{white-space:pre-wrap;word-break:break-word;margin:0}.traces-pre[data-scroll=true]{overflow-y:auto;max-height:360px}
|
|
1
|
+
:root,[data-theme=dark]{--buncss-light: ;--buncss-dark:initial;color-scheme:dark;--bg:#000;--panel:#09090a;--card:#0e0e10;--raised:#17171a;--overlay:#0e0e10c7;--hover:#ffffff09;--press:#ffffff0f;--selected:#ffffff13;--line-1:#ffffff0f;--line-2:#ffffff17;--line-3:#ffffff24;--line-4:#ffffff38;--ink-1:#ededef;--ink-2:#a0a0a8;--ink-3:#6c6c74;--ink-4:#46464c;--ink-inverse:#0a0a0b;--accent-a:#5ad8e6;--accent-b:#ed4abf;--accent:#f068c8;--accent-soft:#ed4abf24;--accent-line:#ed4abf59;--accent-gradient:linear-gradient(100deg,var(--accent-a),var(--accent-b));--focus:#5ad8e6;--ok:#3ecf8e;--ok-soft:#3ecf8e21;--warn:#f5a524;--warn-soft:#f5a52421;--bad:#ff6166;--bad-soft:#ff616621;--live:#3ecf8e;--chart-grid:#ffffff0e;--chart-axis:#5c5c64;--chart-cursor:#ffffff0d;--chart-primary:#5ad8e6;--chart-secondary:#ed4abf;--shadow-1:0 1px 0 #ffffff08 inset,0 1px 2px #00000080;--shadow-2:0 8px 24px #0000008c,0 1px 0 #ffffff0d inset;--shadow-3:0 24px 64px #000000b3,0 1px 0 #ffffff0f inset}[data-theme=light]{--buncss-light:initial;--buncss-dark: ;color-scheme:light;--bg:#f2f2f3;--panel:#fff;--card:#fff;--raised:#f6f6f7;--overlay:#fffc;--hover:#00000008;--press:#0000000d;--selected:#0000000f;--line-1:#0000000f;--line-2:#00000017;--line-3:#00000024;--line-4:#00000038;--ink-1:#151518;--ink-2:#5a5a63;--ink-3:#8b8b94;--ink-4:#b9b9c0;--ink-inverse:#fff;--accent-a:#1fa9bb;--accent-b:#d42ea3;--accent:#c42596;--accent-soft:#d42ea31a;--accent-line:#d42ea34d;--focus:#1fa9bb;--ok:#12a36b;--ok-soft:#12a36b1c;--warn:#c77c02;--warn-soft:#c77c021c;--bad:#dc3a40;--bad-soft:#dc3a401a;--live:#12a36b;--chart-grid:#0000000f;--chart-axis:#9a9aa2;--chart-cursor:#0000000a;--chart-primary:#1fa9bb;--chart-secondary:#d42ea3;--shadow-1:0 1px 2px #0000000a;--shadow-2:0 8px 24px #0000001a;--shadow-3:0 24px 64px #00000029}:root{--font-sans:"Inter var","Inter",ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--font-mono:ui-monospace,"SF Mono","JetBrains Mono","Fira Code",Menlo,Consolas,monospace;--r-chip:6px;--r-control:8px;--r-card:12px;--r-panel:16px;--r-pill:999px;--topbar-h:52px;--sidebar-w:224px;--gutter:28px;--ease:cubic-bezier(.2,0,0,1);--ease-out:cubic-bezier(.16,1,.3,1);--dur-1:.12s;--dur-2:.2s;--dur-3:.36s;--stagger:40ms}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;background:var(--bg)}body{font-family:var(--font-sans);color:var(--ink-1);background:var(--bg);font-feature-settings:"cv11","ss01";min-height:100dvh;font-size:13.5px;line-height:1.5}h1,h2,h3,h4,p,ul,ol,figure{margin:0;padding:0}ul,ol{list-style:none}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer;background:0 0;border:0;padding:0}button:disabled{cursor:default}a{color:inherit;text-decoration:none}svg{display:block;flex-shrink:0}table{border-collapse:collapse;border-spacing:0}code,pre,kbd{font-family:var(--font-mono)}::selection{background:var(--accent-soft);color:var(--ink-1)}:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:4px}[hidden]{display:none!important}*{scrollbar-width:thin;scrollbar-color:var(--line-3)transparent}.mono{font-family:var(--font-mono);font-size:.93em}.num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:.93em}.muted{color:var(--ink-2)}.dim{color:var(--ink-3)}.micro{color:var(--ink-3);font-size:12px;font-weight:500;line-height:1.4}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.tone-ok{color:var(--ok)}.tone-warn{color:var(--warn)}.tone-bad{color:var(--bad)}.tone-accent{color:var(--accent)}.gradient-text{background:var(--accent-gradient);color:#0000;-webkit-background-clip:text;background-clip:text}@keyframes rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes fade{0%{opacity:0}to{opacity:1}}@keyframes ping{0%{transform:scale(1);opacity:.7}80%,to{transform:scale(2.6);opacity:0}}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes indeterminate{0%{transform:translate(-100%)}to{transform:translate(250%)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes flash{0%{color:var(--accent-a)}to{color:inherit}}.rise{animation:rise var(--dur-3)var(--ease-out)backwards;animation-delay:calc(var(--i,0)*var(--stagger))}.spin{animation:.9s linear infinite spin}@media (prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:1ms!important;animation-delay:0s!important;transition-duration:1ms!important}}.shell-ambient{position:fixed;pointer-events:none;z-index:0;background:radial-gradient(60rem 28rem at 12% -10%,color-mix(in srgb,var(--accent-a)7%,transparent),transparent 70%),radial-gradient(50rem 26rem at 95% -12%,color-mix(in srgb,var(--accent-b)6%,transparent),transparent 70%);inset:0}.topbar{position:fixed;height:var(--topbar-h);z-index:40;display:flex;background:color-mix(in srgb,var(--bg)72%,transparent);backdrop-filter:blur(14px)saturate(160%);-webkit-backdrop-filter:blur(14px)saturate(160%);transition:border-color var(--dur-2)var(--ease);border-bottom:1px solid #0000;align-items: center;gap:12px;padding:0 14px 0 18px;top:0;left:0;right:0}.topbar[data-scrolled=true]{border-bottom-color:var(--line-1)}.topbar-brand{display:flex;min-width:calc(var(--sidebar-w) - 18px);letter-spacing:-.01em;align-items: center;gap:10px;font-weight:600}.topbar-mark{display:block;flex:none}.topbar-slash{color:var(--ink-4);font-size:18px;font-weight:300}.topbar-title{color:var(--ink-1);white-space:nowrap;font-weight:500}.topbar-spacer{flex:1}.topbar-actions{display:flex;align-items: center;gap:8px}@media (min-width:901px){.btn.topbar-menu{display:none}}.topbar-progress{position:absolute;overflow:hidden;pointer-events:none;height:2px;bottom:-1px;left:0;right:0}.topbar-progress-fill{background:var(--accent-gradient);transition:width var(--dur-3)var(--ease);box-shadow:0 0 12px var(--accent-b);height:100%}.topbar-progress-fill[data-indeterminate=true]{animation:indeterminate 1.2s var(--ease)infinite;width:40%!important}.sidebar{position:fixed;top:var(--topbar-h);width:var(--sidebar-w);overflow-y:auto;scrollbar-width:none;display:flex;z-index:30;flex-direction:column;gap:18px;padding:8px 10px 14px;bottom:0;left:0}.sidebar::-webkit-scrollbar{display:none}.nav-group{display:flex;flex-direction:column;gap:1px}.nav-heading{color:var(--ink-3);padding:0 10px 6px;font-size:12px;font-weight:500}.nav-row{display:flex;border-radius:var(--r-control);color:var(--ink-2);text-align:left;transition:background var(--dur-1)var(--ease),color var(--dur-1)var(--ease);align-items: center;gap:10px;width:100%;height:32px;padding:0 10px;font-weight:450}.nav-row:hover{background:var(--hover);color:var(--ink-1)}.nav-row:active{transform:scale(.99)}.nav-row[data-active=true]{background:var(--selected);color:var(--ink-1)}.nav-row svg{color:var(--ink-3);transition:color var(--dur-1)var(--ease)}.nav-row[data-active=true] svg{color:var(--accent)}.nav-row-label{flex:1}.nav-row kbd{color:var(--ink-4);opacity:0;transition:opacity var(--dur-1)var(--ease);font-size:10.5px}.nav-row:hover kbd{opacity:1}.sidebar-foot{border-radius:var(--r-card);border:1px solid var(--line-1);background:var(--card);display:flex;flex-direction:column;gap:6px;margin-top:auto;padding:10px}.shell-panel{position:relative;z-index:1;margin:var(--topbar-h)8px 8px var(--sidebar-w);min-height:calc(100dvh - var(--topbar-h) - 8px);background:var(--panel);border-radius:var(--r-panel);border:1px solid var(--line-1);box-shadow:var(--shadow-1);overflow:clip}.shell-content{padding:26px var(--gutter)48px;max-width:1560px;margin:0 auto}.drawer-scrim{position:fixed;z-index:60;animation:fade var(--dur-2)var(--ease)both;background:#00000080;inset:0}@media (max-width:1360px){:root{--sidebar-w:204px;--gutter:22px}}@media (max-width:900px){:root{--gutter:16px}.topbar-brand{min-width:0}.topbar-menu{display:inline-flex}.sidebar{z-index:70;background:var(--overlay);backdrop-filter:blur(18px)saturate(160%);-webkit-backdrop-filter:blur(18px)saturate(160%);border-right:1px solid var(--line-2);transition:transform var(--dur-3)var(--ease-out);width:260px;padding-top:16px;top:0;transform:translate(-102%)}.sidebar[data-open=true]{box-shadow:var(--shadow-3);transform:none}.shell-panel{margin-left:8px}.topbar-hide-narrow{display:none!important}}.page{display:flex;flex-direction:column;gap:20px}.page-header{display:flex;flex-wrap:wrap;justify-content:space-between;align-items: flex-end;gap:16px;padding-bottom:4px}.page-title{letter-spacing:-.02em;font-size:22px;font-weight:600;line-height:1.2}.page-description{color:var(--ink-2);max-width:72ch;margin-top:4px}.page-actions{display:flex;flex-wrap:wrap;align-items: center;gap:8px}.grid{display:grid;gap:16px}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-main-side{grid-template-columns:minmax(0,2fr)minmax(0,1fr)}@media (max-width:1100px){.grid-2,.grid-3,.grid-main-side{grid-template-columns:minmax(0,1fr)}}.row{display:flex;align-items: center;gap:8px;min-width:0}.stack{display:flex;flex-direction:column;gap:4px;min-width:0}.card{position:relative;border-radius:var(--r-card);background:linear-gradient(var(--card),var(--card))padding-box,linear-gradient(180deg,var(--line-3),var(--line-1)40%)border-box;box-shadow:var(--shadow-1);display:flex;border:1px solid #0000;flex-direction:column;min-width:0}.card-header{display:flex;flex-wrap:wrap;justify-content:space-between;align-items: flex-start;gap:12px;padding:14px 16px 0}.card-titles{display:flex;flex-direction:column;gap:2px;min-width:0}.card-title{letter-spacing:-.005em;display:flex;align-items: center;gap:8px;font-size:14px;font-weight:550}.card-description{color:var(--ink-3);font-size:12.5px}.card-actions{display:flex;flex-wrap:wrap;align-items: center;gap:6px}.card-body{flex:1;min-width:0;padding:14px 16px 16px}.card-body[data-flush=true]{padding:10px 0 0}.card-footer{border-top:1px solid var(--line-1);color:var(--ink-3);display:flex;justify-content:space-between;align-items: center;gap:8px;padding:10px 16px;font-size:12.5px}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(var(--stat-min,170px),1fr));border-radius:var(--r-card);background:linear-gradient(var(--card),var(--card))padding-box,linear-gradient(180deg,var(--line-3),var(--line-1)40%)border-box;box-shadow:var(--shadow-1);overflow:hidden;border:1px solid #0000}.stat{position:relative;display:flex;box-shadow:1px 0 0 var(--line-1),0 1px 0 var(--line-1);flex-direction:column;gap:6px;min-width:0;padding:14px 16px 12px}.stat-label{color:var(--ink-2);display:flex;align-items: center;gap:6px;font-size:12.5px;font-weight:500}.stat-value{letter-spacing:-.025em;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:24px;font-weight:550;line-height:1.15}.stat[data-size=sm] .stat-value{font-size:18px}.stat-value[data-flash=true]{animation:flash .9s var(--ease)both}.stat-foot{display:flex;color:var(--ink-3);align-items: center;gap:8px;min-height:18px;font-size:12px}.stat-spark{height:28px;margin-top:2px}.delta{display:inline-flex;font-family:var(--font-mono);border-radius:var(--r-pill);background:var(--raised);color:var(--ink-2);align-items: center;gap:2px;padding:1px 6px;font-size:11.5px;font-weight:500}.delta[data-tone=good]{color:var(--ok);background:var(--ok-soft)}.delta[data-tone=bad]{color:var(--bad);background:var(--bad-soft)}.btn{display:inline-flex;border-radius:var(--r-control);white-space:nowrap;border:1px solid var(--line-2);background:var(--raised);color:var(--ink-1);transition:background var(--dur-1)var(--ease),border-color var(--dur-1)var(--ease),transform var(--dur-1)var(--ease);justify-content:center;align-items: center;gap:6px;height:30px;padding:0 12px;font-size:13px;font-weight:500}.btn:hover:not(:disabled){border-color:var(--line-3);background:color-mix(in srgb,var(--raised)80%,var(--ink-1)6%)}.btn:active:not(:disabled){transform:scale(.97)}.btn:disabled{opacity:.5}.btn[data-variant=primary]{background:var(--ink-1);color:var(--ink-inverse);border-color:#0000}.btn[data-variant=primary]:hover:not(:disabled){background:color-mix(in srgb,var(--ink-1)88%,transparent)}.btn[data-variant=accent]{background:var(--accent-gradient);color:#fff;background-origin:border-box;border-color:#0000}.btn[data-variant=ghost]{color:var(--ink-2);background:0 0;border-color:#0000}.btn[data-variant=ghost]:hover:not(:disabled){background:var(--hover);color:var(--ink-1)}.btn[data-variant=danger]{background:var(--bad-soft);color:var(--bad);border-color:color-mix(in srgb,var(--bad)30%,transparent)}.btn[data-size=sm]{height:26px;padding:0 9px;font-size:12.5px}.btn[data-icon=true]{width:30px;padding:0}.btn[data-icon=true][data-size=sm]{width:26px}.input{border-radius:var(--r-control);border:1px solid var(--line-2);background:var(--card);color:var(--ink-1);transition:border-color var(--dur-1)var(--ease);min-width:0;height:30px;padding:0 10px;font-size:13px}.input::placeholder{color:var(--ink-3)}.input:hover{border-color:var(--line-3)}.input:focus{outline:none;border-color:var(--focus);box-shadow:0 0 0 3px color-mix(in srgb,var(--focus)18%,transparent)}.search{position:relative;display:inline-flex;align-items: center}.search svg{position:absolute;color:var(--ink-3);pointer-events:none;left:9px}.search .input{width:240px;padding-left:30px}select.input{appearance:none;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;padding-right:28px}.check{display:inline-flex;color:var(--ink-2);cursor:pointer;user-select:none;align-items: center;gap:6px;font-size:12.5px}.check input{accent-color:var(--accent)}.segmented{position:relative;display:inline-flex;border-radius:var(--r-control);background:var(--card);border:1px solid var(--line-2);isolation:isolate;align-items: center;gap:0;padding:2px}.segmented-thumb{position:absolute;background:var(--raised);border:1px solid var(--line-3);transition:left var(--dur-2)var(--ease-out),width var(--dur-2)var(--ease-out);z-index:-1;border-radius:6px;top:2px;bottom:2px;box-shadow:0 1px 2px #00000040}.segmented-option{color:var(--ink-3);white-space:nowrap;display:inline-flex;transition:color var(--dur-1)var(--ease);border-radius:6px;align-items: center;gap:6px;height:24px;padding:0 10px;font-size:12.5px;font-weight:500}.segmented-option:hover,.segmented-option[data-active=true]{color:var(--ink-1)}.segmented[data-size=sm] .segmented-option{height:22px;padding:0 8px;font-size:12px}.tabs{display:flex;border-bottom:1px solid var(--line-1);align-items: center;gap:16px;padding:0 16px}.tab{position:relative;color:var(--ink-3);display:inline-flex;align-items: center;gap:6px;height:36px;font-size:13px;font-weight:500}.tab:hover,.tab[data-active=true]{color:var(--ink-1)}.tab[data-active=true]:after{content:"";position:absolute;background:var(--accent-gradient);border-radius:2px;height:2px;bottom:-1px;left:0;right:0}.kbd{display:inline-flex;border:1px solid var(--line-2);background:var(--card);font-family:var(--font-mono);color:var(--ink-3);border-radius:5px;justify-content:center;align-items: center;min-width:18px;height:18px;padding:0 4px;font-size:10.5px}.badge{display:inline-flex;border-radius:var(--r-pill);white-space:nowrap;background:var(--raised);color:var(--ink-2);border:1px solid var(--line-1);align-items: center;gap:5px;height:20px;padding:0 8px;font-size:11.5px;font-weight:500}.badge[data-tone=ok]{background:var(--ok-soft);color:var(--ok);border-color:#0000}.badge[data-tone=warn]{background:var(--warn-soft);color:var(--warn);border-color:#0000}.badge[data-tone=bad]{background:var(--bad-soft);color:var(--bad);border-color:#0000}.badge[data-tone=accent]{background:var(--accent-soft);color:var(--accent);border-color:#0000}.badge[data-mono=true]{font-family:var(--font-mono);font-size:11px}.dot{position:relative;display:inline-block;background:var(--ink-3);border-radius:50%;flex-shrink:0;width:8px;height:8px}.dot[data-tone=ok],.dot[data-tone=live]{background:var(--live)}.dot[data-tone=warn]{background:var(--warn)}.dot[data-tone=bad]{background:var(--bad)}.dot[data-tone=accent]{background:var(--accent)}.dot[data-pulse=true]:after{content:"";position:absolute;background:inherit;animation:ping 1.6s var(--ease-out)infinite;border-radius:50%;inset:0}.swatch{display:inline-block;border-radius:2px;flex-shrink:0;width:8px;height:8px}.table-wrap{overflow-x:auto;min-width:0}.table{width:100%;font-size:13px}.table th{position:sticky;z-index:1;text-align:left;color:var(--ink-3);white-space:nowrap;background:var(--card);border-bottom:1px solid var(--line-1);user-select:none;padding:8px 12px;font-size:12px;font-weight:500;top:0}.table th:first-child,.table td:first-child{padding-left:16px}.table th:last-child,.table td:last-child{padding-right:16px}.table th[data-sortable=true]{cursor:pointer}.table th[data-sortable=true]:hover,.table th[data-sorted]{color:var(--ink-1)}.table th .sort-arrow{display:inline-block;opacity:.8;vertical-align:-1px;margin-left:4px}.table td{border-bottom:1px solid var(--line-1);vertical-align:middle;white-space:nowrap;padding:9px 12px}.table tbody tr:last-child td{border-bottom:0}.table tbody tr{transition:background var(--dur-1)var(--ease)}.table tbody tr:hover{background:var(--hover)}.table tbody tr[data-clickable=true]{cursor:pointer}.table tbody tr[data-selected=true]{background:var(--selected)}.table [data-align=right]{text-align:right}.table [data-align=center]{text-align:center}.table td[data-wrap=true]{white-space:normal}.table[data-dense=true] td{padding-top:6px;padding-bottom:6px}.table-more{display:flex;border-top:1px solid var(--line-1);justify-content:center;align-items: center;gap:8px;padding:10px}.cell-primary{color:var(--ink-1);font-weight:500}.cell-secondary{color:var(--ink-3);font-size:12px}.meter{position:relative;background:var(--line-1);overflow:hidden;border-radius:2px;min-width:48px;height:4px}.meter-fill{position:absolute;background:var(--chart-primary);transition:width var(--dur-3)var(--ease-out);border-radius:2px;inset:0 auto 0 0}.meter-cell{display:flex;justify-content:flex-end;align-items: center;gap:10px}.meter-cell .meter{width:64px}.empty{display:flex;text-align:center;color:var(--ink-3);flex-direction:column;justify-content:center;align-items: center;gap:6px;min-height:140px;padding:40px 16px}.empty svg{color:var(--ink-4);margin-bottom:4px}.empty-title{color:var(--ink-2);font-weight:500}.empty-hint{max-width:44ch;font-size:12.5px}.error-state{display:flex;border-radius:var(--r-control);background:var(--bad-soft);color:var(--bad);align-items: center;gap:12px;margin:12px 16px;padding:12px 14px;font-size:13px}.error-state-message{overflow-wrap:anywhere;flex:1;min-width:0}.skeleton{background:linear-gradient(90deg,var(--line-1)0%,var(--line-2)50%,var(--line-1)100%);animation:1.6s linear infinite shimmer;background-size:200% 100%;border-radius:6px}[data-stale=true]{opacity:.55;transition:opacity var(--dur-2)var(--ease)}[data-stale=false]{transition:opacity var(--dur-2)var(--ease)}.drawer{position:fixed;width:min(var(--drawer-w,560px),calc(100vw - 16px));z-index:61;display:flex;border-radius:var(--r-panel);border:1px solid var(--line-2);background:var(--overlay);backdrop-filter:blur(20px)saturate(170%);-webkit-backdrop-filter:blur(20px)saturate(170%);box-shadow:var(--shadow-3);animation:drawer-in var(--dur-3)var(--ease-out)both;overflow:hidden;flex-direction:column;top:8px;bottom:8px;right:8px}@keyframes drawer-in{0%{transform:translate(24px);opacity:0}to{transform:none;opacity:1}}.drawer-header{display:flex;border-bottom:1px solid var(--line-1);align-items: flex-start;gap:12px;padding:16px 16px 12px 20px}.drawer-titles{overflow-wrap:anywhere;flex:1;min-width:0}.drawer-title{letter-spacing:-.01em;font-size:15px;font-weight:600}.drawer-subtitle{color:var(--ink-3);margin-top:2px;font-size:12.5px}.drawer-body{overflow-y:auto;display:flex;flex-direction:column;flex:1;gap:18px;padding:16px 20px 24px}.kv{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px 16px}.kv-item{display:flex;flex-direction:column;gap:2px;min-width:0}.kv-key{color:var(--ink-3);font-size:12px}.kv-value{font-family:var(--font-mono);color:var(--ink-1);overflow-wrap:anywhere;font-size:12.5px}.section-label{color:var(--ink-3);margin-bottom:8px;font-size:12px;font-weight:500}.code-block{border-radius:var(--r-control);border:1px solid var(--line-1);background:var(--card);font-family:var(--font-mono);color:var(--ink-2);overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;max-height:480px;margin:0;padding:12px 14px;font-size:12px;line-height:1.55}.live-chip{display:inline-flex;border-radius:var(--r-pill);border:1px solid var(--line-2);background:var(--card);color:var(--ink-2);white-space:nowrap;transition:border-color var(--dur-1)var(--ease);align-items: center;gap:8px;height:30px;padding:0 10px 0 11px;font-size:12.5px}.live-chip:hover{border-color:var(--line-3);color:var(--ink-1)}.live-chip-count{font-family:var(--font-mono);color:var(--ink-3);font-size:11.5px}.chart{position:relative;user-select:none;width:100%;min-width:0}.chart svg{overflow:visible}.chart-axis text{fill:var(--chart-axis);font-family:var(--font-mono);font-size:10.5px}.chart-grid line{stroke:var(--chart-grid);shape-rendering:crispEdges}.chart-baseline{stroke:var(--line-3);shape-rendering:crispEdges}.chart-cursor{fill:var(--chart-cursor)}.chart-bar{shape-rendering:crispEdges;transition:opacity var(--dur-1)var(--ease)}.chart[data-hovering=true] .chart-bar[data-hover=false]{opacity:.45}.chart-line{fill:none;stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}.chart-empty{position:absolute;display:flex;color:var(--ink-3);justify-content:center;align-items: center;font-size:12.5px;inset:0}.chart-tooltip{position:absolute;z-index:20;pointer-events:none;border-radius:var(--r-control);border:1px solid var(--line-2);background:var(--overlay);backdrop-filter:blur(14px)saturate(160%);-webkit-backdrop-filter:blur(14px)saturate(160%);box-shadow:var(--shadow-2);min-width:160px;max-width:280px;padding:8px 10px;transition:left 60ms linear,top 60ms linear;font-size:12px;top:0}.chart-tooltip-title{font-family:var(--font-mono);color:var(--ink-3);margin-bottom:6px;font-size:11px}.chart-tooltip-row{display:flex;align-items: center;gap:8px;line-height:1.7}.chart-tooltip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-2);flex:1;min-width:0}.chart-tooltip-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--ink-1)}.chart-tooltip-total{border-top:1px solid var(--line-1);margin-top:4px;padding-top:4px}.legend{display:flex;color:var(--ink-2);flex-wrap:wrap;gap:4px 14px;font-size:12px}.legend-item{display:inline-flex;transition:opacity var(--dur-1)var(--ease);align-items: center;gap:6px;max-width:240px}button.legend-item:hover{color:var(--ink-1)}.legend-item[data-off=true]{opacity:.38}.legend-value{font-family:var(--font-mono);color:var(--ink-3);font-size:11.5px}.sparkline path.area{opacity:.16}.share-bar{display:flex;overflow:hidden;background:var(--line-1);border-radius:3px;gap:2px;width:100%;height:8px}.share-bar-seg{transition:flex-grow var(--dur-3)var(--ease-out);min-width:2px;height:100%}.bar-list{display:flex;flex-direction:column;gap:2px}.bar-list-row{position:relative;display:flex;text-align:left;isolation:isolate;border-radius:6px;align-items: center;gap:10px;width:100%;height:30px;padding:0 8px}button.bar-list-row:hover{background:var(--hover)}.bar-list-fill{position:absolute;z-index:-1;opacity:.16;transition:width var(--dur-3)var(--ease-out);border-radius:5px;top:3px;bottom:3px;left:0}.bar-list-label{display:flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;align-items: center;gap:8px;min-width:0}.bar-list-value{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--ink-2);font-size:12px}.modal-overlay{position:fixed;z-index:80;display:flex;animation:fade var(--dur-2)var(--ease)both;background:#0000008c;justify-content:center;align-items: center;padding:16px;inset:0}.modal{border-radius:var(--r-panel);border:1px solid var(--line-2);background:var(--overlay);backdrop-filter:blur(20px)saturate(170%);-webkit-backdrop-filter:blur(20px)saturate(170%);box-shadow:var(--shadow-3);animation:rise var(--dur-3)var(--ease-out)both;overflow:hidden;width:min(480px,100%)}.modal-header{display:flex;justify-content:space-between;align-items: center;gap:12px;padding:14px 14px 10px 18px}.modal-title{letter-spacing:-.01em;font-size:15px;font-weight:600}.modal-body{color:var(--ink-2);display:flex;flex-direction:column;gap:10px;padding:4px 18px 16px}.modal-footer{display:flex;border-top:1px solid var(--line-1);background:color-mix(in srgb,var(--card)60%,transparent);justify-content:flex-end;gap:8px;padding:12px 18px}.costs-components{display:flex;flex-direction:column}.costs-component-row{display:grid;grid-template-columns:minmax(0,1fr)auto 56px;border-bottom:1px solid var(--line-1);align-items: center;gap:12px;padding:7px 0}.costs-component-share{text-align:right}.costs-component-total{border-bottom:0;font-weight:500}.errors-signature{display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;font-family:var(--font-mono);color:var(--ink-1);overflow-wrap:anywhere;-webkit-box-orient:vertical;font-size:12px;line-height:1.5}.errors-message{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);color:var(--bad);max-width:520px;font-size:12px}.errors-filter{max-width:260px}.errors-filter .truncate{min-width:0}.errors-detail{display:flex;background:var(--hover);border-bottom:1px solid var(--line-1);flex-direction:column;gap:10px;padding:4px 16px 14px}.errors-detail-message{color:var(--ink-1);max-height:200px}.errors-detail-meta{display:flex;flex-wrap:wrap;justify-content:space-between;align-items: center;gap:8px;font-size:12.5px}.errors-detail-models{display:flex;flex-wrap:wrap;gap:6px}.frustration-judge{gap:10px;font-size:13px}.frustration-spacer{flex:1}.frustration-progress{gap:8px}.frustration-progress-head{gap:10px}.frustration-progress-track{border-radius:3px;height:6px}.frustration-progress-fill{background:var(--accent-gradient);border-radius:3px}.frustration-progress-meta{flex-wrap:wrap;gap:4px 18px}.frustration-quote{display:flex;border:1px solid var(--line-2);border-radius:var(--r-control);background:var(--hover);flex-direction:column;gap:2px;padding:12px 14px}.frustration-quote-value{color:var(--ink-1);font-size:22px;font-weight:600}.frustration-chart-body{gap:14px}.frustration-classes{overflow-x:auto;scrollbar-width:none}.frustration-filters{flex-wrap:wrap;align-items: flex-start;gap:8px 16px}.frustration-filters .legend{flex:320px}.frustration-key{border-top:1px solid var(--line-1);color:var(--ink-3);padding-top:10px}.frustration-key .frustration-key-wide{max-width:none}.frustration-key-swatch[data-variant=assistant]{background:var(--ink-2)}.frustration-key-swatch[data-variant=angry]{background:color-mix(in srgb,var(--ink-2)55%,black)}.frustration-key-swatch[data-variant=other]{background:color-mix(in srgb,var(--ink-2)32%,transparent)}.frustration-key-swatch[data-variant=hatch]{background:repeating-linear-gradient(45deg,var(--ink-2)0 1.6px,color-mix(in srgb,var(--ink-2)14%,transparent)1.6px 3.5px)}.frustration-key-line{background:var(--ink-1);border-radius:1px;width:12px;height:2px}.frustration-chart-empty{display:flex;justify-content:center;align-items: center;height:340px}.frustration-tooltip-extra{display:flex;flex-direction:column;gap:2px}.frustration-judged{justify-content:flex-end;gap:6px}.models-chevron{display:inline-flex;color:var(--ink-3);transition:transform var(--dur-2)var(--ease)}.models-chevron[data-open=true]{color:var(--ink-1);transform:rotate(90deg)}.models-detail{display:grid;grid-template-columns:minmax(260px,340px)minmax(0,1fr);background:var(--panel);border-bottom:1px solid var(--line-1);animation:rise var(--dur-3)var(--ease-out)both;gap:24px;padding:16px 16px 18px 44px}.models-detail-facts{display:flex;flex-direction:column;gap:16px;min-width:0}.models-detail-chart{display:flex;flex-direction:column;gap:10px;min-width:0}@media (max-width:1100px){.models-detail{grid-template-columns:minmax(0,1fr);padding-left:16px}}.projects-folder{gap:8px;min-width:0;max-width:280px}.providers-select{max-width:220px}.providers-mix{display:flex;background:var(--bg);border-top:1px solid var(--line-1);flex-direction:column;gap:10px;padding:12px 16px 14px}.providers-swatch-slot{display:inline-flex;flex:none;width:10px}.providers-account{max-width:280px}.providers-accounts{border-top:1px solid var(--line-1);margin:0 -16px -16px}.request-drawer-error{--rd-tone:var(--bad);--rd-tone-soft:var(--bad-soft);border-radius:var(--r-control);border:1px solid color-mix(in srgb,var(--rd-tone)35%,transparent);background:var(--rd-tone-soft);padding:10px 12px 12px}.request-drawer-error[data-tone=warn]{--rd-tone:var(--warn);--rd-tone-soft:var(--warn-soft)}.request-drawer-error-label{color:var(--rd-tone);margin-bottom:6px;font-size:12px;font-weight:550}.request-drawer-error-text{font-family:var(--font-mono);color:var(--ink-1);white-space:pre-wrap;overflow-wrap:anywhere;overflow:auto;max-height:240px;margin:0;font-size:12px;line-height:1.55}.request-drawer-file{display:flex;flex-direction:column;gap:2px;margin-top:12px}.tools-filter{width:200px}.tools-name{max-width:220px}.tools-share{display:inline-block;text-align:right;min-width:32px;margin-left:8px}.traces-models{display:inline-flex;color:var(--ink-2);align-items: center;gap:6px;min-width:0;max-width:220px}.traces-title{display:block;max-width:720px}.traces-spin{animation:.9s linear infinite traces-spin}@keyframes traces-spin{to{transform:rotate(360deg)}}.traces-toolbar{display:flex;flex-wrap:wrap;align-items: center;gap:12px}.traces-check{display:inline-flex;color:var(--ink-2);cursor:pointer;user-select:none;align-items: center;gap:6px;font-size:12.5px}.traces-check input{accent-color:var(--accent);margin:0}.traces-search{display:inline-flex;align-items: center;gap:4px}.traces-match-count{text-align:center;min-width:36px;font-size:12px}.traces-legend{display:inline-flex;color:var(--ink-2);flex-wrap:wrap;gap:12px;margin-left:auto;font-size:12px}.traces-legend-item{display:inline-flex;align-items: center;gap:6px}.traces-minimap{display:block;cursor:crosshair;border-radius:var(--r-chip);border:1px solid var(--line-2);background:var(--panel);touch-action:none;width:100%}.traces-timeline{position:relative;display:flex;overflow-y:auto;overflow-x:hidden;border-top:1px solid var(--line-1);max-height:560px}.traces-canvas{cursor:grab;outline:none;touch-action:none}.traces-canvas:focus-visible{outline:1px solid var(--focus);outline-offset:-1px;border-radius:var(--r-chip)}.traces-canvas:active{cursor:grabbing}.traces-chevron{display:inline-flex;cursor:pointer;color:var(--ink-3);background:0 0;border:none;border-radius:4px;padding:0}.traces-chevron:hover{color:var(--ink-1)}.traces-chevron:focus-visible{outline:2px solid var(--focus)}.traces-gutter-track{color:var(--ink-1);font-size:12px;font-weight:500}.traces-gutter-model{color:var(--ink-3);font-size:10.5px}.traces-gutter-lane{position:absolute;color:var(--ink-3);font-size:10.5px}.traces-tooltip{position:fixed;z-index:60;pointer-events:none;background:var(--overlay);backdrop-filter:blur(12px);border:1px solid var(--line-3);border-radius:var(--r-control);box-shadow:var(--shadow-2);max-width:300px;padding:8px 10px;font-size:12px;line-height:1.5}.traces-tooltip-title{color:var(--ink-1);font-weight:500}.traces-tooltip-detail{color:var(--ink-2);word-break:break-word}.traces-list{overflow-y:auto;height:340px}.traces-row{display:flex;border:none;border-bottom:1px solid var(--line-1);color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background var(--dur-1)var(--ease);background:0 0;align-items: center;gap:10px;width:100%;height:28px;padding:0 16px}.traces-row:hover{background:var(--hover)}.traces-row:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.traces-row[data-selected=true]{background:var(--selected);box-shadow:inset 2px 0 0 var(--accent)}.traces-row[data-static=true]{cursor:default}.traces-row[data-static=true]:hover{background:0 0}.traces-kind{border-radius:var(--r-chip);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-1);background:color-mix(in srgb,var(--traces-kind-color)18%,transparent);box-shadow:inset 2px 0 0 var(--traces-kind-color);flex-shrink:0;width:72px;padding:1px 0;font-size:11px;font-weight:500}.traces-row-track{color:var(--ink-3);flex-shrink:0;max-width:110px;font-size:11px}.traces-row-label{color:var(--ink-1);flex-shrink:1;min-width:0;font-size:12.5px}.traces-row-detail{color:var(--ink-3);flex:1;min-width:0;font-size:12px}.traces-row-meta{display:inline-flex;color:var(--ink-3);flex-shrink:0;gap:12px;margin-left:auto;font-size:11.5px}.traces-drawer{gap:16px}.traces-pre{white-space:pre-wrap;word-break:break-word;margin:0}.traces-pre[data-scroll=true]{overflow-y:auto;max-height:360px}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -33,6 +33,14 @@ export interface MessageStats {
|
|
|
33
33
|
usage: Usage;
|
|
34
34
|
/** Which agent produced this message (main agent, task subagent, advisor) */
|
|
35
35
|
agentType: AgentType;
|
|
36
|
+
/**
|
|
37
|
+
* Service tier the provider reported serving this turn, or `null` when the
|
|
38
|
+
* provider reported none. Lets consumers separate a fast serving path's
|
|
39
|
+
* throughput and premium traffic from standard-tier traffic. Always written by
|
|
40
|
+
* `rowToMessageStats`; optional only because session fixtures that stand in
|
|
41
|
+
* for ingest input are typed as `MessageStats` too.
|
|
42
|
+
*/
|
|
43
|
+
serviceTier?: ServiceTier | null;
|
|
36
44
|
/**
|
|
37
45
|
* Ingest refused to price this request: a scheduled (time-based) card with no
|
|
38
46
|
* recoverable request timestamp, so `usage.cost.total` of 0 is unknown spend
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@oh-my-pi/omp-stats",
|
|
4
|
-
"version": "18.
|
|
4
|
+
"version": "18.7.0",
|
|
5
5
|
"description": "Local observability dashboard for omp AI usage statistics",
|
|
6
6
|
"homepage": "https://omp.sh",
|
|
7
7
|
"author": {
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"fmt": "oxfmt --no-error-on-unmatched-pattern 'src/**/*.{ts,tsx}' '{test,bench,examples,scripts}/**/*.ts' '*.ts'"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@oh-my-pi/pi-ai": "18.
|
|
46
|
-
"@oh-my-pi/pi-catalog": "18.
|
|
47
|
-
"@oh-my-pi/pi-utils": "18.
|
|
45
|
+
"@oh-my-pi/pi-ai": "18.7.0",
|
|
46
|
+
"@oh-my-pi/pi-catalog": "18.7.0",
|
|
47
|
+
"@oh-my-pi/pi-utils": "18.7.0",
|
|
48
48
|
"lucide-react": "^1.24.0",
|
|
49
49
|
"react": "19.2.7",
|
|
50
50
|
"react-dom": "19.2.7"
|
package/src/client/styles.css
CHANGED
package/src/db.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Database } from "bun:sqlite";
|
|
2
2
|
import * as fs from "node:fs/promises";
|
|
3
|
-
import type { Usage } from "@oh-my-pi/pi-ai";
|
|
3
|
+
import type { ServiceTier, Usage } from "@oh-my-pi/pi-ai";
|
|
4
4
|
import {
|
|
5
5
|
calculateUncachedInputCost,
|
|
6
6
|
calculateUsageCost,
|
|
@@ -88,7 +88,10 @@ const BACKFILL_COMPLETE = "complete";
|
|
|
88
88
|
const BACKFILL_PENDING = "pending";
|
|
89
89
|
const USER_MESSAGES_BACKFILL_KEY = "user_messages_v9";
|
|
90
90
|
const USER_MESSAGE_LINKS_REPAIR_KEY = "user_message_links_v1";
|
|
91
|
-
|
|
91
|
+
// v2: the parser also records the served service tier per message, so a full
|
|
92
|
+
// re-parse fills `service_tier` and re-derives ultrafast premium counts that the
|
|
93
|
+
// v1 pass (priority only) left at zero.
|
|
94
|
+
const PRIORITY_PREMIUM_REQUESTS_BACKFILL_KEY = "premium_requests_priority_v2";
|
|
92
95
|
const AGENT_TYPE_BACKFILL_KEY = "agent_type_v1";
|
|
93
96
|
const FORK_DEDUPE_KEY = "fork_dedupe_v1";
|
|
94
97
|
// v2: tool-name sanitization at ingest (see `sanitizeToolName` in parser.ts)
|
|
@@ -158,6 +161,7 @@ export async function initDb(): Promise<Database> {
|
|
|
158
161
|
cost_no_cache_input REAL,
|
|
159
162
|
cost_unpriced INTEGER NOT NULL DEFAULT 0,
|
|
160
163
|
agent_type TEXT NOT NULL DEFAULT 'main',
|
|
164
|
+
service_tier TEXT,
|
|
161
165
|
UNIQUE(session_file, entry_id)
|
|
162
166
|
);
|
|
163
167
|
|
|
@@ -252,6 +256,11 @@ export async function initDb(): Promise<Database> {
|
|
|
252
256
|
if (!messageColumns.some(column => column.name === "cost_no_cache_input")) {
|
|
253
257
|
db.run("ALTER TABLE messages ADD COLUMN cost_no_cache_input REAL");
|
|
254
258
|
}
|
|
259
|
+
// Rows ingested before this column existed carry no served tier; a re-parse
|
|
260
|
+
// fills them from the session's assistant messages.
|
|
261
|
+
if (!messageColumns.some(column => column.name === "service_tier")) {
|
|
262
|
+
db.run("ALTER TABLE messages ADD COLUMN service_tier TEXT");
|
|
263
|
+
}
|
|
255
264
|
// Rows ingested before this column existed default to 0 (not unpriced), so
|
|
256
265
|
// their epoch-sentinel zeros read as free until a re-parse rewrites them.
|
|
257
266
|
if (!messageColumns.some(column => column.name === "cost_unpriced")) {
|
|
@@ -828,9 +837,9 @@ export function insertMessageStats(stats: Iterable<MessageStatsInput>): number {
|
|
|
828
837
|
duration, ttft, stop_reason, error_message,
|
|
829
838
|
input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, total_tokens, premium_requests,
|
|
830
839
|
cost_input, cost_output, cost_cache_read, cost_cache_write, cost_total, cost_no_cache_input,
|
|
831
|
-
cost_unpriced, agent_type
|
|
840
|
+
cost_unpriced, agent_type, service_tier
|
|
832
841
|
)
|
|
833
|
-
SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
842
|
+
SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
834
843
|
WHERE NOT EXISTS (
|
|
835
844
|
SELECT 1 FROM messages
|
|
836
845
|
WHERE entry_id = ? AND timestamp = ? AND session_file <> ?
|
|
@@ -843,7 +852,8 @@ export function insertMessageStats(stats: Iterable<MessageStatsInput>): number {
|
|
|
843
852
|
cost_cache_write = excluded.cost_cache_write,
|
|
844
853
|
cost_total = excluded.cost_total,
|
|
845
854
|
cost_no_cache_input = excluded.cost_no_cache_input,
|
|
846
|
-
cost_unpriced = excluded.cost_unpriced
|
|
855
|
+
cost_unpriced = excluded.cost_unpriced,
|
|
856
|
+
service_tier = excluded.service_tier
|
|
847
857
|
`);
|
|
848
858
|
|
|
849
859
|
let inserted = 0;
|
|
@@ -877,6 +887,7 @@ export function insertMessageStats(stats: Iterable<MessageStatsInput>): number {
|
|
|
877
887
|
noCacheInputCost,
|
|
878
888
|
unpriced ? 1 : 0,
|
|
879
889
|
s.agentType,
|
|
890
|
+
s.serviceTier ?? null,
|
|
880
891
|
// `WHERE NOT EXISTS` binds: skip when a different session_file
|
|
881
892
|
// already holds this (entry_id, timestamp).
|
|
882
893
|
s.entryId,
|
|
@@ -941,6 +952,7 @@ function rowToMessageStats(row: any): MessageStats {
|
|
|
941
952
|
},
|
|
942
953
|
},
|
|
943
954
|
agentType: (row.agent_type as AgentType) ?? "main",
|
|
955
|
+
serviceTier: (row.service_tier as ServiceTier | null) ?? null,
|
|
944
956
|
costUnpriced: row.cost_unpriced === 1,
|
|
945
957
|
};
|
|
946
958
|
}
|
package/src/parser.ts
CHANGED
|
@@ -4,7 +4,8 @@ import * as path from "node:path";
|
|
|
4
4
|
import {
|
|
5
5
|
type AssistantMessage,
|
|
6
6
|
coerceServiceTierByFamily,
|
|
7
|
-
|
|
7
|
+
getPremiumServiceTierRequests,
|
|
8
|
+
parseServiceTier,
|
|
8
9
|
resolveModelServiceTier,
|
|
9
10
|
type ServiceTierByFamily,
|
|
10
11
|
type ToolCall,
|
|
@@ -236,20 +237,26 @@ function extractStats(
|
|
|
236
237
|
const rawUsage = msg.usage as Partial<Usage> | undefined;
|
|
237
238
|
if (!rawUsage || typeof rawUsage !== "object") return null;
|
|
238
239
|
|
|
239
|
-
// Backfill: when the session recorded `priority`
|
|
240
|
-
// at this point but the AI usage payload was
|
|
241
|
-
// requests were folded into `premiumRequests`, derive
|
|
242
|
-
// "Premium Reqs" stat aggregates
|
|
243
|
-
//
|
|
244
|
-
//
|
|
240
|
+
// Backfill: when the session recorded a premium tier (`priority`/`ultrafast`)
|
|
241
|
+
// as the active service tier at this point but the AI usage payload was
|
|
242
|
+
// captured before premium requests were folded into `premiumRequests`, derive
|
|
243
|
+
// the count here so the "Premium Reqs" stat aggregates premium traffic on
|
|
244
|
+
// re-sync. The tier the provider reported serving the turn (`msg.serviceTier`)
|
|
245
|
+
// is authoritative — it is proof the tier reached the wire, so the
|
|
246
|
+
// discovery-metadata gate is skipped; the session's live setting is only a
|
|
247
|
+
// fallback for turns recorded before that field existed. Trust any non-zero
|
|
248
|
+
// value already in `usage.premiumRequests` (Copilot multipliers or the new AI
|
|
249
|
+
// code path) and only synthesise when the field is missing/zero.
|
|
245
250
|
const recorded = rawUsage.premiumRequests ?? 0;
|
|
246
251
|
const model = {
|
|
247
252
|
provider: msg.provider,
|
|
248
253
|
api: msg.api,
|
|
249
254
|
identity: classifyModel(msg.provider, msg.model, { lenient: true }),
|
|
250
255
|
};
|
|
251
|
-
const
|
|
252
|
-
const
|
|
256
|
+
const servedTier = parseServiceTier(msg.serviceTier);
|
|
257
|
+
const tier = servedTier ?? resolveModelServiceTier(currentServiceTier, model);
|
|
258
|
+
const derived =
|
|
259
|
+
recorded > 0 ? recorded : getPremiumServiceTierRequests(tier, model, { served: servedTier !== undefined });
|
|
253
260
|
const wellFormed =
|
|
254
261
|
isFiniteCount(rawUsage.input) &&
|
|
255
262
|
isFiniteCount(rawUsage.output) &&
|
|
@@ -291,6 +298,7 @@ function extractStats(
|
|
|
291
298
|
errorMessage: msg.errorMessage ?? null,
|
|
292
299
|
usage,
|
|
293
300
|
agentType,
|
|
301
|
+
serviceTier: servedTier ?? null,
|
|
294
302
|
};
|
|
295
303
|
}
|
|
296
304
|
|
package/src/types.ts
CHANGED
|
@@ -35,6 +35,14 @@ export interface MessageStats {
|
|
|
35
35
|
usage: Usage;
|
|
36
36
|
/** Which agent produced this message (main agent, task subagent, advisor) */
|
|
37
37
|
agentType: AgentType;
|
|
38
|
+
/**
|
|
39
|
+
* Service tier the provider reported serving this turn, or `null` when the
|
|
40
|
+
* provider reported none. Lets consumers separate a fast serving path's
|
|
41
|
+
* throughput and premium traffic from standard-tier traffic. Always written by
|
|
42
|
+
* `rowToMessageStats`; optional only because session fixtures that stand in
|
|
43
|
+
* for ingest input are typed as `MessageStats` too.
|
|
44
|
+
*/
|
|
45
|
+
serviceTier?: ServiceTier | null;
|
|
38
46
|
/**
|
|
39
47
|
* Ingest refused to price this request: a scheduled (time-based) card with no
|
|
40
48
|
* recoverable request timestamp, so `usage.cost.total` of 0 is unknown spend
|