pi-mega-compact 0.8.19 → 0.8.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/extensions/dashboard-client/src/hooks/useApi.js +51 -0
- package/dist/extensions/dashboard-client/src/hooks/useSSE.js +63 -0
- package/dist/extensions/mega-compact-s38.test.js +28 -2
- package/dist/extensions/mega-events/agent-handlers.js +16 -0
- package/dist/extensions/mega-events/error-classifier.js +8 -3
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-DVgFowc-.js → AchievementTiles-QPo46Pwg.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-DVgFowc-.js.map → AchievementTiles-QPo46Pwg.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{AchievementsTab-Bg86TWPU.js → AchievementsTab-BDJxRXRY.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AchievementsTab-Bg86TWPU.js.map → AchievementsTab-BDJxRXRY.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-DBzoH_q_.js → CacheTab-CUMqXQjd.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-DBzoH_q_.js.map → CacheTab-CUMqXQjd.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ConfigTab-Bj12LgTh.js → ConfigTab-j1dRzurG.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ConfigTab-Bj12LgTh.js.map → ConfigTab-j1dRzurG.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-EC0wMsp_.js → EventsTab-CMglXK4p.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-EC0wMsp_.js.map → EventsTab-CMglXK4p.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{GameTab-CISQitbu.js → GameTab-fpaDoyxi.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{GameTab-CISQitbu.js.map → GameTab-fpaDoyxi.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-us4vVG5D.js → MetricsTab-CWG2crG_.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-us4vVG5D.js.map → MetricsTab-CWG2crG_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/OverviewTab-BaV2D2nf.js +2 -0
- package/extensions/dashboard-client/dist/assets/OverviewTab-BaV2D2nf.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{ReposTab-CiU9AJkb.js → ReposTab-C-0kuZ_0.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-CiU9AJkb.js.map → ReposTab-C-0kuZ_0.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DaCUvTC7.js → SessionsTab-CSYhddCA.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DaCUvTC7.js.map → SessionsTab-CSYhddCA.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BAUSCzq5.js → TimeSavedCard-Dy4KRjSM.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BAUSCzq5.js.map → TimeSavedCard-Dy4KRjSM.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-5MPZyayK.js → index-D_WtU2TV.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-5MPZyayK.js.map → index-D_WtU2TV.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-CDkmYP9l.css → index-og3ghxyY.css} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-BSpmWZZi.js → useSSE-C9yVJlGP.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-BSpmWZZi.js.map → useSSE-C9yVJlGP.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +2 -2
- package/extensions/dashboard-client/package-lock.json +1 -1
- package/extensions/dashboard-client/package.json +1 -1
- package/extensions/dashboard-client/src/components/SessionContextGauges.tsx +181 -0
- package/extensions/dashboard-client/src/main.tsx +1 -0
- package/extensions/dashboard-client/src/styles/session-gauges.css +85 -0
- package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +13 -11
- package/extensions/mega-compact-s38.test.ts +32 -2
- package/extensions/mega-events/agent-handlers.ts +15 -0
- package/extensions/mega-events/error-classifier.ts +8 -2
- package/package.json +1 -1
- package/dist/extensions/dashboard-server/helpers.js +0 -37
- package/dist/extensions/dashboard-server/html/all-repos-tab.js +0 -26
- package/dist/extensions/dashboard-server/html/body-open.js +0 -23
- package/dist/extensions/dashboard-server/html/current-repo-tab.js +0 -130
- package/dist/extensions/dashboard-server/html/head-open.js +0 -16
- package/dist/extensions/dashboard-server/html/high-score-tab.js +0 -25
- package/dist/extensions/dashboard-server/html/repo-detail-modal.js +0 -26
- package/dist/extensions/dashboard-server/html/script.js +0 -259
- package/dist/extensions/dashboard-server/html/styles.js +0 -103
- package/dist/extensions/dashboard-server/html/summary-tab.js +0 -19
- package/dist/extensions/dashboard-server/html-template.js +0 -41
- package/dist/src/store/sqlite/connection.js +0 -35
- package/dist/src/store/sqlite/index-store.js +0 -167
- package/dist/src/store/sqlite/memory.js +0 -54
- package/dist/src/store/sqlite/minhash-lsh.js +0 -47
- package/dist/src/store/sqlite/sessions.js +0 -39
- package/dist/src/store/sqlite/transaction.js +0 -19
- package/dist/src/vectorStore/add.js +0 -260
- package/dist/src/vectorStore/dedup.js +0 -52
- package/dist/src/vectorStore/index.js +0 -10
- package/dist/src/vectorStore/queries.js +0 -83
- package/dist/src/vectorStore/search.js +0 -95
- package/dist/src/vectorStore/session.js +0 -19
- package/dist/src/vectorStore/store.js +0 -105
- package/dist/src/vectorStore/types.js +0 -6
- package/dist/src/vectorStore/utils.js +0 -23
- package/extensions/dashboard-client/dist/assets/OverviewTab-eJ7vFgBE.js +0 -2
- package/extensions/dashboard-client/dist/assets/OverviewTab-eJ7vFgBE.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,u as W,r as C,f as M}from"./index-5MPZyayK.js";import{u as A}from"./useSSE-BSpmWZZi.js";import{f as j,a as F,C as I,T as _}from"./TimeSavedCard-BAUSCzq5.js";function G(s){return s>=90?"gauge-red":s>=70?"gauge-yellow":"gauge-green"}function B({tokens:s,percent:t,contextWindow:a}){const n=t??0,l=Math.max(n,1),o=G(n),u=`${s!=null?s.toLocaleString():"?"} / ${a.toLocaleString()} tokens`;return e.jsxs("div",{className:"card context-gauge",children:[e.jsxs("h3",{children:["Context Window — ",n,"%"]}),e.jsx("div",{className:`gauge-bar ${o}`,role:"meter","aria-valuenow":n,"aria-valuemin":0,"aria-valuemax":100,children:e.jsx("div",{className:"gauge-fill",style:{width:`${l}%`}})}),e.jsx("p",{className:"gauge-label",children:u})]})}const R=["#58a6ff","#3fb950","#d29922","#f85149","#bc8cff","#ff7b72","#79c0ff","#56d4dd","#e3b341","#a5d6ff","#7ee787","#ffa657"];function U(s){let t=5381;for(let a=0;a<s.length;a++)t=(t<<5)+t+s.charCodeAt(a)>>>0;return t}function K(s){return s?R[U(s)%R.length]:R[0]}function z(s){if(!s)return"(unknown)";const t=s.replace(/[\\/]+$/,"");if(!t)return"(unknown)";const a=t.split(/[\\/]/);return a[a.length-1]||t}function V(s){const t=new Map;for(const o of s){const i=o.repoRoot??"__null__",u=o.tokens??0,m=t.get(i);if(m)m.tokens+=u;else{const r=z(o.repoRoot);t.set(i,{repoRoot:o.repoRoot,basename:r,tokens:u,color:K(r)})}}const a=[...t.values()],n=a.reduce((o,i)=>o+i.tokens,0),l=s.reduce((o,i)=>Math.max(o,i.ctxWindow),0);return{repos:a,totalTokens:n,maxWindow:l,sessionCount:s.length}}function P(s){return s>=1e5?`${(s/1e3).toFixed(0)}k`:s.toLocaleString()}function q({sessions:s,loading:t,error:a}){if(a)return e.jsxs("div",{className:"card repo-stack-card",children:[e.jsx("h3",{children:"Context per Repo (live)"}),e.jsxs("div",{className:"sessions-empty",children:["Error loading sessions: ",a.message]})]});if(t&&!s)return e.jsxs("div",{className:"card repo-stack-card",children:[e.jsx("h3",{children:"Context per Repo (live)"}),e.jsx("div",{className:"sessions-empty",children:"Loading sessions…"})]});const n=s?.sessions??[],{repos:l,totalTokens:o,maxWindow:i,sessionCount:u}=V(n);if(l.length===0)return e.jsxs("div",{className:"card repo-stack-card",children:[e.jsx("h3",{children:"Context per Repo (live)"}),e.jsx("div",{className:"sessions-empty",children:"No active sessions."})]});const m=i>0?Math.round(o/i*100):0;return e.jsxs("div",{className:"card repo-stack-card",children:[e.jsx("h3",{children:"Context per Repo (live)"}),e.jsx("div",{className:"repo-stack-bar",role:"group","aria-label":"Per-repo context usage",children:l.map(r=>{const c=o>0?r.tokens/o*100:0,p=o>0?c:0,d=`${r.basename}: ${P(r.tokens)} tokens (${c.toFixed(1)}% of total)`;return e.jsx("div",{className:"repo-stack-segment",style:{width:`${Math.max(p,.5)}%`,backgroundColor:r.color},title:d,"aria-label":d},r.repoRoot??"__null__")})}),e.jsxs("p",{className:"repo-stack-total",children:[P(o)," tokens across ",l.length," ",l.length===1?"repo":"repos"," /"," ",u," ",u===1?"session":"sessions"," ",e.jsxs("span",{className:"pct",children:["— ",m,"% of combined max window"]})]}),e.jsx("div",{className:"repo-stack-legend",children:l.map(r=>{const c=o>0?r.tokens/o*100:0;return e.jsxs("div",{className:"repo-stack-legend-item",children:[e.jsx("span",{className:"repo-stack-legend-swatch",style:{backgroundColor:r.color}}),e.jsx("span",{className:"repo-stack-legend-name",children:r.basename}),e.jsxs("span",{children:[P(r.tokens)," (",c.toFixed(0),"%)"]})]},r.repoRoot??"__null__")})})]})}function E({state:s,label:t}){const a=s==="on"?"bullet-on":s==="na"?"bullet-na":"bullet-off";return e.jsxs("div",{className:`bullet ${a}`,children:[e.jsx("span",{className:"bullet-dot","aria-hidden":"true"}),e.jsx("span",{className:"bullet-label",children:t})]})}function X({armed:s,ready:t}){const a=s?"on":"off",n=t?"on":s?"off":"na",l=t?"THRESHOLD EXCEEDED — compacting next event":s?"past fast gate — monitoring token count":"idle — below fast gate";return e.jsxs("div",{className:"card trigger-status",children:[e.jsx("h3",{children:"Trigger Status"}),e.jsxs("div",{className:"bullet-row",children:[e.jsx(E,{state:a,label:"Armed"}),e.jsx(E,{state:n,label:"Ready"})]}),e.jsx("p",{className:"trigger-state-text",children:l})]})}function J(s){return s>=.9?"meter-green":s>=.6?"meter-yellow":"meter-red"}function h({label:s,value:t,title:a}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",title:a,children:s}),e.jsx("span",{className:"ov-stat-value",children:t})]})}function Q(s){const t=s.compressionPct,a=J(t),n=Math.max(t*100,.5),l=`${j(t)} tokens saved · dedup: ${j(s.dedupPct)}`;return e.jsxs("div",{className:"card vector-store-card",children:[e.jsx("h3",{children:"Vector Store (session)"}),e.jsx(h,{label:"Checkpoints",value:s.checkpointCount.toLocaleString(),title:"A saved summary of a chunk of your conversation that was compacted to free up space."}),e.jsx(h,{label:"Original (dropped)",value:s.tokensIn.toLocaleString(),title:"Total size of the original conversation text dropped into compaction this session, including redundant regions skipped by dedup. This is the 'in'."}),e.jsx(h,{label:"Kept (summaries)",value:s.tokensOut.toLocaleString(),title:"Compact summaries we are currently holding as 'memory' for this session (the 'out'). Smaller is better."}),e.jsx(h,{label:"Freed",value:s.tokensFreed.toLocaleString(),title:"Conversation space freed = dropped − kept (the 'saved')."}),e.jsx(h,{label:"Injected",value:s.injectedCount,title:"How many times old context was automatically brought back into the conversation because it was relevant to what you were doing."}),e.jsx(h,{label:"Recall Relevance",value:j(s.dedupHitRate),title:"Of the times we recalled old context, how often it was actually on-topic."}),e.jsx(h,{label:"Storage Dedup",value:j(s.storageDedupRate),title:"How often new content matched something we already had, so we skipped storing a duplicate copy. Higher = less wasted space."}),e.jsx(h,{label:"Collapsed",value:s.dedupCollapsed,title:"How many duplicate chunks we collapsed into one instead of storing separately."}),e.jsx(h,{label:"Last ID",value:s.lastCheckpointId??"—",title:"The ID of the most recent saved checkpoint."}),e.jsxs("div",{className:"ov-compression-meter",children:[e.jsx("div",{className:"meter-track",children:e.jsx("div",{className:`meter-fill ${a}`,style:{width:`${n}%`}})}),e.jsx("span",{className:"meter-sub",children:l})]})]})}function Y(s){return s>=.9?"meter-green":s>=.6?"meter-yellow":"meter-red"}function x({label:s,value:t}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:s}),e.jsx("span",{className:"ov-stat-value",children:t})]})}function Z(s){const t=s.compressionPct,a=Y(t),n=Math.max(t*100,.5),l=`${j(t)} tokens saved · dedup: ${j(s.dedupPct)}`;return e.jsxs("div",{className:"card repo-sessions-card",children:[e.jsx("h3",{children:"Repo (all sessions)"}),e.jsx(x,{label:"Checkpoints",value:s.checkpointCount.toLocaleString()}),e.jsx(x,{label:"Original",value:s.tokensIn.toLocaleString()}),e.jsx(x,{label:"Kept",value:s.tokensOut.toLocaleString()}),e.jsx(x,{label:"Freed",value:s.tokensFreed.toLocaleString()}),e.jsx(x,{label:"Sessions",value:s.sessionCount.toLocaleString()}),e.jsx(x,{label:"Collapsed",value:s.dedupCollapsed}),e.jsx(x,{label:"Storage Dedup",value:j(s.storageDedupRate)}),e.jsxs("div",{className:"ov-compression-meter",children:[e.jsx("div",{className:"meter-track",children:e.jsx("div",{className:`meter-fill ${a}`,style:{width:`${n}%`}})}),e.jsx("span",{className:"meter-sub",children:l})]})]})}function ee(s){return e.jsxs("div",{className:"card data-safety-card",children:[e.jsx("h3",{children:"🛡 Data Safety"}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Regions Retained"}),e.jsx("span",{className:"ov-stat-value",children:s.regionsRetained.toLocaleString()})]}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Compressed-Original"}),e.jsx("span",{className:"ov-stat-value",children:F(s.compressedOriginalBytes)})]}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Dedup Duplicates"}),e.jsx("span",{className:"ov-stat-value",children:s.duplicatesCollapsed.toLocaleString()})]}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Permanently Deleted"}),e.jsx("span",{className:"ov-stat-value ov-value-ok",children:F(s.bytesPermanentlyDeleted)})]}),e.jsx("p",{className:"safe-note",children:'Every compacted region is kept verbatim (compressed). "Drop" = removed from the live window only. We never delete your data.'})]})}function v({label:s,value:t,title:a}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",title:a,children:s}),e.jsx("span",{className:"ov-stat-value",children:t})]})}function se(s){const t=`${Math.round((s.pressure??0)*100)}%`;let a=s.thresholdTokens.toLocaleString();return s.tierPct!=null&&s.contextWindow>0&&(a+=` (${Math.round(s.tierPct*100)}% of ${s.contextWindow.toLocaleString()})`),e.jsxs("div",{className:"card config-summary-card",children:[e.jsx("h3",{children:"Configuration"}),e.jsx(v,{label:"Tier",value:`${s.tier} (live)`,title:"Live pressure band — climbs low→mega as context fills the window."}),e.jsx(v,{label:"Preset",value:s.presetTier,title:"The env-resolved base compaction preset (low/medium/high/ultra/mega) that set the token threshold."}),e.jsx(v,{label:"Pressure",value:t,title:"Live pressure = currentTokens / threshold — % of the model context window (threshold fires at the tier's % of window)."}),e.jsx(v,{label:"Threshold",value:a,title:"Compaction threshold = tierPct × model context window — mega-compact trims BELOW pi's native ~80% auto-compact for any model size."}),e.jsx(v,{label:"Fast Gate",value:`${s.fastGatePct}%`,title:"Fast-gate arming floor — the live trim arms once context passes this % of the window."}),e.jsx(v,{label:"Auto",value:s.auto?"enabled":"disabled"}),e.jsx(v,{label:"Anchor",value:String(s.anchorUserMessages)})]})}function T({label:s,value:t,title:a}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",title:a,children:s}),e.jsx("span",{className:"ov-stat-value",children:t})]})}function te(s){const t=s.repoTokensFreed||0;let a=0,n="0";if(s.inputRate&&t>0){a=t*s.inputRate;const i=s.contextWindow||0;n=i>0?(t/i).toFixed(1):"0"}const l=`≈ $${a.toFixed(4)} saved`,o=`${n} context-windows extended`;return e.jsxs("div",{className:"card model-cost-card",children:[e.jsx("h3",{children:"💰 Model & Cost Savings"}),e.jsx("div",{className:"ov-cost-usd",children:l}),e.jsx("div",{className:"ov-cost-sub",children:o}),e.jsx(T,{label:"Model",value:s.name,title:"The model pi is currently using — its pricing drives the cost figure."}),e.jsx(T,{label:"Provider",value:s.provider,title:"The provider serving the model."}),e.jsx(T,{label:"Input Rate",value:`$${s.inputRate.toFixed(6)}`,title:"USD per input token, from the model's pricing."}),e.jsx(T,{label:"Output Rate",value:`$${s.outputRate.toFixed(6)}`,title:"USD per output token, from the model's pricing."})]})}function ae(s){const{activeAgents:t,currentTurn:a}=s,n=t>0?`▶ ${t} running`:"idle";return e.jsxs("div",{className:"card crew-card",children:[e.jsx("h3",{children:"Crew / Agents"}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Active Agents"}),e.jsx("span",{className:"ov-stat-value",children:t})]}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Current Turn"}),e.jsx("span",{className:"ov-stat-value",children:a})]}),e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:"Status"}),e.jsx("span",{className:"ov-stat-value",children:n})]})]})}const ne=[e.jsxs("li",{children:[e.jsx("b",{children:"Original (dropped)"}),' — everything compacted away (including duplicates caught by dedup). The "in."']},"1"),e.jsxs("li",{children:[e.jsx("b",{children:"Kept (summaries)"}),' — compact summaries still held as "memory" (the "out").']},"2"),e.jsxs("li",{children:[e.jsx("b",{children:"Freed"})," = dropped − kept — tokens saved so far (higher = better)."]},"3"),e.jsxs("li",{children:[e.jsx("b",{children:"Compression %"})," — Freed ÷ Dropped — the headline efficiency number. Higher = more space reclaimed."]},"4"),e.jsxs("li",{children:[e.jsx("b",{children:"Storage dedup %"})," — how often new content matched something already saved, so no duplicate copy was written."]},"5"),e.jsxs("li",{children:[e.jsx("b",{children:"Data safety"})," — every compacted region is kept verbatim (compressed). Nothing is permanently deleted; you can restore any of it."]},"6")];function oe(){return e.jsx("div",{className:"card legend-card",children:e.jsxs("details",{children:[e.jsx("summary",{children:"What these numbers mean"}),e.jsx("ol",{className:"legend-list",children:ne}),e.jsx("p",{className:"legend-note",children:"Hover any label above for a quick explanation."})]})})}function le(s){return s.type==="session_sample"}function re(s){if(!s)return"never";try{return new Date(s).toLocaleString()}catch{return s}}function ue({snapshot:s,loading:t,error:a}){const{data:n,error:l,loading:o,refetch:i}=W(C.useCallback(()=>M(),[]),{pollInterval:2e3}),{events:u}=A(),m=C.useMemo(()=>u.filter(le),[u]),r=C.useMemo(()=>m.length===0?null:m[m.length-1].ts,[m]);if(C.useEffect(()=>{r!=null&&i()},[r,i]),t&&!s)return e.jsx("div",{className:"tab-stub",children:"Loading snapshot…"});if(a&&!s)return e.jsxs("div",{className:"tab-stub",children:["Error: ",a.message]});if(!s)return e.jsx("div",{className:"tab-stub",children:"No snapshot data."});const c=s,{context:p,compression:d,trigger:f,session:O,store:b,tier:$,updatedAt:H}=c,k=c.config,D=c.crew,w=c.integrity,N=c.cacheHits,L=c.compacts,S=c.timeSaved,y=c.repo,g=c.model;return e.jsxs("div",{className:"overview-tab",children:[e.jsxs("div",{className:"overview-header",children:[e.jsx("span",{className:"tier-pill",children:$}),e.jsxs("span",{className:"updated",children:["updated ",re(H)]})]}),e.jsxs("div",{className:"card-grid overview-card-grid",children:[e.jsx(B,{tokens:p.tokens,percent:p.percent,contextWindow:p.contextWindow}),e.jsx(q,{sessions:n,loading:o,error:l}),e.jsx(X,{armed:f.armed,ready:f.ready,currentTokens:f.currentTokens,thresholdTokens:f.thresholdTokens,fastGatePct:f.fastGatePct}),e.jsx(Q,{checkpointCount:b.checkpointCount,tokensIn:d.session.tokensIn,tokensOut:d.session.tokensOut,tokensFreed:d.session.tokensFreed,injectedCount:b.injectedCount,dedupHitRate:b.dedupHitRate,storageDedupRate:b.storageDedupRate,dedupCollapsed:b.dedupCollapsed,lastCheckpointId:O.lastCheckpointId,compressionPct:d.session.compressionPct,dedupPct:d.session.dedupPct}),e.jsx(Z,{checkpointCount:y.checkpointCount,tokensIn:d.repo.tokensIn,tokensOut:d.repo.tokensOut,tokensFreed:d.repo.tokensFreed,sessionCount:y.sessionCount,dedupCollapsed:y.dedupCollapsed,storageDedupRate:y.storageDedupRate,compressionPct:d.repo.compressionPct,dedupPct:d.repo.dedupPct}),e.jsx(ee,{regionsRetained:w.regionsRetained,compressedOriginalBytes:w.compressedOriginalBytes,duplicatesCollapsed:w.duplicatesCollapsed,bytesPermanentlyDeleted:w.bytesPermanentlyDeleted}),e.jsx(se,{tier:$,presetTier:c.presetTier,pressure:c.pressure,thresholdTokens:k.thresholdTokens,tierPct:k.tierPct,contextWindow:p.contextWindow,fastGatePct:k.fastGatePct,auto:k.auto,anchorUserMessages:k.anchorUserMessages}),g&&e.jsx(te,{name:g.name,provider:g.providerName||g.provider,inputRate:g.inputRate,outputRate:g.outputRate,repoTokensFreed:d.repo.tokensFreed,contextWindow:p.contextWindow}),e.jsx(ae,{activeAgents:D.activeAgents,currentTurn:D.currentTurn}),e.jsx(I,{cacheHitsSession:N.session,cacheHitsTotal:N.total,tokensSavedSession:N.sessionTokensSaved,tokensSavedTotal:N.totalTokensSaved,compactionsSession:L.session,compactionsTotal:L.total}),e.jsx(_,{compactSessionSec:S.compact.sessionSec,compactTotalSec:S.compact.totalSec,cacheHitSessionSec:S.cacheHit.sessionSec,cacheHitTotalSec:S.cacheHit.totalSec}),e.jsx(oe,{})]})]})}export{ue as default};
|
|
2
|
-
//# sourceMappingURL=OverviewTab-eJ7vFgBE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OverviewTab-eJ7vFgBE.js","sources":["../../src/components/ContextGauge.tsx","../../src/components/RepoContextStack.tsx","../../src/components/TriggerStatus.tsx","../../src/components/VectorStoreCard.tsx","../../src/components/RepoAllSessionsCard.tsx","../../src/components/DataSafetyCard.tsx","../../src/components/ConfigSummaryCard.tsx","../../src/components/CacheStatusPerModel.tsx","../../src/components/SessionInfo.tsx","../../src/components/LegendCard.tsx","../../src/tabs/OverviewTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/components/ContextGauge.tsx — token usage meter.\n *\n * Color-coded percent fill bar: green <70%, yellow 70–89%, red ≥90%.\n * Sublabel: \"{tokens} / {contextWindow} tokens\".\n * Shows percentage as \"{pct}%\" in the header.\n */\n\nimport type React from \"react\";\n\nexport interface ContextGaugeProps {\n\t/** Current token count in the context window, or null if unknown. */\n\ttokens: number | null;\n\t/** Context window usage percent (0–100), or null if unknown. */\n\tpercent: number | null;\n\t/** Maximum context window size for the active model. */\n\tcontextWindow: number;\n}\n\nfunction severityClass(percent: number): string {\n\tif (percent >= 90) return \"gauge-red\";\n\tif (percent >= 70) return \"gauge-yellow\";\n\treturn \"gauge-green\";\n}\n\nexport function ContextGauge({\n\ttokens,\n\tpercent,\n\tcontextWindow,\n}: ContextGaugeProps): React.ReactElement {\n\tconst pct = percent ?? 0;\n\tconst fillWidth = Math.max(pct, 1);\n\tconst cls = severityClass(pct);\n\tconst tokStr =\n\t\ttokens !== null && tokens !== undefined\n\t\t\t? tokens.toLocaleString()\n\t\t\t: \"?\";\n\tconst label = `${tokStr} / ${contextWindow.toLocaleString()} tokens`;\n\n\treturn (\n\t\t<div className=\"card context-gauge\">\n\t\t\t<h3>Context Window — {pct}%</h3>\n\t\t\t<div\n\t\t\t\tclassName={`gauge-bar ${cls}`}\n\t\t\t\trole=\"meter\"\n\t\t\t\taria-valuenow={pct}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t>\n\t\t\t\t<div className=\"gauge-fill\" style={{ width: `${fillWidth}%` }} />\n\t\t\t</div>\n\t\t\t<p className=\"gauge-label\">{label}</p>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RepoContextStack.tsx — Stacked per-repo context bar (S40).\n *\n * Horizontal stacked bar: one colored segment per active repo, aggregating\n * that repo's active sessions' token counts. Renders a combined total line\n * and a legend mapping each repo (basename of repoRoot) to its segment color\n * + token count + % of total.\n *\n * Stable per-repo colors: the repoRoot basename is hashed to a deterministic\n * index into a fixed palette array, so the same repo always gets the same\n * color across renders/tabs (mirrors SessionsMemoryChart's stable-color\n * contract from S39).\n *\n * PREVENT-PI-004: this is a pure presentational component — no fetch, no\n * network. Data is passed in by the parent (OverviewTab) via\n * useApi(fetchSessions) + useSSE() for real-time updates.\n */\n\nimport type React from \"react\";\nimport type { ActiveSession, SessionsResponse } from \"@contracts\";\n\nexport interface RepoContextStackProps {\n\t/** Active sessions from /api/sessions (may be null while loading). */\n\tsessions: SessionsResponse | null;\n\t/** Whether the initial fetch is in flight. */\n\tloading: boolean;\n\t/** Fetch error, if any. */\n\terror: Error | null;\n}\n\n// ─── Stable color palette ─────────────────────────────────────────────────────\n// Fixed set of hex colors used for stable per-repo coloring. The hash function\n// maps a repoRoot basename to a deterministic palette index so the same repo\n// always renders the same color.\nconst REPO_PALETTE: ReadonlyArray<string> = [\n\t\"#58a6ff\", // blue\n\t\"#3fb950\", // green\n\t\"#d29922\", // yellow\n\t\"#f85149\", // red\n\t\"#bc8cff\", // purple\n\t\"#ff7b72\", // salmon\n\t\"#79c0ff\", // light blue\n\t\"#56d4dd\", // cyan\n\t\"#e3b341\", // gold\n\t\"#a5d6ff\", // pale blue\n\t\"#7ee787\", // mint\n\t\"#ffa657\", // orange\n];\n\n/**\n * Simple deterministic string hash (djb2 variant). Returns a non-negative\n * 32-bit integer.\n */\nfunction hashString(str: string): number {\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = ((hash << 5) + hash + str.charCodeAt(i)) >>> 0;\n\t}\n\treturn hash;\n}\n\n/**\n * Pick a stable color for a repoRoot basename. Falls back to \"(unknown)\" if\n * the basename is empty.\n */\nfunction colorForRepo(basename: string): string {\n\tif (!basename) return REPO_PALETTE[0];\n\treturn REPO_PALETTE[hashString(basename) % REPO_PALETTE.length];\n}\n\n/**\n * Extract the basename from a repoRoot path. Uses `\"/\"` as the universal\n * separator on all OSes (repoRoot is an absolute path from the dashboard\n * server; on Windows pi actually uses forward-slash normalized paths anyway).\n */\nfunction repoBasename(repoRoot: string | null): string {\n\tif (!repoRoot) return \"(unknown)\";\n\tconst trimmed = repoRoot.replace(/[\\\\/]+$/, \"\");\n\tif (!trimmed) return \"(unknown)\";\n\tconst parts = trimmed.split(/[\\\\/]/);\n\tconst last = parts[parts.length - 1];\n\treturn last || trimmed;\n}\n\n// ─── Aggregation ─────────────────────────────────────────────────────────────\n\ninterface RepoAggregate {\n\trepoRoot: string | null;\n\tbasename: string;\n\ttokens: number;\n\tcolor: string;\n}\n\nfunction aggregateRepos(sessions: ReadonlyArray<ActiveSession>): {\n\trepos: RepoAggregate[];\n\ttotalTokens: number;\n\tmaxWindow: number;\n\tsessionCount: number;\n} {\n\tconst map = new Map<string, RepoAggregate>();\n\tfor (const s of sessions) {\n\t\tconst key = s.repoRoot ?? \"__null__\";\n\t\tconst tokens = s.tokens ?? 0;\n\t\tconst existing = map.get(key);\n\t\tif (existing) {\n\t\t\texisting.tokens += tokens;\n\t\t} else {\n\t\t\tconst basename = repoBasename(s.repoRoot);\n\t\t\tmap.set(key, {\n\t\t\t\trepoRoot: s.repoRoot,\n\t\t\t\tbasename,\n\t\t\t\ttokens,\n\t\t\t\tcolor: colorForRepo(basename),\n\t\t\t});\n\t\t}\n\t}\n\tconst repos = [...map.values()];\n\tconst totalTokens = repos.reduce((sum, r) => sum + r.tokens, 0);\n\t// Combined max window: the largest ctxWindow among the active sessions.\n\t// This mirrors SessionsTab's SummaryTiles combined-% logic.\n\tconst maxWindow = sessions.reduce(\n\t\t(max, s) => Math.max(max, s.ctxWindow),\n\t\t0,\n\t);\n\treturn {\n\t\trepos,\n\t\ttotalTokens,\n\t\tmaxWindow,\n\t\tsessionCount: sessions.length,\n\t};\n}\n\nfunction fmtTokens(n: number): string {\n\tif (n >= 100_000) return `${(n / 1000).toFixed(0)}k`;\n\treturn n.toLocaleString();\n}\n\nexport function RepoContextStack({\n\tsessions,\n\tloading,\n\terror,\n}: RepoContextStackProps): React.ReactElement | null {\n\tif (error) {\n\t\treturn (\n\t\t\t<div className=\"card repo-stack-card\">\n\t\t\t\t<h3>Context per Repo (live)</h3>\n\t\t\t\t<div className=\"sessions-empty\">\n\t\t\t\t\tError loading sessions: {error.message}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (loading && !sessions) {\n\t\treturn (\n\t\t\t<div className=\"card repo-stack-card\">\n\t\t\t\t<h3>Context per Repo (live)</h3>\n\t\t\t\t<div className=\"sessions-empty\">Loading sessions…</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst activeSessions = sessions?.sessions ?? [];\n\tconst { repos, totalTokens, maxWindow, sessionCount } =\n\t\taggregateRepos(activeSessions);\n\n\tif (repos.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"card repo-stack-card\">\n\t\t\t\t<h3>Context per Repo (live)</h3>\n\t\t\t\t<div className=\"sessions-empty\">No active sessions.</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst combinedPct =\n\t\tmaxWindow > 0 ? Math.round((totalTokens / maxWindow) * 100) : 0;\n\n\treturn (\n\t\t<div className=\"card repo-stack-card\">\n\t\t\t<h3>Context per Repo (live)</h3>\n\t\t\t<div\n\t\t\t\tclassName=\"repo-stack-bar\"\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label=\"Per-repo context usage\"\n\t\t\t>\n\t\t\t\t{repos.map((r) => {\n\t\t\t\t\tconst pctOfTotal =\n\t\t\t\t\t\ttotalTokens > 0 ? (r.tokens / totalTokens) * 100 : 0;\n\t\t\t\t\tconst widthPct = totalTokens > 0 ? pctOfTotal : 0;\n\t\t\t\t\tconst tooltip =\n\t\t\t\t\t\t`${r.basename}: ${fmtTokens(r.tokens)} tokens ` +\n\t\t\t\t\t\t`(${pctOfTotal.toFixed(1)}% of total)`;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={r.repoRoot ?? \"__null__\"}\n\t\t\t\t\t\t\tclassName=\"repo-stack-segment\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: `${Math.max(widthPct, 0.5)}%`,\n\t\t\t\t\t\t\t\tbackgroundColor: r.color,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttitle={tooltip}\n\t\t\t\t\t\t\taria-label={tooltip}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<p className=\"repo-stack-total\">\n\t\t\t\t{fmtTokens(totalTokens)} tokens across {repos.length}{\" \"}\n\t\t\t\t{repos.length === 1 ? \"repo\" : \"repos\"} /{\" \"}\n\t\t\t\t{sessionCount}{\" \"}\n\t\t\t\t{sessionCount === 1 ? \"session\" : \"sessions\"}{\" \"}\n\t\t\t\t<span className=\"pct\">— {combinedPct}% of combined max window</span>\n\t\t\t</p>\n\t\t\t<div className=\"repo-stack-legend\">\n\t\t\t\t{repos.map((r) => {\n\t\t\t\t\tconst pctOfTotal =\n\t\t\t\t\t\ttotalTokens > 0 ? (r.tokens / totalTokens) * 100 : 0;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={r.repoRoot ?? \"__null__\"}\n\t\t\t\t\t\t\tclassName=\"repo-stack-legend-item\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"repo-stack-legend-swatch\"\n\t\t\t\t\t\t\t\tstyle={{ backgroundColor: r.color }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span className=\"repo-stack-legend-name\">{r.basename}</span>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{fmtTokens(r.tokens)} ({pctOfTotal.toFixed(0)}%)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/TriggerStatus.tsx — trigger armed/ready status.\n *\n * Two bullets (Armed, Ready) + state text.\n * Ready bullet shows \"na\" (yellow) when not armed.\n * State text: ready → \"THRESHOLD EXCEEDED — compacting next event\",\n * armed → \"past fast gate — monitoring token count\",\n * idle → \"idle — below fast gate\".\n */\n\nimport type React from \"react\";\n\nexport interface TriggerStatusProps {\n\t/** Whether the trigger is armed (waiting for threshold). */\n\tarmed: boolean;\n\t/** Whether the trigger is ready to fire (pressure at/above threshold). */\n\tready: boolean;\n\t/** Current context token count, or null if unknown. */\n\tcurrentTokens: number | null;\n\t/** Token threshold for firing. */\n\tthresholdTokens: number;\n\t/** Fast-gate pressure threshold (percent, 0–100). */\n\tfastGatePct: number;\n}\n\ntype BulletState = \"on\" | \"off\" | \"na\";\n\nfunction Bullet({\n\tstate,\n\tlabel,\n}: {\n\tstate: BulletState;\n\tlabel: string;\n}): React.ReactElement {\n\tconst cls =\n\t\tstate === \"on\" ? \"bullet-on\" : state === \"na\" ? \"bullet-na\" : \"bullet-off\";\n\treturn (\n\t\t<div className={`bullet ${cls}`}>\n\t\t\t<span className=\"bullet-dot\" aria-hidden=\"true\" />\n\t\t\t<span className=\"bullet-label\">{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function TriggerStatus({\n\tarmed,\n\tready,\n}: TriggerStatusProps): React.ReactElement {\n\t// tr-armed: on if armed, off if not\n\t// tr-ready: on if ready, na (yellow) if not armed, off if armed but not ready\n\tconst armedState: BulletState = armed ? \"on\" : \"off\";\n\tconst readyState: BulletState = ready\n\t\t? \"on\"\n\t\t: !armed\n\t\t\t? \"na\"\n\t\t\t: \"off\";\n\n\tconst stateText = ready\n\t\t? \"THRESHOLD EXCEEDED — compacting next event\"\n\t\t: armed\n\t\t\t? \"past fast gate — monitoring token count\"\n\t\t\t: \"idle — below fast gate\";\n\n\treturn (\n\t\t<div className=\"card trigger-status\">\n\t\t\t<h3>Trigger Status</h3>\n\t\t\t<div className=\"bullet-row\">\n\t\t\t\t<Bullet state={armedState} label=\"Armed\" />\n\t\t\t\t<Bullet state={readyState} label=\"Ready\" />\n\t\t\t</div>\n\t\t\t<p className=\"trigger-state-text\">{stateText}</p>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/VectorStoreCard.tsx — Vector Store (session) card.\n *\n * 9 fields: Checkpoints, Original (dropped), Kept (summaries), Freed,\n * Injected, Recall Relevance %, Storage Dedup %, Collapsed, Last ID.\n * Plus a compression meter bar (green ≥90%, yellow ≥60%, red <60%).\n *\n * NOTE: dedupHitRate, storageDedupRate, compressionPct, dedupPct are\n * 0–1 fractions at runtime (despite contract saying 0–100).\n * Tooltips copied verbatim from html.ts.\n */\n\nimport type React from \"react\";\nimport { fmtPctFromFraction } from \"../utils/format\";\n\nexport interface VectorStoreCardProps {\n\tcheckpointCount: number;\n\t/** Original tokens dropped into compaction (session). */\n\ttokensIn: number;\n\t/** Kept summary tokens (session). */\n\ttokensOut: number;\n\t/** Tokens freed = dropped − kept (session). */\n\ttokensFreed: number;\n\t/** Recall injection count. */\n\tinjectedCount: number;\n\t/** Recall relevance — 0–1 fraction. */\n\tdedupHitRate: number;\n\t/** Storage dedup rate — 0–1 fraction. */\n\tstorageDedupRate: number;\n\t/** Duplicate chunks collapsed. */\n\tdedupCollapsed: number;\n\t/** Last checkpoint ID or null. */\n\tlastCheckpointId: string | null;\n\t/** Session compression ratio — 0–1 fraction. */\n\tcompressionPct: number;\n\t/** Session dedup contribution — 0–1 fraction. */\n\tdedupPct: number;\n}\n\n/** Compression meter colour class (inverse of context: high = good). */\nfunction compressClass(sp: number): string {\n\tif (sp >= 0.9) return \"meter-green\";\n\tif (sp >= 0.6) return \"meter-yellow\";\n\treturn \"meter-red\";\n}\n\n/** Stat row with optional tooltip. */\nfunction StatRow({\n\tlabel,\n\tvalue,\n\ttitle,\n}: {\n\tlabel: string;\n\tvalue: string | number;\n\ttitle?: string;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"ov-stat-row\">\n\t\t\t<span className=\"ov-stat-label\" title={title}>\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<span className=\"ov-stat-value\">{value}</span>\n\t\t</div>\n\t);\n}\n\nexport function VectorStoreCard(\n\tprops: VectorStoreCardProps,\n): React.ReactElement {\n\tconst sp = props.compressionPct;\n\tconst barCls = compressClass(sp);\n\tconst barWidth = Math.max(sp * 100, 0.5);\n\tconst compressSub = `${fmtPctFromFraction(sp)} tokens saved · dedup: ${fmtPctFromFraction(props.dedupPct)}`;\n\n\treturn (\n\t\t<div className=\"card vector-store-card\">\n\t\t\t<h3>Vector Store (session)</h3>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Checkpoints\"\n\t\t\t\tvalue={props.checkpointCount.toLocaleString()}\n\t\t\t\ttitle=\"A saved summary of a chunk of your conversation that was compacted to free up space.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Original (dropped)\"\n\t\t\t\tvalue={props.tokensIn.toLocaleString()}\n\t\t\t\ttitle=\"Total size of the original conversation text dropped into compaction this session, including redundant regions skipped by dedup. This is the 'in'.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Kept (summaries)\"\n\t\t\t\tvalue={props.tokensOut.toLocaleString()}\n\t\t\t\ttitle=\"Compact summaries we are currently holding as 'memory' for this session (the 'out'). Smaller is better.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Freed\"\n\t\t\t\tvalue={props.tokensFreed.toLocaleString()}\n\t\t\t\ttitle=\"Conversation space freed = dropped − kept (the 'saved').\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Injected\"\n\t\t\t\tvalue={props.injectedCount}\n\t\t\t\ttitle=\"How many times old context was automatically brought back into the conversation because it was relevant to what you were doing.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Recall Relevance\"\n\t\t\t\tvalue={fmtPctFromFraction(props.dedupHitRate)}\n\t\t\t\ttitle=\"Of the times we recalled old context, how often it was actually on-topic.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Storage Dedup\"\n\t\t\t\tvalue={fmtPctFromFraction(props.storageDedupRate)}\n\t\t\t\ttitle=\"How often new content matched something we already had, so we skipped storing a duplicate copy. Higher = less wasted space.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Collapsed\"\n\t\t\t\tvalue={props.dedupCollapsed}\n\t\t\t\ttitle=\"How many duplicate chunks we collapsed into one instead of storing separately.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Last ID\"\n\t\t\t\tvalue={props.lastCheckpointId ?? \"—\"}\n\t\t\t\ttitle=\"The ID of the most recent saved checkpoint.\"\n\t\t\t/>\n\t\t\t<div className=\"ov-compression-meter\">\n\t\t\t\t<div className=\"meter-track\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`meter-fill ${barCls}`}\n\t\t\t\t\t\tstyle={{ width: `${barWidth}%` }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<span className=\"meter-sub\">{compressSub}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/RepoAllSessionsCard.tsx — Repo (all sessions) card.\n *\n * 7 fields: Checkpoints, Original, Kept, Freed, Sessions, Collapsed, Storage Dedup.\n * Plus a compression meter bar (green ≥90%, yellow ≥60%, red <60%).\n *\n * NOTE: storageDedupRate, compressionPct, dedupPct are 0–1 fractions\n * at runtime (despite contract saying 0–100).\n */\n\nimport type React from \"react\";\nimport { fmtPctFromFraction } from \"../utils/format\";\n\nexport interface RepoAllSessionsCardProps {\n\tcheckpointCount: number;\n\t/** Original tokens dropped (repo-level). */\n\ttokensIn: number;\n\t/** Kept summary tokens (repo-level). */\n\ttokensOut: number;\n\t/** Tokens freed (repo-level). */\n\ttokensFreed: number;\n\t/** Number of sessions. */\n\tsessionCount: number;\n\t/** Duplicate chunks collapsed (repo-level). */\n\tdedupCollapsed: number;\n\t/** Storage dedup rate — 0–1 fraction. */\n\tstorageDedupRate: number;\n\t/** Repo compression ratio — 0–1 fraction. */\n\tcompressionPct: number;\n\t/** Repo dedup contribution — 0–1 fraction. */\n\tdedupPct: number;\n}\n\nfunction compressClass(sp: number): string {\n\tif (sp >= 0.9) return \"meter-green\";\n\tif (sp >= 0.6) return \"meter-yellow\";\n\treturn \"meter-red\";\n}\n\nfunction StatRow({\n\tlabel,\n\tvalue,\n}: {\n\tlabel: string;\n\tvalue: string | number;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"ov-stat-row\">\n\t\t\t<span className=\"ov-stat-label\">{label}</span>\n\t\t\t<span className=\"ov-stat-value\">{value}</span>\n\t\t</div>\n\t);\n}\n\nexport function RepoAllSessionsCard(\n\tprops: RepoAllSessionsCardProps,\n): React.ReactElement {\n\tconst sp = props.compressionPct;\n\tconst barCls = compressClass(sp);\n\tconst barWidth = Math.max(sp * 100, 0.5);\n\tconst compressSub = `${fmtPctFromFraction(sp)} tokens saved · dedup: ${fmtPctFromFraction(props.dedupPct)}`;\n\n\treturn (\n\t\t<div className=\"card repo-sessions-card\">\n\t\t\t<h3>Repo (all sessions)</h3>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Checkpoints\"\n\t\t\t\tvalue={props.checkpointCount.toLocaleString()}\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Original\"\n\t\t\t\tvalue={props.tokensIn.toLocaleString()}\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Kept\"\n\t\t\t\tvalue={props.tokensOut.toLocaleString()}\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Freed\"\n\t\t\t\tvalue={props.tokensFreed.toLocaleString()}\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Sessions\"\n\t\t\t\tvalue={props.sessionCount.toLocaleString()}\n\t\t\t/>\n\t\t\t<StatRow label=\"Collapsed\" value={props.dedupCollapsed} />\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Storage Dedup\"\n\t\t\t\tvalue={fmtPctFromFraction(props.storageDedupRate)}\n\t\t\t/>\n\t\t\t<div className=\"ov-compression-meter\">\n\t\t\t\t<div className=\"meter-track\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`meter-fill ${barCls}`}\n\t\t\t\t\t\tstyle={{ width: `${barWidth}%` }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<span className=\"meter-sub\">{compressSub}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/DataSafetyCard.tsx — Data Safety / Shield.\n *\n * 4 fields: Regions Retained, Compressed-Original bytes, Dedup Duplicates,\n * Permanently Deleted (always 0B, shown in green).\n * Plus the safe-note text (verbatim from html.ts).\n */\n\nimport type React from \"react\";\nimport { fmtBytes } from \"../utils/format\";\n\nexport interface DataSafetyCardProps {\n\tregionsRetained: number;\n\t/** Original byte size of compressed data (bytes). */\n\tcompressedOriginalBytes: number;\n\t/** Number of duplicate chunks collapsed. */\n\tduplicatesCollapsed: number;\n\t/** Bytes permanently deleted (always 0). */\n\tbytesPermanentlyDeleted: number;\n}\n\nexport function DataSafetyCard(\n\tprops: DataSafetyCardProps,\n): React.ReactElement {\n\treturn (\n\t\t<div className=\"card data-safety-card\">\n\t\t\t<h3>🛡 Data Safety</h3>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Regions Retained</span>\n\t\t\t\t<span className=\"ov-stat-value\">\n\t\t\t\t\t{props.regionsRetained.toLocaleString()}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Compressed-Original</span>\n\t\t\t\t<span className=\"ov-stat-value\">\n\t\t\t\t\t{fmtBytes(props.compressedOriginalBytes)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Dedup Duplicates</span>\n\t\t\t\t<span className=\"ov-stat-value\">\n\t\t\t\t\t{props.duplicatesCollapsed.toLocaleString()}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Permanently Deleted</span>\n\t\t\t\t<span className=\"ov-stat-value ov-value-ok\">\n\t\t\t\t\t{fmtBytes(props.bytesPermanentlyDeleted)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<p className=\"safe-note\">\n\t\t\t\tEvery compacted region is kept verbatim (compressed). "Drop" =\n\t\t\t\tremoved from the live window only. We never delete your data.\n\t\t\t</p>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/ConfigSummaryCard.tsx — Configuration summary.\n *\n * 7 fields with tooltips (verbatim from html.ts):\n * Tier (live), Preset, Pressure, Threshold, Fast Gate, Auto, Anchor.\n *\n * NOTE: pressure and tierPct are 0–1 fractions at runtime.\n * fastGatePct is 0–100 at runtime.\n */\n\nimport type React from \"react\";\n\nexport interface ConfigSummaryCardProps {\n\t/** Current tier name. */\n\ttier: string;\n\t/** Preset tier name. */\n\tpresetTier: string;\n\t/** Live pressure — 0–1 fraction. */\n\tpressure: number;\n\t/** Token threshold. */\n\tthresholdTokens: number;\n\t/** Tier percentage — 0–1 fraction (runtime-only field). */\n\ttierPct?: number;\n\t/** Context window size. */\n\tcontextWindow: number;\n\t/** Fast-gate percentage — 0–100. */\n\tfastGatePct: number;\n\t/** Whether auto-compaction is enabled. */\n\tauto: boolean;\n\t/** Number of anchor user messages. */\n\tanchorUserMessages: number;\n}\n\nfunction StatRow({\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=\"ov-stat-row\">\n\t\t\t<span className=\"ov-stat-label\" title={title}>\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<span className=\"ov-stat-value\">{value}</span>\n\t\t</div>\n\t);\n}\n\nexport function ConfigSummaryCard(\n\tprops: ConfigSummaryCardProps,\n): React.ReactElement {\n\tconst pressurePct = `${Math.round((props.pressure ?? 0) * 100)}%`;\n\n\tlet thresholdTxt = props.thresholdTokens.toLocaleString();\n\tif (props.tierPct != null && props.contextWindow > 0) {\n\t\tthresholdTxt += ` (${Math.round(props.tierPct * 100)}% of ${props.contextWindow.toLocaleString()})`;\n\t}\n\n\treturn (\n\t\t<div className=\"card config-summary-card\">\n\t\t\t<h3>Configuration</h3>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Tier\"\n\t\t\t\tvalue={`${props.tier} (live)`}\n\t\t\t\ttitle=\"Live pressure band — climbs low→mega as context fills the window.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Preset\"\n\t\t\t\tvalue={props.presetTier}\n\t\t\t\ttitle=\"The env-resolved base compaction preset (low/medium/high/ultra/mega) that set the token threshold.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Pressure\"\n\t\t\t\tvalue={pressurePct}\n\t\t\t\ttitle=\"Live pressure = currentTokens / threshold — % of the model context window (threshold fires at the tier's % of window).\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Threshold\"\n\t\t\t\tvalue={thresholdTxt}\n\t\t\t\ttitle=\"Compaction threshold = tierPct × model context window — mega-compact trims BELOW pi's native ~80% auto-compact for any model size.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Fast Gate\"\n\t\t\t\tvalue={`${props.fastGatePct}%`}\n\t\t\t\ttitle=\"Fast-gate arming floor — the live trim arms once context passes this % of the window.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Auto\"\n\t\t\t\tvalue={props.auto ? \"enabled\" : \"disabled\"}\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Anchor\"\n\t\t\t\tvalue={String(props.anchorUserMessages)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/CacheStatusPerModel.tsx — Model & Cost Savings card.\n *\n * Shows $ saved, context-windows extended, Model, Provider, Input Rate, Output Rate.\n * Tooltips copied verbatim from html.ts.\n */\n\nimport type React from \"react\";\n\nexport interface ModelCostCardProps {\n\t/** Model name. */\n\tname: string;\n\t/** Provider display name (providerName fallback to provider). */\n\tprovider: string;\n\t/** USD per input token. */\n\tinputRate: number;\n\t/** USD per output token. */\n\toutputRate: number;\n\t/** Tokens freed (repo-level) used for cost calc. */\n\trepoTokensFreed: number;\n\t/** Context window size used for windows calc. */\n\tcontextWindow: number;\n}\n\nfunction StatRow({\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=\"ov-stat-row\">\n\t\t\t<span className=\"ov-stat-label\" title={title}>\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<span className=\"ov-stat-value\">{value}</span>\n\t\t</div>\n\t);\n}\n\nexport function CacheStatusPerModel(\n\tprops: ModelCostCardProps,\n): React.ReactElement {\n\tconst repoSaved = props.repoTokensFreed || 0;\n\tlet usd = 0;\n\tlet windows = \"0\";\n\n\tif (props.inputRate && repoSaved > 0) {\n\t\tusd = repoSaved * props.inputRate;\n\t\tconst win = props.contextWindow || 0;\n\t\twindows = win > 0 ? (repoSaved / win).toFixed(1) : \"0\";\n\t}\n\n\tconst usdStr = `≈ $${usd.toFixed(4)} saved`;\n\tconst windowsStr = `${windows} context-windows extended`;\n\n\treturn (\n\t\t<div className=\"card model-cost-card\">\n\t\t\t<h3>💰 Model & Cost Savings</h3>\n\t\t\t<div className=\"ov-cost-usd\">{usdStr}</div>\n\t\t\t<div className=\"ov-cost-sub\">{windowsStr}</div>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Model\"\n\t\t\t\tvalue={props.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<StatRow\n\t\t\t\tlabel=\"Provider\"\n\t\t\t\tvalue={props.provider}\n\t\t\t\ttitle=\"The provider serving the model.\"\n\t\t\t/>\n\t\t\t<StatRow\n\t\t\t\tlabel=\"Input Rate\"\n\t\t\t\tvalue={`$${props.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<StatRow\n\t\t\t\tlabel=\"Output Rate\"\n\t\t\t\tvalue={`$${props.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/SessionInfo.tsx — Crew / Agents card.\n *\n * Shows Active Agents, Current Turn, and Status.\n */\n\nimport type React from \"react\";\n\nexport interface SessionInfoProps {\n\t/** Number of active crew agents. */\n\tactiveAgents: number;\n\t/** Current turn index in the crew round-robin. */\n\tcurrentTurn: number;\n}\n\nexport function SessionInfo(\n\tprops: SessionInfoProps,\n): React.ReactElement {\n\tconst { activeAgents, currentTurn } = props;\n\tconst status =\n\t\tactiveAgents > 0 ? `▶ ${activeAgents} running` : \"idle\";\n\n\treturn (\n\t\t<div className=\"card crew-card\">\n\t\t\t<h3>Crew / Agents</h3>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Active Agents</span>\n\t\t\t\t<span className=\"ov-stat-value\">{activeAgents}</span>\n\t\t\t</div>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Current Turn</span>\n\t\t\t\t<span className=\"ov-stat-value\">{currentTurn}</span>\n\t\t\t</div>\n\t\t\t<div className=\"ov-stat-row\">\n\t\t\t\t<span className=\"ov-stat-label\">Status</span>\n\t\t\t\t<span className=\"ov-stat-value\">{status}</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/components/LegendCard.tsx — \"What these numbers mean\" legend.\n *\n * Collapsible <details> with the legend list (verbatim from html.ts).\n * Full-width card (grid-column: 1 / -1).\n */\n\nimport type React from \"react\";\n\nconst LEGEND_ITEMS: ReadonlyArray<React.ReactNode> = [\n\t<li key=\"1\">\n\t\t<b>Original (dropped)</b> — everything compacted away (including\n\t\tduplicates caught by dedup). The "in."\n\t</li>,\n\t<li key=\"2\">\n\t\t<b>Kept (summaries)</b> — compact summaries still held as "memory"\n\t\t(the "out").\n\t</li>,\n\t<li key=\"3\">\n\t\t<b>Freed</b> = dropped − kept — tokens saved so far (higher = better).\n\t</li>,\n\t<li key=\"4\">\n\t\t<b>Compression %</b> — Freed ÷ Dropped — the headline efficiency\n\t\tnumber. Higher = more space reclaimed.\n\t</li>,\n\t<li key=\"5\">\n\t\t<b>Storage dedup %</b> — how often new content matched something\n\t\talready saved, so no duplicate copy was written.\n\t</li>,\n\t<li key=\"6\">\n\t\t<b>Data safety</b> — every compacted region is kept verbatim\n\t\t(compressed). Nothing is permanently deleted; you can restore any of\n\t\tit.\n\t</li>,\n];\n\nexport function LegendCard(): React.ReactElement {\n\treturn (\n\t\t<div className=\"card legend-card\">\n\t\t\t<details>\n\t\t\t\t<summary>What these numbers mean</summary>\n\t\t\t\t<ol className=\"legend-list\">{LEGEND_ITEMS}</ol>\n\t\t\t\t<p className=\"legend-note\">\n\t\t\t\t\tHover any label above for a quick explanation.\n\t\t\t\t</p>\n\t\t\t</details>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/OverviewTab.tsx — Overview tab (full spec).\n *\n * Renders all 11 cards from the spec:\n * 1. Context Window (ContextGauge)\n * 2. Trigger Status (TriggerStatus)\n * 3. Vector Store (session) (VectorStoreCard)\n * 4. Repo (all sessions) (RepoAllSessionsCard)\n * 5. Data Safety (DataSafetyCard)\n * 6. Configuration (ConfigSummaryCard)\n * 7. Model & Cost Savings (CacheStatusPerModel)\n * 8. Crew / Agents (SessionInfo)\n * 9. Cache Hits & Compactions (CacheHitsCard)\n * 10. Time Saved (TimeSavedCard)\n * 11. Legend (LegendCard)\n *\n * All data comes from the snapshot prop passed by App.tsx.\n */\n\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { useApi } from \"../hooks/useApi\";\nimport { useSSE } from \"../hooks/useSSE\";\nimport { fetchSessions } from \"../api/client\";\nimport type {\n\tSnapshotResponse,\n\tSseEvent,\n\tSseSessionSample,\n\tSessionsResponse,\n} from \"@contracts\";\nimport type { RuntimeSnapshot } from \"../utils/types\";\nimport { ContextGauge } from \"../components/ContextGauge\";\nimport { RepoContextStack } from \"../components/RepoContextStack\";\nimport { TriggerStatus } from \"../components/TriggerStatus\";\nimport { VectorStoreCard } from \"../components/VectorStoreCard\";\nimport { RepoAllSessionsCard } from \"../components/RepoAllSessionsCard\";\nimport { DataSafetyCard } from \"../components/DataSafetyCard\";\nimport { ConfigSummaryCard } from \"../components/ConfigSummaryCard\";\nimport { CacheStatusPerModel } from \"../components/CacheStatusPerModel\";\nimport { SessionInfo } from \"../components/SessionInfo\";\nimport { CacheHitsCard } from \"../components/CacheHitsCard\";\nimport { TimeSavedCard } from \"../components/TimeSavedCard\";\nimport { LegendCard } from \"../components/LegendCard\";\n\n/** Type guard: narrows an SSE event to a session_sample event. */\nfunction isSessionSample(e: SseEvent): e is SseSessionSample {\n\treturn e.type === \"session_sample\";\n}\n\nexport interface OverviewTabProps {\n\tsnapshot: SnapshotResponse | null;\n\tloading: boolean;\n\terror: Error | null;\n}\n\nfunction formatUpdatedAt(ts: string | null): string {\n\tif (!ts) return \"never\";\n\ttry {\n\t\treturn new Date(ts).toLocaleString();\n\t} catch {\n\t\treturn ts;\n\t}\n}\n\nexport default function OverviewTab({\n\tsnapshot,\n\tloading,\n\terror,\n}: OverviewTabProps): React.ReactElement {\n\t// S40: real-time per-repo context via /api/sessions + SSE. Mirrors the\n\t// SessionsTab pattern: 2s poll + session_sample SSE refetch.\n\tconst {\n\t\tdata: sessionsData,\n\t\terror: sessionsErr,\n\t\tloading: sessionsLoading,\n\t\trefetch: refetchSessions,\n\t} = useApi<SessionsResponse>(\n\t\tuseCallback(() => fetchSessions(), []),\n\t\t{ pollInterval: 2_000 },\n\t);\n\n\tconst { events } = useSSE();\n\n\tconst sampleEvents = useMemo(\n\t\t() => events.filter(isSessionSample),\n\t\t[events],\n\t);\n\tconst lastSampleTs = useMemo(() => {\n\t\tif (sampleEvents.length === 0) return null;\n\t\treturn sampleEvents[sampleEvents.length - 1].ts;\n\t}, [sampleEvents]);\n\n\tuseEffect(() => {\n\t\tif (lastSampleTs == null) return;\n\t\trefetchSessions();\n\t}, [lastSampleTs, refetchSessions]);\n\n\tif (loading && !snapshot)\n\t\treturn <div className=\"tab-stub\">Loading snapshot…</div>;\n\tif (error && !snapshot)\n\t\treturn <div className=\"tab-stub\">Error: {error.message}</div>;\n\tif (!snapshot) return <div className=\"tab-stub\">No snapshot data.</div>;\n\n\t// Cast to RuntimeSnapshot for tierPct (runtime-only field).\n\tconst d = snapshot as RuntimeSnapshot;\n\tconst { context, compression, trigger, session, store, tier, updatedAt } =\n\t\td;\n\tconst cfg = d.config;\n\tconst crew = d.crew;\n\tconst integrity = d.integrity;\n\tconst cacheHits = d.cacheHits;\n\tconst compacts = d.compacts;\n\tconst timeSaved = d.timeSaved;\n\tconst repo = d.repo;\n\tconst model = d.model;\n\n\treturn (\n\t\t<div className=\"overview-tab\">\n\t\t\t<div className=\"overview-header\">\n\t\t\t\t<span className=\"tier-pill\">{tier}</span>\n\t\t\t\t<span className=\"updated\">updated {formatUpdatedAt(updatedAt)}</span>\n\t\t\t</div>\n\t\t\t<div className=\"card-grid overview-card-grid\">\n\t\t\t\t<ContextGauge\n\t\t\t\t\ttokens={context.tokens}\n\t\t\t\t\tpercent={context.percent}\n\t\t\t\t\tcontextWindow={context.contextWindow}\n\t\t\t\t/>\n\t\t\t\t<RepoContextStack\n\t\t\t\t\tsessions={sessionsData}\n\t\t\t\t\tloading={sessionsLoading}\n\t\t\t\t\terror={sessionsErr}\n\t\t\t\t/>\n\t\t\t\t<TriggerStatus\n\t\t\t\t\tarmed={trigger.armed}\n\t\t\t\t\tready={trigger.ready}\n\t\t\t\t\tcurrentTokens={trigger.currentTokens}\n\t\t\t\t\tthresholdTokens={trigger.thresholdTokens}\n\t\t\t\t\tfastGatePct={trigger.fastGatePct}\n\t\t\t\t/>\n\t\t\t\t<VectorStoreCard\n\t\t\t\t\tcheckpointCount={store.checkpointCount}\n\t\t\t\t\ttokensIn={compression.session.tokensIn}\n\t\t\t\t\ttokensOut={compression.session.tokensOut}\n\t\t\t\t\ttokensFreed={compression.session.tokensFreed}\n\t\t\t\t\tinjectedCount={store.injectedCount}\n\t\t\t\t\tdedupHitRate={store.dedupHitRate}\n\t\t\t\t\tstorageDedupRate={store.storageDedupRate}\n\t\t\t\t\tdedupCollapsed={store.dedupCollapsed}\n\t\t\t\t\tlastCheckpointId={session.lastCheckpointId}\n\t\t\t\t\tcompressionPct={compression.session.compressionPct}\n\t\t\t\t\tdedupPct={compression.session.dedupPct}\n\t\t\t\t/>\n\t\t\t\t<RepoAllSessionsCard\n\t\t\t\t\tcheckpointCount={repo.checkpointCount}\n\t\t\t\t\ttokensIn={compression.repo.tokensIn}\n\t\t\t\t\ttokensOut={compression.repo.tokensOut}\n\t\t\t\t\ttokensFreed={compression.repo.tokensFreed}\n\t\t\t\t\tsessionCount={repo.sessionCount}\n\t\t\t\t\tdedupCollapsed={repo.dedupCollapsed}\n\t\t\t\t\tstorageDedupRate={repo.storageDedupRate}\n\t\t\t\t\tcompressionPct={compression.repo.compressionPct}\n\t\t\t\t\tdedupPct={compression.repo.dedupPct}\n\t\t\t\t/>\n\t\t\t\t<DataSafetyCard\n\t\t\t\t\tregionsRetained={integrity.regionsRetained}\n\t\t\t\t\tcompressedOriginalBytes={integrity.compressedOriginalBytes}\n\t\t\t\t\tduplicatesCollapsed={integrity.duplicatesCollapsed}\n\t\t\t\t\tbytesPermanentlyDeleted={integrity.bytesPermanentlyDeleted}\n\t\t\t\t/>\n\t\t\t\t<ConfigSummaryCard\n\t\t\t\t\ttier={tier}\n\t\t\t\t\tpresetTier={d.presetTier}\n\t\t\t\t\tpressure={d.pressure}\n\t\t\t\t\tthresholdTokens={cfg.thresholdTokens}\n\t\t\t\t\ttierPct={cfg.tierPct}\n\t\t\t\t\tcontextWindow={context.contextWindow}\n\t\t\t\t\tfastGatePct={cfg.fastGatePct}\n\t\t\t\t\tauto={cfg.auto}\n\t\t\t\t\tanchorUserMessages={cfg.anchorUserMessages}\n\t\t\t\t/>\n\t\t\t\t{model && (\n\t\t\t\t\t<CacheStatusPerModel\n\t\t\t\t\t\tname={model.name}\n\t\t\t\t\t\tprovider={model.providerName || model.provider}\n\t\t\t\t\t\tinputRate={model.inputRate}\n\t\t\t\t\t\toutputRate={model.outputRate}\n\t\t\t\t\t\trepoTokensFreed={compression.repo.tokensFreed}\n\t\t\t\t\t\tcontextWindow={context.contextWindow}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<SessionInfo\n\t\t\t\t\tactiveAgents={crew.activeAgents}\n\t\t\t\t\tcurrentTurn={crew.currentTurn}\n\t\t\t\t/>\n\t\t\t\t<CacheHitsCard\n\t\t\t\t\tcacheHitsSession={cacheHits.session}\n\t\t\t\t\tcacheHitsTotal={cacheHits.total}\n\t\t\t\t\ttokensSavedSession={cacheHits.sessionTokensSaved}\n\t\t\t\t\ttokensSavedTotal={cacheHits.totalTokensSaved}\n\t\t\t\t\tcompactionsSession={compacts.session}\n\t\t\t\t\tcompactionsTotal={compacts.total}\n\t\t\t\t/>\n\t\t\t\t<TimeSavedCard\n\t\t\t\t\tcompactSessionSec={timeSaved.compact.sessionSec}\n\t\t\t\t\tcompactTotalSec={timeSaved.compact.totalSec}\n\t\t\t\t\tcacheHitSessionSec={timeSaved.cacheHit.sessionSec}\n\t\t\t\t\tcacheHitTotalSec={timeSaved.cacheHit.totalSec}\n\t\t\t\t/>\n\t\t\t\t<LegendCard />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"names":["severityClass","percent","ContextGauge","tokens","contextWindow","pct","fillWidth","cls","label","jsxs","jsx","REPO_PALETTE","hashString","str","hash","i","colorForRepo","basename","repoBasename","repoRoot","trimmed","parts","aggregateRepos","sessions","map","s","key","existing","repos","totalTokens","sum","r","maxWindow","max","fmtTokens","n","RepoContextStack","loading","error","activeSessions","sessionCount","combinedPct","pctOfTotal","widthPct","tooltip","Bullet","state","TriggerStatus","armed","ready","armedState","readyState","stateText","compressClass","sp","StatRow","value","title","VectorStoreCard","props","barCls","barWidth","compressSub","fmtPctFromFraction","RepoAllSessionsCard","DataSafetyCard","fmtBytes","ConfigSummaryCard","pressurePct","thresholdTxt","CacheStatusPerModel","repoSaved","usd","windows","win","usdStr","windowsStr","SessionInfo","activeAgents","currentTurn","status","LEGEND_ITEMS","LegendCard","isSessionSample","e","formatUpdatedAt","ts","OverviewTab","snapshot","sessionsData","sessionsErr","sessionsLoading","refetchSessions","useApi","useCallback","fetchSessions","events","useSSE","sampleEvents","useMemo","lastSampleTs","useEffect","d","context","compression","trigger","session","store","tier","updatedAt","cfg","crew","integrity","cacheHits","compacts","timeSaved","repo","model","CacheHitsCard","TimeSavedCard"],"mappings":"2KAmBA,SAASA,EAAcC,EAAyB,CAC/C,OAAIA,GAAW,GAAW,YACtBA,GAAW,GAAW,eACnB,aACR,CAEO,SAASC,EAAa,CAC5B,OAAAC,EACA,QAAAF,EACA,cAAAG,CACD,EAA0C,CACzC,MAAMC,EAAMJ,GAAW,EACjBK,EAAY,KAAK,IAAID,EAAK,CAAC,EAC3BE,EAAMP,EAAcK,CAAG,EAKvBG,EAAQ,GAHbL,GAAW,KACRA,EAAO,iBACP,GACmB,MAAMC,EAAc,gBAAgB,UAE3D,OACCK,EAAAA,KAAC,MAAA,CAAI,UAAU,qBACd,SAAA,CAAAA,OAAC,KAAA,CAAG,SAAA,CAAA,oBAAkBJ,EAAI,GAAA,EAAC,EAC3BK,EAAAA,IAAC,MAAA,CACA,UAAW,aAAaH,CAAG,GAC3B,KAAK,QACL,gBAAeF,EACf,gBAAe,EACf,gBAAe,IAEf,SAAAK,EAAAA,IAAC,MAAA,CAAI,UAAU,aAAa,MAAO,CAAE,MAAO,GAAGJ,CAAS,GAAA,CAAI,CAAG,CAAA,CAAA,EAEhEI,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAe,SAAAF,CAAA,CAAM,CAAA,EACnC,CAEF,CCpBA,MAAMG,EAAsC,CAC3C,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACD,EAMA,SAASC,EAAWC,EAAqB,CACxC,IAAIC,EAAO,KACX,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAC/BD,GAASA,GAAQ,GAAKA,EAAOD,EAAI,WAAWE,CAAC,IAAO,EAErD,OAAOD,CACR,CAMA,SAASE,EAAaC,EAA0B,CAC/C,OAAKA,EACEN,EAAaC,EAAWK,CAAQ,EAAIN,EAAa,MAAM,EADxCA,EAAa,CAAC,CAErC,CAOA,SAASO,EAAaC,EAAiC,CACtD,GAAI,CAACA,EAAU,MAAO,YACtB,MAAMC,EAAUD,EAAS,QAAQ,UAAW,EAAE,EAC9C,GAAI,CAACC,EAAS,MAAO,YACrB,MAAMC,EAAQD,EAAQ,MAAM,OAAO,EAEnC,OADaC,EAAMA,EAAM,OAAS,CAAC,GACpBD,CAChB,CAWA,SAASE,EAAeC,EAKtB,CACD,MAAMC,MAAU,IAChB,UAAWC,KAAKF,EAAU,CACzB,MAAMG,EAAMD,EAAE,UAAY,WACpBtB,EAASsB,EAAE,QAAU,EACrBE,EAAWH,EAAI,IAAIE,CAAG,EAC5B,GAAIC,EACHA,EAAS,QAAUxB,MACb,CACN,MAAMc,EAAWC,EAAaO,EAAE,QAAQ,EACxCD,EAAI,IAAIE,EAAK,CACZ,SAAUD,EAAE,SACZ,SAAAR,EACA,OAAAd,EACA,MAAOa,EAAaC,CAAQ,CAAA,CAC5B,CACF,CACD,CACA,MAAMW,EAAQ,CAAC,GAAGJ,EAAI,QAAQ,EACxBK,EAAcD,EAAM,OAAO,CAACE,EAAKC,IAAMD,EAAMC,EAAE,OAAQ,CAAC,EAGxDC,EAAYT,EAAS,OAC1B,CAACU,EAAKR,IAAM,KAAK,IAAIQ,EAAKR,EAAE,SAAS,EACrC,CAAA,EAED,MAAO,CACN,MAAAG,EACA,YAAAC,EACA,UAAAG,EACA,aAAcT,EAAS,MAAA,CAEzB,CAEA,SAASW,EAAUC,EAAmB,CACrC,OAAIA,GAAK,IAAgB,IAAIA,EAAI,KAAM,QAAQ,CAAC,CAAC,IAC1CA,EAAE,eAAA,CACV,CAEO,SAASC,EAAiB,CAChC,SAAAb,EACA,QAAAc,EACA,MAAAC,CACD,EAAqD,CACpD,GAAIA,EACH,OACC7B,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,yBAAA,CAAuB,EAC3BD,EAAAA,KAAC,MAAA,CAAI,UAAU,iBAAiB,SAAA,CAAA,2BACN6B,EAAM,OAAA,CAAA,CAChC,CAAA,EACD,EAIF,GAAID,GAAW,CAACd,EACf,OACCd,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,yBAAA,CAAuB,EAC3BA,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAiB,SAAA,mBAAA,CAAiB,CAAA,EAClD,EAIF,MAAM6B,EAAiBhB,GAAU,UAAY,CAAA,EACvC,CAAE,MAAAK,EAAO,YAAAC,EAAa,UAAAG,EAAW,aAAAQ,CAAA,EACtClB,EAAeiB,CAAc,EAE9B,GAAIX,EAAM,SAAW,EACpB,OACCnB,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,yBAAA,CAAuB,EAC3BA,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAiB,SAAA,qBAAA,CAAmB,CAAA,EACpD,EAIF,MAAM+B,EACLT,EAAY,EAAI,KAAK,MAAOH,EAAcG,EAAa,GAAG,EAAI,EAE/D,OACCvB,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,yBAAA,CAAuB,EAC3BA,EAAAA,IAAC,MAAA,CACA,UAAU,iBACV,KAAK,QACL,aAAW,yBAEV,SAAAkB,EAAM,IAAK,GAAM,CACjB,MAAMc,EACLb,EAAc,EAAK,EAAE,OAASA,EAAe,IAAM,EAC9Cc,EAAWd,EAAc,EAAIa,EAAa,EAC1CE,EACL,GAAG,EAAE,QAAQ,KAAKV,EAAU,EAAE,MAAM,CAAC,YACjCQ,EAAW,QAAQ,CAAC,CAAC,cAC1B,OACChC,EAAAA,IAAC,MAAA,CAEA,UAAU,qBACV,MAAO,CACN,MAAO,GAAG,KAAK,IAAIiC,EAAU,EAAG,CAAC,IACjC,gBAAiB,EAAE,KAAA,EAEpB,MAAOC,EACP,aAAYA,CAAA,EAPP,EAAE,UAAY,UAAA,CAUtB,CAAC,CAAA,CAAA,EAEFnC,EAAAA,KAAC,IAAA,CAAE,UAAU,mBACX,SAAA,CAAAyB,EAAUL,CAAW,EAAE,kBAAgBD,EAAM,OAAQ,IACrDA,EAAM,SAAW,EAAI,OAAS,QAAQ,KAAG,IACzCY,EAAc,IACdA,IAAiB,EAAI,UAAY,WAAY,IAC9C/B,EAAAA,KAAC,OAAA,CAAK,UAAU,MAAM,SAAA,CAAA,KAAGgC,EAAY,0BAAA,CAAA,CAAwB,CAAA,EAC9D,QACC,MAAA,CAAI,UAAU,oBACb,SAAAb,EAAM,IAAK,GAAM,CACjB,MAAMc,EACLb,EAAc,EAAK,EAAE,OAASA,EAAe,IAAM,EACpD,OACCpB,EAAAA,KAAC,MAAA,CAEA,UAAU,yBAEV,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACA,UAAU,2BACV,MAAO,CAAE,gBAAiB,EAAE,KAAA,CAAM,CAAA,EAEnCA,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,WAAE,SAAS,SACpD,OAAA,CACC,SAAA,CAAAwB,EAAU,EAAE,MAAM,EAAE,KAAGQ,EAAW,QAAQ,CAAC,EAAE,IAAA,CAAA,CAC/C,CAAA,CAAA,EAVK,EAAE,UAAY,UAAA,CAatB,CAAC,CAAA,CACF,CAAA,EACD,CAEF,CClNA,SAASG,EAAO,CACf,MAAAC,EACA,MAAAtC,CACD,EAGuB,CACtB,MAAMD,EACLuC,IAAU,KAAO,YAAcA,IAAU,KAAO,YAAc,aAC/D,OACCrC,EAAAA,KAAC,MAAA,CAAI,UAAW,UAAUF,CAAG,GAC5B,SAAA,CAAAG,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAa,cAAY,OAAO,EAChDA,EAAAA,IAAC,OAAA,CAAK,UAAU,eAAgB,SAAAF,CAAA,CAAM,CAAA,EACvC,CAEF,CAEO,SAASuC,EAAc,CAC7B,MAAAC,EACA,MAAAC,CACD,EAA2C,CAG1C,MAAMC,EAA0BF,EAAQ,KAAO,MACzCG,EAA0BF,EAC7B,KACCD,EAEA,MADA,KAGEI,EAAYH,EACf,6CACAD,EACC,0CACA,yBAEJ,OACCvC,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,gBAAA,CAAc,EAClBD,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAACmC,EAAA,CAAO,MAAOK,EAAY,MAAM,QAAQ,EACzCxC,EAAAA,IAACmC,EAAA,CAAO,MAAOM,EAAY,MAAM,OAAA,CAAQ,CAAA,EAC1C,EACAzC,EAAAA,IAAC,IAAA,CAAE,UAAU,qBAAsB,SAAA0C,CAAA,CAAU,CAAA,EAC9C,CAEF,CCjCA,SAASC,EAAcC,EAAoB,CAC1C,OAAIA,GAAM,GAAY,cAClBA,GAAM,GAAY,eACf,WACR,CAGA,SAASC,EAAQ,CAChB,MAAA/C,EACA,MAAAgD,EACA,MAAAC,CACD,EAIuB,CACtB,OACChD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,MAAA+C,EAC9B,SAAAjD,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAA8C,CAAA,CAAM,CAAA,EACxC,CAEF,CAEO,SAASE,EACfC,EACqB,CACrB,MAAML,EAAKK,EAAM,eACXC,EAASP,EAAcC,CAAE,EACzBO,EAAW,KAAK,IAAIP,EAAK,IAAK,EAAG,EACjCQ,EAAc,GAAGC,EAAmBT,CAAE,CAAC,0BAA0BS,EAAmBJ,EAAM,QAAQ,CAAC,GAEzG,OACClD,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,wBAAA,CAAsB,EAC1BA,EAAAA,IAAC6C,EAAA,CACA,MAAM,cACN,MAAOI,EAAM,gBAAgB,eAAA,EAC7B,MAAM,sFAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,qBACN,MAAOI,EAAM,SAAS,eAAA,EACtB,MAAM,oJAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,mBACN,MAAOI,EAAM,UAAU,eAAA,EACvB,MAAM,yGAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,QACN,MAAOI,EAAM,YAAY,eAAA,EACzB,MAAM,0DAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,cACb,MAAM,iIAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,mBACN,MAAOQ,EAAmBJ,EAAM,YAAY,EAC5C,MAAM,2EAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,gBACN,MAAOQ,EAAmBJ,EAAM,gBAAgB,EAChD,MAAM,6HAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,YACN,MAAOI,EAAM,eACb,MAAM,gFAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,UACN,MAAOI,EAAM,kBAAoB,IACjC,MAAM,6CAAA,CAAA,EAEPlD,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cACd,SAAAA,EAAAA,IAAC,MAAA,CACA,UAAW,cAAckD,CAAM,GAC/B,MAAO,CAAE,MAAO,GAAGC,CAAQ,GAAA,CAAI,CAAA,EAEjC,EACAnD,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAoD,CAAA,CAAY,CAAA,CAAA,CAC1C,CAAA,EACD,CAEF,CCpGA,SAAST,EAAcC,EAAoB,CAC1C,OAAIA,GAAM,GAAY,cAClBA,GAAM,GAAY,eACf,WACR,CAEA,SAASC,EAAQ,CAChB,MAAA/C,EACA,MAAAgD,CACD,EAGuB,CACtB,OACC/C,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAF,EAAM,EACvCE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAA8C,CAAA,CAAM,CAAA,EACxC,CAEF,CAEO,SAASQ,EACfL,EACqB,CACrB,MAAML,EAAKK,EAAM,eACXC,EAASP,EAAcC,CAAE,EACzBO,EAAW,KAAK,IAAIP,EAAK,IAAK,EAAG,EACjCQ,EAAc,GAAGC,EAAmBT,CAAE,CAAC,0BAA0BS,EAAmBJ,EAAM,QAAQ,CAAC,GAEzG,OACClD,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,qBAAA,CAAmB,EACvBA,EAAAA,IAAC6C,EAAA,CACA,MAAM,cACN,MAAOI,EAAM,gBAAgB,eAAA,CAAe,CAAA,EAE7CjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,SAAS,eAAA,CAAe,CAAA,EAEtCjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,OACN,MAAOI,EAAM,UAAU,eAAA,CAAe,CAAA,EAEvCjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,QACN,MAAOI,EAAM,YAAY,eAAA,CAAe,CAAA,EAEzCjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,aAAa,eAAA,CAAe,CAAA,QAEzCJ,EAAA,CAAQ,MAAM,YAAY,MAAOI,EAAM,eAAgB,EACxDjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,gBACN,MAAOQ,EAAmBJ,EAAM,gBAAgB,CAAA,CAAA,EAEjDlD,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cACd,SAAAA,EAAAA,IAAC,MAAA,CACA,UAAW,cAAckD,CAAM,GAC/B,MAAO,CAAE,MAAO,GAAGC,CAAQ,GAAA,CAAI,CAAA,EAEjC,EACAnD,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAoD,CAAA,CAAY,CAAA,CAAA,CAC1C,CAAA,EACD,CAEF,CChFO,SAASG,GACfN,EACqB,CACrB,OACClD,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,gBAAA,CAAc,EAClBD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,mBAAgB,QAC/C,OAAA,CAAK,UAAU,gBACd,SAAAiD,EAAM,gBAAgB,gBAAe,CACvC,CAAA,EACD,EACAlD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,sBAAmB,QAClD,OAAA,CAAK,UAAU,gBACd,SAAAwD,EAASP,EAAM,uBAAuB,CAAA,CACxC,CAAA,EACD,EACAlD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,mBAAgB,QAC/C,OAAA,CAAK,UAAU,gBACd,SAAAiD,EAAM,oBAAoB,gBAAe,CAC3C,CAAA,EACD,EACAlD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,sBAAmB,QAClD,OAAA,CAAK,UAAU,4BACd,SAAAwD,EAASP,EAAM,uBAAuB,CAAA,CACxC,CAAA,EACD,EACAjD,EAAAA,IAAC,IAAA,CAAE,UAAU,YAAY,SAAA,8HAAA,CAGzB,CAAA,EACD,CAEF,CCxBA,SAAS6C,EAAQ,CAChB,MAAA/C,EACA,MAAAgD,EACA,MAAAC,CACD,EAIuB,CACtB,OACChD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,MAAA+C,EAC9B,SAAAjD,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAA8C,CAAA,CAAM,CAAA,EACxC,CAEF,CAEO,SAASW,GACfR,EACqB,CACrB,MAAMS,EAAc,GAAG,KAAK,OAAOT,EAAM,UAAY,GAAK,GAAG,CAAC,IAE9D,IAAIU,EAAeV,EAAM,gBAAgB,eAAA,EACzC,OAAIA,EAAM,SAAW,MAAQA,EAAM,cAAgB,IAClDU,GAAgB,KAAK,KAAK,MAAMV,EAAM,QAAU,GAAG,CAAC,QAAQA,EAAM,cAAc,eAAA,CAAgB,KAIhGlD,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,eAAA,CAAa,EACjBA,EAAAA,IAAC6C,EAAA,CACA,MAAM,OACN,MAAO,GAAGI,EAAM,IAAI,UACpB,MAAM,mEAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,SACN,MAAOI,EAAM,WACb,MAAM,oGAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,WACN,MAAOa,EACP,MAAM,wHAAA,CAAA,EAEP1D,EAAAA,IAAC6C,EAAA,CACA,MAAM,YACN,MAAOc,EACP,MAAM,oIAAA,CAAA,EAEP3D,EAAAA,IAAC6C,EAAA,CACA,MAAM,YACN,MAAO,GAAGI,EAAM,WAAW,IAC3B,MAAM,uFAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,OACN,MAAOI,EAAM,KAAO,UAAY,UAAA,CAAA,EAEjCjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,SACN,MAAO,OAAOI,EAAM,kBAAkB,CAAA,CAAA,CACvC,EACD,CAEF,CC5EA,SAASJ,EAAQ,CAChB,MAAA/C,EACA,MAAAgD,EACA,MAAAC,CACD,EAIuB,CACtB,OACChD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,MAAA+C,EAC9B,SAAAjD,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAA8C,CAAA,CAAM,CAAA,EACxC,CAEF,CAEO,SAASc,GACfX,EACqB,CACrB,MAAMY,EAAYZ,EAAM,iBAAmB,EAC3C,IAAIa,EAAM,EACNC,EAAU,IAEd,GAAId,EAAM,WAAaY,EAAY,EAAG,CACrCC,EAAMD,EAAYZ,EAAM,UACxB,MAAMe,EAAMf,EAAM,eAAiB,EACnCc,EAAUC,EAAM,GAAKH,EAAYG,GAAK,QAAQ,CAAC,EAAI,GACpD,CAEA,MAAMC,EAAS,MAAMH,EAAI,QAAQ,CAAC,CAAC,SAC7BI,EAAa,GAAGH,CAAO,4BAE7B,OACChE,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,yBAAA,CAA2B,EAC/BA,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAe,SAAAiE,EAAO,EACrCjE,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAe,SAAAkE,EAAW,EACzClE,EAAAA,IAAC6C,EAAA,CACA,MAAM,QACN,MAAOI,EAAM,KACb,MAAM,uEAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,SACb,MAAM,iCAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,aACN,MAAO,IAAII,EAAM,UAAU,QAAQ,CAAC,CAAC,GACrC,MAAM,gDAAA,CAAA,EAEPjD,EAAAA,IAAC6C,EAAA,CACA,MAAM,cACN,MAAO,IAAII,EAAM,WAAW,QAAQ,CAAC,CAAC,GACtC,MAAM,iDAAA,CAAA,CACP,EACD,CAEF,CCvEO,SAASkB,GACflB,EACqB,CACrB,KAAM,CAAE,aAAAmB,EAAc,YAAAC,CAAA,EAAgBpB,EAChCqB,EACLF,EAAe,EAAI,KAAKA,CAAY,WAAa,OAElD,OACCrE,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,eAAA,CAAa,EACjBD,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,gBAAa,EAC7CA,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAoE,CAAA,CAAa,CAAA,EAC/C,EACArE,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,eAAY,EAC5CA,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAqE,CAAA,CAAY,CAAA,EAC9C,EACAtE,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,SAAM,EACtCA,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAsE,CAAA,CAAO,CAAA,CAAA,CACzC,CAAA,EACD,CAEF,CC9BA,MAAMC,GAA+C,QACnD,KAAA,CACA,SAAA,CAAAvE,EAAAA,IAAC,KAAE,SAAA,oBAAA,CAAkB,EAAI,gFAAA,CAAA,EADlB,GAGR,SACC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,KAAE,SAAA,kBAAA,CAAgB,EAAI,0DAAA,CAAA,EADhB,GAGR,SACC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,KAAE,SAAA,OAAA,CAAK,EAAI,4DAAA,CAAA,EADL,GAER,SACC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,KAAE,SAAA,eAAA,CAAa,EAAI,qFAAA,CAAA,EADb,GAGR,SACC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,KAAE,SAAA,iBAAA,CAAe,EAAI,6FAAA,CAAA,EADf,GAGR,SACC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,KAAE,SAAA,aAAA,CAAW,EAAI,qHAAA,CAAA,EADX,GAIR,CACD,EAEO,SAASwE,IAAiC,CAChD,OACCxE,EAAAA,IAAC,MAAA,CAAI,UAAU,mBACd,gBAAC,UAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,WAAQ,SAAA,yBAAA,CAAuB,EAChCA,EAAAA,IAAC,KAAA,CAAG,UAAU,cAAe,SAAAuE,GAAa,EAC1CvE,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAc,SAAA,gDAAA,CAE3B,CAAA,CAAA,CACD,CAAA,CACD,CAEF,CCHA,SAASyE,GAAgBC,EAAoC,CAC5D,OAAOA,EAAE,OAAS,gBACnB,CAQA,SAASC,GAAgBC,EAA2B,CACnD,GAAI,CAACA,EAAI,MAAO,QAChB,GAAI,CACH,OAAO,IAAI,KAAKA,CAAE,EAAE,eAAA,CACrB,MAAQ,CACP,OAAOA,CACR,CACD,CAEA,SAAwBC,GAAY,CACnC,SAAAC,EACA,QAAAnD,EACA,MAAAC,CACD,EAAyC,CAGxC,KAAM,CACL,KAAMmD,EACN,MAAOC,EACP,QAASC,EACT,QAASC,CAAA,EACNC,EACHC,cAAY,IAAMC,EAAA,EAAiB,EAAE,EACrC,CAAE,aAAc,GAAA,CAAM,EAGjB,CAAE,OAAAC,CAAA,EAAWC,EAAA,EAEbC,EAAeC,EAAAA,QACpB,IAAMH,EAAO,OAAOb,EAAe,EACnC,CAACa,CAAM,CAAA,EAEFI,EAAeD,EAAAA,QAAQ,IACxBD,EAAa,SAAW,EAAU,KAC/BA,EAAaA,EAAa,OAAS,CAAC,EAAE,GAC3C,CAACA,CAAY,CAAC,EAOjB,GALAG,EAAAA,UAAU,IAAM,CACXD,GAAgB,MACpBR,EAAA,CACD,EAAG,CAACQ,EAAcR,CAAe,CAAC,EAE9BvD,GAAW,CAACmD,EACf,OAAO9E,EAAAA,IAAC,MAAA,CAAI,UAAU,WAAW,SAAA,oBAAiB,EACnD,GAAI4B,GAAS,CAACkD,EACb,OAAO/E,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,SAAA,CAAA,UAAQ6B,EAAM,OAAA,EAAQ,EACxD,GAAI,CAACkD,EAAU,aAAQ,MAAA,CAAI,UAAU,WAAW,SAAA,oBAAiB,EAGjE,MAAMc,EAAId,EACJ,CAAE,QAAAe,EAAS,YAAAC,EAAa,QAAAC,EAAS,QAAAC,EAAS,MAAAC,EAAO,KAAAC,EAAM,UAAAC,GAC5DP,EACKQ,EAAMR,EAAE,OACRS,EAAOT,EAAE,KACTU,EAAYV,EAAE,UACdW,EAAYX,EAAE,UACdY,EAAWZ,EAAE,SACba,EAAYb,EAAE,UACdc,EAAOd,EAAE,KACTe,EAAQf,EAAE,MAEhB,OACC7F,EAAAA,KAAC,MAAA,CAAI,UAAU,eACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAkG,EAAK,EAClCnG,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAU,SAAA,CAAA,WAAS4E,GAAgBwB,CAAS,CAAA,CAAA,CAAE,CAAA,EAC/D,EACApG,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACd,SAAA,CAAAC,EAAAA,IAACR,EAAA,CACA,OAAQqG,EAAQ,OAChB,QAASA,EAAQ,QACjB,cAAeA,EAAQ,aAAA,CAAA,EAExB7F,EAAAA,IAAC0B,EAAA,CACA,SAAUqD,EACV,QAASE,EACT,MAAOD,CAAA,CAAA,EAERhF,EAAAA,IAACqC,EAAA,CACA,MAAO0D,EAAQ,MACf,MAAOA,EAAQ,MACf,cAAeA,EAAQ,cACvB,gBAAiBA,EAAQ,gBACzB,YAAaA,EAAQ,WAAA,CAAA,EAEtB/F,EAAAA,IAACgD,EAAA,CACA,gBAAiBiD,EAAM,gBACvB,SAAUH,EAAY,QAAQ,SAC9B,UAAWA,EAAY,QAAQ,UAC/B,YAAaA,EAAY,QAAQ,YACjC,cAAeG,EAAM,cACrB,aAAcA,EAAM,aACpB,iBAAkBA,EAAM,iBACxB,eAAgBA,EAAM,eACtB,iBAAkBD,EAAQ,iBAC1B,eAAgBF,EAAY,QAAQ,eACpC,SAAUA,EAAY,QAAQ,QAAA,CAAA,EAE/B9F,EAAAA,IAACsD,EAAA,CACA,gBAAiBoD,EAAK,gBACtB,SAAUZ,EAAY,KAAK,SAC3B,UAAWA,EAAY,KAAK,UAC5B,YAAaA,EAAY,KAAK,YAC9B,aAAcY,EAAK,aACnB,eAAgBA,EAAK,eACrB,iBAAkBA,EAAK,iBACvB,eAAgBZ,EAAY,KAAK,eACjC,SAAUA,EAAY,KAAK,QAAA,CAAA,EAE5B9F,EAAAA,IAACuD,GAAA,CACA,gBAAiB+C,EAAU,gBAC3B,wBAAyBA,EAAU,wBACnC,oBAAqBA,EAAU,oBAC/B,wBAAyBA,EAAU,uBAAA,CAAA,EAEpCtG,EAAAA,IAACyD,GAAA,CACA,KAAAyC,EACA,WAAYN,EAAE,WACd,SAAUA,EAAE,SACZ,gBAAiBQ,EAAI,gBACrB,QAASA,EAAI,QACb,cAAeP,EAAQ,cACvB,YAAaO,EAAI,YACjB,KAAMA,EAAI,KACV,mBAAoBA,EAAI,kBAAA,CAAA,EAExBO,GACA3G,EAAAA,IAAC4D,GAAA,CACA,KAAM+C,EAAM,KACZ,SAAUA,EAAM,cAAgBA,EAAM,SACtC,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,gBAAiBb,EAAY,KAAK,YAClC,cAAeD,EAAQ,aAAA,CAAA,EAGzB7F,EAAAA,IAACmE,GAAA,CACA,aAAckC,EAAK,aACnB,YAAaA,EAAK,WAAA,CAAA,EAEnBrG,EAAAA,IAAC4G,EAAA,CACA,iBAAkBL,EAAU,QAC5B,eAAgBA,EAAU,MAC1B,mBAAoBA,EAAU,mBAC9B,iBAAkBA,EAAU,iBAC5B,mBAAoBC,EAAS,QAC7B,iBAAkBA,EAAS,KAAA,CAAA,EAE5BxG,EAAAA,IAAC6G,EAAA,CACA,kBAAmBJ,EAAU,QAAQ,WACrC,gBAAiBA,EAAU,QAAQ,SACnC,mBAAoBA,EAAU,SAAS,WACvC,iBAAkBA,EAAU,SAAS,QAAA,CAAA,QAErCjC,GAAA,CAAA,CAAW,CAAA,CAAA,CACb,CAAA,EACD,CAEF"}
|