pi-mega-compact 0.8.18 → 0.8.19
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/extensions/mega-events/context-handler.js +22 -8
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-CNWZ5NjP.js → AchievementTiles-DVgFowc-.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AchievementTiles-CNWZ5NjP.js.map → AchievementTiles-DVgFowc-.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/AchievementsTab-Bg86TWPU.js +2 -0
- package/extensions/dashboard-client/dist/assets/{AchievementsTab-BKPifNKj.js.map → AchievementsTab-Bg86TWPU.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab--epzrQHD.js → CacheTab-DBzoH_q_.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab--epzrQHD.js.map → CacheTab-DBzoH_q_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ConfigTab-D3ralwSj.js → ConfigTab-Bj12LgTh.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ConfigTab-D3ralwSj.js.map → ConfigTab-Bj12LgTh.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-BKkuVQsM.js → EventsTab-EC0wMsp_.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-BKkuVQsM.js.map → EventsTab-EC0wMsp_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{GameTab-CgUvITYy.js → GameTab-CISQitbu.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{GameTab-CgUvITYy.js.map → GameTab-CISQitbu.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DrlJqXGL.js → MetricsTab-us4vVG5D.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DrlJqXGL.js.map → MetricsTab-us4vVG5D.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/OverviewTab-eJ7vFgBE.js +2 -0
- package/extensions/dashboard-client/dist/assets/OverviewTab-eJ7vFgBE.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{ReposTab-DjEZmqUb.js → ReposTab-CiU9AJkb.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-DjEZmqUb.js.map → ReposTab-CiU9AJkb.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DsYMUzoh.js → SessionsTab-DaCUvTC7.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DsYMUzoh.js.map → SessionsTab-DaCUvTC7.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BbAXT1wO.js → TimeSavedCard-BAUSCzq5.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BbAXT1wO.js.map → TimeSavedCard-BAUSCzq5.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-CnRzusfi.js → index-5MPZyayK.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-CnRzusfi.js.map → index-5MPZyayK.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-BTft6DM_.css → index-CDkmYP9l.css} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-Bf-1rZ2N.js → useSSE-BSpmWZZi.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-Bf-1rZ2N.js.map → useSSE-BSpmWZZi.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +2 -2
- package/extensions/dashboard-client/src/components/RepoContextStack.tsx +238 -0
- package/extensions/dashboard-client/src/main.tsx +1 -0
- package/extensions/dashboard-client/src/styles/repostack.css +87 -0
- package/extensions/dashboard-client/src/tabs/OverviewTab.tsx +49 -1
- package/extensions/mega-events/context-handler.ts +40 -18
- package/package.json +1 -1
- package/extensions/dashboard-client/dist/assets/AchievementsTab-BKPifNKj.js +0 -2
- package/extensions/dashboard-client/dist/assets/OverviewTab-_gD756wJ.js +0 -2
- package/extensions/dashboard-client/dist/assets/OverviewTab-_gD756wJ.js.map +0 -1
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import { epochIdFor } from "../../src/mirror/epoch.js";
|
|
22
22
|
import { autoCompactCheck } from "../../src/compact.js";
|
|
23
23
|
import { estimateSessionTokens } from "../../src/tokens.js";
|
|
24
|
-
import {
|
|
24
|
+
import type { MegaRuntime } from "../mega-runtime.js";
|
|
25
25
|
import { runCompact, piCompactWouldNoop } from "../mega-pipeline.js";
|
|
26
26
|
import { computeLiveTrimCut, liveTrimSummaryMessage } from "../mega-trim.js";
|
|
27
27
|
import {
|
|
@@ -42,13 +42,19 @@ function toRawTranscriptRow(
|
|
|
42
42
|
epochId: string,
|
|
43
43
|
): RawTranscriptRow | null {
|
|
44
44
|
// Narrow to Message union (has content + timestamp).
|
|
45
|
-
const m = msg as {
|
|
45
|
+
const m = msg as {
|
|
46
|
+
role?: string;
|
|
47
|
+
content?: unknown;
|
|
48
|
+
timestamp?: number;
|
|
49
|
+
toolName?: string;
|
|
50
|
+
};
|
|
46
51
|
const content = m.content;
|
|
47
52
|
if (content == null || content === "") return null;
|
|
48
53
|
// Canonical form: sort object keys for deterministic hashing.
|
|
49
|
-
const contentBytes =
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
const contentBytes =
|
|
55
|
+
typeof content === "string"
|
|
56
|
+
? content
|
|
57
|
+
: JSON.stringify(content, Object.keys(content as object).sort());
|
|
52
58
|
const contentHash = createHash("sha256").update(contentBytes).digest("hex");
|
|
53
59
|
return {
|
|
54
60
|
contentHash,
|
|
@@ -85,21 +91,32 @@ export function registerContextHandler(
|
|
|
85
91
|
pi.on("context", async (event: ContextEvent, ctx: ExtensionContext) => {
|
|
86
92
|
const usage = ctx.getContextUsage();
|
|
87
93
|
const pct = usage?.percent;
|
|
94
|
+
const messages = event.messages;
|
|
88
95
|
// Always track context for the dashboard/widget, even when auto is off.
|
|
89
96
|
// (v0.8 regression: !config.auto gate sat above this, leaving ctx stats
|
|
90
97
|
// null -> widget '?% / ?/?' when auto disabled. Track first, THEN gate.)
|
|
91
|
-
|
|
98
|
+
// S40 fix: fall back to estimateSessionTokens(view) when the provider
|
|
99
|
+
// doesn't report tokens (e.g. plexus / claude-mythos-5 via OpenRouter).
|
|
100
|
+
// Without this, lastCtxTokens is null -> appendTokenSample (S39) never
|
|
101
|
+
// fires -> Sessions chart + Overview per-repo stack + ContextGauge all
|
|
102
|
+
// show empty/zero. Compute view lazily only when the fallback is needed
|
|
103
|
+
// (at most one engineView call per context event; when auto is on and
|
|
104
|
+
// usage.tokens is present, view is computed once below via reuse).
|
|
105
|
+
const viewForFallback =
|
|
106
|
+
usage?.tokens == null ? runtime.engineView(messages) : null;
|
|
107
|
+
const currentTokens =
|
|
108
|
+
usage?.tokens ??
|
|
109
|
+
(viewForFallback != null
|
|
110
|
+
? estimateSessionTokens(viewForFallback)
|
|
111
|
+
: null) ??
|
|
112
|
+
Math.round(((pct ?? 0) / 100) * (usage?.contextWindow ?? 0));
|
|
113
|
+
runtime.lastCtxTokens = currentTokens ?? null;
|
|
92
114
|
runtime.lastCtxPercent = pct ?? null;
|
|
93
115
|
runtime.lastCtxWindow = usage?.contextWindow ?? 0;
|
|
94
116
|
runtime.snapshot(ctx);
|
|
95
117
|
if (!config.auto) return;
|
|
96
118
|
|
|
97
|
-
const
|
|
98
|
-
const view = runtime.engineView(messages);
|
|
99
|
-
const currentTokens =
|
|
100
|
-
usage?.tokens ??
|
|
101
|
-
estimateSessionTokens(view) ??
|
|
102
|
-
Math.round(((pct ?? 0) / 100) * (usage?.contextWindow ?? 0));
|
|
119
|
+
const view = viewForFallback ?? runtime.engineView(messages);
|
|
103
120
|
|
|
104
121
|
// S27 DB-mirror: append ALL incoming messages to raw_transcript.
|
|
105
122
|
// Runs BEFORE fast-gate so every message is captured, even if we
|
|
@@ -178,7 +195,7 @@ export function registerContextHandler(
|
|
|
178
195
|
pct != null && runtime.trimCache.ctxPct != null
|
|
179
196
|
? pct - runtime.trimCache.ctxPct >= RECOMPACT_PCT_DELTA
|
|
180
197
|
: currentTokens - (runtime.trimCache.ctxTokens ?? 0) >=
|
|
181
|
-
|
|
198
|
+
runtime.effectiveThreshold * 0.5;
|
|
182
199
|
if (!grewEnough) {
|
|
183
200
|
const recent = messages.slice(runtime.trimCache.cut); // guardrails-allow PREVENT-PI-002: cached `cut` was sanitized once by computeLiveTrimCut (src/boundary.ts) and replayed verbatim; the transcript only grows within an epoch (cache is cleared on durable truncation), so the preserved run still starts on a toolPair-safe index.
|
|
184
201
|
runtime.diagLiveTrimFires++; // trim view returned this call (replay counts as a fire)
|
|
@@ -186,7 +203,9 @@ export function registerContextHandler(
|
|
|
186
203
|
runtime.snapshot(ctx);
|
|
187
204
|
// v0.8.7: shallow-copy the cached summary so pi's transformContext can't
|
|
188
205
|
// mutate the shared reference across replays (audit P3).
|
|
189
|
-
return {
|
|
206
|
+
return {
|
|
207
|
+
messages: [{ ...runtime.trimCache.summaryAgentMsg }, ...recent],
|
|
208
|
+
};
|
|
190
209
|
}
|
|
191
210
|
// else: context grew enough → fall through to re-compact (cache is stale)
|
|
192
211
|
}
|
|
@@ -195,7 +214,10 @@ export function registerContextHandler(
|
|
|
195
214
|
// with how close we are to the model context limit. Null-safe: when the
|
|
196
215
|
// token-fallback path ran (pct unavailable) use the token-basis pressure
|
|
197
216
|
// (the same basis the runtime `pressure` getter uses for custom/no-window).
|
|
198
|
-
const pressure =
|
|
217
|
+
const pressure =
|
|
218
|
+
pct != null
|
|
219
|
+
? pressureFromPct(pct)
|
|
220
|
+
: pressureRatio(currentTokens, runtime.effectiveThreshold);
|
|
199
221
|
const ran = runCompact(pi, runtime, config, ctx, messages, {
|
|
200
222
|
compressionPressure: pressure,
|
|
201
223
|
});
|
|
@@ -269,9 +291,9 @@ export function registerContextHandler(
|
|
|
269
291
|
setTimeout(() => {
|
|
270
292
|
try {
|
|
271
293
|
if (runtime.rt.sessionId !== liveSid) return; // session reset
|
|
272
|
-
const since2 =
|
|
273
|
-
|
|
274
|
-
|
|
294
|
+
const since2 = Date.now() - (runtime.rt.lastNativeCompactAt ?? 0);
|
|
295
|
+
if (runtime.rt.lastNativeCompactAt !== stamp && since2 < cooldownMs)
|
|
296
|
+
return;
|
|
275
297
|
if (piCompactWouldNoop(ctx)) return;
|
|
276
298
|
ctx.compact({
|
|
277
299
|
customInstructions: undefined,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-mega-compact",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.19",
|
|
4
4
|
"description": "Layered, local, vector-backed context compressor for pi — supersede/collapse/cluster compaction with deduped inline recall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "BSD-2-Clause",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as t,g as m,j as s}from"./index-CnRzusfi.js";import{A as v}from"./AchievementTiles-CNWZ5NjP.js";function x(){const[r,o]=t.useState([]),[l,u]=t.useState(!0),[a,n]=t.useState(null),c=t.useCallback(async()=>{try{const e=await m();o(e),n(null)}catch(e){n(e instanceof Error?e:new Error(String(e)))}finally{u(!1)}},[]);return t.useEffect(()=>{let e=!0;const i=async()=>{e&&await c()};i();const h=setInterval(()=>void i(),15e3);return()=>{e=!1,clearInterval(h)}},[c]),l&&r.length===0?s.jsx("div",{className:"tab-stub",children:"Loading achievements…"}):a&&r.length===0?s.jsxs("div",{className:"tab-stub",children:["Error: ",a.message]}):s.jsxs("div",{className:"achievements-tab",children:[s.jsx("h2",{children:"Achievements"}),s.jsx(v,{achievements:r})]})}export{x as default};
|
|
2
|
-
//# sourceMappingURL=AchievementsTab-BKPifNKj.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./index-CnRzusfi.js";import{f as u,a as k,C as T,T as R}from"./TimeSavedCard-BbAXT1wO.js";function P(t){return t>=90?"gauge-red":t>=70?"gauge-yellow":"gauge-green"}function $({tokens:t,percent:s,contextWindow:n}){const a=s??0,o=Math.max(a,1),l=P(a),f=`${t!=null?t.toLocaleString():"?"} / ${n.toLocaleString()} tokens`;return e.jsxs("div",{className:"card context-gauge",children:[e.jsxs("h3",{children:["Context Window — ",a,"%"]}),e.jsx("div",{className:`gauge-bar ${l}`,role:"meter","aria-valuenow":a,"aria-valuemin":0,"aria-valuemax":100,children:e.jsx("div",{className:"gauge-fill",style:{width:`${o}%`}})}),e.jsx("p",{className:"gauge-label",children:f})]})}function y({state:t,label:s}){const n=t==="on"?"bullet-on":t==="na"?"bullet-na":"bullet-off";return e.jsxs("div",{className:`bullet ${n}`,children:[e.jsx("span",{className:"bullet-dot","aria-hidden":"true"}),e.jsx("span",{className:"bullet-label",children:s})]})}function D({armed:t,ready:s}){const n=t?"on":"off",a=s?"on":t?"off":"na",o=s?"THRESHOLD EXCEEDED — compacting next event":t?"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(y,{state:n,label:"Armed"}),e.jsx(y,{state:a,label:"Ready"})]}),e.jsx("p",{className:"trigger-state-text",children:o})]})}function L(t){return t>=.9?"meter-green":t>=.6?"meter-yellow":"meter-red"}function r({label:t,value:s,title:n}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",title:n,children:t}),e.jsx("span",{className:"ov-stat-value",children:s})]})}function F(t){const s=t.compressionPct,n=L(s),a=Math.max(s*100,.5),o=`${u(s)} tokens saved · dedup: ${u(t.dedupPct)}`;return e.jsxs("div",{className:"card vector-store-card",children:[e.jsx("h3",{children:"Vector Store (session)"}),e.jsx(r,{label:"Checkpoints",value:t.checkpointCount.toLocaleString(),title:"A saved summary of a chunk of your conversation that was compacted to free up space."}),e.jsx(r,{label:"Original (dropped)",value:t.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(r,{label:"Kept (summaries)",value:t.tokensOut.toLocaleString(),title:"Compact summaries we are currently holding as 'memory' for this session (the 'out'). Smaller is better."}),e.jsx(r,{label:"Freed",value:t.tokensFreed.toLocaleString(),title:"Conversation space freed = dropped − kept (the 'saved')."}),e.jsx(r,{label:"Injected",value:t.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(r,{label:"Recall Relevance",value:u(t.dedupHitRate),title:"Of the times we recalled old context, how often it was actually on-topic."}),e.jsx(r,{label:"Storage Dedup",value:u(t.storageDedupRate),title:"How often new content matched something we already had, so we skipped storing a duplicate copy. Higher = less wasted space."}),e.jsx(r,{label:"Collapsed",value:t.dedupCollapsed,title:"How many duplicate chunks we collapsed into one instead of storing separately."}),e.jsx(r,{label:"Last ID",value:t.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 ${n}`,style:{width:`${a}%`}})}),e.jsx("span",{className:"meter-sub",children:o})]})]})}function H(t){return t>=.9?"meter-green":t>=.6?"meter-yellow":"meter-red"}function c({label:t,value:s}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",children:t}),e.jsx("span",{className:"ov-stat-value",children:s})]})}function O(t){const s=t.compressionPct,n=H(s),a=Math.max(s*100,.5),o=`${u(s)} tokens saved · dedup: ${u(t.dedupPct)}`;return e.jsxs("div",{className:"card repo-sessions-card",children:[e.jsx("h3",{children:"Repo (all sessions)"}),e.jsx(c,{label:"Checkpoints",value:t.checkpointCount.toLocaleString()}),e.jsx(c,{label:"Original",value:t.tokensIn.toLocaleString()}),e.jsx(c,{label:"Kept",value:t.tokensOut.toLocaleString()}),e.jsx(c,{label:"Freed",value:t.tokensFreed.toLocaleString()}),e.jsx(c,{label:"Sessions",value:t.sessionCount.toLocaleString()}),e.jsx(c,{label:"Collapsed",value:t.dedupCollapsed}),e.jsx(c,{label:"Storage Dedup",value:u(t.storageDedupRate)}),e.jsxs("div",{className:"ov-compression-meter",children:[e.jsx("div",{className:"meter-track",children:e.jsx("div",{className:`meter-fill ${n}`,style:{width:`${a}%`}})}),e.jsx("span",{className:"meter-sub",children:o})]})]})}function W(t){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:t.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:k(t.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:t.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:k(t.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 d({label:t,value:s,title:n}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",title:n,children:t}),e.jsx("span",{className:"ov-stat-value",children:s})]})}function I(t){const s=`${Math.round((t.pressure??0)*100)}%`;let n=t.thresholdTokens.toLocaleString();return t.tierPct!=null&&t.contextWindow>0&&(n+=` (${Math.round(t.tierPct*100)}% of ${t.contextWindow.toLocaleString()})`),e.jsxs("div",{className:"card config-summary-card",children:[e.jsx("h3",{children:"Configuration"}),e.jsx(d,{label:"Tier",value:`${t.tier} (live)`,title:"Live pressure band — climbs low→mega as context fills the window."}),e.jsx(d,{label:"Preset",value:t.presetTier,title:"The env-resolved base compaction preset (low/medium/high/ultra/mega) that set the token threshold."}),e.jsx(d,{label:"Pressure",value:s,title:"Live pressure = currentTokens / threshold — % of the model context window (threshold fires at the tier's % of window)."}),e.jsx(d,{label:"Threshold",value:n,title:"Compaction threshold = tierPct × model context window — mega-compact trims BELOW pi's native ~80% auto-compact for any model size."}),e.jsx(d,{label:"Fast Gate",value:`${t.fastGatePct}%`,title:"Fast-gate arming floor — the live trim arms once context passes this % of the window."}),e.jsx(d,{label:"Auto",value:t.auto?"enabled":"disabled"}),e.jsx(d,{label:"Anchor",value:String(t.anchorUserMessages)})]})}function b({label:t,value:s,title:n}){return e.jsxs("div",{className:"ov-stat-row",children:[e.jsx("span",{className:"ov-stat-label",title:n,children:t}),e.jsx("span",{className:"ov-stat-value",children:s})]})}function A(t){const s=t.repoTokensFreed||0;let n=0,a="0";if(t.inputRate&&s>0){n=s*t.inputRate;const i=t.contextWindow||0;a=i>0?(s/i).toFixed(1):"0"}const o=`≈ $${n.toFixed(4)} saved`,l=`${a} 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:o}),e.jsx("div",{className:"ov-cost-sub",children:l}),e.jsx(b,{label:"Model",value:t.name,title:"The model pi is currently using — its pricing drives the cost figure."}),e.jsx(b,{label:"Provider",value:t.provider,title:"The provider serving the model."}),e.jsx(b,{label:"Input Rate",value:`$${t.inputRate.toFixed(6)}`,title:"USD per input token, from the model's pricing."}),e.jsx(b,{label:"Output Rate",value:`$${t.outputRate.toFixed(6)}`,title:"USD per output token, from the model's pricing."})]})}function E(t){const{activeAgents:s,currentTurn:n}=t,a=s>0?`▶ ${s} 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:s})]}),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:n})]}),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:a})]})]})}const M=[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 G(){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:M}),e.jsx("p",{className:"legend-note",children:"Hover any label above for a quick explanation."})]})})}function B(t){if(!t)return"never";try{return new Date(t).toLocaleString()}catch{return t}}function z({snapshot:t,loading:s,error:n}){if(s&&!t)return e.jsx("div",{className:"tab-stub",children:"Loading snapshot…"});if(n&&!t)return e.jsxs("div",{className:"tab-stub",children:["Error: ",n.message]});if(!t)return e.jsx("div",{className:"tab-stub",children:"No snapshot data."});const a=t,{context:o,compression:l,trigger:i,session:f,store:h,tier:w,updatedAt:C}=a,v=a.config,N=a.crew,x=a.integrity,p=a.cacheHits,S=a.compacts,j=a.timeSaved,g=a.repo,m=a.model;return e.jsxs("div",{className:"overview-tab",children:[e.jsxs("div",{className:"overview-header",children:[e.jsx("span",{className:"tier-pill",children:w}),e.jsxs("span",{className:"updated",children:["updated ",B(C)]})]}),e.jsxs("div",{className:"card-grid overview-card-grid",children:[e.jsx($,{tokens:o.tokens,percent:o.percent,contextWindow:o.contextWindow}),e.jsx(D,{armed:i.armed,ready:i.ready,currentTokens:i.currentTokens,thresholdTokens:i.thresholdTokens,fastGatePct:i.fastGatePct}),e.jsx(F,{checkpointCount:h.checkpointCount,tokensIn:l.session.tokensIn,tokensOut:l.session.tokensOut,tokensFreed:l.session.tokensFreed,injectedCount:h.injectedCount,dedupHitRate:h.dedupHitRate,storageDedupRate:h.storageDedupRate,dedupCollapsed:h.dedupCollapsed,lastCheckpointId:f.lastCheckpointId,compressionPct:l.session.compressionPct,dedupPct:l.session.dedupPct}),e.jsx(O,{checkpointCount:g.checkpointCount,tokensIn:l.repo.tokensIn,tokensOut:l.repo.tokensOut,tokensFreed:l.repo.tokensFreed,sessionCount:g.sessionCount,dedupCollapsed:g.dedupCollapsed,storageDedupRate:g.storageDedupRate,compressionPct:l.repo.compressionPct,dedupPct:l.repo.dedupPct}),e.jsx(W,{regionsRetained:x.regionsRetained,compressedOriginalBytes:x.compressedOriginalBytes,duplicatesCollapsed:x.duplicatesCollapsed,bytesPermanentlyDeleted:x.bytesPermanentlyDeleted}),e.jsx(I,{tier:w,presetTier:a.presetTier,pressure:a.pressure,thresholdTokens:v.thresholdTokens,tierPct:v.tierPct,contextWindow:o.contextWindow,fastGatePct:v.fastGatePct,auto:v.auto,anchorUserMessages:v.anchorUserMessages}),m&&e.jsx(A,{name:m.name,provider:m.providerName||m.provider,inputRate:m.inputRate,outputRate:m.outputRate,repoTokensFreed:l.repo.tokensFreed,contextWindow:o.contextWindow}),e.jsx(E,{activeAgents:N.activeAgents,currentTurn:N.currentTurn}),e.jsx(T,{cacheHitsSession:p.session,cacheHitsTotal:p.total,tokensSavedSession:p.sessionTokensSaved,tokensSavedTotal:p.totalTokensSaved,compactionsSession:S.session,compactionsTotal:S.total}),e.jsx(R,{compactSessionSec:j.compact.sessionSec,compactTotalSec:j.compact.totalSec,cacheHitSessionSec:j.cacheHit.sessionSec,cacheHitTotalSec:j.cacheHit.totalSec}),e.jsx(G,{})]})]})}export{z as default};
|
|
2
|
-
//# sourceMappingURL=OverviewTab-_gD756wJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OverviewTab-_gD756wJ.js","sources":["../../src/components/ContextGauge.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/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 type { SnapshotResponse } from \"@contracts\";\nimport type { RuntimeSnapshot } from \"../utils/types\";\nimport { ContextGauge } from \"../components/ContextGauge\";\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\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\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<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","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","formatUpdatedAt","ts","OverviewTab","snapshot","loading","error","d","context","compression","trigger","session","store","tier","updatedAt","cfg","crew","integrity","cacheHits","compacts","timeSaved","repo","model","CacheHitsCard","TimeSavedCard"],"mappings":"6GAmBA,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,CC3BA,SAASG,EAAO,CACf,MAAAC,EACA,MAAAJ,CACD,EAGuB,CACtB,MAAMD,EACLK,IAAU,KAAO,YAAcA,IAAU,KAAO,YAAc,aAC/D,OACCH,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,SAASK,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,OACCL,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,gBAAA,CAAc,EAClBD,EAAAA,KAAC,MAAA,CAAI,UAAU,aACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAO,MAAOK,EAAY,MAAM,QAAQ,EACzCN,EAAAA,IAACC,EAAA,CAAO,MAAOM,EAAY,MAAM,OAAA,CAAQ,CAAA,EAC1C,EACAP,EAAAA,IAAC,IAAA,CAAE,UAAU,qBAAsB,SAAAQ,CAAA,CAAU,CAAA,EAC9C,CAEF,CCjCA,SAASC,EAAcC,EAAoB,CAC1C,OAAIA,GAAM,GAAY,cAClBA,GAAM,GAAY,eACf,WACR,CAGA,SAASC,EAAQ,CAChB,MAAAb,EACA,MAAAc,EACA,MAAAC,CACD,EAIuB,CACtB,OACCd,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,MAAAa,EAC9B,SAAAf,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAY,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,OACChB,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,wBAAA,CAAsB,EAC1BA,EAAAA,IAACW,EAAA,CACA,MAAM,cACN,MAAOI,EAAM,gBAAgB,eAAA,EAC7B,MAAM,sFAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,qBACN,MAAOI,EAAM,SAAS,eAAA,EACtB,MAAM,oJAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,mBACN,MAAOI,EAAM,UAAU,eAAA,EACvB,MAAM,yGAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,QACN,MAAOI,EAAM,YAAY,eAAA,EACzB,MAAM,0DAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,cACb,MAAM,iIAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,mBACN,MAAOQ,EAAmBJ,EAAM,YAAY,EAC5C,MAAM,2EAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,gBACN,MAAOQ,EAAmBJ,EAAM,gBAAgB,EAChD,MAAM,6HAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,YACN,MAAOI,EAAM,eACb,MAAM,gFAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,UACN,MAAOI,EAAM,kBAAoB,IACjC,MAAM,6CAAA,CAAA,EAEPhB,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cACd,SAAAA,EAAAA,IAAC,MAAA,CACA,UAAW,cAAcgB,CAAM,GAC/B,MAAO,CAAE,MAAO,GAAGC,CAAQ,GAAA,CAAI,CAAA,EAEjC,EACAjB,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAkB,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,MAAAb,EACA,MAAAc,CACD,EAGuB,CACtB,OACCb,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAF,EAAM,EACvCE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAY,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,OACChB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,qBAAA,CAAmB,EACvBA,EAAAA,IAACW,EAAA,CACA,MAAM,cACN,MAAOI,EAAM,gBAAgB,eAAA,CAAe,CAAA,EAE7Cf,EAAAA,IAACW,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,SAAS,eAAA,CAAe,CAAA,EAEtCf,EAAAA,IAACW,EAAA,CACA,MAAM,OACN,MAAOI,EAAM,UAAU,eAAA,CAAe,CAAA,EAEvCf,EAAAA,IAACW,EAAA,CACA,MAAM,QACN,MAAOI,EAAM,YAAY,eAAA,CAAe,CAAA,EAEzCf,EAAAA,IAACW,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,aAAa,eAAA,CAAe,CAAA,QAEzCJ,EAAA,CAAQ,MAAM,YAAY,MAAOI,EAAM,eAAgB,EACxDf,EAAAA,IAACW,EAAA,CACA,MAAM,gBACN,MAAOQ,EAAmBJ,EAAM,gBAAgB,CAAA,CAAA,EAEjDhB,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,cACd,SAAAA,EAAAA,IAAC,MAAA,CACA,UAAW,cAAcgB,CAAM,GAC/B,MAAO,CAAE,MAAO,GAAGC,CAAQ,GAAA,CAAI,CAAA,EAEjC,EACAjB,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAkB,CAAA,CAAY,CAAA,CAAA,CAC1C,CAAA,EACD,CAEF,CChFO,SAASG,EACfN,EACqB,CACrB,OACChB,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,SAAAe,EAAM,gBAAgB,gBAAe,CACvC,CAAA,EACD,EACAhB,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,sBAAmB,QAClD,OAAA,CAAK,UAAU,gBACd,SAAAsB,EAASP,EAAM,uBAAuB,CAAA,CACxC,CAAA,EACD,EACAhB,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,mBAAgB,QAC/C,OAAA,CAAK,UAAU,gBACd,SAAAe,EAAM,oBAAoB,gBAAe,CAC3C,CAAA,EACD,EACAhB,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,sBAAmB,QAClD,OAAA,CAAK,UAAU,4BACd,SAAAsB,EAASP,EAAM,uBAAuB,CAAA,CACxC,CAAA,EACD,EACAf,EAAAA,IAAC,IAAA,CAAE,UAAU,YAAY,SAAA,8HAAA,CAGzB,CAAA,EACD,CAEF,CCxBA,SAASW,EAAQ,CAChB,MAAAb,EACA,MAAAc,EACA,MAAAC,CACD,EAIuB,CACtB,OACCd,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,MAAAa,EAC9B,SAAAf,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAY,CAAA,CAAM,CAAA,EACxC,CAEF,CAEO,SAASW,EACfR,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,KAIhGhB,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,eAAA,CAAa,EACjBA,EAAAA,IAACW,EAAA,CACA,MAAM,OACN,MAAO,GAAGI,EAAM,IAAI,UACpB,MAAM,mEAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,SACN,MAAOI,EAAM,WACb,MAAM,oGAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,WACN,MAAOa,EACP,MAAM,wHAAA,CAAA,EAEPxB,EAAAA,IAACW,EAAA,CACA,MAAM,YACN,MAAOc,EACP,MAAM,oIAAA,CAAA,EAEPzB,EAAAA,IAACW,EAAA,CACA,MAAM,YACN,MAAO,GAAGI,EAAM,WAAW,IAC3B,MAAM,uFAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,OACN,MAAOI,EAAM,KAAO,UAAY,UAAA,CAAA,EAEjCf,EAAAA,IAACW,EAAA,CACA,MAAM,SACN,MAAO,OAAOI,EAAM,kBAAkB,CAAA,CAAA,CACvC,EACD,CAEF,CC5EA,SAASJ,EAAQ,CAChB,MAAAb,EACA,MAAAc,EACA,MAAAC,CACD,EAIuB,CACtB,OACCd,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,MAAAa,EAC9B,SAAAf,EACF,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAY,CAAA,CAAM,CAAA,EACxC,CAEF,CAEO,SAASc,EACfX,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,OACC9B,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACd,SAAA,CAAAC,EAAAA,IAAC,MAAG,SAAA,yBAAA,CAA2B,EAC/BA,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAe,SAAA+B,EAAO,EACrC/B,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAe,SAAAgC,EAAW,EACzChC,EAAAA,IAACW,EAAA,CACA,MAAM,QACN,MAAOI,EAAM,KACb,MAAM,uEAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,WACN,MAAOI,EAAM,SACb,MAAM,iCAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,aACN,MAAO,IAAII,EAAM,UAAU,QAAQ,CAAC,CAAC,GACrC,MAAM,gDAAA,CAAA,EAEPf,EAAAA,IAACW,EAAA,CACA,MAAM,cACN,MAAO,IAAII,EAAM,WAAW,QAAQ,CAAC,CAAC,GACtC,MAAM,iDAAA,CAAA,CACP,EACD,CAEF,CCvEO,SAASkB,EACflB,EACqB,CACrB,KAAM,CAAE,aAAAmB,EAAc,YAAAC,CAAA,EAAgBpB,EAChCqB,EACLF,EAAe,EAAI,KAAKA,CAAY,WAAa,OAElD,OACCnC,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,SAAAkC,CAAA,CAAa,CAAA,EAC/C,EACAnC,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,eAAY,EAC5CA,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAmC,CAAA,CAAY,CAAA,EAC9C,EACApC,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAgB,SAAA,SAAM,EACtCA,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAoC,CAAA,CAAO,CAAA,CAAA,CACzC,CAAA,EACD,CAEF,CC9BA,MAAMC,EAA+C,QACnD,KAAA,CACA,SAAA,CAAArC,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,SAASsC,GAAiC,CAChD,OACCtC,EAAAA,IAAC,MAAA,CAAI,UAAU,mBACd,gBAAC,UAAA,CACA,SAAA,CAAAA,EAAAA,IAAC,WAAQ,SAAA,yBAAA,CAAuB,EAChCA,EAAAA,IAAC,KAAA,CAAG,UAAU,cAAe,SAAAqC,EAAa,EAC1CrC,EAAAA,IAAC,IAAA,CAAE,UAAU,cAAc,SAAA,gDAAA,CAE3B,CAAA,CAAA,CACD,CAAA,CACD,CAEF,CCRA,SAASuC,EAAgBC,EAA2B,CACnD,GAAI,CAACA,EAAI,MAAO,QAChB,GAAI,CACH,OAAO,IAAI,KAAKA,CAAE,EAAE,eAAA,CACrB,MAAQ,CACP,OAAOA,CACR,CACD,CAEA,SAAwBC,EAAY,CACnC,SAAAC,EACA,QAAAC,EACA,MAAAC,CACD,EAAyC,CACxC,GAAID,GAAW,CAACD,EACf,OAAO1C,EAAAA,IAAC,MAAA,CAAI,UAAU,WAAW,SAAA,oBAAiB,EACnD,GAAI4C,GAAS,CAACF,EACb,OAAO3C,EAAAA,KAAC,MAAA,CAAI,UAAU,WAAW,SAAA,CAAA,UAAQ6C,EAAM,OAAA,EAAQ,EACxD,GAAI,CAACF,EAAU,aAAQ,MAAA,CAAI,UAAU,WAAW,SAAA,oBAAiB,EAGjE,MAAMG,EAAIH,EACJ,CAAE,QAAAI,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,OACC9C,EAAAA,KAAC,MAAA,CAAI,UAAU,eACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACd,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,YAAa,SAAAmD,EAAK,EAClCpD,EAAAA,KAAC,OAAA,CAAK,UAAU,UAAU,SAAA,CAAA,WAASwC,EAAgBa,CAAS,CAAA,CAAA,CAAE,CAAA,EAC/D,EACArD,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACd,SAAA,CAAAC,EAAAA,IAACR,EAAA,CACA,OAAQsD,EAAQ,OAChB,QAASA,EAAQ,QACjB,cAAeA,EAAQ,aAAA,CAAA,EAExB9C,EAAAA,IAACG,EAAA,CACA,MAAO6C,EAAQ,MACf,MAAOA,EAAQ,MACf,cAAeA,EAAQ,cACvB,gBAAiBA,EAAQ,gBACzB,YAAaA,EAAQ,WAAA,CAAA,EAEtBhD,EAAAA,IAACc,EAAA,CACA,gBAAiBoC,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/B/C,EAAAA,IAACoB,EAAA,CACA,gBAAiBuC,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,EAE5B/C,EAAAA,IAACqB,EAAA,CACA,gBAAiBkC,EAAU,gBAC3B,wBAAyBA,EAAU,wBACnC,oBAAqBA,EAAU,oBAC/B,wBAAyBA,EAAU,uBAAA,CAAA,EAEpCvD,EAAAA,IAACuB,EAAA,CACA,KAAA4B,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,GACA5D,EAAAA,IAAC0B,EAAA,CACA,KAAMkC,EAAM,KACZ,SAAUA,EAAM,cAAgBA,EAAM,SACtC,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,gBAAiBb,EAAY,KAAK,YAClC,cAAeD,EAAQ,aAAA,CAAA,EAGzB9C,EAAAA,IAACiC,EAAA,CACA,aAAcqB,EAAK,aACnB,YAAaA,EAAK,WAAA,CAAA,EAEnBtD,EAAAA,IAAC6D,EAAA,CACA,iBAAkBL,EAAU,QAC5B,eAAgBA,EAAU,MAC1B,mBAAoBA,EAAU,mBAC9B,iBAAkBA,EAAU,iBAC5B,mBAAoBC,EAAS,QAC7B,iBAAkBA,EAAS,KAAA,CAAA,EAE5BzD,EAAAA,IAAC8D,EAAA,CACA,kBAAmBJ,EAAU,QAAQ,WACrC,gBAAiBA,EAAU,QAAQ,SACnC,mBAAoBA,EAAU,SAAS,WACvC,iBAAkBA,EAAU,SAAS,QAAA,CAAA,QAErCpB,EAAA,CAAA,CAAW,CAAA,CAAA,CACb,CAAA,EACD,CAEF"}
|