pi-mega-compact 0.20.74 → 0.20.76
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/dist/config/vector-cortex-enc2c.js +9 -6
- package/dist/extensions/dashboard-server/api-contracts/setup-cortex-native-ort.js +5 -3
- package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -1
- package/dist/extensions/dashboard-server/setup-cortex-actions-native-ort.js +176 -49
- package/dist/src/config/vector-cortex-enc2c.js +9 -6
- package/dist/src/vector-cortex/encoder/native-qualify-retest.js +9 -5
- package/dist/src/vector-cortex/setup-cortex-blockers-compute.js +5 -3
- package/dist/vector-cortex/encoder/native-qualify-retest.js +9 -5
- package/dist/vector-cortex/setup-cortex-blockers-compute.js +5 -3
- package/extensions/dashboard-client/dist/assets/{AdminTab-CqhIxrlT.js → AdminTab-B8JqsA41.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AdminTab-CqhIxrlT.js.map → AdminTab-B8JqsA41.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{AreaChart-D4EY7yiY.js → AreaChart-CeaexvWO.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-D4EY7yiY.js.map → AreaChart-CeaexvWO.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-r_BFpd7a.js → BarChart-Bhyviy7_.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-r_BFpd7a.js.map → BarChart-Bhyviy7_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-Bf5rwce6.js → CacheTab-C6bFdEHq.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-Bf5rwce6.js.map → CacheTab-C6bFdEHq.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ConfigTab-RFUXAUIP.js → ConfigTab-CbsdI5yj.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ConfigTab-RFUXAUIP.js.map → ConfigTab-CbsdI5yj.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-DEqHbSHf.js → EventsTab-kvB5Znx2.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-DEqHbSHf.js.map → EventsTab-kvB5Znx2.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-WGEwtqmO.js → HealthTab-DqEUk5LW.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-WGEwtqmO.js.map → HealthTab-DqEUk5LW.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-ClT1D4P9.js → MaintenanceTab-CS5HqDkY.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-ClT1D4P9.js.map → MaintenanceTab-CS5HqDkY.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-DaAxLJ5x.js → MemoryMapTab-Oq-iqvUq.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-DaAxLJ5x.js.map → MemoryMapTab-Oq-iqvUq.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsCards-CprVx2Yq.js → MetricsCards-36RVmtPj.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsCards-CprVx2Yq.js.map → MetricsCards-36RVmtPj.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/MetricsTab-Clkcniuo.js +2 -0
- package/extensions/dashboard-client/dist/assets/{MetricsTab-8WBHRpRp.js.map → MetricsTab-Clkcniuo.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-C5ClXheK.js → OverviewTab-Cl2Zx7r1.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-C5ClXheK.js.map → OverviewTab-Cl2Zx7r1.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-BOX5sOBg.js → ReposTab-DUoDgjk-.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-BOX5sOBg.js.map → ReposTab-DUoDgjk-.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DKUO5gCp.js → SessionsTab-hEQ_OAfB.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DKUO5gCp.js.map → SessionsTab-hEQ_OAfB.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SetupTab-CeeRk5Rd.js → SetupTab-Bqibg0cD.js} +3 -3
- package/extensions/dashboard-client/dist/assets/SetupTab-Bqibg0cD.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-Dlhljae9.js → TimeSavedCard-9QMQUc7L.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-Dlhljae9.js.map → TimeSavedCard-9QMQUc7L.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnMemoryView-B8fWymMP.js → TurnMemoryView-DAfqhJqd.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnMemoryView-B8fWymMP.js.map → TurnMemoryView-DAfqhJqd.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/TurnsTab-C-uZNH2F.js +2 -0
- package/extensions/dashboard-client/dist/assets/{TurnsTab-kJ4sfWSd.js.map → TurnsTab-C-uZNH2F.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-FJZlkrD7.js → VcStatusBadge-DyOagOVb.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-FJZlkrD7.js.map → VcStatusBadge-DyOagOVb.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VectorCortexTab-C1iE6z4c.js → VectorCortexTab-BxsbSUGv.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VectorCortexTab-C1iE6z4c.js.map → VectorCortexTab-BxsbSUGv.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{WikiTab-BXqRiTbt.js → WikiTab-CjefloQb.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{WikiTab-BXqRiTbt.js.map → WikiTab-CjefloQb.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{button-CUeN3VyF.js → button-D-9nb4Bw.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{button-CUeN3VyF.js.map → button-D-9nb4Bw.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-DtOD33bZ.js → card-Dvl16_R5.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-DtOD33bZ.js.map → card-Dvl16_R5.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{client-extra-_tIKSPZ3.js → client-extra-BShDrG99.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{client-extra-_tIKSPZ3.js.map → client-extra-BShDrG99.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-8AyWGIrK.js → generateCategoricalChart-Q_V4fqVi.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-8AyWGIrK.js.map → generateCategoricalChart-Q_V4fqVi.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-BBJ8LglL.js → index-CL6Af_JZ.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-BBJ8LglL.js.map → index-CL6Af_JZ.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{switch-Drm0yRgr.js → switch-0MNUTR9I.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-Drm0yRgr.js.map → switch-0MNUTR9I.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-DnRtZDPW.js → toggle-DHbWo-CW.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-DnRtZDPW.js.map → toggle-DHbWo-CW.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-l_bpRt_v.js → useSSE-DcBpzKtI.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-l_bpRt_v.js.map → useSSE-DcBpzKtI.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +1 -1
- package/extensions/dashboard-client/src/tabs/SetupTab/CortexActionsCard.tsx +15 -7
- package/extensions/dashboard-client/src/tabs/SetupTab/CortexRetestCard.tsx +11 -1
- package/extensions/dashboard-client/src/tabs/SetupTab/CortexRuntimeCard.tsx +1 -1
- package/extensions/dashboard-server/api-contracts/setup-cortex-native-ort.ts +5 -3
- package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +1 -1
- package/extensions/dashboard-server/setup-cortex-actions-native-ort.ts +203 -51
- package/package.json +1 -1
- package/src/config/vector-cortex-enc2c.ts +9 -6
- package/src/vector-cortex/encoder/native-qualify-retest.ts +9 -5
- package/src/vector-cortex/setup-cortex-blockers-compute.ts +5 -3
- package/extensions/dashboard-client/dist/assets/MetricsTab-8WBHRpRp.js +0 -2
- package/extensions/dashboard-client/dist/assets/SetupTab-CeeRk5Rd.js.map +0 -1
- package/extensions/dashboard-client/dist/assets/TurnsTab-kJ4sfWSd.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e,u as R,r as C,f as $,B as L,k as P,l as B,N as E}from"./index-BBJ8LglL.js";import{C as n,a as h,b as p,c}from"./card-DtOD33bZ.js";import{R as v,C as f,X as g,Y as b,T as y,B as T,L as I,a as z}from"./generateCategoricalChart-8AyWGIrK.js";import{B as M,L as G}from"./BarChart-r_BFpd7a.js";import{A as H,a as F}from"./AreaChart-D4EY7yiY.js";function x(s){return s>=1e3?`${(s/1e3).toFixed(1)}s`:`${s.toFixed(0)}ms`}function m({value:s,max:a,colorClass:t}){const l=a>0?Math.max(0,Math.min(100,s/a*100)):0;return e.jsx("div",{className:"perf-bar-track",children:e.jsx("div",{className:`perf-bar-fill ${t}`,style:{width:`${l}%`}})})}function K({perf:s}){const a=Math.max(s.turn_latency_ms.p95,s.provider_latency_ms.p95,1),t=Math.max(s.tps.avg,1);return e.jsxs(n,{children:[e.jsxs(h,{className:"flex-row items-center justify-between space-y-0",children:[e.jsx(p,{children:"Performance"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.windowMinutes,"min window · ",s.sampleCount," samples"]})]}),e.jsxs(c,{children:[e.jsxs("div",{className:"perf-grid",children:[e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Turn latency p50 / p95"}),e.jsxs("span",{className:"perf-value",children:[x(s.turn_latency_ms.p50)," /"," ",x(s.turn_latency_ms.p95)]}),e.jsx(m,{value:s.turn_latency_ms.p95,max:a,colorClass:"perf-blue"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Provider latency p50 / p95"}),e.jsxs("span",{className:"perf-value",children:[x(s.provider_latency_ms.p50)," /"," ",x(s.provider_latency_ms.p95)]}),e.jsx(m,{value:s.provider_latency_ms.p95,max:a,colorClass:"perf-purple"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Tokens/sec (avg)"}),e.jsx("span",{className:"perf-value",children:s.tps.avg.toFixed(1)}),e.jsx(m,{value:s.tps.avg,max:t,colorClass:"perf-green"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Cache hit (avg / latest)"}),e.jsxs("span",{className:"perf-value",children:[s.cache_hit_pct.avg.toFixed(1),"% /"," ",s.cache_hit_pct.latest.toFixed(1),"%"]}),e.jsx(m,{value:s.cache_hit_pct.avg,max:100,colorClass:"perf-green"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"DB recompute p95"}),e.jsx("span",{className:"perf-value",children:x(s.db_recompute_ms.p95)}),e.jsx(m,{value:s.db_recompute_ms.p95,max:a,colorClass:"perf-yellow"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Disk write p95"}),e.jsx("span",{className:"perf-value",children:x(s.disk_write_ms.p95)}),e.jsx(m,{value:s.disk_write_ms.p95,max:a,colorClass:"perf-yellow"})]})]}),e.jsxs("div",{className:"perf-resources",children:[e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"RSS"}),e.jsxs("span",{className:"perf-value",children:[s.rss_mb.latest.toFixed(0)," MB"]})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Heap"}),e.jsxs("span",{className:"perf-value",children:[s.heap_mb.latest.toFixed(0)," MB"]})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"CPU user"}),e.jsxs("span",{className:"perf-value",children:[(s.cpu_user_ms.latest/1e3).toFixed(1),"s"]})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"CPU sys"}),e.jsxs("span",{className:"perf-value",children:[(s.cpu_sys_ms.latest/1e3).toFixed(1),"s"]})]})]}),s.diag&&e.jsxs("div",{className:"perf-diag",children:[e.jsxs("span",{className:"perf-label",children:["Fast-gate fires: ",s.diag.ctxFastGate]}),e.jsxs("span",{className:"perf-label",children:["Live trim fires: ",s.diag.liveTrimFires]}),e.jsxs("span",{className:"perf-label",children:["Live trim replays: ",s.diag.liveTrimReplays]})]})]})]})}function d(s){return s==null?"—":s>=100?`${Math.round(s)}ms`:`${s.toFixed(1)}ms`}function u(s,a){return s==null||typeof s!="number"?"—":s.toFixed(a)}function w(s){return s==null?"—":String(s)}function r({label:s,value:a}){return e.jsxs("div",{className:"flex items-baseline justify-between border-b border-border py-1 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:s}),e.jsx("span",{className:"font-semibold",children:a})]})}function j({title:s,children:a}){return e.jsxs(n,{className:"electric-hover",children:[e.jsx(h,{children:e.jsx(p,{children:s})}),e.jsx(c,{children:a})]})}function U({perf:s}){const a=`${u(s.cpu_user_ms.latest,1)} / ${u(s.cpu_sys_ms.latest,1)} ms`;return e.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",children:[e.jsxs(j,{title:"Model latency",children:[e.jsx(r,{label:"Turn p50",value:d(s.turn_latency_ms.p50)}),e.jsx(r,{label:"Turn p95",value:d(s.turn_latency_ms.p95)}),e.jsx(r,{label:"Provider p50",value:d(s.provider_latency_ms.p50)}),e.jsx(r,{label:"Provider p95",value:d(s.provider_latency_ms.p95)})]}),e.jsxs(j,{title:"Throughput",children:[e.jsx(r,{label:"TPS (avg)",value:u(s.tps.avg,1)}),e.jsx(r,{label:"Cache hit %",value:`${u(s.cache_hit_pct.avg,1)}%`})]}),e.jsxs(j,{title:"Process",children:[e.jsx(r,{label:"RSS",value:`${u(s.rss_mb.latest,1)} MB`}),e.jsx(r,{label:"Heap",value:`${u(s.heap_mb.latest,1)} MB`}),e.jsx(r,{label:"CPU user / sys",value:a})]}),e.jsxs(j,{title:"Snapshot cost",children:[e.jsx(r,{label:"DB recompute p50",value:d(s.db_recompute_ms.p50)}),e.jsx(r,{label:"DB recompute p95",value:d(s.db_recompute_ms.p95)}),e.jsx(r,{label:"Disk write p50",value:d(s.disk_write_ms.p50)})]}),e.jsxs(j,{title:"TUI lag proxy",children:[e.jsx(r,{label:"Live-trim fires",value:w(s.diag?.liveTrimFires)}),e.jsx(r,{label:"Cache replays",value:w(s.diag?.liveTrimReplays)}),e.jsx(r,{label:"Fast-gate skips",value:w(s.diag?.ctxFastGate)}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"skip vs recompute vs replay cadence"})]})]})}function N({label:s,value:a,title:t}){return e.jsxs("div",{className:"model-field",title:t,children:[e.jsx("span",{className:"model-field-label",children:s}),e.jsx("span",{className:"model-field-value",children:a})]})}function O({name:s,providerName:a,provider:t,inputRate:l,outputRate:o}){const S=a||t||"—";return e.jsxs("div",{className:"model-badge",children:[e.jsx(N,{label:"Model",value:s,title:"The model pi is currently using — its pricing drives the cost figure."}),e.jsx(N,{label:"Provider",value:S,title:"The provider serving the model."}),e.jsx(N,{label:"Input Rate",value:`$${l.toFixed(6)}`,title:"USD per input token, from the model's pricing."}),e.jsx(N,{label:"Output Rate",value:`$${o.toFixed(6)}`,title:"USD per output token, from the model's pricing."})]})}const i="#8b949e",_="#30363d",k={background:"#161b22",border:"1px solid #30363d",borderRadius:"6px",color:"#e6edf3",fontSize:12};function X(s){return s.map(a=>{const t=Math.max(0,a.recallCount-a.hydeRanCount);return{day:a.day.slice(5),avgLift:a.avgLift??0,avgScore:a.avgScore??0,avgGenMs:a.avgGenMs??0,passRate:a.avgScore==null?0:a.avgScore,hydeTurns:a.hydeRanCount,baseTurns:t,recallCount:a.recallCount}})}const W=({metrics:s})=>{const{data:a,loading:t}=R(C.useMemo(()=>()=>$(),[]),{pollInterval:3e4}),l=s??a,o=C.useMemo(()=>l?X(l.daily):[],[l]);if(t&&!l)return e.jsx("div",{className:"text-sm text-muted-foreground",children:"Loading RAG metrics…"});if(!l)return e.jsx("div",{className:"text-sm text-muted-foreground",children:"No RAG metrics available yet. They appear once turns record HyDE/recall telemetry."});const{totals:S,flags:A}=l;return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Y,{totals:S,flags:A}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2",children:[e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"HyDE Recall Lift"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(M,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40}),e.jsx(y,{contentStyle:k}),e.jsx(T,{dataKey:"avgLift",name:"avg lift",fill:"#58a6ff",isAnimationActive:!1})]})})})]}),e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"CRAG Quality"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(G,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40,domain:[0,1]}),e.jsx(y,{contentStyle:k}),e.jsx(I,{type:"monotone",dataKey:"avgScore",name:"avg score",stroke:"#3fb950",dot:!1,strokeWidth:2,isAnimationActive:!1})]})})})]}),e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"Recall Latency (avg gen ms)"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(M,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40}),e.jsx(y,{contentStyle:k}),e.jsx(T,{dataKey:"avgGenMs",name:"gen ms",fill:"#d29922",isAnimationActive:!1})]})})})]}),e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"HyDE vs Base Turn Volume"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(H,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40}),e.jsx(y,{contentStyle:k}),e.jsx(z,{wrapperStyle:{fontSize:11}}),e.jsx(F,{type:"monotone",dataKey:"hydeTurns",name:"hyde turns",stackId:"1",stroke:"#58a6ff",fill:"#58a6ff",fillOpacity:.5,isAnimationActive:!1}),e.jsx(F,{type:"monotone",dataKey:"baseTurns",name:"base turns",stackId:"1",stroke:"#8b949e",fill:"#8b949e",fillOpacity:.4,isAnimationActive:!1})]})})})]})]})]})};function Y({totals:s,flags:a}){const t=[{label:"Telemetry turns",value:String(s.telemetryTurns),hint:"turns with HyDE or recall data"},{label:"HyDE ran",value:String(s.hydeRanTurns),hint:"turns where HyDE generated a doc"},{label:"Avg lift",value:`${s.avgLift.toFixed(2)}×`,hint:"fused / raw hit breadth"},{label:"Pass rate",value:`${Math.round(s.recentPassRate*100)}%`,hint:s.avgScore==null?"no scored turns":`avg score ${s.avgScore.toFixed(2)}`}];return e.jsxs("div",{className:"grid grid-cols-2 gap-4 lg:grid-cols-5",children:[t.map(l=>e.jsx(n,{children:e.jsxs(c,{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:l.label}),e.jsx("div",{className:"font-heading text-2xl font-semibold text-foreground",children:l.value}),e.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground",children:l.hint})]})},l.label)),e.jsx(n,{children:e.jsxs(c,{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"Flags"}),e.jsxs("div",{className:"mt-1 flex flex-col gap-1 text-xs",children:[e.jsx(D,{label:"HyDE",on:a.hydeEnabled}),e.jsx(D,{label:"Recall metrics",on:a.recallMetricsEnabled})]})]})})]})}function D({label:s,on:a}){return e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`inline-block h-2 w-2 rounded-full ${a?"bg-success":"bg-danger"}`,"aria-hidden":"true"}),s,":"," ",e.jsx(L,{variant:a?"success":"danger",children:a?"on":"off"})]})}function ee(){const{data:s,error:a}=R(C.useCallback(()=>P({minutes:30}),[]),{pollInterval:1e4}),{data:t}=R(C.useCallback(()=>B(),[]),{pollInterval:1e4});return a&&!s?e.jsxs("div",{className:"tab-stub",children:["Error loading perf: ",a.message]}):s?e.jsxs("div",{className:"flex flex-col gap-4",children:[t?.model&&e.jsx(O,{name:t.model.name,providerName:t.model.providerName,provider:t.model.provider,inputRate:t.model.inputRate,outputRate:t.model.outputRate}),e.jsx(K,{perf:s}),e.jsx(U,{perf:s}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:[s.sampleCount," samples · updated ",s.updatedAt]}),E()&&e.jsx(W,{})]}):e.jsx("div",{className:"tab-stub",children:"Loading perf…"})}export{ee as M};
|
|
2
|
-
//# sourceMappingURL=MetricsCards-
|
|
1
|
+
import{j as e,u as R,r as C,f as $,B as L,k as P,l as B,N as E}from"./index-CL6Af_JZ.js";import{C as n,a as h,b as p,c}from"./card-Dvl16_R5.js";import{R as v,C as f,X as g,Y as b,T as y,B as T,L as I,a as z}from"./generateCategoricalChart-Q_V4fqVi.js";import{B as M,L as G}from"./BarChart-Bhyviy7_.js";import{A as H,a as F}from"./AreaChart-CeaexvWO.js";function x(s){return s>=1e3?`${(s/1e3).toFixed(1)}s`:`${s.toFixed(0)}ms`}function m({value:s,max:a,colorClass:t}){const l=a>0?Math.max(0,Math.min(100,s/a*100)):0;return e.jsx("div",{className:"perf-bar-track",children:e.jsx("div",{className:`perf-bar-fill ${t}`,style:{width:`${l}%`}})})}function K({perf:s}){const a=Math.max(s.turn_latency_ms.p95,s.provider_latency_ms.p95,1),t=Math.max(s.tps.avg,1);return e.jsxs(n,{children:[e.jsxs(h,{className:"flex-row items-center justify-between space-y-0",children:[e.jsx(p,{children:"Performance"}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[s.windowMinutes,"min window · ",s.sampleCount," samples"]})]}),e.jsxs(c,{children:[e.jsxs("div",{className:"perf-grid",children:[e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Turn latency p50 / p95"}),e.jsxs("span",{className:"perf-value",children:[x(s.turn_latency_ms.p50)," /"," ",x(s.turn_latency_ms.p95)]}),e.jsx(m,{value:s.turn_latency_ms.p95,max:a,colorClass:"perf-blue"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Provider latency p50 / p95"}),e.jsxs("span",{className:"perf-value",children:[x(s.provider_latency_ms.p50)," /"," ",x(s.provider_latency_ms.p95)]}),e.jsx(m,{value:s.provider_latency_ms.p95,max:a,colorClass:"perf-purple"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Tokens/sec (avg)"}),e.jsx("span",{className:"perf-value",children:s.tps.avg.toFixed(1)}),e.jsx(m,{value:s.tps.avg,max:t,colorClass:"perf-green"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Cache hit (avg / latest)"}),e.jsxs("span",{className:"perf-value",children:[s.cache_hit_pct.avg.toFixed(1),"% /"," ",s.cache_hit_pct.latest.toFixed(1),"%"]}),e.jsx(m,{value:s.cache_hit_pct.avg,max:100,colorClass:"perf-green"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"DB recompute p95"}),e.jsx("span",{className:"perf-value",children:x(s.db_recompute_ms.p95)}),e.jsx(m,{value:s.db_recompute_ms.p95,max:a,colorClass:"perf-yellow"})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Disk write p95"}),e.jsx("span",{className:"perf-value",children:x(s.disk_write_ms.p95)}),e.jsx(m,{value:s.disk_write_ms.p95,max:a,colorClass:"perf-yellow"})]})]}),e.jsxs("div",{className:"perf-resources",children:[e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"RSS"}),e.jsxs("span",{className:"perf-value",children:[s.rss_mb.latest.toFixed(0)," MB"]})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"Heap"}),e.jsxs("span",{className:"perf-value",children:[s.heap_mb.latest.toFixed(0)," MB"]})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"CPU user"}),e.jsxs("span",{className:"perf-value",children:[(s.cpu_user_ms.latest/1e3).toFixed(1),"s"]})]}),e.jsxs("div",{className:"perf-metric",children:[e.jsx("span",{className:"perf-label",children:"CPU sys"}),e.jsxs("span",{className:"perf-value",children:[(s.cpu_sys_ms.latest/1e3).toFixed(1),"s"]})]})]}),s.diag&&e.jsxs("div",{className:"perf-diag",children:[e.jsxs("span",{className:"perf-label",children:["Fast-gate fires: ",s.diag.ctxFastGate]}),e.jsxs("span",{className:"perf-label",children:["Live trim fires: ",s.diag.liveTrimFires]}),e.jsxs("span",{className:"perf-label",children:["Live trim replays: ",s.diag.liveTrimReplays]})]})]})]})}function d(s){return s==null?"—":s>=100?`${Math.round(s)}ms`:`${s.toFixed(1)}ms`}function u(s,a){return s==null||typeof s!="number"?"—":s.toFixed(a)}function w(s){return s==null?"—":String(s)}function r({label:s,value:a}){return e.jsxs("div",{className:"flex items-baseline justify-between border-b border-border py-1 text-sm",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:s}),e.jsx("span",{className:"font-semibold",children:a})]})}function j({title:s,children:a}){return e.jsxs(n,{className:"electric-hover",children:[e.jsx(h,{children:e.jsx(p,{children:s})}),e.jsx(c,{children:a})]})}function U({perf:s}){const a=`${u(s.cpu_user_ms.latest,1)} / ${u(s.cpu_sys_ms.latest,1)} ms`;return e.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",children:[e.jsxs(j,{title:"Model latency",children:[e.jsx(r,{label:"Turn p50",value:d(s.turn_latency_ms.p50)}),e.jsx(r,{label:"Turn p95",value:d(s.turn_latency_ms.p95)}),e.jsx(r,{label:"Provider p50",value:d(s.provider_latency_ms.p50)}),e.jsx(r,{label:"Provider p95",value:d(s.provider_latency_ms.p95)})]}),e.jsxs(j,{title:"Throughput",children:[e.jsx(r,{label:"TPS (avg)",value:u(s.tps.avg,1)}),e.jsx(r,{label:"Cache hit %",value:`${u(s.cache_hit_pct.avg,1)}%`})]}),e.jsxs(j,{title:"Process",children:[e.jsx(r,{label:"RSS",value:`${u(s.rss_mb.latest,1)} MB`}),e.jsx(r,{label:"Heap",value:`${u(s.heap_mb.latest,1)} MB`}),e.jsx(r,{label:"CPU user / sys",value:a})]}),e.jsxs(j,{title:"Snapshot cost",children:[e.jsx(r,{label:"DB recompute p50",value:d(s.db_recompute_ms.p50)}),e.jsx(r,{label:"DB recompute p95",value:d(s.db_recompute_ms.p95)}),e.jsx(r,{label:"Disk write p50",value:d(s.disk_write_ms.p50)})]}),e.jsxs(j,{title:"TUI lag proxy",children:[e.jsx(r,{label:"Live-trim fires",value:w(s.diag?.liveTrimFires)}),e.jsx(r,{label:"Cache replays",value:w(s.diag?.liveTrimReplays)}),e.jsx(r,{label:"Fast-gate skips",value:w(s.diag?.ctxFastGate)}),e.jsx("span",{className:"text-xs text-muted-foreground",children:"skip vs recompute vs replay cadence"})]})]})}function N({label:s,value:a,title:t}){return e.jsxs("div",{className:"model-field",title:t,children:[e.jsx("span",{className:"model-field-label",children:s}),e.jsx("span",{className:"model-field-value",children:a})]})}function O({name:s,providerName:a,provider:t,inputRate:l,outputRate:o}){const S=a||t||"—";return e.jsxs("div",{className:"model-badge",children:[e.jsx(N,{label:"Model",value:s,title:"The model pi is currently using — its pricing drives the cost figure."}),e.jsx(N,{label:"Provider",value:S,title:"The provider serving the model."}),e.jsx(N,{label:"Input Rate",value:`$${l.toFixed(6)}`,title:"USD per input token, from the model's pricing."}),e.jsx(N,{label:"Output Rate",value:`$${o.toFixed(6)}`,title:"USD per output token, from the model's pricing."})]})}const i="#8b949e",_="#30363d",k={background:"#161b22",border:"1px solid #30363d",borderRadius:"6px",color:"#e6edf3",fontSize:12};function X(s){return s.map(a=>{const t=Math.max(0,a.recallCount-a.hydeRanCount);return{day:a.day.slice(5),avgLift:a.avgLift??0,avgScore:a.avgScore??0,avgGenMs:a.avgGenMs??0,passRate:a.avgScore==null?0:a.avgScore,hydeTurns:a.hydeRanCount,baseTurns:t,recallCount:a.recallCount}})}const W=({metrics:s})=>{const{data:a,loading:t}=R(C.useMemo(()=>()=>$(),[]),{pollInterval:3e4}),l=s??a,o=C.useMemo(()=>l?X(l.daily):[],[l]);if(t&&!l)return e.jsx("div",{className:"text-sm text-muted-foreground",children:"Loading RAG metrics…"});if(!l)return e.jsx("div",{className:"text-sm text-muted-foreground",children:"No RAG metrics available yet. They appear once turns record HyDE/recall telemetry."});const{totals:S,flags:A}=l;return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(Y,{totals:S,flags:A}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2",children:[e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"HyDE Recall Lift"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(M,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40}),e.jsx(y,{contentStyle:k}),e.jsx(T,{dataKey:"avgLift",name:"avg lift",fill:"#58a6ff",isAnimationActive:!1})]})})})]}),e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"CRAG Quality"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(G,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40,domain:[0,1]}),e.jsx(y,{contentStyle:k}),e.jsx(I,{type:"monotone",dataKey:"avgScore",name:"avg score",stroke:"#3fb950",dot:!1,strokeWidth:2,isAnimationActive:!1})]})})})]}),e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"Recall Latency (avg gen ms)"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(M,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40}),e.jsx(y,{contentStyle:k}),e.jsx(T,{dataKey:"avgGenMs",name:"gen ms",fill:"#d29922",isAnimationActive:!1})]})})})]}),e.jsxs(n,{children:[e.jsx(h,{children:e.jsx(p,{children:"HyDE vs Base Turn Volume"})}),e.jsx(c,{children:e.jsx(v,{width:"100%",height:200,children:e.jsxs(H,{data:o,margin:{top:8,right:12,left:0,bottom:0},children:[e.jsx(f,{strokeDasharray:"3 3",stroke:_}),e.jsx(g,{dataKey:"day",stroke:i,tick:{fontSize:11}}),e.jsx(b,{stroke:i,tick:{fontSize:11},width:40}),e.jsx(y,{contentStyle:k}),e.jsx(z,{wrapperStyle:{fontSize:11}}),e.jsx(F,{type:"monotone",dataKey:"hydeTurns",name:"hyde turns",stackId:"1",stroke:"#58a6ff",fill:"#58a6ff",fillOpacity:.5,isAnimationActive:!1}),e.jsx(F,{type:"monotone",dataKey:"baseTurns",name:"base turns",stackId:"1",stroke:"#8b949e",fill:"#8b949e",fillOpacity:.4,isAnimationActive:!1})]})})})]})]})]})};function Y({totals:s,flags:a}){const t=[{label:"Telemetry turns",value:String(s.telemetryTurns),hint:"turns with HyDE or recall data"},{label:"HyDE ran",value:String(s.hydeRanTurns),hint:"turns where HyDE generated a doc"},{label:"Avg lift",value:`${s.avgLift.toFixed(2)}×`,hint:"fused / raw hit breadth"},{label:"Pass rate",value:`${Math.round(s.recentPassRate*100)}%`,hint:s.avgScore==null?"no scored turns":`avg score ${s.avgScore.toFixed(2)}`}];return e.jsxs("div",{className:"grid grid-cols-2 gap-4 lg:grid-cols-5",children:[t.map(l=>e.jsx(n,{children:e.jsxs(c,{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:l.label}),e.jsx("div",{className:"font-heading text-2xl font-semibold text-foreground",children:l.value}),e.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground",children:l.hint})]})},l.label)),e.jsx(n,{children:e.jsxs(c,{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"Flags"}),e.jsxs("div",{className:"mt-1 flex flex-col gap-1 text-xs",children:[e.jsx(D,{label:"HyDE",on:a.hydeEnabled}),e.jsx(D,{label:"Recall metrics",on:a.recallMetricsEnabled})]})]})})]})}function D({label:s,on:a}){return e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`inline-block h-2 w-2 rounded-full ${a?"bg-success":"bg-danger"}`,"aria-hidden":"true"}),s,":"," ",e.jsx(L,{variant:a?"success":"danger",children:a?"on":"off"})]})}function ee(){const{data:s,error:a}=R(C.useCallback(()=>P({minutes:30}),[]),{pollInterval:1e4}),{data:t}=R(C.useCallback(()=>B(),[]),{pollInterval:1e4});return a&&!s?e.jsxs("div",{className:"tab-stub",children:["Error loading perf: ",a.message]}):s?e.jsxs("div",{className:"flex flex-col gap-4",children:[t?.model&&e.jsx(O,{name:t.model.name,providerName:t.model.providerName,provider:t.model.provider,inputRate:t.model.inputRate,outputRate:t.model.outputRate}),e.jsx(K,{perf:s}),e.jsx(U,{perf:s}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:[s.sampleCount," samples · updated ",s.updatedAt]}),E()&&e.jsx(W,{})]}):e.jsx("div",{className:"tab-stub",children:"Loading perf…"})}export{ee as M};
|
|
2
|
+
//# sourceMappingURL=MetricsCards-36RVmtPj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCards-CprVx2Yq.js","sources":["../../src/components/PerfChart.tsx","../../src/components/PerfCards.tsx","../../src/components/ModelBadge.tsx","../../src/components/RagDashboard.tsx","../../src/tabs/CacheTab/MetricsCards.tsx"],"sourcesContent":["/**\n * dashboard-client/src/components/PerfChart.tsx — perf stat chart.\n *\n * The /api/perf endpoint returns rolling-window aggregates (not time-series),\n * so this renders a stat-card \"chart\": p50/p95 latency bars, TPS, cache hit %,\n * db recompute + disk write. Each metric shows a normalized bar + numeric.\n */\n\nimport type React from \"react\";\nimport type { PerfResponse } from \"@contracts\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\n\nexport interface PerfChartProps {\n\tperf: PerfResponse;\n}\n\nfunction fmtMs(n: number): string {\n\treturn n >= 1000 ? `${(n / 1000).toFixed(1)}s` : `${n.toFixed(0)}ms`;\n}\n\ninterface BarProps {\n\t/** Current value. */\n\tvalue: number;\n\t/** Value that represents 100% bar fill (the \"max\" reference). */\n\tmax: number;\n\t/** Color class. */\n\tcolorClass: string;\n}\n\nfunction Bar({ value, max, colorClass }: BarProps): React.ReactElement {\n\tconst pct = max > 0 ? Math.max(0, Math.min(100, (value / max) * 100)) : 0;\n\treturn (\n\t\t<div className=\"perf-bar-track\">\n\t\t\t<div\n\t\t\t\tclassName={`perf-bar-fill ${colorClass}`}\n\t\t\t\tstyle={{ width: `${pct}%` }}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function PerfChart({ perf }: PerfChartProps): React.ReactElement {\n\t// Reference maxes: p95 is the upper bound for latency bars; rates scale to a\n\t// reasonable reference (tok/s) so bars are visually meaningful even with\n\t// small samples. cache_hit_pct is already 0-100.\n\tconst latencyMax = Math.max(\n\t\tperf.turn_latency_ms.p95,\n\t\tperf.provider_latency_ms.p95,\n\t\t1,\n\t);\n\tconst tpsRef = Math.max(perf.tps.avg, 1);\n\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader className=\"flex-row items-center justify-between space-y-0\">\n\t\t\t\t<CardTitle>Performance</CardTitle>\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t{perf.windowMinutes}min window · {perf.sampleCount} samples\n\t\t\t\t</span>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t<div className=\"perf-grid\">\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Turn latency p50 / p95</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{fmtMs(perf.turn_latency_ms.p50)} /{\" \"}\n\t\t\t\t\t\t{fmtMs(perf.turn_latency_ms.p95)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.turn_latency_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-blue\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Provider latency p50 / p95</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{fmtMs(perf.provider_latency_ms.p50)} /{\" \"}\n\t\t\t\t\t\t{fmtMs(perf.provider_latency_ms.p95)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.provider_latency_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-purple\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Tokens/sec (avg)</span>\n\t\t\t\t\t<span className=\"perf-value\">{perf.tps.avg.toFixed(1)}</span>\n\t\t\t\t\t<Bar value={perf.tps.avg} max={tpsRef} colorClass=\"perf-green\" />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Cache hit (avg / latest)</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{perf.cache_hit_pct.avg.toFixed(1)}% /{\" \"}\n\t\t\t\t\t\t{perf.cache_hit_pct.latest.toFixed(1)}%\n\t\t\t\t\t</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.cache_hit_pct.avg}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tcolorClass=\"perf-green\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">DB recompute p95</span>\n\t\t\t\t\t<span className=\"perf-value\">{fmtMs(perf.db_recompute_ms.p95)}</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.db_recompute_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-yellow\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Disk write p95</span>\n\t\t\t\t\t<span className=\"perf-value\">{fmtMs(perf.disk_write_ms.p95)}</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.disk_write_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-yellow\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"perf-resources\">\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">RSS</span>\n\t\t\t\t\t<span className=\"perf-value\">{perf.rss_mb.latest.toFixed(0)} MB</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Heap</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{perf.heap_mb.latest.toFixed(0)} MB\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">CPU user</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{(perf.cpu_user_ms.latest / 1000).toFixed(1)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">CPU sys</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{(perf.cpu_sys_ms.latest / 1000).toFixed(1)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{perf.diag && (\n\t\t\t\t<div className=\"perf-diag\">\n\t\t\t\t\t<span className=\"perf-label\">\n\t\t\t\t\t\tFast-gate fires: {perf.diag.ctxFastGate}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"perf-label\">\n\t\t\t\t\t\tLive trim fires: {perf.diag.liveTrimFires}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"perf-label\">\n\t\t\t\t\t\tLive trim replays: {perf.diag.liveTrimReplays}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","/**\n * dashboard-client/src/components/PerfCards.tsx — 5 perf metric cards.\n *\n * Mirrors the old html.ts perf grid: model latency, throughput, process,\n * snapshot cost, and TUI lag proxy. Uses the existing perf-metric CSS\n * classes from repos-metrics.css plus metrics-extra.css for card headers.\n */\n\nimport type React from \"react\";\nimport type { PerfResponse } from \"@contracts\";\nimport {\n\tCard,\n\tCardContent,\n\tCardHeader,\n\tCardTitle,\n} from \"../components/ui/card\";\n\n/** Format milliseconds (em-dash for null/undefined). */\nfunction fmtMs(v: number | null | undefined): string {\n\treturn v == null ? \"\\u2014\" : v >= 100 ? `${Math.round(v)}ms` : `${v.toFixed(1)}ms`;\n}\n\n/** Format a number with fixed decimals (em-dash for null/non-number). */\nfunction fmtNum(v: number | null | undefined, dec: number): string {\n\treturn v == null || typeof v !== \"number\" ? \"\\u2014\" : v.toFixed(dec);\n}\n\n/** Format a diag counter (em-dash for null). */\nfunction fmtDiag(v: number | null | undefined): string {\n\treturn v == null ? \"\\u2014\" : String(v);\n}\n\ninterface PerfCardsProps {\n\tperf: PerfResponse;\n}\n\n/** A single stat row inside a perf card. */\nfunction Stat({ label, value }: { label: string; value: string }): React.ReactElement {\n\treturn (\n\t\t<div className=\"flex items-baseline justify-between border-b border-border py-1 text-sm\">\n\t\t\t<span className=\"text-xs text-muted-foreground\">{label}</span>\n\t\t\t<span className=\"font-semibold\">{value}</span>\n\t\t</div>\n\t);\n}\n\n/** Card wrapper with a title. */\nfunction PerfCard({ title, children }: { title: string; children: React.ReactNode }): React.ReactElement {\n\treturn (\n\t\t<Card className=\"electric-hover\">\n\t\t\t<CardHeader>\n\t\t\t\t<CardTitle>{title}</CardTitle>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>{children}</CardContent>\n\t\t</Card>\n\t);\n}\n\nexport function PerfCards({ perf }: PerfCardsProps): React.ReactElement {\n\tconst cpuTxt = `${fmtNum(perf.cpu_user_ms.latest, 1)} / ${fmtNum(perf.cpu_sys_ms.latest, 1)} ms`;\n\n\treturn (\n\t\t<div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n\t\t\t<PerfCard title=\"Model latency\">\n\t\t\t\t<Stat label=\"Turn p50\" value={fmtMs(perf.turn_latency_ms.p50)} />\n\t\t\t\t<Stat label=\"Turn p95\" value={fmtMs(perf.turn_latency_ms.p95)} />\n\t\t\t\t<Stat label=\"Provider p50\" value={fmtMs(perf.provider_latency_ms.p50)} />\n\t\t\t\t<Stat label=\"Provider p95\" value={fmtMs(perf.provider_latency_ms.p95)} />\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"Throughput\">\n\t\t\t\t<Stat label=\"TPS (avg)\" value={fmtNum(perf.tps.avg, 1)} />\n\t\t\t\t<Stat\n\t\t\t\t\tlabel=\"Cache hit %\"\n\t\t\t\t\tvalue={`${fmtNum(perf.cache_hit_pct.avg, 1)}%`}\n\t\t\t\t/>\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"Process\">\n\t\t\t\t<Stat label=\"RSS\" value={`${fmtNum(perf.rss_mb.latest, 1)} MB`} />\n\t\t\t\t<Stat label=\"Heap\" value={`${fmtNum(perf.heap_mb.latest, 1)} MB`} />\n\t\t\t\t<Stat label=\"CPU user / sys\" value={cpuTxt} />\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"Snapshot cost\">\n\t\t\t\t<Stat label=\"DB recompute p50\" value={fmtMs(perf.db_recompute_ms.p50)} />\n\t\t\t\t<Stat label=\"DB recompute p95\" value={fmtMs(perf.db_recompute_ms.p95)} />\n\t\t\t\t<Stat label=\"Disk write p50\" value={fmtMs(perf.disk_write_ms.p50)} />\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"TUI lag proxy\">\n\t\t\t\t<Stat label=\"Live-trim fires\" value={fmtDiag(perf.diag?.liveTrimFires)} />\n\t\t\t\t<Stat label=\"Cache replays\" value={fmtDiag(perf.diag?.liveTrimReplays)} />\n\t\t\t\t<Stat label=\"Fast-gate skips\" value={fmtDiag(perf.diag?.ctxFastGate)} />\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">skip vs recompute vs replay cadence</span>\n\t\t\t</PerfCard>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/ModelBadge.tsx — model + provider + rates.\n *\n * Shows the active model name, provider, and input/output rates.\n * Tooltips copied verbatim from html.ts. Used in the Metrics tab header.\n */\n\nimport type React from \"react\";\n\nexport interface ModelBadgeProps {\n\t/** Model name/identifier. */\n\tname: string;\n\t/** Human-readable provider name. */\n\tproviderName: string;\n\t/** Machine-readable provider identifier. */\n\tprovider: string;\n\t/** USD per input token (from model pricing). */\n\tinputRate: number;\n\t/** USD per output token (from model pricing). */\n\toutputRate: number;\n}\n\nfunction Field({\n\tlabel,\n\tvalue,\n\ttitle,\n}: {\n\tlabel: string;\n\tvalue: string;\n\ttitle?: string;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"model-field\" title={title}>\n\t\t\t<span className=\"model-field-label\">{label}</span>\n\t\t\t<span className=\"model-field-value\">{value}</span>\n\t\t</div>\n\t);\n}\n\nexport function ModelBadge({\n\tname,\n\tproviderName,\n\tprovider,\n\tinputRate,\n\toutputRate,\n}: ModelBadgeProps): React.ReactElement {\n\tconst providerDisplay = providerName || provider || \"—\";\n\treturn (\n\t\t<div className=\"model-badge\">\n\t\t\t<Field\n\t\t\t\tlabel=\"Model\"\n\t\t\t\tvalue={name}\n\t\t\t\ttitle=\"The model pi is currently using — its pricing drives the cost figure.\"\n\t\t\t/>\n\t\t\t<Field\n\t\t\t\tlabel=\"Provider\"\n\t\t\t\tvalue={providerDisplay}\n\t\t\t\ttitle=\"The provider serving the model.\"\n\t\t\t/>\n\t\t\t<Field\n\t\t\t\tlabel=\"Input Rate\"\n\t\t\t\tvalue={`$${inputRate.toFixed(6)}`}\n\t\t\t\ttitle=\"USD per input token, from the model's pricing.\"\n\t\t\t/>\n\t\t\t<Field\n\t\t\t\tlabel=\"Output Rate\"\n\t\t\t\tvalue={`$${outputRate.toFixed(6)}`}\n\t\t\t\ttitle=\"USD per output token, from the model's pricing.\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RagDashboard.tsx — full RAG metrics section\n * (H3.2). Rendered in the Metrics tab.\n *\n * Fetches /api/rag-metrics and renders:\n * 1. Stat row: telemetry turns, HyDE-ran count, avg lift, pass rate.\n * 2. HyDE Recall Lift Bar (BarChart over daily avg lift).\n * 3. CRAG Quality Line (LineChart over daily avg score).\n * 4. Per-flag status dots (hydeEnabled, recallMetricsEnabled).\n * 5. Recall Latency Stacked Bar (hyde vs base turn counts) + Hit-Rate Area.\n *\n * PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.\n * recharts is bundled into this localhost-served static bundle (no runtime\n * network calls).\n */\n\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { fetchRagMetrics } from \"../api/client\";\nimport type { RagMetricsResponse } from \"@contracts\";\n\n/** Daily-aggregate row shape (derived from the rag-metrics contract). */\ntype DailyTelemetry = RagMetricsResponse[\"daily\"][number];\nimport {\n\tResponsiveContainer,\n\tBarChart,\n\tBar,\n\tLineChart,\n\tLine,\n\tAreaChart,\n\tArea,\n\tXAxis,\n\tYAxis,\n\tCartesianGrid,\n\tTooltip,\n\tLegend,\n} from \"recharts\";\nimport { Card, CardHeader, CardTitle, CardContent } from \"./ui/card\";\nimport { Badge } from \"./ui/badge\";\n\nconst AXIS = \"#8b949e\";\nconst GRID = \"#30363d\";\nconst TOOLTIP = {\n\tbackground: \"#161b22\",\n\tborder: \"1px solid #30363d\",\n\tborderRadius: \"6px\",\n\tcolor: \"#e6edf3\",\n\tfontSize: 12,\n} as const;\n\n/** One row per day, with lead/lag-safe derived series for the charts. */\ninterface DailyRow {\n\tday: string;\n\tavgLift: number;\n\tavgScore: number;\n\tavgGenMs: number;\n\tpassRate: number;\n\thydeTurns: number;\n\tbaseTurns: number;\n\trecallCount: number;\n}\n\nfunction toRows(daily: DailyTelemetry[]): DailyRow[] {\n\treturn daily.map((d) => {\n\t\tconst baseTurns = Math.max(0, d.recallCount - d.hydeRanCount);\n\t\treturn {\n\t\t\tday: d.day.slice(5), // \"MM-DD\"\n\t\t\tavgLift: d.avgLift ?? 0,\n\t\t\tavgScore: d.avgScore ?? 0,\n\t\t\tavgGenMs: d.avgGenMs ?? 0,\n\t\t\tpassRate: d.avgScore == null ? 0 : d.avgScore,\n\t\t\thydeTurns: d.hydeRanCount,\n\t\t\tbaseTurns,\n\t\t\trecallCount: d.recallCount,\n\t\t};\n\t});\n}\n\nexport interface RagDashboardProps {\n\t/** Optional pre-fetched metrics; when absent, the card fetches inline. */\n\tmetrics?: RagMetricsResponse | null;\n}\n\nexport const RagDashboard: React.FC<RagDashboardProps> = ({ metrics }) => {\n\tconst { data, loading } = useApi<RagMetricsResponse>(\n\t\tuseMemo(() => () => fetchRagMetrics(), []),\n\t\t{ pollInterval: 30_000 },\n\t);\n\tconst m = metrics ?? data;\n\tconst rows = useMemo(() => (m ? toRows(m.daily) : []), [m]);\n\n\tif (loading && !m) {\n\t\treturn <div className=\"text-sm text-muted-foreground\">Loading RAG metrics…</div>;\n\t}\n\tif (!m) {\n\t\treturn (\n\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\tNo RAG metrics available yet. They appear once turns record HyDE/recall\n\t\t\t\ttelemetry.\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst { totals, flags } = m;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<StatRow totals={totals} flags={flags} />\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>HyDE Recall Lift</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<BarChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Bar dataKey=\"avgLift\" name=\"avg lift\" fill=\"#58a6ff\" isAnimationActive={false} />\n\t\t\t\t\t\t\t</BarChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>CRAG Quality</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<LineChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} domain={[0, 1]} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Line type=\"monotone\" dataKey=\"avgScore\" name=\"avg score\" stroke=\"#3fb950\" dot={false} strokeWidth={2} isAnimationActive={false} />\n\t\t\t\t\t\t\t</LineChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Recall Latency (avg gen ms)</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<BarChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Bar dataKey=\"avgGenMs\" name=\"gen ms\" fill=\"#d29922\" isAnimationActive={false} />\n\t\t\t\t\t\t\t</BarChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>HyDE vs Base Turn Volume</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<AreaChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Legend wrapperStyle={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<Area type=\"monotone\" dataKey=\"hydeTurns\" name=\"hyde turns\" stackId=\"1\" stroke=\"#58a6ff\" fill=\"#58a6ff\" fillOpacity={0.5} isAnimationActive={false} />\n\t\t\t\t\t\t\t\t<Area type=\"monotone\" dataKey=\"baseTurns\" name=\"base turns\" stackId=\"1\" stroke=\"#8b949e\" fill=\"#8b949e\" fillOpacity={0.4} isAnimationActive={false} />\n\t\t\t\t\t\t\t</AreaChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nfunction StatRow({\n\ttotals,\n\tflags,\n}: {\n\ttotals: RagMetricsResponse[\"totals\"];\n\tflags: RagMetricsResponse[\"flags\"];\n}): React.ReactElement {\n\tconst stats: Array<{ label: string; value: string; hint: string }> = [\n\t\t{\n\t\t\tlabel: \"Telemetry turns\",\n\t\t\tvalue: String(totals.telemetryTurns),\n\t\t\thint: \"turns with HyDE or recall data\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"HyDE ran\",\n\t\t\tvalue: String(totals.hydeRanTurns),\n\t\t\thint: \"turns where HyDE generated a doc\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"Avg lift\",\n\t\t\tvalue: `${totals.avgLift.toFixed(2)}×`,\n\t\t\thint: \"fused / raw hit breadth\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"Pass rate\",\n\t\t\tvalue: `${Math.round(totals.recentPassRate * 100)}%`,\n\t\t\thint: totals.avgScore == null ? \"no scored turns\" : `avg score ${totals.avgScore.toFixed(2)}`,\n\t\t},\n\t];\n\n\treturn (\n\t\t<div className=\"grid grid-cols-2 gap-4 lg:grid-cols-5\">\n\t\t\t{stats.map((s) => (\n\t\t\t\t<Card key={s.label}>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">{s.label}</div>\n\t\t\t\t\t\t<div className=\"font-heading text-2xl font-semibold text-foreground\">\n\t\t\t\t\t\t\t{s.value}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-0.5 text-xs text-muted-foreground\">{s.hint}</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t))}\n\t\t\t<Card>\n\t\t\t\t<CardContent>\n\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">Flags</div>\n\t\t\t\t\t<div className=\"mt-1 flex flex-col gap-1 text-xs\">\n\t\t\t\t\t\t<FlagDot label=\"HyDE\" on={flags.hydeEnabled} />\n\t\t\t\t\t\t<FlagDot label=\"Recall metrics\" on={flags.recallMetricsEnabled} />\n\t\t\t\t\t</div>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t</div>\n\t);\n}\n\nfunction FlagDot({ label, on }: { label: string; on: boolean }): React.ReactElement {\n\treturn (\n\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t<span\n\t\t\t\tclassName={`inline-block h-2 w-2 rounded-full ${on ? \"bg-success\" : \"bg-danger\"}`}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>\n\t\t\t{label}:{\" \"}\n\t\t\t<Badge variant={on ? \"success\" : \"danger\"}>{on ? \"on\" : \"off\"}</Badge>\n\t\t</span>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/CacheTab/MetricsCards.tsx — Performance cards (C2),\n * moved VERBATIM from the top-level MetricsTab.tsx.\n *\n * DASH-0c: the Cache+Performance surface absorbs MetricsTab as a Performance\n * section. This file holds the byte-preserved metrics body (the `MetricsCards`\n * component). The standalone `tabs/MetricsTab.tsx` is reduced to a shell that\n * re-exports it (kept for the #metrics deep-link + rollback symmetry). Only the\n * export name changed (MetricsTab → MetricsCards); the render body is otherwise\n * identical.\n *\n * Fetches /api/perf (rolling-window aggregates) + /api/snapshot (for model).\n * Renders ModelBadge + PerfChart + 5 perf cards (latency, throughput, process,\n * snapshot cost, TUI lag proxy). Polls every 10s.\n */\n\nimport type React from \"react\";\nimport { useCallback } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { fetchPerf, fetchSnapshot } from \"../../api/client\";\nimport type { PerfResponse, SnapshotResponse } from \"@contracts\";\nimport { NEW_UI } from \"../../config\";\nimport { PerfChart } from \"../../components/PerfChart\";\nimport { PerfCards } from \"../../components/PerfCards\";\nimport { ModelBadge } from \"../../components/ModelBadge\";\nimport { RagDashboard } from \"../../components/RagDashboard\";\n\nexport function MetricsCards(): React.ReactElement {\n\tconst { data: perf, error: perfErr } = useApi<PerfResponse>(\n\t\tuseCallback(() => fetchPerf({ minutes: 30 }), []),\n\t\t{ pollInterval: 10_000 },\n\t);\n\tconst { data: snapshot } = useApi<SnapshotResponse>(\n\t\tuseCallback(() => fetchSnapshot(), []),\n\t\t{ pollInterval: 10_000 },\n\t);\n\n\tif (perfErr && !perf) {\n\t\treturn (\n\t\t\t<div className=\"tab-stub\">Error loading perf: {perfErr.message}</div>\n\t\t);\n\t}\n\tif (!perf) {\n\t\treturn <div className=\"tab-stub\">Loading perf…</div>;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{snapshot?.model && (\n\t\t\t\t<ModelBadge\n\t\t\t\t\tname={snapshot.model.name}\n\t\t\t\t\tproviderName={snapshot.model.providerName}\n\t\t\t\t\tprovider={snapshot.model.provider}\n\t\t\t\t\tinputRate={snapshot.model.inputRate}\n\t\t\t\t\toutputRate={snapshot.model.outputRate}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<PerfChart perf={perf} />\n\t\t\t<PerfCards perf={perf} />\n\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t{perf.sampleCount} samples · updated {perf.updatedAt}\n\t\t\t</div>\n\t\t\t{NEW_UI() && <RagDashboard />}\n\t\t</div>\n\t);\n}\n"],"names":["fmtMs","n","Bar","value","max","colorClass","pct","jsx","PerfChart","perf","latencyMax","tpsRef","Card","jsxs","CardHeader","CardTitle","CardContent","v","fmtNum","dec","fmtDiag","Stat","label","PerfCard","title","children","PerfCards","cpuTxt","Field","ModelBadge","name","providerName","provider","inputRate","outputRate","providerDisplay","AXIS","GRID","TOOLTIP","toRows","daily","d","baseTurns","RagDashboard","metrics","data","loading","useApi","useMemo","fetchRagMetrics","m","rows","totals","flags","StatRow","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","LineChart","Line","AreaChart","Legend","Area","stats","s","FlagDot","on","Badge","MetricsCards","perfErr","useCallback","fetchPerf","snapshot","fetchSnapshot","NEW_UI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MetricsCards-36RVmtPj.js","sources":["../../src/components/PerfChart.tsx","../../src/components/PerfCards.tsx","../../src/components/ModelBadge.tsx","../../src/components/RagDashboard.tsx","../../src/tabs/CacheTab/MetricsCards.tsx"],"sourcesContent":["/**\n * dashboard-client/src/components/PerfChart.tsx — perf stat chart.\n *\n * The /api/perf endpoint returns rolling-window aggregates (not time-series),\n * so this renders a stat-card \"chart\": p50/p95 latency bars, TPS, cache hit %,\n * db recompute + disk write. Each metric shows a normalized bar + numeric.\n */\n\nimport type React from \"react\";\nimport type { PerfResponse } from \"@contracts\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\n\nexport interface PerfChartProps {\n\tperf: PerfResponse;\n}\n\nfunction fmtMs(n: number): string {\n\treturn n >= 1000 ? `${(n / 1000).toFixed(1)}s` : `${n.toFixed(0)}ms`;\n}\n\ninterface BarProps {\n\t/** Current value. */\n\tvalue: number;\n\t/** Value that represents 100% bar fill (the \"max\" reference). */\n\tmax: number;\n\t/** Color class. */\n\tcolorClass: string;\n}\n\nfunction Bar({ value, max, colorClass }: BarProps): React.ReactElement {\n\tconst pct = max > 0 ? Math.max(0, Math.min(100, (value / max) * 100)) : 0;\n\treturn (\n\t\t<div className=\"perf-bar-track\">\n\t\t\t<div\n\t\t\t\tclassName={`perf-bar-fill ${colorClass}`}\n\t\t\t\tstyle={{ width: `${pct}%` }}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function PerfChart({ perf }: PerfChartProps): React.ReactElement {\n\t// Reference maxes: p95 is the upper bound for latency bars; rates scale to a\n\t// reasonable reference (tok/s) so bars are visually meaningful even with\n\t// small samples. cache_hit_pct is already 0-100.\n\tconst latencyMax = Math.max(\n\t\tperf.turn_latency_ms.p95,\n\t\tperf.provider_latency_ms.p95,\n\t\t1,\n\t);\n\tconst tpsRef = Math.max(perf.tps.avg, 1);\n\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader className=\"flex-row items-center justify-between space-y-0\">\n\t\t\t\t<CardTitle>Performance</CardTitle>\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t{perf.windowMinutes}min window · {perf.sampleCount} samples\n\t\t\t\t</span>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t<div className=\"perf-grid\">\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Turn latency p50 / p95</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{fmtMs(perf.turn_latency_ms.p50)} /{\" \"}\n\t\t\t\t\t\t{fmtMs(perf.turn_latency_ms.p95)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.turn_latency_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-blue\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Provider latency p50 / p95</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{fmtMs(perf.provider_latency_ms.p50)} /{\" \"}\n\t\t\t\t\t\t{fmtMs(perf.provider_latency_ms.p95)}\n\t\t\t\t\t</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.provider_latency_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-purple\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Tokens/sec (avg)</span>\n\t\t\t\t\t<span className=\"perf-value\">{perf.tps.avg.toFixed(1)}</span>\n\t\t\t\t\t<Bar value={perf.tps.avg} max={tpsRef} colorClass=\"perf-green\" />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Cache hit (avg / latest)</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{perf.cache_hit_pct.avg.toFixed(1)}% /{\" \"}\n\t\t\t\t\t\t{perf.cache_hit_pct.latest.toFixed(1)}%\n\t\t\t\t\t</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.cache_hit_pct.avg}\n\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\tcolorClass=\"perf-green\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">DB recompute p95</span>\n\t\t\t\t\t<span className=\"perf-value\">{fmtMs(perf.db_recompute_ms.p95)}</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.db_recompute_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-yellow\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Disk write p95</span>\n\t\t\t\t\t<span className=\"perf-value\">{fmtMs(perf.disk_write_ms.p95)}</span>\n\t\t\t\t\t<Bar\n\t\t\t\t\t\tvalue={perf.disk_write_ms.p95}\n\t\t\t\t\t\tmax={latencyMax}\n\t\t\t\t\t\tcolorClass=\"perf-yellow\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"perf-resources\">\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">RSS</span>\n\t\t\t\t\t<span className=\"perf-value\">{perf.rss_mb.latest.toFixed(0)} MB</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">Heap</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{perf.heap_mb.latest.toFixed(0)} MB\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">CPU user</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{(perf.cpu_user_ms.latest / 1000).toFixed(1)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"perf-metric\">\n\t\t\t\t\t<span className=\"perf-label\">CPU sys</span>\n\t\t\t\t\t<span className=\"perf-value\">\n\t\t\t\t\t\t{(perf.cpu_sys_ms.latest / 1000).toFixed(1)}s\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{perf.diag && (\n\t\t\t\t<div className=\"perf-diag\">\n\t\t\t\t\t<span className=\"perf-label\">\n\t\t\t\t\t\tFast-gate fires: {perf.diag.ctxFastGate}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"perf-label\">\n\t\t\t\t\t\tLive trim fires: {perf.diag.liveTrimFires}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"perf-label\">\n\t\t\t\t\t\tLive trim replays: {perf.diag.liveTrimReplays}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","/**\n * dashboard-client/src/components/PerfCards.tsx — 5 perf metric cards.\n *\n * Mirrors the old html.ts perf grid: model latency, throughput, process,\n * snapshot cost, and TUI lag proxy. Uses the existing perf-metric CSS\n * classes from repos-metrics.css plus metrics-extra.css for card headers.\n */\n\nimport type React from \"react\";\nimport type { PerfResponse } from \"@contracts\";\nimport {\n\tCard,\n\tCardContent,\n\tCardHeader,\n\tCardTitle,\n} from \"../components/ui/card\";\n\n/** Format milliseconds (em-dash for null/undefined). */\nfunction fmtMs(v: number | null | undefined): string {\n\treturn v == null ? \"\\u2014\" : v >= 100 ? `${Math.round(v)}ms` : `${v.toFixed(1)}ms`;\n}\n\n/** Format a number with fixed decimals (em-dash for null/non-number). */\nfunction fmtNum(v: number | null | undefined, dec: number): string {\n\treturn v == null || typeof v !== \"number\" ? \"\\u2014\" : v.toFixed(dec);\n}\n\n/** Format a diag counter (em-dash for null). */\nfunction fmtDiag(v: number | null | undefined): string {\n\treturn v == null ? \"\\u2014\" : String(v);\n}\n\ninterface PerfCardsProps {\n\tperf: PerfResponse;\n}\n\n/** A single stat row inside a perf card. */\nfunction Stat({ label, value }: { label: string; value: string }): React.ReactElement {\n\treturn (\n\t\t<div className=\"flex items-baseline justify-between border-b border-border py-1 text-sm\">\n\t\t\t<span className=\"text-xs text-muted-foreground\">{label}</span>\n\t\t\t<span className=\"font-semibold\">{value}</span>\n\t\t</div>\n\t);\n}\n\n/** Card wrapper with a title. */\nfunction PerfCard({ title, children }: { title: string; children: React.ReactNode }): React.ReactElement {\n\treturn (\n\t\t<Card className=\"electric-hover\">\n\t\t\t<CardHeader>\n\t\t\t\t<CardTitle>{title}</CardTitle>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>{children}</CardContent>\n\t\t</Card>\n\t);\n}\n\nexport function PerfCards({ perf }: PerfCardsProps): React.ReactElement {\n\tconst cpuTxt = `${fmtNum(perf.cpu_user_ms.latest, 1)} / ${fmtNum(perf.cpu_sys_ms.latest, 1)} ms`;\n\n\treturn (\n\t\t<div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n\t\t\t<PerfCard title=\"Model latency\">\n\t\t\t\t<Stat label=\"Turn p50\" value={fmtMs(perf.turn_latency_ms.p50)} />\n\t\t\t\t<Stat label=\"Turn p95\" value={fmtMs(perf.turn_latency_ms.p95)} />\n\t\t\t\t<Stat label=\"Provider p50\" value={fmtMs(perf.provider_latency_ms.p50)} />\n\t\t\t\t<Stat label=\"Provider p95\" value={fmtMs(perf.provider_latency_ms.p95)} />\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"Throughput\">\n\t\t\t\t<Stat label=\"TPS (avg)\" value={fmtNum(perf.tps.avg, 1)} />\n\t\t\t\t<Stat\n\t\t\t\t\tlabel=\"Cache hit %\"\n\t\t\t\t\tvalue={`${fmtNum(perf.cache_hit_pct.avg, 1)}%`}\n\t\t\t\t/>\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"Process\">\n\t\t\t\t<Stat label=\"RSS\" value={`${fmtNum(perf.rss_mb.latest, 1)} MB`} />\n\t\t\t\t<Stat label=\"Heap\" value={`${fmtNum(perf.heap_mb.latest, 1)} MB`} />\n\t\t\t\t<Stat label=\"CPU user / sys\" value={cpuTxt} />\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"Snapshot cost\">\n\t\t\t\t<Stat label=\"DB recompute p50\" value={fmtMs(perf.db_recompute_ms.p50)} />\n\t\t\t\t<Stat label=\"DB recompute p95\" value={fmtMs(perf.db_recompute_ms.p95)} />\n\t\t\t\t<Stat label=\"Disk write p50\" value={fmtMs(perf.disk_write_ms.p50)} />\n\t\t\t</PerfCard>\n\n\t\t\t<PerfCard title=\"TUI lag proxy\">\n\t\t\t\t<Stat label=\"Live-trim fires\" value={fmtDiag(perf.diag?.liveTrimFires)} />\n\t\t\t\t<Stat label=\"Cache replays\" value={fmtDiag(perf.diag?.liveTrimReplays)} />\n\t\t\t\t<Stat label=\"Fast-gate skips\" value={fmtDiag(perf.diag?.ctxFastGate)} />\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">skip vs recompute vs replay cadence</span>\n\t\t\t</PerfCard>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/ModelBadge.tsx — model + provider + rates.\n *\n * Shows the active model name, provider, and input/output rates.\n * Tooltips copied verbatim from html.ts. Used in the Metrics tab header.\n */\n\nimport type React from \"react\";\n\nexport interface ModelBadgeProps {\n\t/** Model name/identifier. */\n\tname: string;\n\t/** Human-readable provider name. */\n\tproviderName: string;\n\t/** Machine-readable provider identifier. */\n\tprovider: string;\n\t/** USD per input token (from model pricing). */\n\tinputRate: number;\n\t/** USD per output token (from model pricing). */\n\toutputRate: number;\n}\n\nfunction Field({\n\tlabel,\n\tvalue,\n\ttitle,\n}: {\n\tlabel: string;\n\tvalue: string;\n\ttitle?: string;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"model-field\" title={title}>\n\t\t\t<span className=\"model-field-label\">{label}</span>\n\t\t\t<span className=\"model-field-value\">{value}</span>\n\t\t</div>\n\t);\n}\n\nexport function ModelBadge({\n\tname,\n\tproviderName,\n\tprovider,\n\tinputRate,\n\toutputRate,\n}: ModelBadgeProps): React.ReactElement {\n\tconst providerDisplay = providerName || provider || \"—\";\n\treturn (\n\t\t<div className=\"model-badge\">\n\t\t\t<Field\n\t\t\t\tlabel=\"Model\"\n\t\t\t\tvalue={name}\n\t\t\t\ttitle=\"The model pi is currently using — its pricing drives the cost figure.\"\n\t\t\t/>\n\t\t\t<Field\n\t\t\t\tlabel=\"Provider\"\n\t\t\t\tvalue={providerDisplay}\n\t\t\t\ttitle=\"The provider serving the model.\"\n\t\t\t/>\n\t\t\t<Field\n\t\t\t\tlabel=\"Input Rate\"\n\t\t\t\tvalue={`$${inputRate.toFixed(6)}`}\n\t\t\t\ttitle=\"USD per input token, from the model's pricing.\"\n\t\t\t/>\n\t\t\t<Field\n\t\t\t\tlabel=\"Output Rate\"\n\t\t\t\tvalue={`$${outputRate.toFixed(6)}`}\n\t\t\t\ttitle=\"USD per output token, from the model's pricing.\"\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RagDashboard.tsx — full RAG metrics section\n * (H3.2). Rendered in the Metrics tab.\n *\n * Fetches /api/rag-metrics and renders:\n * 1. Stat row: telemetry turns, HyDE-ran count, avg lift, pass rate.\n * 2. HyDE Recall Lift Bar (BarChart over daily avg lift).\n * 3. CRAG Quality Line (LineChart over daily avg score).\n * 4. Per-flag status dots (hydeEnabled, recallMetricsEnabled).\n * 5. Recall Latency Stacked Bar (hyde vs base turn counts) + Hit-Rate Area.\n *\n * PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.\n * recharts is bundled into this localhost-served static bundle (no runtime\n * network calls).\n */\n\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { fetchRagMetrics } from \"../api/client\";\nimport type { RagMetricsResponse } from \"@contracts\";\n\n/** Daily-aggregate row shape (derived from the rag-metrics contract). */\ntype DailyTelemetry = RagMetricsResponse[\"daily\"][number];\nimport {\n\tResponsiveContainer,\n\tBarChart,\n\tBar,\n\tLineChart,\n\tLine,\n\tAreaChart,\n\tArea,\n\tXAxis,\n\tYAxis,\n\tCartesianGrid,\n\tTooltip,\n\tLegend,\n} from \"recharts\";\nimport { Card, CardHeader, CardTitle, CardContent } from \"./ui/card\";\nimport { Badge } from \"./ui/badge\";\n\nconst AXIS = \"#8b949e\";\nconst GRID = \"#30363d\";\nconst TOOLTIP = {\n\tbackground: \"#161b22\",\n\tborder: \"1px solid #30363d\",\n\tborderRadius: \"6px\",\n\tcolor: \"#e6edf3\",\n\tfontSize: 12,\n} as const;\n\n/** One row per day, with lead/lag-safe derived series for the charts. */\ninterface DailyRow {\n\tday: string;\n\tavgLift: number;\n\tavgScore: number;\n\tavgGenMs: number;\n\tpassRate: number;\n\thydeTurns: number;\n\tbaseTurns: number;\n\trecallCount: number;\n}\n\nfunction toRows(daily: DailyTelemetry[]): DailyRow[] {\n\treturn daily.map((d) => {\n\t\tconst baseTurns = Math.max(0, d.recallCount - d.hydeRanCount);\n\t\treturn {\n\t\t\tday: d.day.slice(5), // \"MM-DD\"\n\t\t\tavgLift: d.avgLift ?? 0,\n\t\t\tavgScore: d.avgScore ?? 0,\n\t\t\tavgGenMs: d.avgGenMs ?? 0,\n\t\t\tpassRate: d.avgScore == null ? 0 : d.avgScore,\n\t\t\thydeTurns: d.hydeRanCount,\n\t\t\tbaseTurns,\n\t\t\trecallCount: d.recallCount,\n\t\t};\n\t});\n}\n\nexport interface RagDashboardProps {\n\t/** Optional pre-fetched metrics; when absent, the card fetches inline. */\n\tmetrics?: RagMetricsResponse | null;\n}\n\nexport const RagDashboard: React.FC<RagDashboardProps> = ({ metrics }) => {\n\tconst { data, loading } = useApi<RagMetricsResponse>(\n\t\tuseMemo(() => () => fetchRagMetrics(), []),\n\t\t{ pollInterval: 30_000 },\n\t);\n\tconst m = metrics ?? data;\n\tconst rows = useMemo(() => (m ? toRows(m.daily) : []), [m]);\n\n\tif (loading && !m) {\n\t\treturn <div className=\"text-sm text-muted-foreground\">Loading RAG metrics…</div>;\n\t}\n\tif (!m) {\n\t\treturn (\n\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\tNo RAG metrics available yet. They appear once turns record HyDE/recall\n\t\t\t\ttelemetry.\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst { totals, flags } = m;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<StatRow totals={totals} flags={flags} />\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>HyDE Recall Lift</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<BarChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Bar dataKey=\"avgLift\" name=\"avg lift\" fill=\"#58a6ff\" isAnimationActive={false} />\n\t\t\t\t\t\t\t</BarChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>CRAG Quality</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<LineChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} domain={[0, 1]} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Line type=\"monotone\" dataKey=\"avgScore\" name=\"avg score\" stroke=\"#3fb950\" dot={false} strokeWidth={2} isAnimationActive={false} />\n\t\t\t\t\t\t\t</LineChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Recall Latency (avg gen ms)</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<BarChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Bar dataKey=\"avgGenMs\" name=\"gen ms\" fill=\"#d29922\" isAnimationActive={false} />\n\t\t\t\t\t\t\t</BarChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>HyDE vs Base Turn Volume</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height={200}>\n\t\t\t\t\t\t\t<AreaChart data={rows} margin={{ top: 8, right: 12, left: 0, bottom: 0 }}>\n\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} />\n\t\t\t\t\t\t\t\t<XAxis dataKey=\"day\" stroke={AXIS} tick={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<YAxis stroke={AXIS} tick={{ fontSize: 11 }} width={40} />\n\t\t\t\t\t\t\t\t<Tooltip contentStyle={TOOLTIP} />\n\t\t\t\t\t\t\t\t<Legend wrapperStyle={{ fontSize: 11 }} />\n\t\t\t\t\t\t\t\t<Area type=\"monotone\" dataKey=\"hydeTurns\" name=\"hyde turns\" stackId=\"1\" stroke=\"#58a6ff\" fill=\"#58a6ff\" fillOpacity={0.5} isAnimationActive={false} />\n\t\t\t\t\t\t\t\t<Area type=\"monotone\" dataKey=\"baseTurns\" name=\"base turns\" stackId=\"1\" stroke=\"#8b949e\" fill=\"#8b949e\" fillOpacity={0.4} isAnimationActive={false} />\n\t\t\t\t\t\t\t</AreaChart>\n\t\t\t\t\t\t</ResponsiveContainer>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nfunction StatRow({\n\ttotals,\n\tflags,\n}: {\n\ttotals: RagMetricsResponse[\"totals\"];\n\tflags: RagMetricsResponse[\"flags\"];\n}): React.ReactElement {\n\tconst stats: Array<{ label: string; value: string; hint: string }> = [\n\t\t{\n\t\t\tlabel: \"Telemetry turns\",\n\t\t\tvalue: String(totals.telemetryTurns),\n\t\t\thint: \"turns with HyDE or recall data\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"HyDE ran\",\n\t\t\tvalue: String(totals.hydeRanTurns),\n\t\t\thint: \"turns where HyDE generated a doc\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"Avg lift\",\n\t\t\tvalue: `${totals.avgLift.toFixed(2)}×`,\n\t\t\thint: \"fused / raw hit breadth\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"Pass rate\",\n\t\t\tvalue: `${Math.round(totals.recentPassRate * 100)}%`,\n\t\t\thint: totals.avgScore == null ? \"no scored turns\" : `avg score ${totals.avgScore.toFixed(2)}`,\n\t\t},\n\t];\n\n\treturn (\n\t\t<div className=\"grid grid-cols-2 gap-4 lg:grid-cols-5\">\n\t\t\t{stats.map((s) => (\n\t\t\t\t<Card key={s.label}>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">{s.label}</div>\n\t\t\t\t\t\t<div className=\"font-heading text-2xl font-semibold text-foreground\">\n\t\t\t\t\t\t\t{s.value}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-0.5 text-xs text-muted-foreground\">{s.hint}</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t))}\n\t\t\t<Card>\n\t\t\t\t<CardContent>\n\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">Flags</div>\n\t\t\t\t\t<div className=\"mt-1 flex flex-col gap-1 text-xs\">\n\t\t\t\t\t\t<FlagDot label=\"HyDE\" on={flags.hydeEnabled} />\n\t\t\t\t\t\t<FlagDot label=\"Recall metrics\" on={flags.recallMetricsEnabled} />\n\t\t\t\t\t</div>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t</div>\n\t);\n}\n\nfunction FlagDot({ label, on }: { label: string; on: boolean }): React.ReactElement {\n\treturn (\n\t\t<span className=\"flex items-center gap-1.5\">\n\t\t\t<span\n\t\t\t\tclassName={`inline-block h-2 w-2 rounded-full ${on ? \"bg-success\" : \"bg-danger\"}`}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t/>\n\t\t\t{label}:{\" \"}\n\t\t\t<Badge variant={on ? \"success\" : \"danger\"}>{on ? \"on\" : \"off\"}</Badge>\n\t\t</span>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/CacheTab/MetricsCards.tsx — Performance cards (C2),\n * moved VERBATIM from the top-level MetricsTab.tsx.\n *\n * DASH-0c: the Cache+Performance surface absorbs MetricsTab as a Performance\n * section. This file holds the byte-preserved metrics body (the `MetricsCards`\n * component). The standalone `tabs/MetricsTab.tsx` is reduced to a shell that\n * re-exports it (kept for the #metrics deep-link + rollback symmetry). Only the\n * export name changed (MetricsTab → MetricsCards); the render body is otherwise\n * identical.\n *\n * Fetches /api/perf (rolling-window aggregates) + /api/snapshot (for model).\n * Renders ModelBadge + PerfChart + 5 perf cards (latency, throughput, process,\n * snapshot cost, TUI lag proxy). Polls every 10s.\n */\n\nimport type React from \"react\";\nimport { useCallback } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { fetchPerf, fetchSnapshot } from \"../../api/client\";\nimport type { PerfResponse, SnapshotResponse } from \"@contracts\";\nimport { NEW_UI } from \"../../config\";\nimport { PerfChart } from \"../../components/PerfChart\";\nimport { PerfCards } from \"../../components/PerfCards\";\nimport { ModelBadge } from \"../../components/ModelBadge\";\nimport { RagDashboard } from \"../../components/RagDashboard\";\n\nexport function MetricsCards(): React.ReactElement {\n\tconst { data: perf, error: perfErr } = useApi<PerfResponse>(\n\t\tuseCallback(() => fetchPerf({ minutes: 30 }), []),\n\t\t{ pollInterval: 10_000 },\n\t);\n\tconst { data: snapshot } = useApi<SnapshotResponse>(\n\t\tuseCallback(() => fetchSnapshot(), []),\n\t\t{ pollInterval: 10_000 },\n\t);\n\n\tif (perfErr && !perf) {\n\t\treturn (\n\t\t\t<div className=\"tab-stub\">Error loading perf: {perfErr.message}</div>\n\t\t);\n\t}\n\tif (!perf) {\n\t\treturn <div className=\"tab-stub\">Loading perf…</div>;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{snapshot?.model && (\n\t\t\t\t<ModelBadge\n\t\t\t\t\tname={snapshot.model.name}\n\t\t\t\t\tproviderName={snapshot.model.providerName}\n\t\t\t\t\tprovider={snapshot.model.provider}\n\t\t\t\t\tinputRate={snapshot.model.inputRate}\n\t\t\t\t\toutputRate={snapshot.model.outputRate}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<PerfChart perf={perf} />\n\t\t\t<PerfCards perf={perf} />\n\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t{perf.sampleCount} samples · updated {perf.updatedAt}\n\t\t\t</div>\n\t\t\t{NEW_UI() && <RagDashboard />}\n\t\t</div>\n\t);\n}\n"],"names":["fmtMs","n","Bar","value","max","colorClass","pct","jsx","PerfChart","perf","latencyMax","tpsRef","Card","jsxs","CardHeader","CardTitle","CardContent","v","fmtNum","dec","fmtDiag","Stat","label","PerfCard","title","children","PerfCards","cpuTxt","Field","ModelBadge","name","providerName","provider","inputRate","outputRate","providerDisplay","AXIS","GRID","TOOLTIP","toRows","daily","d","baseTurns","RagDashboard","metrics","data","loading","useApi","useMemo","fetchRagMetrics","m","rows","totals","flags","StatRow","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","LineChart","Line","AreaChart","Legend","Area","stats","s","FlagDot","on","Badge","MetricsCards","perfErr","useCallback","fetchPerf","snapshot","fetchSnapshot","NEW_UI"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as r}from"./index-CL6Af_JZ.js";import{M as t}from"./MetricsCards-36RVmtPj.js";import"./card-Dvl16_R5.js";import"./generateCategoricalChart-Q_V4fqVi.js";import"./BarChart-Bhyviy7_.js";import"./AreaChart-CeaexvWO.js";function e(){return r.jsx(t,{})}export{e as default};
|
|
2
|
+
//# sourceMappingURL=MetricsTab-Clkcniuo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsTab-
|
|
1
|
+
{"version":3,"file":"MetricsTab-Clkcniuo.js","sources":["../../src/tabs/MetricsTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/tabs/MetricsTab.tsx — Metrics tab (C2) shell.\n *\n * DASH-0c: the Cache+Performance surface absorbs the metrics body as a\n * Performance section; this file is reduced to a shell that re-exports\n * `MetricsCards` (the byte-preserved body moved to ./CacheTab/MetricsCards.tsx).\n * Kept as a deep-link anchor for #metrics and for rollback symmetry (flag-off\n * renders MetricsTab as a standalone top-level surface). A DASH-0d cleanup deletes\n * this standalone copy after a deep-link audit proves no live consumer points\n * at it. The render body is otherwise identical to the pre-DASH-0c MetricsTab.\n */\n\nimport { MetricsCards } from \"./CacheTab/MetricsCards\";\n\nexport default function MetricsTab(): React.ReactElement {\n\treturn <MetricsCards />;\n}\n"],"names":["MetricsTab","MetricsCards"],"mappings":"gOAcA,SAAwBA,GAAiC,CACxD,aAAQC,EAAA,EAAa,CACtB"}
|
package/extensions/dashboard-client/dist/assets/{OverviewTab-C5ClXheK.js → OverviewTab-Cl2Zx7r1.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as dn,r as l,j as s,u as un,f as Yn,R as K,a as _e,b as Vn,d as qn,B as Jn,N as Qn}from"./index-
|
|
1
|
+
import{c as dn,r as l,j as s,u as un,f as Yn,R as K,a as _e,b as Vn,d as qn,B as Jn,N as Qn}from"./index-CL6Af_JZ.js";import{u as Zn}from"./useSSE-DcBpzKtI.js";import{C as ye,a as Ae,b as Le,c as we}from"./card-Dvl16_R5.js";import{f as Re,a as Gt}from"./format-COjDIVGj.js";import{T as er,C as tr}from"./TimeSavedCard-9QMQUc7L.js";import{R as fn,C as hn,X as gn,Y as pn,T as mn,L as nr,B as rr}from"./generateCategoricalChart-Q_V4fqVi.js";import{L as sr,B as or}from"./BarChart-Bhyviy7_.js";/**
|
|
2
2
|
* @license lucide-react v0.400.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -13,4 +13,4 @@ import{c as dn,r as l,j as s,u as un,f as Yn,R as K,a as _e,b as Vn,d as qn,B as
|
|
|
13
13
|
While dragging, use the arrow keys to move the item.
|
|
14
14
|
Press space again to drop the item in its new position, or press escape to cancel.
|
|
15
15
|
`},Gr={onDragStart(e){let{active:t}=e;return"Picked up draggable item "+t.id+"."},onDragOver(e){let{active:t,over:n}=e;return n?"Draggable item "+t.id+" was moved over droppable area "+n.id+".":"Draggable item "+t.id+" is no longer over a droppable area."},onDragEnd(e){let{active:t,over:n}=e;return n?"Draggable item "+t.id+" was dropped over droppable area "+n.id:"Draggable item "+t.id+" was dropped."},onDragCancel(e){let{active:t}=e;return"Dragging was cancelled. Draggable item "+t.id+" was dropped."}};function Yr(e){let{announcements:t=Gr,container:n,hiddenTextDescribedById:r,screenReaderInstructions:o=Ur}=e;const{announce:i,announcement:a}=_r(),c=Ze("DndLiveRegion"),[d,u]=l.useState(!1);if(l.useEffect(()=>{u(!0)},[]),Xr(l.useMemo(()=>({onDragStart(f){let{active:v}=f;i(t.onDragStart({active:v}))},onDragMove(f){let{active:v,over:g}=f;t.onDragMove&&i(t.onDragMove({active:v,over:g}))},onDragOver(f){let{active:v,over:g}=f;i(t.onDragOver({active:v,over:g}))},onDragEnd(f){let{active:v,over:g}=f;i(t.onDragEnd({active:v,over:g}))},onDragCancel(f){let{active:v,over:g}=f;i(t.onDragCancel({active:v,over:g}))}}),[i,t])),!d)return null;const h=K.createElement(K.Fragment,null,K.createElement(Wr,{id:r,value:o.draggable}),K.createElement(Hr,{id:c,announcement:a}));return n?_e.createPortal(h,n):h}var I;(function(e){e.DragStart="dragStart",e.DragMove="dragMove",e.DragEnd="dragEnd",e.DragCancel="dragCancel",e.DragOver="dragOver",e.RegisterDroppable="registerDroppable",e.SetDroppableDisabled="setDroppableDisabled",e.UnregisterDroppable="unregisterDroppable"})(I||(I={}));function dt(){}const te=Object.freeze({x:0,y:0});function Vr(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return r-n}function qr(e,t){if(!e||e.length===0)return null;const[n]=e;return n[t]}function Jr(e,t){const n=Math.max(t.top,e.top),r=Math.max(t.left,e.left),o=Math.min(t.left+t.width,e.left+e.width),i=Math.min(t.top+t.height,e.top+e.height),a=o-r,c=i-n;if(r<o&&n<i){const d=t.width*t.height,u=e.width*e.height,h=a*c,f=h/(d+u-h);return Number(f.toFixed(4))}return 0}const Qr=e=>{let{collisionRect:t,droppableRects:n,droppableContainers:r}=e;const o=[];for(const i of r){const{id:a}=i,c=n.get(a);if(c){const d=Jr(c,t);d>0&&o.push({id:a,data:{droppableContainer:i,value:d}})}}return o.sort(Vr)};function Zr(e,t,n){return{...e,scaleX:t&&n?t.width/n.width:1,scaleY:t&&n?t.height/n.height:1}}function yn(e,t){return e&&t?{x:e.left-t.left,y:e.top-t.top}:te}function es(e){return function(n){for(var r=arguments.length,o=new Array(r>1?r-1:0),i=1;i<r;i++)o[i-1]=arguments[i];return o.reduce((a,c)=>({...a,top:a.top+e*c.y,bottom:a.bottom+e*c.y,left:a.left+e*c.x,right:a.right+e*c.x}),{...n})}}const ts=es(1);function ns(e){if(e.startsWith("matrix3d(")){const t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}else if(e.startsWith("matrix(")){const t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}function rs(e,t,n){const r=ns(t);if(!r)return e;const{scaleX:o,scaleY:i,x:a,y:c}=r,d=e.left-a-(1-o)*parseFloat(n),u=e.top-c-(1-i)*parseFloat(n.slice(n.indexOf(" ")+1)),h=o?e.width/o:e.width,f=i?e.height/i:e.height;return{width:h,height:f,top:u,right:d+h,bottom:u+f,left:d}}const ss={ignoreTransform:!1};function $e(e,t){t===void 0&&(t=ss);let n=e.getBoundingClientRect();if(t.ignoreTransform){const{transform:u,transformOrigin:h}=U(e).getComputedStyle(e);u&&(n=rs(n,u,h))}const{top:r,left:o,width:i,height:a,bottom:c,right:d}=n;return{top:r,left:o,width:i,height:a,bottom:c,right:d}}function Zt(e){return $e(e,{ignoreTransform:!0})}function os(e){const t=e.innerWidth,n=e.innerHeight;return{top:0,left:0,right:t,bottom:n,width:t,height:n}}function is(e,t){return t===void 0&&(t=U(e).getComputedStyle(e)),t.position==="fixed"}function as(e,t){t===void 0&&(t=U(e).getComputedStyle(e));const n=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(o=>{const i=t[o];return typeof i=="string"?n.test(i):!1})}function Pt(e,t){const n=[];function r(o){if(t!=null&&n.length>=t||!o)return n;if(At(o)&&o.scrollingElement!=null&&!n.includes(o.scrollingElement))return n.push(o.scrollingElement),n;if(!Je(o)||vn(o)||n.includes(o))return n;const i=U(e).getComputedStyle(o);return o!==e&&as(o,i)&&n.push(o),is(o,i)?n:r(o.parentNode)}return e?r(e):n}function wn(e){const[t]=Pt(e,1);return t??null}function Ct(e){return!ft||!e?null:Ie(e)?e:Ot(e)?At(e)||e===Pe(e).scrollingElement?window:Je(e)?e:null:null}function jn(e){return Ie(e)?e.scrollX:e.scrollLeft}function Sn(e){return Ie(e)?e.scrollY:e.scrollTop}function Et(e){return{x:jn(e),y:Sn(e)}}var $;(function(e){e[e.Forward=1]="Forward",e[e.Backward=-1]="Backward"})($||($={}));function Cn(e){return!ft||!e?!1:e===document.scrollingElement}function Rn(e){const t={x:0,y:0},n=Cn(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},r={x:e.scrollWidth-n.width,y:e.scrollHeight-n.height},o=e.scrollTop<=t.y,i=e.scrollLeft<=t.x,a=e.scrollTop>=r.y,c=e.scrollLeft>=r.x;return{isTop:o,isLeft:i,isBottom:a,isRight:c,maxScroll:r,minScroll:t}}const ls={x:.2,y:.2};function cs(e,t,n,r,o){let{top:i,left:a,right:c,bottom:d}=n;r===void 0&&(r=10),o===void 0&&(o=ls);const{isTop:u,isBottom:h,isLeft:f,isRight:v}=Rn(e),g={x:0,y:0},p={x:0,y:0},m={height:t.height*o.y,width:t.width*o.x};return!u&&i<=t.top+m.height?(g.y=$.Backward,p.y=r*Math.abs((t.top+m.height-i)/m.height)):!h&&d>=t.bottom-m.height&&(g.y=$.Forward,p.y=r*Math.abs((t.bottom-m.height-d)/m.height)),!v&&c>=t.right-m.width?(g.x=$.Forward,p.x=r*Math.abs((t.right-m.width-c)/m.width)):!f&&a<=t.left+m.width&&(g.x=$.Backward,p.x=r*Math.abs((t.left+m.width-a)/m.width)),{direction:g,speed:p}}function ds(e){if(e===document.scrollingElement){const{innerWidth:i,innerHeight:a}=window;return{top:0,left:0,right:i,bottom:a,width:i,height:a}}const{top:t,left:n,right:r,bottom:o}=e.getBoundingClientRect();return{top:t,left:n,right:r,bottom:o,width:e.clientWidth,height:e.clientHeight}}function Dn(e){return e.reduce((t,n)=>Oe(t,Et(n)),te)}function us(e){return e.reduce((t,n)=>t+jn(n),0)}function fs(e){return e.reduce((t,n)=>t+Sn(n),0)}function hs(e,t){if(t===void 0&&(t=$e),!e)return;const{top:n,left:r,bottom:o,right:i}=t(e);wn(e)&&(o<=0||i<=0||n>=window.innerHeight||r>=window.innerWidth)&&e.scrollIntoView({block:"center",inline:"center"})}const gs=[["x",["left","right"],us],["y",["top","bottom"],fs]];class $t{constructor(t,n){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const r=Pt(n),o=Dn(r);this.rect={...t},this.width=t.width,this.height=t.height;for(const[i,a,c]of gs)for(const d of a)Object.defineProperty(this,d,{get:()=>{const u=c(r),h=o[i]-u;return this.rect[d]+h},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class Xe{constructor(t){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(n=>{var r;return(r=this.target)==null?void 0:r.removeEventListener(...n)})},this.target=t}add(t,n,r){var o;(o=this.target)==null||o.addEventListener(t,n,r),this.listeners.push([t,n,r])}}function ps(e){const{EventTarget:t}=U(e);return e instanceof t?e:Pe(e)}function Rt(e,t){const n=Math.abs(e.x),r=Math.abs(e.y);return typeof t=="number"?Math.sqrt(n**2+r**2)>t:"x"in t&&"y"in t?n>t.x&&r>t.y:"x"in t?n>t.x:"y"in t?r>t.y:!1}var Q;(function(e){e.Click="click",e.DragStart="dragstart",e.Keydown="keydown",e.ContextMenu="contextmenu",e.Resize="resize",e.SelectionChange="selectionchange",e.VisibilityChange="visibilitychange"})(Q||(Q={}));function en(e){e.preventDefault()}function ms(e){e.stopPropagation()}var N;(function(e){e.Space="Space",e.Down="ArrowDown",e.Right="ArrowRight",e.Left="ArrowLeft",e.Up="ArrowUp",e.Esc="Escape",e.Enter="Enter",e.Tab="Tab"})(N||(N={}));const kn={start:[N.Space,N.Enter],cancel:[N.Esc],end:[N.Space,N.Enter,N.Tab]},vs=(e,t)=>{let{currentCoordinates:n}=t;switch(e.code){case N.Right:return{...n,x:n.x+25};case N.Left:return{...n,x:n.x-25};case N.Down:return{...n,y:n.y+25};case N.Up:return{...n,y:n.y-25}}};class Nn{constructor(t){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=t;const{event:{target:n}}=t;this.props=t,this.listeners=new Xe(Pe(n)),this.windowListeners=new Xe(U(n)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(Q.Resize,this.handleCancel),this.windowListeners.add(Q.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add(Q.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:t,onStart:n}=this.props,r=t.node.current;r&&hs(r),n(te)}handleKeyDown(t){if(It(t)){const{active:n,context:r,options:o}=this.props,{keyboardCodes:i=kn,coordinateGetter:a=vs,scrollBehavior:c="smooth"}=o,{code:d}=t;if(i.end.includes(d)){this.handleEnd(t);return}if(i.cancel.includes(d)){this.handleCancel(t);return}const{collisionRect:u}=r.current,h=u?{x:u.left,y:u.top}:te;this.referenceCoordinates||(this.referenceCoordinates=h);const f=a(t,{active:n,context:r.current,currentCoordinates:h});if(f){const v=ct(f,h),g={x:0,y:0},{scrollableAncestors:p}=r.current;for(const m of p){const x=t.code,{isTop:C,isRight:R,isLeft:S,isBottom:D,maxScroll:k,minScroll:y}=Rn(m),j=ds(m),b={x:Math.min(x===N.Right?j.right-j.width/2:j.right,Math.max(x===N.Right?j.left:j.left+j.width/2,f.x)),y:Math.min(x===N.Down?j.bottom-j.height/2:j.bottom,Math.max(x===N.Down?j.top:j.top+j.height/2,f.y))},M=x===N.Right&&!R||x===N.Left&&!S,O=x===N.Down&&!D||x===N.Up&&!C;if(M&&b.x!==f.x){const E=m.scrollLeft+v.x,_=x===N.Right&&E<=k.x||x===N.Left&&E>=y.x;if(_&&!v.y){m.scrollTo({left:E,behavior:c});return}_?g.x=m.scrollLeft-E:g.x=x===N.Right?m.scrollLeft-k.x:m.scrollLeft-y.x,g.x&&m.scrollBy({left:-g.x,behavior:c});break}else if(O&&b.y!==f.y){const E=m.scrollTop+v.y,_=x===N.Down&&E<=k.y||x===N.Up&&E>=y.y;if(_&&!v.x){m.scrollTo({top:E,behavior:c});return}_?g.y=m.scrollTop-E:g.y=x===N.Down?m.scrollTop-k.y:m.scrollTop-y.y,g.y&&m.scrollBy({top:-g.y,behavior:c});break}}this.handleMove(t,Oe(ct(f,this.referenceCoordinates),g))}}}handleMove(t,n){const{onMove:r}=this.props;t.preventDefault(),r(n)}handleEnd(t){const{onEnd:n}=this.props;t.preventDefault(),this.detach(),n()}handleCancel(t){const{onCancel:n}=this.props;t.preventDefault(),this.detach(),n()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}Nn.activators=[{eventName:"onKeyDown",handler:(e,t,n)=>{let{keyboardCodes:r=kn,onActivation:o}=t,{active:i}=n;const{code:a}=e.nativeEvent;if(r.start.includes(a)){const c=i.activatorNode.current;return c&&e.target!==c?!1:(e.preventDefault(),o?.({event:e.nativeEvent}),!0)}return!1}}];function tn(e){return!!(e&&"distance"in e)}function nn(e){return!!(e&&"delay"in e)}class Ft{constructor(t,n,r){var o;r===void 0&&(r=ps(t.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=t,this.events=n;const{event:i}=t,{target:a}=i;this.props=t,this.events=n,this.document=Pe(a),this.documentListeners=new Xe(this.document),this.listeners=new Xe(r),this.windowListeners=new Xe(U(a)),this.initialCoordinates=(o=Nt(i))!=null?o:te,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:t,props:{options:{activationConstraint:n,bypassActivationConstraint:r}}}=this;if(this.listeners.add(t.move.name,this.handleMove,{passive:!1}),this.listeners.add(t.end.name,this.handleEnd),t.cancel&&this.listeners.add(t.cancel.name,this.handleCancel),this.windowListeners.add(Q.Resize,this.handleCancel),this.windowListeners.add(Q.DragStart,en),this.windowListeners.add(Q.VisibilityChange,this.handleCancel),this.windowListeners.add(Q.ContextMenu,en),this.documentListeners.add(Q.Keydown,this.handleKeydown),n){if(r!=null&&r({event:this.props.event,activeNode:this.props.activeNode,options:this.props.options}))return this.handleStart();if(nn(n)){this.timeoutId=setTimeout(this.handleStart,n.delay),this.handlePending(n);return}if(tn(n)){this.handlePending(n);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handlePending(t,n){const{active:r,onPending:o}=this.props;o(r,t,this.initialCoordinates,n)}handleStart(){const{initialCoordinates:t}=this,{onStart:n}=this.props;t&&(this.activated=!0,this.documentListeners.add(Q.Click,ms,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(Q.SelectionChange,this.removeTextSelection),n(t))}handleMove(t){var n;const{activated:r,initialCoordinates:o,props:i}=this,{onMove:a,options:{activationConstraint:c}}=i;if(!o)return;const d=(n=Nt(t))!=null?n:te,u=ct(o,d);if(!r&&c){if(tn(c)){if(c.tolerance!=null&&Rt(u,c.tolerance))return this.handleCancel();if(Rt(u,c.distance))return this.handleStart()}if(nn(c)&&Rt(u,c.tolerance))return this.handleCancel();this.handlePending(c,u);return}t.cancelable&&t.preventDefault(),a(d)}handleEnd(){const{onAbort:t,onEnd:n}=this.props;this.detach(),this.activated||t(this.props.active),n()}handleCancel(){const{onAbort:t,onCancel:n}=this.props;this.detach(),this.activated||t(this.props.active),n()}handleKeydown(t){t.code===N.Esc&&this.handleCancel()}removeTextSelection(){var t;(t=this.document.getSelection())==null||t.removeAllRanges()}}const xs={cancel:{name:"pointercancel"},move:{name:"pointermove"},end:{name:"pointerup"}};class En extends Ft{constructor(t){const{event:n}=t,r=Pe(n.target);super(t,xs,r)}}En.activators=[{eventName:"onPointerDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return!n.isPrimary||n.button!==0?!1:(r?.({event:n}),!0)}}];const bs={move:{name:"mousemove"},end:{name:"mouseup"}};var Tt;(function(e){e[e.RightClick=2]="RightClick"})(Tt||(Tt={}));class ys extends Ft{constructor(t){super(t,bs,Pe(t.event.target))}}ys.activators=[{eventName:"onMouseDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return n.button===Tt.RightClick?!1:(r?.({event:n}),!0)}}];const Dt={cancel:{name:"touchcancel"},move:{name:"touchmove"},end:{name:"touchend"}};class ws extends Ft{constructor(t){super(t,Dt)}static setup(){return window.addEventListener(Dt.move.name,t,{capture:!1,passive:!1}),function(){window.removeEventListener(Dt.move.name,t)};function t(){}}}ws.activators=[{eventName:"onTouchStart",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;const{touches:o}=n;return o.length>1?!1:(r?.({event:n}),!0)}}];var Ke;(function(e){e[e.Pointer=0]="Pointer",e[e.DraggableRect=1]="DraggableRect"})(Ke||(Ke={}));var ut;(function(e){e[e.TreeOrder=0]="TreeOrder",e[e.ReversedTreeOrder=1]="ReversedTreeOrder"})(ut||(ut={}));function js(e){let{acceleration:t,activator:n=Ke.Pointer,canScroll:r,draggingRect:o,enabled:i,interval:a=5,order:c=ut.TreeOrder,pointerCoordinates:d,scrollableAncestors:u,scrollableAncestorRects:h,delta:f,threshold:v}=e;const g=Cs({delta:f,disabled:!i}),[p,m]=Pr(),x=l.useRef({x:0,y:0}),C=l.useRef({x:0,y:0}),R=l.useMemo(()=>{switch(n){case Ke.Pointer:return d?{top:d.y,bottom:d.y,left:d.x,right:d.x}:null;case Ke.DraggableRect:return o}},[n,o,d]),S=l.useRef(null),D=l.useCallback(()=>{const y=S.current;if(!y)return;const j=x.current.x*C.current.x,b=x.current.y*C.current.y;y.scrollBy(j,b)},[]),k=l.useMemo(()=>c===ut.TreeOrder?[...u].reverse():u,[c,u]);l.useEffect(()=>{if(!i||!u.length||!R){m();return}for(const y of k){if(r?.(y)===!1)continue;const j=u.indexOf(y),b=h[j];if(!b)continue;const{direction:M,speed:O}=cs(y,b,R,t,v);for(const E of["x","y"])g[E][M[E]]||(O[E]=0,M[E]=0);if(O.x>0||O.y>0){m(),S.current=y,p(D,a),x.current=O,C.current=M;return}}x.current={x:0,y:0},C.current={x:0,y:0},m()},[t,D,r,m,i,a,JSON.stringify(R),JSON.stringify(g),p,u,k,h,JSON.stringify(v)])}const Ss={x:{[$.Backward]:!1,[$.Forward]:!1},y:{[$.Backward]:!1,[$.Forward]:!1}};function Cs(e){let{delta:t,disabled:n}=e;const r=kt(t);return Qe(o=>{if(n||!r||!o)return Ss;const i={x:Math.sign(t.x-r.x),y:Math.sign(t.y-r.y)};return{x:{[$.Backward]:o.x[$.Backward]||i.x===-1,[$.Forward]:o.x[$.Forward]||i.x===1},y:{[$.Backward]:o.y[$.Backward]||i.y===-1,[$.Forward]:o.y[$.Forward]||i.y===1}}},[n,t,r])}function Rs(e,t){const n=t!=null?e.get(t):void 0,r=n?n.node.current:null;return Qe(o=>{var i;return t==null?null:(i=r??o)!=null?i:null},[r,t])}function Ds(e,t){return l.useMemo(()=>e.reduce((n,r)=>{const{sensor:o}=r,i=o.activators.map(a=>({eventName:a.eventName,handler:t(a.handler,r)}));return[...n,...i]},[]),[e,t])}var qe;(function(e){e[e.Always=0]="Always",e[e.BeforeDragging=1]="BeforeDragging",e[e.WhileDragging=2]="WhileDragging"})(qe||(qe={}));var Mt;(function(e){e.Optimized="optimized"})(Mt||(Mt={}));const rn=new Map;function ks(e,t){let{dragging:n,dependencies:r,config:o}=t;const[i,a]=l.useState(null),{frequency:c,measure:d,strategy:u}=o,h=l.useRef(e),f=x(),v=Ye(f),g=l.useCallback(function(C){C===void 0&&(C=[]),!v.current&&a(R=>R===null?C:R.concat(C.filter(S=>!R.includes(S))))},[v]),p=l.useRef(null),m=Qe(C=>{if(f&&!n)return rn;if(!C||C===rn||h.current!==e||i!=null){const R=new Map;for(let S of e){if(!S)continue;if(i&&i.length>0&&!i.includes(S.id)&&S.rect.current){R.set(S.id,S.rect.current);continue}const D=S.node.current,k=D?new $t(d(D),D):null;S.rect.current=k,k&&R.set(S.id,k)}return R}return C},[e,i,n,f,d]);return l.useEffect(()=>{h.current=e},[e]),l.useEffect(()=>{f||g()},[n,f]),l.useEffect(()=>{i&&i.length>0&&a(null)},[JSON.stringify(i)]),l.useEffect(()=>{f||typeof c!="number"||p.current!==null||(p.current=setTimeout(()=>{g(),p.current=null},c))},[c,f,g,...r]),{droppableRects:m,measureDroppableContainers:g,measuringScheduled:i!=null};function x(){switch(u){case qe.Always:return!1;case qe.BeforeDragging:return n;default:return!n}}}function Tn(e,t){return Qe(n=>e?n||(typeof t=="function"?t(e):e):null,[t,e])}function Ns(e,t){return Tn(e,t)}function Es(e){let{callback:t,disabled:n}=e;const r=Lt(t),o=l.useMemo(()=>{if(n||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:i}=window;return new i(r)},[r,n]);return l.useEffect(()=>()=>o?.disconnect(),[o]),o}function ht(e){let{callback:t,disabled:n}=e;const r=Lt(t),o=l.useMemo(()=>{if(n||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:i}=window;return new i(r)},[n]);return l.useEffect(()=>()=>o?.disconnect(),[o]),o}function Ts(e){return new $t($e(e),e)}function sn(e,t,n){t===void 0&&(t=Ts);const[r,o]=l.useState(null);function i(){o(d=>{if(!e)return null;if(e.isConnected===!1){var u;return(u=d??n)!=null?u:null}const h=t(e);return JSON.stringify(d)===JSON.stringify(h)?d:h})}const a=Es({callback(d){if(e)for(const u of d){const{type:h,target:f}=u;if(h==="childList"&&f instanceof HTMLElement&&f.contains(e)){i();break}}}}),c=ht({callback:i});return ie(()=>{i(),e?(c?.observe(e),a?.observe(document.body,{childList:!0,subtree:!0})):(c?.disconnect(),a?.disconnect())},[e]),r}function Ms(e){const t=Tn(e);return yn(e,t)}const on=[];function Os(e){const t=l.useRef(e),n=Qe(r=>e?r&&r!==on&&e&&t.current&&e.parentNode===t.current.parentNode?r:Pt(e):on,[e]);return l.useEffect(()=>{t.current=e},[e]),n}function As(e){const[t,n]=l.useState(null),r=l.useRef(e),o=l.useCallback(i=>{const a=Ct(i.target);a&&n(c=>c?(c.set(a,Et(a)),new Map(c)):null)},[]);return l.useEffect(()=>{const i=r.current;if(e!==i){a(i);const c=e.map(d=>{const u=Ct(d);return u?(u.addEventListener("scroll",o,{passive:!0}),[u,Et(u)]):null}).filter(d=>d!=null);n(c.length?new Map(c):null),r.current=e}return()=>{a(e),a(i)};function a(c){c.forEach(d=>{const u=Ct(d);u?.removeEventListener("scroll",o)})}},[o,e]),l.useMemo(()=>e.length?t?Array.from(t.values()).reduce((i,a)=>Oe(i,a),te):Dn(e):te,[e,t])}function an(e,t){t===void 0&&(t=[]);const n=l.useRef(null);return l.useEffect(()=>{n.current=null},t),l.useEffect(()=>{const r=e!==te;r&&!n.current&&(n.current=e),!r&&n.current&&(n.current=null)},[e]),n.current?ct(e,n.current):te}function Ls(e){l.useEffect(()=>{if(!ft)return;const t=e.map(n=>{let{sensor:r}=n;return r.setup==null?void 0:r.setup()});return()=>{for(const n of t)n?.()}},e.map(t=>{let{sensor:n}=t;return n}))}function Is(e,t){return l.useMemo(()=>e.reduce((n,r)=>{let{eventName:o,handler:i}=r;return n[o]=a=>{i(a,t)},n},{}),[e,t])}function Mn(e){return l.useMemo(()=>e?os(e):null,[e])}const ln=[];function Ps(e,t){t===void 0&&(t=$e);const[n]=e,r=Mn(n?U(n):null),[o,i]=l.useState(ln);function a(){i(()=>e.length?e.map(d=>Cn(d)?r:new $t(t(d),d)):ln)}const c=ht({callback:a});return ie(()=>{c?.disconnect(),a(),e.forEach(d=>c?.observe(d))},[e]),o}function $s(e){if(!e)return null;if(e.children.length>1)return e;const t=e.children[0];return Je(t)?t:e}function Fs(e){let{measure:t}=e;const[n,r]=l.useState(null),o=l.useCallback(u=>{for(const{target:h}of u)if(Je(h)){r(f=>{const v=t(h);return f?{...f,width:v.width,height:v.height}:v});break}},[t]),i=ht({callback:o}),a=l.useCallback(u=>{const h=$s(u);i?.disconnect(),h&&i?.observe(h),r(h?t(h):null)},[t,i]),[c,d]=lt(a);return l.useMemo(()=>({nodeRef:c,rect:n,setRef:d}),[n,c,d])}const zs=[{sensor:En,options:{}},{sensor:Nn,options:{}}],Bs={current:{}},at={draggable:{measure:Zt},droppable:{measure:Zt,strategy:qe.WhileDragging,frequency:Mt.Optimized},dragOverlay:{measure:$e}};class Ue extends Map{get(t){var n;return t!=null&&(n=super.get(t))!=null?n:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(t=>{let{disabled:n}=t;return!n})}getNodeFor(t){var n,r;return(n=(r=this.get(t))==null?void 0:r.node.current)!=null?n:void 0}}const Ws={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new Ue,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:dt},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:at,measureDroppableContainers:dt,windowRect:null,measuringScheduled:!1},Hs={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:dt,draggableNodes:new Map,over:null,measureDroppableContainers:dt},gt=l.createContext(Hs),On=l.createContext(Ws);function _s(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new Ue}}}function Xs(e,t){switch(t.type){case I.DragStart:return{...e,draggable:{...e.draggable,initialCoordinates:t.initialCoordinates,active:t.active}};case I.DragMove:return e.draggable.active==null?e:{...e,draggable:{...e.draggable,translate:{x:t.coordinates.x-e.draggable.initialCoordinates.x,y:t.coordinates.y-e.draggable.initialCoordinates.y}}};case I.DragEnd:case I.DragCancel:return{...e,draggable:{...e.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case I.RegisterDroppable:{const{element:n}=t,{id:r}=n,o=new Ue(e.droppable.containers);return o.set(r,n),{...e,droppable:{...e.droppable,containers:o}}}case I.SetDroppableDisabled:{const{id:n,key:r,disabled:o}=t,i=e.droppable.containers.get(n);if(!i||r!==i.key)return e;const a=new Ue(e.droppable.containers);return a.set(n,{...i,disabled:o}),{...e,droppable:{...e.droppable,containers:a}}}case I.UnregisterDroppable:{const{id:n,key:r}=t,o=e.droppable.containers.get(n);if(!o||r!==o.key)return e;const i=new Ue(e.droppable.containers);return i.delete(n),{...e,droppable:{...e.droppable,containers:i}}}default:return e}}function Ks(e){let{disabled:t}=e;const{active:n,activatorEvent:r,draggableNodes:o}=l.useContext(gt),i=kt(r),a=kt(n?.id);return l.useEffect(()=>{if(!t&&!r&&i&&a!=null){if(!It(i)||document.activeElement===i.target)return;const c=o.get(a);if(!c)return;const{activatorNode:d,node:u}=c;if(!d.current&&!u.current)return;requestAnimationFrame(()=>{for(const h of[d.current,u.current]){if(!h)continue;const f=zr(h);if(f){f.focus();break}}})}},[r,t,o,a,i]),null}function Us(e,t){let{transform:n,...r}=t;return e!=null&&e.length?e.reduce((o,i)=>i({transform:o,...r}),n):n}function Gs(e){return l.useMemo(()=>({draggable:{...at.draggable,...e?.draggable},droppable:{...at.droppable,...e?.droppable},dragOverlay:{...at.dragOverlay,...e?.dragOverlay}}),[e?.draggable,e?.droppable,e?.dragOverlay])}function Ys(e){let{activeNode:t,measure:n,initialRect:r,config:o=!0}=e;const i=l.useRef(!1),{x:a,y:c}=typeof o=="boolean"?{x:o,y:o}:o;ie(()=>{if(!a&&!c||!t){i.current=!1;return}if(i.current||!r)return;const u=t?.node.current;if(!u||u.isConnected===!1)return;const h=n(u),f=yn(h,r);if(a||(f.x=0),c||(f.y=0),i.current=!0,Math.abs(f.x)>0||Math.abs(f.y)>0){const v=wn(u);v&&v.scrollBy({top:f.y,left:f.x})}},[t,a,c,r,n])}const An=l.createContext({...te,scaleX:1,scaleY:1});var be;(function(e){e[e.Uninitialized=0]="Uninitialized",e[e.Initializing=1]="Initializing",e[e.Initialized=2]="Initialized"})(be||(be={}));const Vs=l.memo(function(t){var n,r,o,i;let{id:a,accessibility:c,autoScroll:d=!0,children:u,sensors:h=zs,collisionDetection:f=Qr,measuring:v,modifiers:g,...p}=t;const m=l.useReducer(Xs,void 0,_s),[x,C]=m,[R,S]=Kr(),[D,k]=l.useState(be.Uninitialized),y=D===be.Initialized,{draggable:{active:j,nodes:b,translate:M},droppable:{containers:O}}=x,E=j!=null?b.get(j):null,_=l.useRef({initial:null,translated:null}),G=l.useMemo(()=>{var W;return j!=null?{id:j,data:(W=E?.data)!=null?W:Bs,rect:_}:null},[j,E]),z=l.useRef(null),[fe,ae]=l.useState(null),[P,je]=l.useState(null),X=Ye(p,Object.values(p)),ne=Ze("DndDescribedBy",a),Z=l.useMemo(()=>O.getEnabled(),[O]),B=Gs(v),{droppableRects:w,measureDroppableContainers:L,measuringScheduled:A}=ks(Z,{dragging:y,dependencies:[M.x,M.y],config:B.droppable}),H=Rs(b,j),et=l.useMemo(()=>P?Nt(P):null,[P]),he=Gn(),le=Ns(H,B.draggable.measure);Ys({activeNode:j!=null?b.get(j):null,config:he.layoutShiftCompensation,initialRect:le,measure:B.draggable.measure});const T=sn(H,B.draggable.measure,le),Fe=sn(H?H.parentElement:null),re=l.useRef({activatorEvent:null,active:null,activeNode:H,collisionRect:null,collisions:null,droppableRects:w,draggableNodes:b,draggingNode:null,draggingNodeRect:null,droppableContainers:O,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),De=O.getNodeFor((n=re.current.over)==null?void 0:n.id),ce=Fs({measure:B.dragOverlay.measure}),ke=(r=ce.nodeRef.current)!=null?r:H,Ne=y?(o=ce.rect)!=null?o:T:null,zt=!!(ce.nodeRef.current&&ce.rect),Bt=Ms(zt?null:T),pt=Mn(ke?U(ke):null),ge=Os(y?De??H:null),tt=Ps(ge),nt=Us(g,{transform:{x:M.x-Bt.x,y:M.y-Bt.y,scaleX:1,scaleY:1},activatorEvent:P,active:G,activeNodeRect:T,containerNodeRect:Fe,draggingNodeRect:Ne,over:re.current.over,overlayNodeRect:ce.rect,scrollableAncestors:ge,scrollableAncestorRects:tt,windowRect:pt}),Wt=et?Oe(et,M):null,Ht=As(ge),Bn=an(Ht),Wn=an(Ht,[T]),Ee=Oe(nt,Bn),Te=Ne?ts(Ne,nt):null,ze=G&&Te?f({active:G,collisionRect:Te,droppableRects:w,droppableContainers:Z,pointerCoordinates:Wt}):null,_t=qr(ze,"id"),[pe,Xt]=l.useState(null),Hn=zt?nt:Oe(nt,Wn),_n=Zr(Hn,(i=pe?.rect)!=null?i:null,T),mt=l.useRef(null),Kt=l.useCallback((W,Y)=>{let{sensor:V,options:me}=Y;if(z.current==null)return;const J=b.get(z.current);if(!J)return;const q=W.nativeEvent,se=new V({active:z.current,activeNode:J,event:q,options:me,context:re,onAbort(F){if(!b.get(F))return;const{onDragAbort:oe}=X.current,de={id:F};oe?.(de),R({type:"onDragAbort",event:de})},onPending(F,ve,oe,de){if(!b.get(F))return;const{onDragPending:We}=X.current,xe={id:F,constraint:ve,initialCoordinates:oe,offset:de};We?.(xe),R({type:"onDragPending",event:xe})},onStart(F){const ve=z.current;if(ve==null)return;const oe=b.get(ve);if(!oe)return;const{onDragStart:de}=X.current,Be={activatorEvent:q,active:{id:ve,data:oe.data,rect:_}};_e.unstable_batchedUpdates(()=>{de?.(Be),k(be.Initializing),C({type:I.DragStart,initialCoordinates:F,active:ve}),R({type:"onDragStart",event:Be}),ae(mt.current),je(q)})},onMove(F){C({type:I.DragMove,coordinates:F})},onEnd:Me(I.DragEnd),onCancel:Me(I.DragCancel)});mt.current=se;function Me(F){return async function(){const{active:oe,collisions:de,over:Be,scrollAdjustedTranslate:We}=re.current;let xe=null;if(oe&&We){const{cancelDrop:He}=X.current;xe={activatorEvent:q,active:oe,collisions:de,delta:We,over:Be},F===I.DragEnd&&typeof He=="function"&&await Promise.resolve(He(xe))&&(F=I.DragCancel)}z.current=null,_e.unstable_batchedUpdates(()=>{C({type:F}),k(be.Uninitialized),Xt(null),ae(null),je(null),mt.current=null;const He=F===I.DragEnd?"onDragEnd":"onDragCancel";if(xe){const vt=X.current[He];vt?.(xe),R({type:He,event:xe})}})}}},[b]),Xn=l.useCallback((W,Y)=>(V,me)=>{const J=V.nativeEvent,q=b.get(me);if(z.current!==null||!q||J.dndKit||J.defaultPrevented)return;const se={active:q};W(V,Y.options,se)===!0&&(J.dndKit={capturedBy:Y.sensor},z.current=me,Kt(V,Y))},[b,Kt]),Ut=Ds(h,Xn);Ls(h),ie(()=>{T&&D===be.Initializing&&k(be.Initialized)},[T,D]),l.useEffect(()=>{const{onDragMove:W}=X.current,{active:Y,activatorEvent:V,collisions:me,over:J}=re.current;if(!Y||!V)return;const q={active:Y,activatorEvent:V,collisions:me,delta:{x:Ee.x,y:Ee.y},over:J};_e.unstable_batchedUpdates(()=>{W?.(q),R({type:"onDragMove",event:q})})},[Ee.x,Ee.y]),l.useEffect(()=>{const{active:W,activatorEvent:Y,collisions:V,droppableContainers:me,scrollAdjustedTranslate:J}=re.current;if(!W||z.current==null||!Y||!J)return;const{onDragOver:q}=X.current,se=me.get(_t),Me=se&&se.rect.current?{id:se.id,rect:se.rect.current,data:se.data,disabled:se.disabled}:null,F={active:W,activatorEvent:Y,collisions:V,delta:{x:J.x,y:J.y},over:Me};_e.unstable_batchedUpdates(()=>{Xt(Me),q?.(F),R({type:"onDragOver",event:F})})},[_t]),ie(()=>{re.current={activatorEvent:P,active:G,activeNode:H,collisionRect:Te,collisions:ze,droppableRects:w,draggableNodes:b,draggingNode:ke,draggingNodeRect:Ne,droppableContainers:O,over:pe,scrollableAncestors:ge,scrollAdjustedTranslate:Ee},_.current={initial:Ne,translated:Te}},[G,H,ze,Te,b,ke,Ne,w,O,pe,ge,Ee]),js({...he,delta:M,draggingRect:Te,pointerCoordinates:Wt,scrollableAncestors:ge,scrollableAncestorRects:tt});const Kn=l.useMemo(()=>({active:G,activeNode:H,activeNodeRect:T,activatorEvent:P,collisions:ze,containerNodeRect:Fe,dragOverlay:ce,draggableNodes:b,droppableContainers:O,droppableRects:w,over:pe,measureDroppableContainers:L,scrollableAncestors:ge,scrollableAncestorRects:tt,measuringConfiguration:B,measuringScheduled:A,windowRect:pt}),[G,H,T,P,ze,Fe,ce,b,O,w,pe,L,ge,tt,B,A,pt]),Un=l.useMemo(()=>({activatorEvent:P,activators:Ut,active:G,activeNodeRect:T,ariaDescribedById:{draggable:ne},dispatch:C,draggableNodes:b,over:pe,measureDroppableContainers:L}),[P,Ut,G,T,C,ne,b,pe,L]);return K.createElement(bn.Provider,{value:S},K.createElement(gt.Provider,{value:Un},K.createElement(On.Provider,{value:Kn},K.createElement(An.Provider,{value:_n},u)),K.createElement(Ks,{disabled:c?.restoreFocus===!1})),K.createElement(Yr,{...c,hiddenTextDescribedById:ne}));function Gn(){const W=fe?.autoScrollEnabled===!1,Y=typeof d=="object"?d.enabled===!1:d===!1,V=y&&!W&&!Y;return typeof d=="object"?{...d,enabled:V}:{enabled:V}}}),qs=l.createContext(null),cn="button",Js="Draggable";function Qs(e){let{id:t,data:n,disabled:r=!1,attributes:o}=e;const i=Ze(Js),{activators:a,activatorEvent:c,active:d,activeNodeRect:u,ariaDescribedById:h,draggableNodes:f,over:v}=l.useContext(gt),{role:g=cn,roleDescription:p="draggable",tabIndex:m=0}=o??{},x=d?.id===t,C=l.useContext(x?An:qs),[R,S]=lt(),[D,k]=lt(),y=Is(a,t),j=Ye(n);ie(()=>(f.set(t,{id:t,key:i,node:R,activatorNode:D,data:j}),()=>{const M=f.get(t);M&&M.key===i&&f.delete(t)}),[f,t]);const b=l.useMemo(()=>({role:g,tabIndex:m,"aria-disabled":r,"aria-pressed":x&&g===cn?!0:void 0,"aria-roledescription":p,"aria-describedby":h.draggable}),[r,g,m,x,p,h.draggable]);return{active:d,activatorEvent:c,activeNodeRect:u,attributes:b,isDragging:x,listeners:r?void 0:y,node:R,over:v,setNodeRef:S,setActivatorNodeRef:k,transform:C}}function Zs(){return l.useContext(On)}const eo="Droppable",to={timeout:25};function no(e){let{data:t,disabled:n=!1,id:r,resizeObserverConfig:o}=e;const i=Ze(eo),{active:a,dispatch:c,over:d,measureDroppableContainers:u}=l.useContext(gt),h=l.useRef({disabled:n}),f=l.useRef(!1),v=l.useRef(null),g=l.useRef(null),{disabled:p,updateMeasurementsFor:m,timeout:x}={...to,...o},C=Ye(m??r),R=l.useCallback(()=>{if(!f.current){f.current=!0;return}g.current!=null&&clearTimeout(g.current),g.current=setTimeout(()=>{u(Array.isArray(C.current)?C.current:[C.current]),g.current=null},x)},[x]),S=ht({callback:R,disabled:p||!a}),D=l.useCallback((b,M)=>{S&&(M&&(S.unobserve(M),f.current=!1),b&&S.observe(b))},[S]),[k,y]=lt(D),j=Ye(t);return l.useEffect(()=>{!S||!k.current||(S.disconnect(),f.current=!1,S.observe(k.current))},[k,S]),l.useEffect(()=>(c({type:I.RegisterDroppable,element:{id:r,key:i,disabled:n,node:k,rect:v,data:j}}),()=>c({type:I.UnregisterDroppable,key:i,id:r})),[r]),l.useEffect(()=>{n!==h.current.disabled&&(c({type:I.SetDroppableDisabled,id:r,key:i,disabled:n}),h.current.disabled=n)},[r,i,n,c]),{active:a,rect:v,isOver:d?.id===r,node:k,over:d,setNodeRef:y}}function Ln(e,t,n){const r=e.slice();return r.splice(n<0?r.length+n:n,0,r.splice(t,1)[0]),r}function ro(e,t){return e.reduce((n,r,o)=>{const i=t.get(r);return i&&(n[o]=i),n},Array(e.length))}function it(e){return e!==null&&e>=0}function so(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function oo(e){return typeof e=="boolean"?{draggable:e,droppable:e}:e}const In=e=>{let{rects:t,activeIndex:n,overIndex:r,index:o}=e;const i=Ln(t,r,n),a=t[o],c=i[o];return!c||!a?null:{x:c.left-a.left,y:c.top-a.top,scaleX:c.width/a.width,scaleY:c.height/a.height}},Pn="Sortable",$n=K.createContext({activeIndex:-1,containerId:Pn,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:In,disabled:{draggable:!1,droppable:!1}});function io(e){let{children:t,id:n,items:r,strategy:o=In,disabled:i=!1}=e;const{active:a,dragOverlay:c,droppableRects:d,over:u,measureDroppableContainers:h}=Zs(),f=Ze(Pn,n),v=c.rect!==null,g=l.useMemo(()=>r.map(y=>typeof y=="object"&&"id"in y?y.id:y),[r]),p=a!=null,m=a?g.indexOf(a.id):-1,x=u?g.indexOf(u.id):-1,C=l.useRef(g),R=!so(g,C.current),S=x!==-1&&m===-1||R,D=oo(i);ie(()=>{R&&p&&h(g)},[R,g,p,h]),l.useEffect(()=>{C.current=g},[g]);const k=l.useMemo(()=>({activeIndex:m,containerId:f,disabled:D,disableTransforms:S,items:g,overIndex:x,useDragOverlay:v,sortedRects:ro(g,d),strategy:o}),[m,f,D.draggable,D.droppable,S,g,x,d,v,o]);return K.createElement($n.Provider,{value:k},t)}const ao=e=>{let{id:t,items:n,activeIndex:r,overIndex:o}=e;return Ln(n,r,o).indexOf(t)},lo=e=>{let{containerId:t,isSorting:n,wasDragging:r,index:o,items:i,newIndex:a,previousItems:c,previousContainerId:d,transition:u}=e;return!u||!r||c!==i&&o===a?!1:n?!0:a!==o&&t===d},co={duration:200,easing:"ease"},Fn="transform",uo=Ve.Transition.toString({property:Fn,duration:0,easing:"linear"}),fo={roleDescription:"sortable"};function ho(e){let{disabled:t,index:n,node:r,rect:o}=e;const[i,a]=l.useState(null),c=l.useRef(n);return ie(()=>{if(!t&&n!==c.current&&r.current){const d=o.current;if(d){const u=$e(r.current,{ignoreTransform:!0}),h={x:d.left-u.left,y:d.top-u.top,scaleX:d.width/u.width,scaleY:d.height/u.height};(h.x||h.y)&&a(h)}}n!==c.current&&(c.current=n)},[t,n,r,o]),l.useEffect(()=>{i&&a(null)},[i]),i}function go(e){let{animateLayoutChanges:t=lo,attributes:n,disabled:r,data:o,getNewIndex:i=ao,id:a,strategy:c,resizeObserverConfig:d,transition:u=co}=e;const{items:h,containerId:f,activeIndex:v,disabled:g,disableTransforms:p,sortedRects:m,overIndex:x,useDragOverlay:C,strategy:R}=l.useContext($n),S=po(r,g),D=h.indexOf(a),k=l.useMemo(()=>({sortable:{containerId:f,index:D,items:h},...o}),[f,o,D,h]),y=l.useMemo(()=>h.slice(h.indexOf(a)),[h,a]),{rect:j,node:b,isOver:M,setNodeRef:O}=no({id:a,data:k,disabled:S.droppable,resizeObserverConfig:{updateMeasurementsFor:y,...d}}),{active:E,activatorEvent:_,activeNodeRect:G,attributes:z,setNodeRef:fe,listeners:ae,isDragging:P,over:je,setActivatorNodeRef:X,transform:ne}=Qs({id:a,data:k,attributes:{...fo,...n},disabled:S.draggable}),Z=Ir(O,fe),B=!!E,w=B&&!p&&it(v)&&it(x),L=!C&&P,A=L&&w?ne:null,et=w?A??(c??R)({rects:m,activeNodeRect:G,activeIndex:v,overIndex:x,index:D}):null,he=it(v)&&it(x)?i({id:a,items:h,activeIndex:v,overIndex:x}):D,le=E?.id,T=l.useRef({activeId:le,items:h,newIndex:he,containerId:f}),Fe=h!==T.current.items,re=t({active:E,containerId:f,isDragging:P,isSorting:B,id:a,index:D,items:h,newIndex:T.current.newIndex,previousItems:T.current.items,previousContainerId:T.current.containerId,transition:u,wasDragging:T.current.activeId!=null}),De=ho({disabled:!re,index:D,node:b,rect:j});return l.useEffect(()=>{B&&T.current.newIndex!==he&&(T.current.newIndex=he),f!==T.current.containerId&&(T.current.containerId=f),h!==T.current.items&&(T.current.items=h)},[B,he,f,h]),l.useEffect(()=>{if(le===T.current.activeId)return;if(le!=null&&T.current.activeId==null){T.current.activeId=le;return}const ke=setTimeout(()=>{T.current.activeId=le},50);return()=>clearTimeout(ke)},[le]),{active:E,activeIndex:v,attributes:z,data:k,rect:j,index:D,newIndex:he,items:h,isOver:M,isSorting:B,isDragging:P,listeners:ae,node:b,overIndex:x,over:je,setNodeRef:Z,setActivatorNodeRef:X,setDroppableNodeRef:O,setDraggableNodeRef:fe,transform:De??et,transition:ce()};function ce(){if(De||Fe&&T.current.newIndex===D)return uo;if(!(L&&!It(_)||!u)&&(B||re))return Ve.Transition.toString({...u,property:Fn})}}function po(e,t){var n,r;return typeof e=="boolean"?{draggable:e,droppable:!1}:{draggable:(n=e?.draggable)!=null?n:t.draggable,droppable:(r=e?.droppable)!=null?r:t.droppable}}N.Down,N.Right,N.Up,N.Left;const Ge=["trigger","vector","repo-all","data-safety","config","model","crew","cache-hits","time-saved","rag-health","legend"],zn="mega-compact-card-order";function mo(e){if(!Array.isArray(e)||e.length!==Ge.length)return!1;const t=new Set(Ge),n=new Set;for(const r of e){if(typeof r!="string"||!t.has(r)||n.has(r))return!1;n.add(r)}return!0}function vo(){try{const e=window.localStorage.getItem(zn);if(e==null)return Ge;const t=JSON.parse(e);return mo(t)?t:Ge}catch{return Ge}}function xo(){const[e,t]=l.useState(vo),n=l.useCallback((r,o)=>{t(i=>{const a=i.indexOf(r),c=i.indexOf(o);if(a===-1||c===-1||a===c)return i;const d=[...i];d.splice(a,1),d.splice(c,0,r);try{window.localStorage.setItem(zn,JSON.stringify(d))}catch{}return d})},[]);return{order:e,moveCard:n}}function ee({id:e,children:t,onClick:n}){const{attributes:r,listeners:o,setNodeRef:i,transform:a,transition:c,isDragging:d}=go({id:e}),u={transform:Ve.Transform.toString(a),transition:c,opacity:d?.5:1,zIndex:d?10:void 0},h=f=>{n&&(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),n())};return s.jsxs("div",{ref:i,style:u,className:"relative",children:[s.jsx("button",{type:"button","aria-label":`Reorder ${e} card`,className:"absolute right-2 top-2 z-10 cursor-grab rounded p-1 text-muted-foreground/50 hover:bg-foreground/5 hover:text-muted-foreground active:cursor-grabbing",...r,...o,children:s.jsx(ir,{size:16})}),n?s.jsx("div",{role:"button",tabIndex:0,onClick:n,onKeyDown:h,className:"cursor-pointer rounded-lg outline-none transition-all duration-200 hover:ring-1 hover:ring-primary/60 focus-visible:ring-1 focus-visible:ring-primary/60",children:t}):s.jsx("div",{children:t})]})}function bo(e){return e.type==="session_sample"}function yo(e){switch(e){case"cache":return"cache_hit_pct";case"vector":return"turn_latency_ms";case"time":return"disk_write_ms";default:return null}}function wo(e){if(!e)return"never";try{return new Date(e).toLocaleString()}catch{return e}}function Eo({snapshot:e,loading:t,error:n}){const{data:r,error:o,loading:i,refetch:a}=un(l.useCallback(()=>Vn(),[]),{pollInterval:2e3}),{events:c}=Zn(),d=l.useMemo(()=>c.filter(bo),[c]),u=l.useMemo(()=>d.length===0?null:d[d.length-1].ts,[d]);l.useEffect(()=>{u!=null&&a()},[u,a]);const[h,f]=l.useState(null),[v,g]=l.useState([]),[p,m]=l.useState(!1),[x,C]=l.useState(null);l.useEffect(()=>{g([]),C(null);const w=h?yo(h):null;if(w===null){m(!1);return}let L=!1;return m(!0),qn(w,60).then(A=>{L||g(A.samples.map(H=>({ts:H.ts,value:H.value})))}).catch(A=>{L||C(A instanceof Error?A:new Error(String(A)))}).finally(()=>{L||m(!1)}),()=>{L=!0}},[h]);const{order:R,moveCard:S}=xo(),D=l.useCallback(w=>{const{active:L,over:A}=w;A&&L.id!==A.id&&S(L.id,A.id)},[S]),k=l.useMemo(()=>{const w=e,L=w?.compression,A=w?.model;return[{label:"Tokens freed",value:L?.repo.tokensFreed??0},{label:"Input rate",value:A?A.inputRate:0},{label:"Output rate",value:A?A.outputRate:0}]},[e]);if(t&&!e)return s.jsx("div",{className:"tab-stub",children:"Loading snapshot…"});if(n&&!e)return s.jsxs("div",{className:"tab-stub",children:[s.jsxs("p",{children:["Error loading snapshot: ",n.message]}),s.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"Auto-retried with backoff and will re-poll every 5s — no action needed."})]});if(!e)return s.jsx("div",{className:"tab-stub",children:"No snapshot data."});const y=e,{context:j,compression:b,trigger:M,session:O,store:E,tier:_,updatedAt:G}=y,z=y.config,fe=y.crew,ae=y.integrity,P=y.cacheHits,je=y.compacts,X=y.timeSaved,ne=y.repo,Z=y.model,B=w=>{switch(w){case"trigger":return s.jsx(ee,{id:w,onClick:()=>f("cache"),children:s.jsx(xr,{armed:M.armed,ready:M.ready,currentTokens:M.currentTokens,thresholdTokens:M.thresholdTokens,fastGatePct:M.fastGatePct})});case"vector":return s.jsx(ee,{id:w,onClick:()=>f("vector"),children:s.jsx(yr,{checkpointCount:E.checkpointCount,tokensIn:b.session.tokensIn,tokensOut:b.session.tokensOut,tokensFreed:b.session.tokensFreed,injectedCount:E.injectedCount,dedupHitRate:E.dedupHitRate,storageDedupRate:E.storageDedupRate,dedupCollapsed:E.dedupCollapsed,lastCheckpointId:O.lastCheckpointId,compressionPct:b.session.compressionPct,dedupPct:b.session.dedupPct})});case"repo-all":return s.jsx(ee,{id:w,children:s.jsx(jr,{checkpointCount:ne.checkpointCount,tokensIn:b.repo.tokensIn,tokensOut:b.repo.tokensOut,tokensFreed:b.repo.tokensFreed,sessionCount:ne.sessionCount,dedupCollapsed:ne.dedupCollapsed,storageDedupRate:ne.storageDedupRate,compressionPct:b.repo.compressionPct,dedupPct:b.repo.dedupPct})});case"data-safety":return s.jsx(ee,{id:w,children:s.jsx(Sr,{regionsRetained:ae.regionsRetained,compressedOriginalBytes:ae.compressedOriginalBytes,duplicatesCollapsed:ae.duplicatesCollapsed,bytesPermanentlyDeleted:ae.bytesPermanentlyDeleted})});case"config":return s.jsx(ee,{id:w,children:s.jsx(Cr,{tier:_,presetTier:y.presetTier,pressure:y.pressure,thresholdTokens:z.thresholdTokens,tierPct:z.tierPct,contextWindow:j.contextWindow,fastGatePct:z.fastGatePct,auto:z.auto,anchorUserMessages:z.anchorUserMessages})});case"model":return Z?s.jsx(ee,{id:w,onClick:()=>f("model"),children:s.jsx(Rr,{name:Z.name,provider:Z.providerName||Z.provider,inputRate:Z.inputRate,outputRate:Z.outputRate,repoTokensFreed:b.repo.tokensFreed,contextWindow:j.contextWindow})}):null;case"crew":return s.jsx(ee,{id:w,children:s.jsx(Dr,{activeAgents:fe.activeAgents,currentTurn:fe.currentTurn})});case"cache-hits":return s.jsx(ee,{id:w,onClick:()=>f("cache"),children:s.jsx(tr,{cacheHitsSession:P.session,cacheHitsTotal:P.total,tokensSavedSession:P.sessionTokensSaved,tokensSavedTotal:P.totalTokensSaved,compactionsSession:je.session,compactionsTotal:je.total})});case"time-saved":return s.jsx(ee,{id:w,onClick:()=>f("time"),children:s.jsx(er,{compactSessionSec:X.compact.sessionSec,compactTotalSec:X.compact.totalSec,cacheHitSessionSec:X.cacheHit.sessionSec,cacheHitTotalSec:X.cacheHit.totalSec})});case"rag-health":return Qn()?s.jsx(ee,{id:w,children:s.jsx(Er,{})}):null;case"legend":return s.jsx(ee,{id:w,children:s.jsx(Nr,{})})}};return s.jsxs("div",{className:"flex flex-col gap-4",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx(Jn,{variant:"accent",children:_}),s.jsxs("span",{className:"text-xs text-muted-foreground",children:["updated ",wo(G)]})]}),s.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2",children:[s.jsx(vr,{sessions:r,loading:i,error:o,launcherSessionId:O.id,launcher:{tokens:j.tokens,percent:j.percent,contextWindow:j.contextWindow}}),s.jsx(fr,{sessions:r,loading:i,error:o})]}),s.jsx(Vs,{onDragEnd:D,children:s.jsx(io,{items:R,children:s.jsx("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3",children:R.map(w=>({cardId:w,node:B(w)})).filter(({node:w})=>w!=null).map(({cardId:w,node:L})=>s.jsx("div",{children:L},w))})})}),s.jsx(ot,{title:"Cache Hits Trend",open:h==="cache",onClose:()=>f(null),children:p?s.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:"Loading…"}):x?s.jsx("p",{className:"py-8 text-center text-sm text-red-400",children:x.message}):s.jsx(wt,{data:v,label:"Cache hit %",color:"#58a6ff"})}),s.jsx(ot,{title:"Turn Latency",open:h==="vector",onClose:()=>f(null),children:p?s.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:"Loading…"}):x?s.jsx("p",{className:"py-8 text-center text-sm text-red-400",children:x.message}):s.jsx(wt,{data:v,label:"Turn latency (ms)",color:"#58a6ff"})}),s.jsx(ot,{title:"Disk Write Time",open:h==="time",onClose:()=>f(null),children:p?s.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:"Loading…"}):x?s.jsx("p",{className:"py-8 text-center text-sm text-red-400",children:x.message}):s.jsx(wt,{data:v,label:"Disk write (ms)",color:"#58a6ff"})}),s.jsx(ot,{title:"Model & Cost",open:h==="model",onClose:()=>f(null),children:s.jsx(Lr,{data:k,color:"#3fb950",valueFormatter:w=>w.toLocaleString()})})]})}export{Eo as default};
|
|
16
|
-
//# sourceMappingURL=OverviewTab-
|
|
16
|
+
//# sourceMappingURL=OverviewTab-Cl2Zx7r1.js.map
|