pi-mega-compact 0.20.49 → 0.20.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/vector-cortex-enc1a.js +39 -0
- package/dist/config/vector-cortex.js +1 -0
- package/dist/config.js +1 -1
- package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -0
- package/dist/extensions/dashboard-server/routes-setup-enc1a.js +157 -0
- package/dist/extensions/dashboard-server/routes-setup.js +21 -0
- package/dist/src/config/vector-cortex-enc1a.js +39 -0
- package/dist/src/config/vector-cortex.js +1 -0
- package/dist/src/config.js +1 -1
- package/extensions/dashboard-client/dist/assets/{AreaChart-COnj8FHi.js → AreaChart-CeVnaV-0.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-COnj8FHi.js.map → AreaChart-CeVnaV-0.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-BYqt8c5-.js → BarChart-DoNd35sw.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-BYqt8c5-.js.map → BarChart-DoNd35sw.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-PLRjMrZV.js → CacheTab-BROshdFf.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-PLRjMrZV.js.map → CacheTab-BROshdFf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-DXKSft6w.js → EventsTab-DAD6NeBR.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-DXKSft6w.js.map → EventsTab-DAD6NeBR.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-BgVIsrde.js → HealthTab-BBVMM54F.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-BgVIsrde.js.map → HealthTab-BBVMM54F.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DNgFC8KZ.js → MaintenanceTab-f9VhlFco.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-DNgFC8KZ.js.map → MaintenanceTab-f9VhlFco.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-B6yY47sz.js → MemoryMapTab-BaxfyzN2.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-B6yY47sz.js.map → MemoryMapTab-BaxfyzN2.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-BrhJ6rkx.js → MetricsTab-DkUvoeS_.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-BrhJ6rkx.js.map → MetricsTab-DkUvoeS_.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-RFHU9L4x.js → OverviewTab-BCpK1vgt.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-RFHU9L4x.js.map → OverviewTab-BCpK1vgt.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-UFIWKkJM.js → ReposTab-cJ5neYIG.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-UFIWKkJM.js.map → ReposTab-cJ5neYIG.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-BHFYsmK8.js → SessionsTab-8DyQv1Ry.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-BHFYsmK8.js.map → SessionsTab-8DyQv1Ry.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/SetupTab-BQGPf9CI.js +3 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-BQGPf9CI.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-aPG5Knqn.js → TimeSavedCard-8N7Vvlch.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-aPG5Knqn.js.map → TimeSavedCard-8N7Vvlch.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-fGm9n-Tk.js → TurnsTab-CCijkQoH.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-fGm9n-Tk.js.map → TurnsTab-CCijkQoH.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-BtmSNH8X.js → VcStatusBadge-D9a7By8x.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VcStatusBadge-BtmSNH8X.js.map → VcStatusBadge-D9a7By8x.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{VectorCortexTab-meALMMOZ.js → VectorCortexTab-pviD6CCy.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{VectorCortexTab-meALMMOZ.js.map → VectorCortexTab-pviD6CCy.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{WikiTab-0TK6q6g1.js → WikiTab-DLyicguz.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{WikiTab-0TK6q6g1.js.map → WikiTab-DLyicguz.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{button-CKEnMZ98.js → button-D8nKit8Y.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{button-CKEnMZ98.js.map → button-D8nKit8Y.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-BVVhm3sL.js → card-Xf5wHHBL.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-BVVhm3sL.js.map → card-Xf5wHHBL.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{client-extra-BvGxKZpm.js → client-extra-CvxDLpQr.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{client-extra-BvGxKZpm.js.map → client-extra-CvxDLpQr.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-B1PeCct1.js → generateCategoricalChart-DhQquRa8.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-B1PeCct1.js.map → generateCategoricalChart-DhQquRa8.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-DuThOA-d.js → index-BUP3MK5S.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-DuThOA-d.js.map → index-BUP3MK5S.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{switch-7qLS7ajc.js → switch-B13rb8Z2.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-7qLS7ajc.js.map → switch-B13rb8Z2.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-D7mgOVxz.js → toggle-4h6DUEB5.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-D7mgOVxz.js.map → toggle-4h6DUEB5.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-ChpyZVeX.js → useSSE-Djom4z1K.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-ChpyZVeX.js.map → useSSE-Djom4z1K.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +1 -1
- package/extensions/dashboard-client/src/tabs/SetupTab/CustomEndpointSection.tsx +57 -2
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +9 -39
- package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetupHelpers.tsx +50 -0
- package/extensions/dashboard-server/api-contracts/setup.ts +12 -0
- package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +6 -0
- package/extensions/dashboard-server/routes-setup-enc1a.ts +184 -0
- package/extensions/dashboard-server/routes-setup.ts +21 -0
- package/package.json +1 -1
- package/src/config/vector-cortex-enc1a.ts +41 -0
- package/src/config/vector-cortex.ts +1 -0
- package/src/config.ts +1 -0
- package/extensions/dashboard-client/dist/assets/SetupTab-C3dnKa8y.js +0 -3
- package/extensions/dashboard-client/dist/assets/SetupTab-C3dnKa8y.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SetupTab-C3dnKa8y.js","sources":["../../src/components/AchievementTiles.tsx","../../src/tabs/GameTab.tsx","../../src/tabs/AchievementsTab.tsx","../../../../src/config/themes.ts","../../src/tabs/ConfigTab.tsx","../../src/tabs/SetupTab/EmbedderHealthCard.tsx","../../src/tabs/SetupTab/SettingsSection.tsx","../../src/tabs/SetupTab/SettingsPanel.tsx","../../src/tabs/SetupTab/EmbedderSetupStyles.ts","../../src/tabs/SetupTab/CustomEndpointSection.tsx","../../src/tabs/SetupTab/EmbedderSetup.tsx","../../src/tabs/SetupTab/ThresholdsPanel.tsx","../../src/api/setup-cortex.ts","../../src/tabs/useSetupCortexPoll.ts","../../src/tabs/SetupTab/CortexSetupStyles.ts","../../src/tabs/SetupTab/CortexEncoderCard.tsx","../../src/tabs/SetupTab/CortexBlockersCard.tsx","../../src/tabs/SetupTab/CortexActionsCard.tsx","../../src/tabs/SetupTab/CortexSetup.tsx","../../src/tabs/SetupTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/components/AchievementTiles.tsx — shared achievement grid.\n *\n * Renders a grid of achievement tiles from fetchAchievements() data.\n * Tile states: unlocked (icon+title+date), visible-locked (??? teaser),\n * hidden+locked (not rendered). Just-unlocked tiles get a pulse animation.\n * Toast notification fires for newly-unlocked achievements.\n *\n * Used by both GameTab (sub-section) and AchievementsTab (standalone).\n */\n\nimport type React from \"react\";\nimport { useRef, useState, useEffect } from \"react\";\nimport type { AchievementRow } from \"@contracts\";\n\nexport interface AchievementTilesProps {\n\t/** Achievement rows from /api/achievements. */\n\tachievements: AchievementRow[];\n}\n\n/** Format unlock timestamp (seconds → locale string). */\nfunction fmtUnlockDate(ts: number): string {\n\ttry {\n\t\treturn new Date(ts * 1000).toLocaleString();\n\t} catch {\n\t\treturn \"\\u2014\";\n\t}\n}\n\nexport function AchievementTiles({\n\tachievements,\n}: AchievementTilesProps): React.ReactElement {\n\tconst lastMaxTsRef = useRef(0);\n\tconst [toastText, setToastText] = useState<string | null>(null);\n\n\tconst maxTs = achievements.reduce(\n\t\t(mx, a) => Math.max(mx, a.unlocked_at ?? 0),\n\t\t0,\n\t);\n\tconst prevMaxTs = lastMaxTsRef.current;\n\n\t/* Update ref after render so next poll sees previous baseline. */\n\tuseEffect(() => {\n\t\tif (maxTs > lastMaxTsRef.current) {\n\t\t\tlastMaxTsRef.current = maxTs;\n\t\t}\n\t}, [maxTs]);\n\n\t/* Toast for newly-unlocked achievements. */\n\tuseEffect(() => {\n\t\tif (prevMaxTs > 0 && maxTs > prevMaxTs) {\n\t\t\tconst newly = achievements.filter(\n\t\t\t\t(a) => a.unlocked_at != null && (a.unlocked_at ?? 0) > prevMaxTs,\n\t\t\t);\n\t\t\tif (newly.length > 0) {\n\t\t\t\tconst text =\n\t\t\t\t\tnewly\n\t\t\t\t\t\t.map((a) => `${a.icon ?? \"\"} ${a.title}`.trim())\n\t\t\t\t\t\t.join(\", \") + \" unlocked!\";\n\t\t\t\tsetToastText(text);\n\t\t\t\tconst t = setTimeout(() => setToastText(null), 4000);\n\t\t\t\treturn (): void => clearTimeout(t);\n\t\t\t}\n\t\t}\n\t}, [achievements, maxTs, prevMaxTs]);\n\n\t/* Visible tiles: skip hidden+locked (hidden === 1 && unlocked_at == null). */\n\tconst tiles = achievements.filter(\n\t\t(a) => !(a.hidden === 1 && a.unlocked_at == null),\n\t);\n\n\treturn (\n\t\t<div className=\"ach-section\">\n\t\t\t{toastText != null && (\n\t\t\t\t<div className=\"ach-toast show\">{toastText}</div>\n\t\t\t)}\n\t\t\t<div className=\"ach-tiles\">\n\t\t\t\t{tiles.length === 0 && (\n\t\t\t\t\t<span className=\"repo-none\">no achievements yet</span>\n\t\t\t\t)}\n\t\t\t\t{tiles.map((a) => {\n\t\t\t\t\tif (a.unlocked_at != null) {\n\t\t\t\t\t\tconst isNew = prevMaxTs > 0 && (a.unlocked_at ?? 0) > prevMaxTs;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={a.id}\n\t\t\t\t\t\t\t\tclassName={`ach-tile unlocked${isNew ? \" just-unlocked\" : \"\"}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{a.icon ?? \"\"} {a.title}\n\t\t\t\t\t\t\t\t<span className=\"ach-detail\">\n\t\t\t\t\t\t\t\t\tunlocked {fmtUnlockDate(a.unlocked_at)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={a.id} className=\"ach-tile locked\">\n\t\t\t\t\t\t\t??? {a.title}\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/tabs/GameTab.tsx — Game tab (NEW).\n *\n * Renders:\n * (1) MEGA CACHE banner (animated gradient, shown when any mega_cache > 100)\n * (2) Opie unlock tile (shown when mega_cache > 100)\n * (3) High Scores header\n * (4) 4 leaderboards in 2×2 grid: Cache %, Dedupe, Turns (LVL badge),\n * MEGA CACHE trophies (firstSeen date meta)\n * (5) Repos count badge via fetchGameScores({metric:'repos',limit:1})\n * (6) Achievements sub-section (AchievementTiles shared component)\n * (7) Game empty state\n * Polls scores + achievements every 15s, game-state every 15s.\n * Applies data-theme accent vars when game_mode_on.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { GameScoreRow, AchievementRow } from \"@contracts\";\nimport { fetchGameScores, fetchAchievements, fetchGameState } from \"../api/client\";\nimport { AchievementTiles } from \"../components/AchievementTiles\";\n\n/** Actual flat game state shape from the server (NOT the nested contract). */\ninterface FlatGameState {\n\tgame_mode_on: boolean;\n\ttheme: string;\n\ttui_display_mode: \"full\" | \"minimal\";\n}\n\n/** Metadata object inside a mega_cache GameScoreRow. */\ninterface TrophyMeta {\n\tfirstSeenTs?: number;\n\tfirstSeen?: number;\n}\n\n/* ── Format helpers (matching html.ts logic) ─────────────────────────── */\n\nfunction fmtPct(v: number): string {\n\treturn (Math.round(v * 10) / 10).toString() + \"%\";\n}\n\nfunction fmtDate(ts: number | null | undefined): string {\n\treturn ts != null ? new Date(ts).toLocaleString() : \"\\u2014\";\n}\n\nfunction trophyMeta(m: unknown): TrophyMeta {\n\treturn m && typeof m === \"object\" ? (m as TrophyMeta) : {};\n}\n\nfunction repoBasename(path: string): string {\n\treturn path.split(\"/\").pop() || path;\n}\n\n/* ── Leaderboard card ────────────────────────────────────────────────── */\n\ninterface LeaderboardCardProps {\n\ttitle: string;\n\trows: GameScoreRow[];\n\tbadge?: React.ReactNode;\n\trenderValue: (r: GameScoreRow) => React.ReactNode;\n}\n\nfunction LeaderboardCard({\n\ttitle,\n\trows,\n\tbadge,\n\trenderValue,\n}: LeaderboardCardProps): React.ReactElement {\n\treturn (\n\t\t<div className=\"lb-card\">\n\t\t\t<h3>\n\t\t\t\t{title}\n\t\t\t\t{badge}\n\t\t\t</h3>\n\t\t\t{rows.length === 0 ? (\n\t\t\t\t<div className=\"lb-empty\">—</div>\n\t\t\t) : (\n\t\t\t\t<table>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t<tr key={`${r.repo_root}-${i}`}>\n\t\t\t\t\t\t\t\t<td title={r.repo_root}>{repoBasename(r.repo_root)}</td>\n\t\t\t\t\t\t\t\t<td className=\"num\">{renderValue(r)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n/* ── Main GameTab component ──────────────────────────────────────────── */\n\nexport default function GameTab(): React.ReactElement {\n\tconst [scores, setScores] = useState<\n\t\tRecord<string, GameScoreRow[]>\n\t>({});\n\tconst [reposCount, setReposCount] = useState(0);\n\tconst [achievements, setAchievements] = useState<AchievementRow[]>([]);\n\tconst [gameModeOn, setGameModeOn] = useState(false);\n\tconst [loading, setLoading] = useState(true);\n\tconst [megaToast, setMegaToast] = useState<string | null>(null);\n\tconst lastMegaTsRef = useRef(0);\n\n\tconst fetchAll = useCallback(async (): Promise<void> => {\n\t\ttry {\n\t\t\tconst [cache, dedupe, turns, megaCache, repos, ach] =\n\t\t\t\tawait Promise.all([\n\t\t\t\t\tfetchGameScores({ metric: \"cache\", limit: 25 }),\n\t\t\t\t\tfetchGameScores({ metric: \"dedupe\", limit: 25 }),\n\t\t\t\t\tfetchGameScores({ metric: \"turns\", limit: 25 }),\n\t\t\t\t\tfetchGameScores({ metric: \"mega_cache\", limit: 25 }),\n\t\t\t\t\tfetchGameScores({ metric: \"repos\", limit: 1 }),\n\t\t\t\t\tfetchAchievements(),\n\t\t\t\t]);\n\n\t\t\t/* Mega-cache toast: new row with value > 100 since last poll */\n\t\t\tconst newRow = megaCache.find(\n\t\t\t\t(r) => r.ts > lastMegaTsRef.current && r.value > 100,\n\t\t\t);\n\t\t\tif (lastMegaTsRef.current > 0 && newRow) {\n\t\t\t\tsetMegaToast(\n\t\t\t\t\t`oopsie! cache went to ${Math.round(newRow.value)}% — MEGA CACHE \\uD83E\\uDD67`,\n\t\t\t\t);\n\t\t\t\tsetTimeout(() => setMegaToast(null), 4000);\n\t\t\t}\n\t\t\tif (megaCache.length > 0) {\n\t\t\t\tlastMegaTsRef.current = Math.max(\n\t\t\t\t\t...megaCache.map((r) => r.ts),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetScores({ cache, dedupe, turns, mega_cache: megaCache });\n\t\t\tsetReposCount(repos[0]?.value ?? 0);\n\t\t\tsetAchievements(ach);\n\t\t} catch {\n\t\t\t/* non-fatal */\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, []);\n\n\t/* Poll scores + achievements every 15s. */\n\tuseEffect(() => {\n\t\tlet active = true;\n\t\tconst doFetch = async (): Promise<void> => {\n\t\t\tif (active) await fetchAll();\n\t\t};\n\t\tvoid doFetch();\n\t\tconst timer = setInterval(() => void doFetch(), 15000);\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclearInterval(timer);\n\t\t};\n\t}, [fetchAll]);\n\n\t/* Poll game state every 15s for styling. */\n\tuseEffect(() => {\n\t\tlet active = true;\n\t\tconst doFetch = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst gs = (await fetchGameState()) as unknown as FlatGameState;\n\t\t\t\tif (active) {\n\t\t\t\t\tsetGameModeOn(!!gs.game_mode_on);\n\t\t\t\t\tif (gs.theme)\n\t\t\t\t\t\tdocument.documentElement.dataset.theme = gs.theme;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* non-fatal */\n\t\t\t}\n\t\t};\n\t\tvoid doFetch();\n\t\tconst timer = setInterval(() => void doFetch(), 15000);\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclearInterval(timer);\n\t\t};\n\t}, []);\n\n\t/* Compute mega-cache banner data */\n\tconst megaRows = scores.mega_cache ?? [];\n\tlet bestMega: number | null = null;\n\tlet firstSeen: number | null = null;\n\tfor (const r of megaRows) {\n\t\tif (bestMega == null || r.value > bestMega) bestMega = r.value;\n\t\tconst m = trophyMeta(r.meta);\n\t\tconst fs = m.firstSeenTs ?? m.firstSeen ?? r.ts;\n\t\tif (firstSeen == null || fs < firstSeen) firstSeen = fs;\n\t}\n\tconst showMega = bestMega != null && bestMega > 100;\n\n\t/* Turns level badge */\n\tconst turnsRows = scores.turns ?? [];\n\tconst maxTurns = turnsRows.reduce((mx, r) => Math.max(mx, r.value), 0);\n\tconst lvl = Math.floor(Math.log2(maxTurns + 1)) + 1;\n\n\t/* Game empty state */\n\tconst hasData =\n\t\t(scores.cache?.length ?? 0) > 0 ||\n\t\t(scores.dedupe?.length ?? 0) > 0 ||\n\t\tturnsRows.length > 0 ||\n\t\tmegaRows.length > 0 ||\n\t\treposCount > 0;\n\n\treturn (\n\t\t<div className={`game-tab${gameModeOn ? \" game-mode-on\" : \"\"}`}>\n\t\t\t{megaToast != null && (\n\t\t\t\t<div className=\"mega-cache-toast show\">{megaToast}</div>\n\t\t\t)}\n\n\t\t\t{showMega && (\n\t\t\t\t<div className=\"mega-cache-banner\">\n\t\t\t\t\t{\"\\uD83E\\uDD67\"} MEGA CACHE! peak {fmtPct(bestMega!)} — first\n\t\t\t\t\treached {fmtDate(firstSeen)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{showMega && (\n\t\t\t\t<div className=\"achievement-tile unlocked\">\n\t\t\t\t\t{\"\\uD83C\\uDFC6\"} Opie's Wild Ride\n\t\t\t\t\t<span className=\"ach-detail\">\n\t\t\t\t\t\tbest {fmtPct(bestMega!)} · first {fmtDate(firstSeen)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<h2>High Scores</h2>\n\n\t\t\t{!hasData && !loading && (\n\t\t\t\t<div className=\"game-empty\">\n\t\t\t\t\tNo scores yet — run a session with game mode on.\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{hasData && (\n\t\t\t\t<div className=\"game-leaderboards\">\n\t\t\t\t\t<LeaderboardCard\n\t\t\t\t\t\ttitle=\"Cache %\"\n\t\t\t\t\t\trows={scores.cache ?? []}\n\t\t\t\t\t\trenderValue={(r) => fmtPct(r.value)}\n\t\t\t\t\t/>\n\t\t\t\t\t<LeaderboardCard\n\t\t\t\t\t\ttitle=\"Dedupe (collapsed)\"\n\t\t\t\t\t\trows={scores.dedupe ?? []}\n\t\t\t\t\t\trenderValue={(r) => r.value.toLocaleString()}\n\t\t\t\t\t/>\n\t\t\t\t\t<LeaderboardCard\n\t\t\t\t\t\ttitle=\"Turns\"\n\t\t\t\t\t\trows={turnsRows}\n\t\t\t\t\t\tbadge={\n\t\t\t\t\t\t\tturnsRows.length > 0 ? (\n\t\t\t\t\t\t\t\t<span className=\"lvl-badge\">LVL {lvl}</span>\n\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\trenderValue={(r) => r.value.toLocaleString()}\n\t\t\t\t\t/>\n\t\t\t\t\t<LeaderboardCard\n\t\t\t\t\t\ttitle=\"MEGA CACHE trophies\"\n\t\t\t\t\t\trows={megaRows}\n\t\t\t\t\t\trenderValue={(r) => (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{fmtPct(r.value)}\n\t\t\t\t\t\t\t\t<span className=\"lb-meta\">\n\t\t\t\t\t\t\t\t\t{fmtDate(\n\t\t\t\t\t\t\t\t\t\ttrophyMeta(r.meta).firstSeenTs ??\n\t\t\t\t\t\t\t\t\t\t\ttrophyMeta(r.meta).firstSeen ??\n\t\t\t\t\t\t\t\t\t\t\tr.ts,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{reposCount > 0 && (\n\t\t\t\t<div className=\"repos-badge-line\">\n\t\t\t\t\t<span className=\"repos-badge\">{reposCount} repos</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<h3>Achievements</h3>\n\t\t\t<AchievementTiles achievements={achievements} />\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/AchievementsTab.tsx — Achievements tab (NEW).\n *\n * Renders the shared AchievementTiles component standalone, plus a toast area.\n * Polls /api/achievements every 15s.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { AchievementRow } from \"@contracts\";\nimport { fetchAchievements } from \"../api/client\";\nimport { AchievementTiles } from \"../components/AchievementTiles\";\n\nexport default function AchievementsTab(): React.ReactElement {\n\tconst [achievements, setAchievements] = useState<AchievementRow[]>([]);\n\tconst [loading, setLoading] = useState(true);\n\tconst [error, setError] = useState<Error | null>(null);\n\n\tconst doFetch = useCallback(async (): Promise<void> => {\n\t\ttry {\n\t\t\tconst rows = await fetchAchievements();\n\t\t\tsetAchievements(rows);\n\t\t\tsetError(null);\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e : new Error(String(e)));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tlet active = true;\n\t\tconst run = async (): Promise<void> => {\n\t\t\tif (active) await doFetch();\n\t\t};\n\t\tvoid run();\n\t\tconst timer = setInterval(() => void run(), 15000);\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclearInterval(timer);\n\t\t};\n\t}, [doFetch]);\n\n\tif (loading && achievements.length === 0)\n\t\treturn <div className=\"tab-stub\">Loading achievements…</div>;\n\tif (error && achievements.length === 0)\n\t\treturn <div className=\"tab-stub\">Error: {error.message}</div>;\n\n\treturn (\n\t\t<div className=\"achievements-tab\">\n\t\t\t<h2>Achievements</h2>\n\t\t\t<AchievementTiles achievements={achievements} />\n\t\t</div>\n\t);\n}\n","/**\n * themes.ts — SINGLE SOURCE OF TRUTH for game-mode visual-effect themes (S30).\n *\n * Each theme defines BOTH an HTML/CSS palette (dashboard) AND an ANSI accent\n * mapping (TUI widget), since the TUI is ANSI and the dashboard is HTML.\n *\n * Theme scope (QA1 correction): themes restyle the mega-compact statusbar\n * widget + the whole dashboard HTML page. We do NOT theme pi's chrome.\n *\n * `transparent` (default) semantics: no background fill, colored accents only —\n * so game-mode stays visible against any terminal background.\n *\n * PREVENT-PI-004: pure config, no network. Pi-agnostic: no pi runtime types.\n */\n\n/** HTML/CSS palette for the dashboard (hex strings, or `null` for \"no bg\"). */\nexport interface ThemeCss {\n /** Page/cell background hex, or `null` for transparent (no bg fill). */\n bg: string | null;\n /** Default foreground (text) hex. */\n fg: string;\n /** Accent hex (bars, highlights, level numbers). */\n accent: string;\n /** MEGA CACHE highlight hex (fires at cache >= 100%). */\n mega: string;\n}\n\n/** ANSI accent mapping for the TUI widget (SGR parameter strings, no `\\x1b[`).\n * `bg` is `null` for transparent themes (no background fill). */\nexport interface ThemeAnsi {\n /** Background SGR params (e.g. \"48;5;23\"), or `null` for no bg fill. */\n bg: string | null;\n /** Foreground SGR params (e.g. \"39\" for default, \"92\" for bright green). */\n fg: string;\n /** Accent SGR params. */\n accent: string;\n /** MEGA CACHE SGR params (fires at cache >= 100%). */\n mega: string;\n}\n\n/** A complete theme = CSS palette + ANSI mapping + display metadata. */\nexport interface Theme {\n id: string;\n label: string;\n css: ThemeCss;\n ansi: ThemeAnsi;\n}\n\nexport const DEFAULT_THEME = \"transparent\";\n\nexport const THEMES: readonly Theme[] = [\n {\n id: \"transparent\",\n label: \"Transparent (accents only)\",\n css: { bg: null, fg: \"#c9d1d9\", accent: \"#3fb950\", mega: \"#f0883e\" },\n ansi: { bg: null, fg: \"39\", accent: \"32\", mega: \"33\" },\n },\n {\n id: \"retro\",\n label: \"Retro 8-bit green\",\n css: { bg: \"#003300\", fg: \"#33ff33\", accent: \"#00ff41\", mega: \"#39ff14\" },\n ansi: { bg: \"40\", fg: \"92\", accent: \"92\", mega: \"1;92\" },\n },\n {\n id: \"orange-bold\",\n label: \"Orange bold\",\n css: { bg: \"#1a0f00\", fg: \"#ff8c00\", accent: \"#ff6b00\", mega: \"#ff4500\" },\n ansi: { bg: \"48;5;52\", fg: \"38;5;208\", accent: \"38;5;208\", mega: \"1;38;5;202\" },\n },\n {\n id: \"cyan-neon\",\n label: \"Cyan neon\",\n css: { bg: \"#001a1a\", fg: \"#00ffff\", accent: \"#22d3ee\", mega: \"#7df9ff\" },\n ansi: { bg: \"48;5;23\", fg: \"38;5;51\", accent: \"38;5;51\", mega: \"1;38;5;51\" },\n },\n {\n id: \"amber-mono\",\n label: \"Amber phosphor\",\n css: { bg: \"#1a1200\", fg: \"#ffb000\", accent: \"#ff8c00\", mega: \"#ff5500\" },\n ansi: { bg: \"48;5;58\", fg: \"38;5;214\", accent: \"38;5;214\", mega: \"1;38;5;208\" },\n },\n {\n id: \"grayscale\",\n label: \"Grayscale minimal\",\n css: { bg: \"#161616\", fg: \"#b0b0b0\", accent: \"#8b949e\", mega: \"#e6edf3\" },\n ansi: { bg: \"48;5;235\", fg: \"38;5;249\", accent: \"38;5;249\", mega: \"1;38;5;255\" },\n },\n] as const;\n\n/** All valid theme ids, in definition order (used for `theme next` cycling). */\nexport const THEME_IDS: readonly string[] = THEMES.map((t) => t.id);\n\n/** Look up a theme by id; returns `undefined` for an unknown id (caller\n * validates + falls back to DEFAULT_THEME). */\nexport function getTheme(id: string): Theme | undefined {\n return THEMES.find((t) => t.id === id);\n}\n\n/** True if `id` is a known theme id. */\nexport function isValidTheme(id: string): boolean {\n return THEME_IDS.includes(id);\n}\n\n/** Cycle to the next theme id (wraps at the end). Falls back to DEFAULT_THEME\n * if `current` is unknown (defensive — the stored id should always be valid). */\nexport function nextTheme(current: string): string {\n const i = THEME_IDS.indexOf(current);\n if (i < 0) return DEFAULT_THEME;\n return THEME_IDS[(i + 1) % THEME_IDS.length]!;\n}\n\n/** CSS variable declarations for a theme's CSS palette. `bg` is `null` for the\n * transparent theme → `--bg: transparent` (no page fill, accents only). Pure,\n * no pi types. */\nexport function themeCssVars(theme: Theme): string {\n const bg = theme.css.bg ?? \"transparent\";\n return `--bg: ${bg}; --fg: ${theme.css.fg}; --accent: ${theme.css.accent}; --mega: ${theme.css.mega};`;\n}\n\n/** A `:root[data-theme=\"<id>\"]` override block carrying the theme's CSS vars,\n * for client-side instant theme switching. Pure, no pi types. */\nexport function themeDataBlock(theme: Theme): string {\n return `:root[data-theme=\"${theme.id}\"]{ ${themeCssVars(theme)} }`;\n}\n","/**\n * dashboard-client/src/tabs/ConfigTab.tsx — Config tab (C3).\n *\n * Full configuration editor:\n * (1) Game mode toggle (checkbox)\n * (2) Theme selector (dropdown) from src/config/themes.ts THEMES array\n * (3) TUI mode selector (Full/Minimal dropdown)\n * (4) Read-only config display section from snapshot (Tier, Preset, Pressure,\n * Threshold, Fast Gate, Auto, Anchor) with verbatim tooltips from html.ts.\n *\n * Uses fetchGameState() to load current state, putGameState() to save changes.\n * Polls gameState and snapshot every 5s. Applies theme by setting\n * document.documentElement.dataset.theme.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { SnapshotResponse, GameStatePatch } from \"@contracts\";\nimport { fetchSnapshot, fetchGameState, putGameState } from \"../api/client\";\nimport { THEMES, THEME_IDS } from \"../../../../src/config/themes\";\n\n/** Actual flat game state returned by the server (the server returns a flat\n * { game_mode_on, theme, tui_display_mode } shape, NOT the contract's nested\n * { config: { enabled, theme, displayMode }, activeRitual } shape). */\ninterface FlatGameState {\n\tgame_mode_on: boolean;\n\ttheme: string;\n\ttui_display_mode: \"full\" | \"minimal\";\n}\ntype FlatGameStatePatch = Partial<FlatGameState>;\n\n/** Extended snapshot config — the runtime includes tierPct (not in contract).\n * Implemented as a type intersection rather than `interface extends` because\n * TypeScript (TS2499) forbids `interface extends T[\"k\"]` indexed-access\n * parents; the resulting type is structurally identical. */\ntype ConfigExt = SnapshotResponse[\"config\"] & {\n\ttierPct?: number | null;\n};\n\n/* Tooltips copied verbatim from extensions/dashboard-server/html.ts */\nconst TOOLTIPS = {\n\tgameMode: \"Turn game mode on/off (themes the widget + dashboard)\",\n\ttheme: \"Visual theme (applies instantly)\",\n\ttuiMode: \"TUI widget display density\",\n\ttier: \"Live pressure band — climbs low\\u2192mega as context fills the window.\",\n\tpreset:\n\t\t\"The env-resolved base compaction preset (low/medium/high/ultra/mega) that set the token threshold.\",\n\tpressure:\n\t\t\"Live pressure = currentTokens / threshold \\u2014 % of the model context window (threshold fires at the tier's % of window).\",\n\tthreshold:\n\t\t\"Compaction threshold = tierPct \\u00d7 model context window \\u2014 mega-compact trims BELOW pi's native ~80% auto-compact for any model size.\",\n\tfastGate:\n\t\t\"Fast-gate arming floor \\u2014 the live trim arms once context passes this % of the window.\",\n} as const;\n\nfunction formatThreshold(\n\ttokens: number,\n\ttierPct: number | null | undefined,\n\tcw: number,\n): string {\n\tlet txt = tokens.toLocaleString();\n\tif (tierPct != null && cw > 0) {\n\t\ttxt += ` (${Math.round(tierPct * 100)}% of ${cw.toLocaleString()})`;\n\t}\n\treturn txt;\n}\n\nfunction formatPressure(pressure: number): string {\n\t/* Runtime sends 0\\u20131 fraction despite contract saying 0\\u2013100. */\n\treturn `${Math.round((pressure || 0) * 100)}%`;\n}\n\nexport default function ConfigTab(): React.ReactElement {\n\tconst [snapshot, setSnapshot] = useState<SnapshotResponse | null>(null);\n\tconst [gameState, setGameState] = useState<FlatGameState | null>(null);\n\tconst [saving, setSaving] = useState(false);\n\n\t/* Poll snapshot every 5s for config display section. */\n\tuseEffect(() => {\n\t\tlet active = true;\n\t\tconst doFetch = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst s = await fetchSnapshot();\n\t\t\t\tif (active) setSnapshot(s);\n\t\t\t} catch {\n\t\t\t\t/* non-fatal */\n\t\t\t}\n\t\t};\n\t\tvoid doFetch();\n\t\tconst timer = setInterval(() => void doFetch(), 5000);\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclearInterval(timer);\n\t\t};\n\t}, []);\n\n\t/* Poll game state every 5s. */\n\tuseEffect(() => {\n\t\tlet active = true;\n\t\tconst doFetch = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst gs = (await fetchGameState()) as unknown as FlatGameState;\n\t\t\t\tif (active) {\n\t\t\t\t\tsetGameState(gs);\n\t\t\t\t\tif (gs.theme)\n\t\t\t\t\t\tdocument.documentElement.dataset.theme = gs.theme;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* non-fatal */\n\t\t\t}\n\t\t};\n\t\tvoid doFetch();\n\t\tconst timer = setInterval(() => void doFetch(), 5000);\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tclearInterval(timer);\n\t\t};\n\t}, []);\n\n\t/* PUT a patch to the server immediately on change. */\n\tconst handlePatch = useCallback(async (patch: FlatGameStatePatch) => {\n\t\tsetSaving(true);\n\t\ttry {\n\t\t\tconst result = (await putGameState(\n\t\t\t\tpatch as unknown as GameStatePatch,\n\t\t\t)) as unknown as FlatGameState;\n\t\t\tsetGameState(result);\n\t\t\tif (result.theme)\n\t\t\t\tdocument.documentElement.dataset.theme = result.theme;\n\t\t} catch {\n\t\t\t/* non-fatal */\n\t\t}\n\t\tsetSaving(false);\n\t}, []);\n\n\tconst gmOn = gameState?.game_mode_on ?? false;\n\tconst themeVal = gameState?.theme ?? \"transparent\";\n\tconst tuiVal = gameState?.tui_display_mode ?? \"full\";\n\n\tconst cfg = snapshot?.config as ConfigExt | undefined;\n\tconst cw = snapshot?.context.contextWindow ?? 0;\n\n\treturn (\n\t\t<div className=\"config-tab\">\n\t\t\t<section className=\"config-settings\">\n\t\t\t\t<h3>Settings</h3>\n\t\t\t\t<div className=\"settings-row\">\n\t\t\t\t\t<label title={TOOLTIPS.gameMode}>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tchecked={gmOn}\n\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\thandlePatch({ game_mode_on: e.currentTarget.checked })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tGame Mode\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"settings-row\">\n\t\t\t\t\t<label title={TOOLTIPS.theme}>\n\t\t\t\t\t\tTheme\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\tvalue={themeVal}\n\t\t\t\t\t\t\tonChange={(e) => handlePatch({ theme: e.currentTarget.value })}\n\t\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{THEMES.map((t) => (\n\t\t\t\t\t\t\t\t<option key={t.id} value={t.id}>\n\t\t\t\t\t\t\t\t\t{t.label}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\t\tclassName=\"theme-cycle-btn\"\n\t\t\t\t\t\t\ttitle=\"Cycle to the next theme (P3)\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tconst i = THEME_IDS.indexOf(themeVal);\n\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\tTHEME_IDS[(i < 0 ? 0 : i + 1) % THEME_IDS.length];\n\t\t\t\t\t\t\t\tif (next) void handlePatch({ theme: next });\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tNext theme →\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"settings-row\">\n\t\t\t\t\t<label title={TOOLTIPS.tuiMode}>\n\t\t\t\t\t\tTUI Mode\n\t\t\t\t\t\t<select\n\t\t\t\t\t\t\tvalue={tuiVal}\n\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\thandlePatch({\n\t\t\t\t\t\t\t\t\ttui_display_mode: e.currentTarget.value as \"full\" | \"minimal\",\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<option value=\"full\">Full</option>\n\t\t\t\t\t\t\t<option value=\"minimal\">Minimal</option>\n\t\t\t\t\t\t</select>{\" \"}\n\t\t\t\t\t\t\t<span className=\"tui-mode-hint\">\n\t\t\t\t\t\t\t\t(affects the in-app TUI widget; not shown here)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</section>\n\n\t\t\t<section className=\"config-display\">\n\t\t\t\t<h3>Configuration</h3>\n\t\t\t\t<div className=\"config-grid\">\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\" title={TOOLTIPS.tier}>\n\t\t\t\t\t\t\tTier\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{snapshot ? `${snapshot.tier} (live)` : \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\" title={TOOLTIPS.preset}>\n\t\t\t\t\t\t\tPreset\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{snapshot?.presetTier ?? \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\" title={TOOLTIPS.pressure}>\n\t\t\t\t\t\t\tPressure\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{snapshot ? formatPressure(snapshot.pressure) : \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\" title={TOOLTIPS.threshold}>\n\t\t\t\t\t\t\tThreshold\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{cfg ? formatThreshold(cfg.thresholdTokens, cfg.tierPct, cw) : \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\" title={TOOLTIPS.fastGate}>\n\t\t\t\t\t\t\tFast Gate\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{cfg ? `${cfg.fastGatePct}%` : \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\">Auto</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{cfg ? (cfg.auto ? \"enabled\" : \"disabled\") : \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"config-item\">\n\t\t\t\t\t\t<span className=\"config-label\">Anchor</span>\n\t\t\t\t\t\t<span className=\"config-value\">\n\t\t\t\t\t\t\t{cfg?.anchorUserMessages ?? \"\\u2014\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/EmbedderHealthCard.tsx — embedder health probe card (Part A).\n *\n * Round-trips a test embed through the active embedder and shows ✓ working /\n * ✗ unreachable + latency + dimensions. Polls every 30s.\n */\nimport type React from \"react\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { EmbedderHealthResponse } from \"@contracts\";\nimport { fetchEmbedderHealth } from \"../../api/client\";\n\nconst styles: Record<string, React.CSSProperties> = {\n\tsection: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t},\n\tsectionTitle: {\n\t\tfontSize: \"1.1rem\",\n\t\tfontWeight: 700,\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t\tcolor: \"#e0e0e0\",\n\t\tborderBottom: \"1px solid #333\",\n\t\tpaddingBottom: \"0.5rem\",\n\t},\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n};\n\nexport default function EmbedderHealthCard(): React.ReactElement {\n\tconst [health, setHealth] = useState<EmbedderHealthResponse | null>(null);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst loadHealth = useCallback(() => {\n\t\tfetchEmbedderHealth()\n\t\t\t.then(setHealth)\n\t\t\t.catch((e: unknown) =>\n\t\t\t\tsetError(e instanceof Error ? e.message : String(e)),\n\t\t\t);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadHealth();\n\t}, [loadHealth]);\n\n\t// Poll health every 30s\n\tuseEffect(() => {\n\t\tconst id = setInterval(loadHealth, 30000);\n\t\treturn () => clearInterval(id);\n\t}, [loadHealth]);\n\n\tconst ok = health?.status === \"ok\";\n\tconst statusText =\n\t\thealth?.status === \"ok\"\n\t\t\t? \"Working\"\n\t\t\t: health?.status === \"unreachable\"\n\t\t\t\t? \"Unreachable\"\n\t\t\t\t: \"Error\";\n\tconst color = ok ? \"#4caf50\" : \"#f44336\";\n\tconst icon = ok ? \"✓\" : \"✗\";\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Embedder Health</h3>\n\t\t\t{error && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError: {error}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{!health && !error && (\n\t\t\t\t<p style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tProbing embedder...\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{health && (\n\t\t\t\t<>\n\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t<span style={{ ...styles.label, color: `${color}` }}>\n\t\t\t\t\t\t\t{icon} {statusText}:\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span style={styles.value}>{health.dim} dims</span>\n\t\t\t\t\t\t{health.latencyMs !== undefined && (\n\t\t\t\t\t\t\t<span style={{ color: \"#a0a0c0\", marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\t\t({health.latencyMs.toFixed(1)} ms)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Endpoint:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{health.url ?? (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>built-in (no URL)</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{health.error && (\n\t\t\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\t\t{health.error}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/SettingsSection.tsx — collapsible settings category section.\n *\n * Each category from /api/rag-settings renders as a <section> with a toggle\n * button (aria-expanded + aria-controls) that shows/hides its setting rows.\n * Matches the Sidebar collapsible-accessibility pattern.\n */\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\n\ninterface SettingsSectionProps {\n\treadonly title: string;\n\treadonly children: React.ReactNode;\n}\n\nexport default function SettingsSection({\n\ttitle,\n\tchildren,\n}: SettingsSectionProps): React.ReactElement {\n\tconst [open, setOpen] = useState<boolean>(true);\n\tconst panelId = `settings-${title.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}`;\n\n\treturn (\n\t\t<section className=\"overflow-hidden rounded-xl border border-border bg-bg-elevated/40\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setOpen((o) => !o)}\n\t\t\t\tclassName=\"flex w-full items-center justify-between rounded-t-xl bg-bg-elevated/60 px-4 py-3 text-left text-sm font-semibold text-foreground transition-colors hover:bg-bg-elevated\"\n\t\t\t\taria-expanded={open}\n\t\t\t\taria-controls={panelId}\n\t\t\t>\n\t\t\t\t<span>{title}</span>\n\t\t\t\t<ChevronDown\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"h-4 w-4 text-muted-foreground transition-transform\",\n\t\t\t\t\t\topen && \"rotate-180\",\n\t\t\t\t\t)}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</button>\n\t\t\t{open && (\n\t\t\t\t<div id={panelId} className=\"divide-y divide-border px-4 py-1\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</section>\n\t);\n}\n","/**\n * SetupTab/SettingsPanel.tsx — comprehensive adjustable-settings panel.\n *\n * Renders every MEGACOMPACT_* setting from /api/rag-settings, grouped into\n * collapsible categories. Each setting renders by type (boolean → Switch,\n * number/string → styled input) and writes back via POST /api/rag-settings on\n * change. Switches POST immediately; text/number inputs POST after a 500ms\n * debounce. Requires-LLM settings show an amber badge when no LLM embedder is\n * active. A restart-required toast appears after a successful write.\n *\n * PREVENT-PI-004: all data comes from localhost dashboard API endpoints.\n */\nimport type React from \"react\";\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport type { SettingsResponse, SettingState } from \"@contracts\";\nimport { fetchSettings, postSetting } from \"../../api/client\";\nimport { Switch } from \"../../components/ui/switch\";\nimport SettingsSection from \"./SettingsSection\";\n\nconst INPUT_CLASS =\n\t\"rounded-md border border-border bg-bg-elevated/50 px-2 py-1 text-sm outline-none transition-colors focus:border-primary disabled:cursor-not-allowed disabled:opacity-50\";\n\nfunction LlmBadge(): React.ReactElement {\n\treturn (\n\t\t<span\n\t\t\tclassName=\"ml-2 inline-flex items-center rounded-md border border-warning/40 bg-warning/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-warning\"\n\t\t\ttitle=\"Requires an LLM embedder (Ollama/HTTP) to be effective\"\n\t\t>\n\t\t\tLLM\n\t\t</span>\n\t);\n}\n\ninterface RowProps {\n\treadonly setting: SettingState;\n\treadonly id: string;\n\treadonly llmActive: boolean;\n\treadonly saving: boolean;\n\treadonly onUpdate: (key: string, raw: string) => Promise<string | null>;\n}\n\nfunction SettingRow({\n\tsetting,\n\tid,\n\tllmActive,\n\tsaving,\n\tonUpdate,\n}: RowProps): React.ReactElement {\n\tconst [error, setError] = useState<string | null>(null);\n\tconst locked = setting.requiresLlm && !llmActive;\n\tconst timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timerRef.current) clearTimeout(timerRef.current);\n\t\t};\n\t}, []);\n\n\tconst submit = useCallback(\n\t\t(raw: string) => {\n\t\t\tonUpdate(setting.key, raw)\n\t\t\t\t.then((msg) => setError(msg))\n\t\t\t\t.catch((e: unknown) =>\n\t\t\t\t\tsetError(e instanceof Error ? e.message : String(e)),\n\t\t\t\t);\n\t\t},\n\t\t[onUpdate, setting.key],\n\t);\n\n\tconst scheduleSave = useCallback(\n\t\t(raw: string) => {\n\t\t\tif (timerRef.current) clearTimeout(timerRef.current);\n\t\t\ttimerRef.current = setTimeout(() => submit(raw), 500);\n\t\t},\n\t\t[submit],\n\t);\n\n\tconst inputDisabled = saving || locked;\n\n\treturn (\n\t\t<div className=\"py-2.5\">\n\t\t\t<div className=\"flex items-start justify-between gap-3\">\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"flex items-center text-sm font-semibold text-foreground\">\n\t\t\t\t\t\t<label htmlFor={`${id}-input`} className=\"cursor-pointer\">\n\t\t\t\t\t\t\t{setting.label}\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t{setting.requiresLlm && !llmActive && <LlmBadge />}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mt-0.5 text-xs text-muted-foreground\">\n\t\t\t\t\t\t{setting.description}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-2\">\n\t\t\t\t\t{setting.type === \"boolean\" ? (\n\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\tid={`${id}-input`}\n\t\t\t\t\t\t\tchecked={Boolean(setting.value)}\n\t\t\t\t\t\t\tdisabled={inputDisabled || locked}\n\t\t\t\t\t\t\tonCheckedChange={(checked) => submit(String(checked))}\n\t\t\t\t\t\t\taria-label={setting.label}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid={`${id}-input`}\n\t\t\t\t\t\t\t\ttype={setting.type === \"number\" ? \"number\" : \"text\"}\n\t\t\t\t\t\t\t\tdefaultValue={String(setting.value ?? \"\")}\n\t\t\t\t\t\t\t\tmin={setting.min}\n\t\t\t\t\t\t\t\tmax={setting.max}\n\t\t\t\t\t\t\t\tdisabled={inputDisabled}\n\t\t\t\t\t\t\t\tonChange={(e) => scheduleSave(e.target.value)}\n\t\t\t\t\t\t\t\tclassName={`${INPUT_CLASS} ${setting.type === \"number\" ? \"w-24\" : \"w-56\"}`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{setting.unit && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">{setting.unit}</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{error && <p className=\"mt-1 text-xs text-danger\">Error: {error}</p>}\n\t\t</div>\n\t);\n}\n\nexport default function SettingsPanel(): React.ReactElement {\n\tconst [settings, setSettings] = useState<SettingsResponse | null>(null);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [saving, setSaving] = useState(false);\n\tconst [toast, setToast] = useState<string | null>(null);\n\n\tconst load = useCallback(() => {\n\t\tfetchSettings()\n\t\t\t.then(setSettings)\n\t\t\t.catch((e: unknown) =>\n\t\t\t\tsetError(e instanceof Error ? e.message : String(e)),\n\t\t\t);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tload();\n\t}, [load]);\n\n\tconst handleUpdate = useCallback(\n\t\tasync (key: string, raw: string): Promise<string | null> => {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tconst res = await postSetting({ key, value: raw });\n\t\t\t\tsetToast(\n\t\t\t\t\tres.restartRequired\n\t\t\t\t\t\t? \"Saved — restart pi to apply changes.\"\n\t\t\t\t\t\t: \"Saved.\",\n\t\t\t\t);\n\t\t\t\t// Refresh to pick up the server's normalized value (and to keep the\n\t\t\t\t// controlled Switch in sync with the persisted state).\n\t\t\t\tload();\n\t\t\t\treturn null;\n\t\t\t} catch (e) {\n\t\t\t\treturn e instanceof Error ? e.message : String(e);\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t},\n\t\t[load],\n\t);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t{error && <p className=\"text-sm text-danger\">Error: {error}</p>}\n\t\t\t{!settings && !error && (\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">Loading settings...</p>\n\t\t\t)}\n\t\t\t{settings?.categories.map((cat) => (\n\t\t\t\t<SettingsSection key={cat.name} title={cat.name}>\n\t\t\t\t\t{cat.settings.map((setting) => (\n\t\t\t\t\t\t<SettingRow\n\t\t\t\t\t\t\tkey={setting.key}\n\t\t\t\t\t\t\tsetting={setting}\n\t\t\t\t\t\t\tid={`${cat.name.replace(/[^a-z0-9]+/gi, \"-\")}-${setting.key}`}\n\t\t\t\t\t\t\tllmActive={settings.llmActive}\n\t\t\t\t\t\t\tsaving={saving}\n\t\t\t\t\t\t\tonUpdate={handleUpdate}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</SettingsSection>\n\t\t\t))}\n\t\t\t{toast && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mt-1 rounded-md border border-warning/40 bg-warning/10 p-2 text-xs text-warning\"\n\t\t\t\t\trole=\"status\"\n\t\t\t\t>\n\t\t\t\t\t{toast}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/EmbedderSetupStyles.ts — extracted styles for EmbedderSetup.\n *\n * Split from EmbedderSetup.tsx to respect the extensions/ 400-line soft limit.\n */\nimport type React from \"react\";\n\nexport const styles: Record<string, React.CSSProperties> = {\n\tcontainer: {\n\t\tpadding: \"1rem\",\n\t\tmaxWidth: \"720px\",\n\t\tmargin: \"0 auto\",\n\t\tfontFamily: \"system-ui, sans-serif\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsection: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t},\n\tsectionTitle: {\n\t\tfontSize: \"1.1rem\",\n\t\tfontWeight: 700,\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t\tcolor: \"#e0e0e0\",\n\t\tborderBottom: \"1px solid #333\",\n\t\tpaddingBottom: \"0.5rem\",\n\t},\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\twarning: {\n\t\tbackground: \"#3a2a00\",\n\t\tborder: \"1px solid #665500\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"0.75rem\",\n\t\tmarginTop: \"0.5rem\",\n\t\tcolor: \"#ffcc00\",\n\t\tfontSize: \"0.85rem\",\n\t},\n\tbadge: {\n\t\tdisplay: \"inline-block\",\n\t\tpadding: \"0.15rem 0.5rem\",\n\t\tborderRadius: \"4px\",\n\t\tfontSize: \"0.8rem\",\n\t\tfontWeight: 600,\n\t\tmarginLeft: \"0.5rem\",\n\t},\n\tdetectRow: {\n\t\tdisplay: \"flex\",\n\t\tjustifyContent: \"space-between\",\n\t\talignItems: \"center\",\n\t\tpadding: \"0.5rem 0\",\n\t\tborderBottom: \"1px solid #2a2a4e\",\n\t},\n\tbutton: {\n\t\tbackground: \"#3a5a9f\",\n\t\tcolor: \"#fff\",\n\t\tborder: \"none\",\n\t\tborderRadius: \"6px\",\n\t\tpadding: \"0.5rem 1rem\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"0.9rem\",\n\t\tfontWeight: 600,\n\t},\n};\n","/**\n * SetupTab/CustomEndpointSection.tsx — custom remote embedder endpoint section.\n *\n * Extracted from EmbedderSetup.tsx to respect the extensions/ 400-line soft limit.\n */\nimport type React from \"react\";\nimport { styles } from \"./EmbedderSetupStyles\";\n\ninterface CustomEndpointSectionProps {\n\tcustomUrl: string;\n\tsetCustomUrl: (v: string) => void;\n\tapplyEmbedder: (embedder: \"ollama\" | \"llama\" | \"trigram\" | \"custom\" | \"onnx\", url?: string) => void;\n\tconfiguring: string | null;\n}\n\nexport default function CustomEndpointSection({\n\tcustomUrl,\n\tsetCustomUrl,\n\tapplyEmbedder,\n\tconfiguring,\n}: CustomEndpointSectionProps): React.ReactElement {\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Custom Endpoint (remote / third-party)</h3>\n\t\t\t<p style={{ fontSize: \"0.85rem\", color: \"#a0a0c0\", marginTop: 0 }}>\n\t\t\t\tPoint at any OpenAI-compatible embeddings API or hosted endpoint.\n\t\t\t\tThis opts in to a non-loopback connection (sets{\" \"}\n\t\t\t\t<code>MEGACOMPACT_ALLOW_REMOTE_EMBEDDER=1</code>) — your prompts'\n\t\t\t\tembedding requests will be sent to the URL you enter. Default is\n\t\t\t\tloopback-only.\n\t\t\t</p>\n\t\t\t<div style={{ display: \"flex\", gap: \"0.5rem\", flexWrap: \"wrap\", alignItems: \"center\" }}>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"url\"\n\t\t\t\t\tplaceholder=\"https://api.example.com/v1/embeddings\"\n\t\t\t\t\tvalue={customUrl}\n\t\t\t\t\tonChange={(e) => setCustomUrl(e.target.value)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tflex: \"1 1 300px\",\n\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\tstyle={{ ...styles.button, opacity: customUrl ? 1 : 0.4 }}\n\t\t\t\t\tonClick={() => applyEmbedder(\"custom\", customUrl)}\n\t\t\t\t\tdisabled={!customUrl || configuring !== null}\n\t\t\t\t>\n\t\t\t\t\t{configuring === \"custom\" ? \"Writing...\" : \"Use Custom URL\"}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div style={styles.warning}>\n\t\t\t\t<strong>Heads up:</strong> a remote endpoint receives the text you embed\n\t\t\t\t(it does NOT receive your full conversation — only the strings passed to\n\t\t\t\t<code> embed()</code> for recall/dedup). Verify the endpoint's privacy\n\t\t\t\tpolicy before use.\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/EmbedderSetup.tsx — Embedder setup section (P0b).\n *\n * Shows current embedder configuration, warns about trigram recall quality,\n * and mirrors the /megasetup command with detection results. Extracted from\n * SetupTab.tsx to respect the extensions/ 500-line file limit.\n *\n * PREVENT-PI-004: all data comes from localhost dashboard API endpoints —\n * no external network calls.\n */\nimport type React from \"react\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { SetupStatusResponse, SetupDetectResponse, SetupConfigureResponse } from \"@contracts\";\nimport { fetchSetupStatus, fetchSetupDetect, configureEmbedder } from \"../../api/client\";\nimport EmbedderHealthCard from \"./EmbedderHealthCard\";\nimport SettingsPanel from \"./SettingsPanel\";\nimport CustomEndpointSection from \"./CustomEndpointSection\";\nimport { styles } from \"./EmbedderSetupStyles\";\n\nexport default function EmbedderSetup(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [detect, setDetect] = useState<SetupDetectResponse | null>(null);\n\tconst [statusError, setStatusError] = useState<string | null>(null);\n\tconst [detectError, setDetectError] = useState<string | null>(null);\n\tconst [runningDetect, setRunningDetect] = useState(false);\n\tconst [configuring, setConfiguring] = useState<string | null>(null);\n\tconst [configResult, setConfigResult] = useState<SetupConfigureResponse | null>(null);\n\tconst [configError, setConfigError] = useState<string | null>(null);\n\tconst [customUrl, setCustomUrl] = useState(\"\");\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch((e: unknown) =>\n\t\t\t\tsetStatusError(e instanceof Error ? e.message : String(e)),\n\t\t\t);\n\t}, []);\n\n\tconst applyEmbedder = useCallback((embedder: \"ollama\" | \"llama\" | \"trigram\" | \"custom\" | \"onnx\", url?: string) => {\n\t\tsetConfiguring(embedder);\n\t\tsetConfigError(null);\n\t\tsetConfigResult(null);\n\t\tconfigureEmbedder({ embedder, url })\n\t\t\t.then((r) => {\n\t\t\t\tsetConfigResult(r);\n\t\t\t\tsetConfiguring(null);\n\t\t\t\tloadStatus();\n\t\t\t})\n\t\t\t.catch((e: unknown) => {\n\t\t\t\tsetConfigError(e instanceof Error ? e.message : String(e));\n\t\t\t\tsetConfiguring(null);\n\t\t\t});\n\t}, [loadStatus]);\n\n\tconst runDetect = useCallback(() => {\n\t\tsetRunningDetect(true);\n\t\tsetDetectError(null);\n\t\tfetchSetupDetect()\n\t\t\t.then((d) => {\n\t\t\t\tsetDetect(d);\n\t\t\t\tsetRunningDetect(false);\n\t\t\t})\n\t\t\t.catch((e: unknown) => {\n\t\t\t\tsetDetectError(e instanceof Error ? e.message : String(e));\n\t\t\t\tsetRunningDetect(false);\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t}, [loadStatus]);\n\n\t// Poll status every 5s — the same cadence the Setup Cortex sub-tab uses\n\t// (see useSetupCortexPoll) so the embedder + cortex sub-tabs share one poll\n\t// contract (VC9D consolidation). Detection is memoized server-side, so the\n\t// periodic detect refresh below hits the cache rather than re-spawning.\n\tuseEffect(() => {\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\t// Auto-refresh the (server-memoized) detection at the same 5s cadence so the\n\t// embedder sub-tab reflects cached detect changes without manual clicks; the\n\t// manual \"Run Detection\" button still works for an explicit refresh.\n\tuseEffect(() => {\n\t\trunDetect();\n\t\tconst id = setInterval(runDetect, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [runDetect]);\n\n\tconst embedderLabel = (e: string): string => {\n\t\tswitch (e) {\n\t\t\tcase \"trigram\":\n\t\t\t\treturn \"TrigramEmbedder (heuristic, default)\";\n\t\t\tcase \"http\":\n\t\t\t\treturn \"HTTP Embedder (BYO localhost)\";\n\t\t\tcase \"minilm\":\n\t\t\t\treturn \"MiniLM (experimental)\";\n\t\t\tdefault:\n\t\t\t\treturn \"Unknown\";\n\t\t}\n\t};\n\n\tconst trigramWarning = status?.currentEmbedder === \"trigram\" && (\n\t\t<div style={styles.warning}>\n\t\t\t<strong>Note:</strong> TrigramEmbedder is a heuristic-strength default\n\t\t\tembedder. It works without any setup but recall quality may be lower\n\t\t\tthan a dedicated embedding backend. If you notice poor recall results,\n\t\t\tconsider installing Ollama and running the{\" \"}\n\t\t\t<code>/megasetup</code> command, or set{\" \"}\n\t\t\t<code>MEGACOMPACT_EMBEDDING_URL</code> to point at your own localhost\n\t\t\tembedding server.\n\t\t</div>\n\t);\n\n\tconst detectBadge = (installed: boolean): React.ReactElement => {\n\t\tconst bg = installed ? \"#1a5a1a\" : \"#3a1a1a\";\n\t\tconst color = installed ? \"#4caf50\" : \"#f44336\";\n\t\treturn (\n\t\t\t<span style={{ ...styles.badge, background: bg, color }}>\n\t\t\t\t{installed ? \"Detected\" : \"Not found\"}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h2 style={{ fontSize: \"1.3rem\", marginTop: 0, marginBottom: \"1rem\" }}>\n\t\t\t\tEmbedder Setup\n\t\t\t</h2>\n\n\t\t\t<EmbedderHealthCard />\n\n\t\t\t{/* Current Config Section */}\n\t\t\t<div style={styles.section}>\n\t\t\t\t<h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>\n\t\t\t\t{statusError && (\n\t\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\tError: {statusError}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t\t{status && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.label}>Active Embedder:</span>\n\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\t{embedderLabel(status.currentEmbedder)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{\"configuredEmbedder\" in status && status.configuredEmbedder !== status.currentEmbedder && (\n\t\t\t\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t\t\t\t<strong>Configured but not active:</strong>{\" \"}\n\t\t\t\t\t\t\t\t{embedderLabel(status.configuredEmbedder)} is configured in\n\t\t\t\t\t\t\t\t.mega-compact.env but not yet loaded.{\" \"}\n\t\t\t\t\t\t\t\t<strong>Restart pi</strong> to activate it.\n\t\t\t\t\t\t\t\t{status.configuredUrl && (\n\t\t\t\t\t\t\t\t\t<> ({status.configuredUrl})</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{\"restartRequired\" in status && status.restartRequired && (\n\t\t\t\t\t\t\t<div style={{ ...styles.row, color: \"#ff9800\" }}>\n\t\t\t\t\t\t\t\t<span style={styles.label}>Status:</span>\n\t\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\t\tRestart required to activate the configured embedder\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.label}>Embedding URL:</span>\n\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\t{status.embeddingUrl ?? (\n\t\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not set</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.label}>Embed Cache:</span>\n\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\t{status.embedCache ?? (\n\t\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not set</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.label}>MiniLM:</span>\n\t\t\t\t\t\t\t<span style={styles.value}>{status.minilm ? \"enabled\" : \"disabled\"}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{trigramWarning}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!status && !statusError && (\n\t\t\t\t\t<p style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\tLoading configuration...\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Detection Section */}\n\t\t\t<div style={styles.section}>\n\t\t\t\t<h3 style={styles.sectionTitle}>Local Embedder Detection</h3>\n\t\t\t\t<p style={{ fontSize: \"0.85rem\", color: \"#a0a0c0\", marginTop: 0 }}>\n\t\t\t\t\tDetect which local embedding backends are available on this machine.\n\t\t\t\t\tNo software is installed — detection only.\n\t\t\t\t</p>\n\n\t\t\t\t{detect && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{/* Ollama */}\n\t\t\t\t\t\t<div style={styles.detectRow}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<strong>Ollama</strong>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{detect.ollama !== null ? (\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{detectBadge(detect.ollama.installed)}\n\t\t\t\t\t\t\t\t\t{detect.ollama.installed && (\n\t\t\t\t\t\t\t\t\t\t<span style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\", marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\t\t\t\t\t{detect.ollama.running\n\t\t\t\t\t\t\t\t\t\t\t\t? `server running, ${detect.ollama.models.length} model(s)`\n\t\t\t\t\t\t\t\t\t\t\t\t: \"server not running\"}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\t\t\t\tnot checked\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* llama.cpp */}\n\t\t\t\t\t\t<div style={styles.detectRow}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<strong>llama.cpp</strong>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{detect.llamaCpp !== null ? (\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{detectBadge(detect.llamaCpp.installed)}\n\t\t\t\t\t\t\t\t\t{detect.llamaCpp.installed && detect.llamaCpp.detail && (\n\t\t\t\t\t\t\t\t\t\t<span style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\", marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\t\t\t\t\t{detect.llamaCpp.detail}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\t\t\t\tnot checked\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* ONNX */}\n\t\t\t\t\t\t<div style={styles.detectRow}>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<strong>ONNX Runtime</strong>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{detect.onnx !== null ? (\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{detectBadge(detect.onnx.installed)}\n\t\t\t\t\t\t\t\t\t{detect.onnx.installed && detect.onnx.detail && (\n\t\t\t\t\t\t\t\t\t\t<span style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\", marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\t\t\t\t\t{detect.onnx.detail}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\t\t\t\tnot checked\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{detect.error && (\n\t\t\t\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.8rem\", marginTop: \"0.5rem\" }}>\n\t\t\t\t\t\t\t\tDetection error: {detect.error}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{detectError && (\n\t\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\t\tError: {detectError}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\n\t\t\t\t<div style={{ marginTop: \"1rem\" }}>\n\t\t\t\t\t<button\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={runDetect}\n\t\t\t\t\t\tdisabled={runningDetect}\n\t\t\t\t\t>\n\t\t\t\t\t\t{runningDetect ? \"Detecting...\" : \"Run Detection\"}\n\t\t\t\t\t</button>\n\t\t\t\t\t<span style={{ fontSize: \"0.8rem\", color: \"#888\", marginLeft: \"0.75rem\" }}>\n\t\t\t\t\t\tOr run <code>/megasetup</code> in the chat for an interactive wizard.\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Configure buttons — appear after detection runs */}\n\t\t\t\t{detect && (\n\t\t\t\t\t<div style={{ marginTop: \"1rem\", paddingTop: \"0.75rem\", borderTop: \"1px solid #2a2a4e\" }}>\n\t\t\t\t\t\t<div style={{ fontSize: \"0.9rem\", fontWeight: 600, marginBottom: \"0.5rem\" }}>\n\t\t\t\t\t\t\tConfigure\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style={{ display: \"flex\", gap: \"0.5rem\", flexWrap: \"wrap\" }}>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tstyle={{ ...styles.button, opacity: detect.ollama?.installed ? 1 : 0.4 }}\n\t\t\t\t\t\t\t\tonClick={() => applyEmbedder(\"ollama\")}\n\t\t\t\t\t\t\t\tdisabled={!detect.ollama?.installed || configuring !== null}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{configuring === \"ollama\" ? \"Writing...\" : \"Use Ollama\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tstyle={{ ...styles.button, opacity: detect.llamaCpp?.installed ? 1 : 0.4 }}\n\t\t\t\t\t\t\t\tonClick={() => applyEmbedder(\"llama\")}\n\t\t\t\t\t\t\t\tdisabled={!detect.llamaCpp?.installed || configuring !== null}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{configuring === \"llama\" ? \"Writing...\" : \"Use llama.cpp\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tstyle={{ ...styles.button, opacity: detect.onnx?.installed ? 1 : 0.4 }}\n\t\t\t\t\t\t\t\tonClick={() => applyEmbedder(\"onnx\")}\n\t\t\t\t\t\t\t\tdisabled={!detect.onnx?.installed || configuring !== null}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{configuring === \"onnx\" ? \"Writing...\" : \"Use ONNX\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tstyle={{ ...styles.button, background: \"#444\" }}\n\t\t\t\t\t\t\t\tonClick={() => applyEmbedder(\"trigram\")}\n\t\t\t\t\t\t\t\tdisabled={configuring !== null}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{configuring === \"trigram\" ? \"Writing...\" : \"Use Trigram (default)\"}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{configResult && (\n\t\t\t\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t\t\t\t{configResult.alreadyActive\n\t\t\t\t\t\t\t\t\t? \"Already active — no restart needed.\"\n\t\t\t\t\t\t\t\t\t: `Configured ${configResult.embedder}. Restart pi to activate (config written to ${configResult.envPath}).`}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{configError && (\n\t\t\t\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\", marginTop: \"0.5rem\" }}>\n\t\t\t\t\t\t\t\tConfigure error: {configError}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Custom (remote) embedder — third-party / hosted endpoint */}\n\t\t\t<CustomEndpointSection\n\t\t\t\tcustomUrl={customUrl}\n\t\t\t\tsetCustomUrl={setCustomUrl}\n\t\t\t\tapplyEmbedder={applyEmbedder}\n\t\t\t\tconfiguring={configuring}\n\t\t\t/>\n\n\t\t\t{/* Help Section */}\n\t\t\t<div style={styles.section}>\n\t\t\t\t<h3 style={styles.sectionTitle}>How to Upgrade</h3>\n\t\t\t\t<ul style={{ fontSize: \"0.85rem\", lineHeight: 1.6, paddingLeft: \"1.25rem\" }}>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<strong>Ollama:</strong> Install from{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://ollama.com\"\n\t\t\t\t\t\t\tstyle={{ color: \"#6a9fff\" }}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tollama.com\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t, then <code>ollama pull nomic-embed-text</code> and restart pi.\n\t\t\t\t\t\tSet <code>MEGACOMPACT_EMBEDDING_URL=http://localhost:11434/api/embeddings</code>.\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<strong>llama.cpp:</strong> Build or install llama.cpp, run{\" \"}\n\t\t\t\t\t\t<code>llama-server</code> with an embedding model, and set\n\t\t\t\t\t\tthe URL accordingly.\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<strong>ONNX Runtime:</strong> Run a local text-embeddings\n\t\t\t\t\t\tserver (e.g. TEI) and click <strong>Use ONNX</strong> above.\n\t\t\t\t\t\tDefault URL: <code>http://localhost:8081/v1/embeddings</code>.\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t{/* Settings Section — every adjustable MEGACOMPACT_* setting */}\n\t\t\t<div style={styles.section}>\n\t\t\t\t<h3 style={styles.sectionTitle}>Settings</h3>\n\t\t\t\t<SettingsPanel />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/ThresholdsPanel.tsx — per-model compaction thresholds (S52 / v0.16.1).\n *\n * Lists every known model (from model_snapshots) with two sliders each:\n * - Safety Margin (0-20%): reserved after summary + maxOutput. Lower =\n * more usable tail but risks the \"too long even after compaction\" error.\n * - Fire Point (10-90%): % of window where compaction fires. Lower = compact\n * earlier (more headroom); higher = more context before compaction.\n *\n * Warnings fire on <5% safety (overflow risk) and >85% fire point (aggressive\n * — may hit the cap before compaction triggers). Changes save immediately via\n * PUT /api/model-thresholds; a \"Reset to default\" button DELETEs the override.\n *\n * PREVENT-PI-004: all data comes from localhost dashboard API endpoints.\n */\nimport type React from \"react\";\nimport { useState, useEffect, useCallback } from \"react\";\nimport {\n\tfetchModelThresholds,\n\tputModelThreshold,\n\tdeleteModelThreshold,\n} from \"../../api/client\";\nimport type { ModelThresholdsResponse } from \"@contracts\";\n\ninterface ModelRow {\n\treadonly modelId: string;\n\treadonly provider: string;\n\treadonly modelName: string | null;\n\treadonly contextWindow: number;\n\treadonly maxTokens: number;\n\treadonly hasOverride: boolean;\n\treadonly threshold: {\n\t\treadonly safetyMarginPct: number;\n\t\treadonly firePointPct: number;\n\t\treadonly isOverride: boolean;\n\t};\n}\n\nfunction fmtWindow(n: number): string {\n\tif (n >= 1_000_000) return `${(n / 1_000_000).toFixed(2)}M`;\n\tif (n >= 1000) return `${Math.round(n / 1000)}K`;\n\treturn String(n);\n}\n\n/** Live preview of the usable tail budget for a model + slider values. */\nfunction usableTail(\n\tctxWindow: number,\n\tmaxTokens: number,\n\tsafetyPct: number,\n): string {\n\tif (ctxWindow <= 0) return \"—\";\n\tconst maxOut = maxTokens > 0 ? maxTokens : Math.ceil(ctxWindow * 0.1);\n\tconst reserve = maxOut + Math.ceil(ctxWindow * (safetyPct / 100));\n\tconst usable = ctxWindow - reserve;\n\tif (usable <= 0) return \"0 (at risk)\";\n\treturn `${fmtWindow(usable)} tokens`;\n}\n\nfunction ThresholdSlider({\n\tlabel,\n\tvalue,\n\tmin,\n\tmax,\n\tstep = 1,\n\tonChange,\n\twarning,\n}: {\n\treadonly label: string;\n\treadonly value: number;\n\treadonly min: number;\n\treadonly max: number;\n\treadonly step?: number;\n\treadonly onChange: (v: number) => void;\n\treadonly warning?: string;\n}): React.ReactElement {\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<div className=\"flex items-center justify-between text-xs\">\n\t\t\t\t<span className=\"font-medium text-fg-muted\">{label}</span>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`font-mono ${warning ? \"text-warning\" : \"text-fg\"}`}\n\t\t\t\t\ttitle={warning}\n\t\t\t\t>\n\t\t\t\t\t{value}%\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<input\n\t\t\t\ttype=\"range\"\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(e) => onChange(Number(e.target.value))}\n\t\t\t\tclassName=\"threshold-slider w-full\"\n\t\t\t/>\n\t\t\t{warning && <p className=\"text-[10px] text-warning\">⚠ {warning}</p>}\n\t\t</div>\n\t);\n}\n\nfunction ModelThresholdRow({\n\tmodel,\n\tdefaults,\n\tsafetyRange,\n\tfireRange,\n\tonSave,\n\tonReset,\n\tsaving,\n}: {\n\treadonly model: ModelRow;\n\treadonly defaults: { safetyMarginPct: number; firePointPct: number };\n\treadonly safetyRange: readonly [number, number];\n\treadonly fireRange: readonly [number, number];\n\treadonly onSave: (\n\t\tmodelId: string,\n\t\tsafetyMarginPct: number,\n\t\tfirePointPct: number,\n\t) => Promise<void>;\n\treadonly onReset: (modelId: string) => Promise<void>;\n\treadonly saving: boolean;\n}): React.ReactElement {\n\tconst [safety, setSafety] = useState(model.threshold.safetyMarginPct);\n\tconst [fire, setFire] = useState(model.threshold.firePointPct);\n\tconst [dirty, setDirty] = useState(false);\n\tconst [err, setErr] = useState<string | null>(null);\n\n\t// Re-sync when the server data changes (e.g. after reset).\n\tuseEffect(() => {\n\t\tsetSafety(model.threshold.safetyMarginPct);\n\t\tsetFire(model.threshold.firePointPct);\n\t\tsetDirty(false);\n\t}, [model.threshold.safetyMarginPct, model.threshold.firePointPct]);\n\n\tconst safetyWarning =\n\t\tsafety < 5\n\t\t\t? `Low safety margin — risks \"conversation too long\" errors when a single turn injects a large tool output between gate fires.`\n\t\t\t: undefined;\n\tconst fireWarning =\n\t\tfire > 85\n\t\t\t? `High fire point — compaction may trigger close to the window cap; a single large turn can overshoot before the gate fires.`\n\t\t\t: undefined;\n\n\tconst save = useCallback(async () => {\n\t\tsetErr(null);\n\t\ttry {\n\t\t\tawait onSave(model.modelId, safety, fire);\n\t\t\tsetDirty(false);\n\t\t} catch (e) {\n\t\t\tsetErr(e instanceof Error ? e.message : String(e));\n\t\t}\n\t}, [model.modelId, safety, fire, onSave]);\n\n\treturn (\n\t\t<div className=\"rounded-md border border-border bg-bg-elevated/30 p-3\">\n\t\t\t<div className=\"mb-2 flex items-start justify-between\">\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<span className=\"text-sm font-semibold text-fg\">\n\t\t\t\t\t\t\t{model.modelName ?? model.modelId}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{model.threshold.isOverride && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"rounded border border-primary/40 bg-primary/15 px-1.5 py-0.5 text-[10px] font-semibold uppercase text-primary\"\n\t\t\t\t\t\t\t\ttitle=\"This model has a custom override (not the default)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tOverride\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-[11px] text-fg-muted\">\n\t\t\t\t\t\t{model.provider} · {fmtWindow(model.contextWindow)} window ·{\" \"}\n\t\t\t\t\t\t{fmtWindow(model.maxTokens)} output\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"text-right text-[11px] text-fg-muted\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\tUsable tail:{\" \"}\n\t\t\t\t\t\t<span className=\"font-mono text-fg\">\n\t\t\t\t\t\t\t{usableTail(model.contextWindow, model.maxTokens, safety)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\tCompaction fires at:{\" \"}\n\t\t\t\t\t\t<span className=\"font-mono text-fg\">\n\t\t\t\t\t\t\t{fmtWindow(Math.ceil(model.contextWindow * (fire / 100)))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n\t\t\t\t<ThresholdSlider\n\t\t\t\t\tlabel=\"Safety margin\"\n\t\t\t\t\tvalue={safety}\n\t\t\t\t\tmin={safetyRange[0]}\n\t\t\t\t\tmax={safetyRange[1]}\n\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\tsetSafety(v);\n\t\t\t\t\t\tsetDirty(true);\n\t\t\t\t\t}}\n\t\t\t\t\twarning={safetyWarning}\n\t\t\t\t/>\n\t\t\t\t<ThresholdSlider\n\t\t\t\t\tlabel=\"Fire point\"\n\t\t\t\t\tvalue={fire}\n\t\t\t\t\tmin={fireRange[0]}\n\t\t\t\t\tmax={fireRange[1]}\n\t\t\t\t\tonChange={(v) => {\n\t\t\t\t\t\tsetFire(v);\n\t\t\t\t\t\tsetDirty(true);\n\t\t\t\t\t}}\n\t\t\t\t\twarning={fireWarning}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div className=\"mt-2 flex items-center gap-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={save}\n\t\t\t\t\tdisabled={!dirty || saving}\n\t\t\t\t\tclassName=\"rounded-md bg-primary px-2.5 py-1 text-xs font-semibold text-primary-fg disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t{dirty ? \"Save override\" : \"Saved\"}\n\t\t\t\t</button>\n\t\t\t\t{model.threshold.isOverride && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onReset(model.modelId)}\n\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\tclassName=\"rounded-md border border-border px-2.5 py-1 text-xs text-fg-muted disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\tReset to default ({defaults.safetyMarginPct}% /{\" \"}\n\t\t\t\t\t\t{defaults.firePointPct}%)\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{err && <span className=\"text-[11px] text-error\">{err}</span>}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default function ThresholdsPanel(): React.ReactElement {\n\tconst [data, setData] = useState<ModelThresholdsResponse | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [saving, setSaving] = useState(false);\n\n\tconst load = useCallback(async () => {\n\t\ttry {\n\t\t\tsetError(null);\n\t\t\tsetData(await fetchModelThresholds());\n\t\t} catch (e) {\n\t\t\tsetError(e instanceof Error ? e.message : String(e));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tload();\n\t}, [load]);\n\n\tconst onSave = useCallback(\n\t\tasync (modelId: string, safetyMarginPct: number, firePointPct: number) => {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait putModelThreshold({ modelId, safetyMarginPct, firePointPct });\n\t\t\t\tawait load();\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t},\n\t\t[load],\n\t);\n\n\tconst onReset = useCallback(\n\t\tasync (modelId: string) => {\n\t\t\tsetSaving(true);\n\t\t\ttry {\n\t\t\t\tawait deleteModelThreshold(modelId);\n\t\t\t\tawait load();\n\t\t\t} finally {\n\t\t\t\tsetSaving(false);\n\t\t\t}\n\t\t},\n\t\t[load],\n\t);\n\n\tif (loading)\n\t\treturn <div className=\"p-4 text-sm text-fg-muted\">Loading thresholds…</div>;\n\tif (error)\n\t\treturn <div className=\"p-4 text-sm text-error\">Error: {error}</div>;\n\tif (!data) return <div className=\"p-4 text-sm text-fg-muted\">No data.</div>;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"rounded-md border border-border bg-bg-elevated/20 p-3\">\n\t\t\t\t<h3 className=\"text-sm font-semibold\">\n\t\t\t\t\tPer-Model Compaction Thresholds\n\t\t\t\t</h3>\n\t\t\t\t<p className=\"mt-1 text-[11px] text-fg-muted\">\n\t\t\t\t\tTune when compaction fires + how much safety margin to reserve,\n\t\t\t\t\t<strong> per model</strong>. Different providers' models range from 8K\n\t\t\t\t\tto 1M+ context — one global % is wrong. Defaults:{\" \"}\n\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t{data.defaults.safetyMarginPct}% safety\n\t\t\t\t\t</span>{\" \"}\n\t\t\t\t\t/{\" \"}\n\t\t\t\t\t<span className=\"font-mono\">{data.defaults.firePointPct}% fire</span>.\n\t\t\t\t\tValues outside the safe band show warnings.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t{data.models.length === 0 ? (\n\t\t\t\t<div className=\"rounded-md border border-border p-4 text-sm text-fg-muted\">\n\t\t\t\t\tNo models captured yet. Start a pi session in any repo to populate\n\t\t\t\t\tmodel snapshots, then return here to tune per-model thresholds.\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t{data.models.map((m) => (\n\t\t\t\t\t\t<ModelThresholdRow\n\t\t\t\t\t\t\tkey={m.modelId}\n\t\t\t\t\t\t\tmodel={m}\n\t\t\t\t\t\t\tdefaults={data.defaults}\n\t\t\t\t\t\t\tsafetyRange={data.defaults.safetyMarginRange}\n\t\t\t\t\t\t\tfireRange={data.defaults.firePointRange}\n\t\t\t\t\t\t\tonSave={onSave}\n\t\t\t\t\t\t\tonReset={onReset}\n\t\t\t\t\t\t\tsaving={saving}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/api/setup-cortex.ts — Setup Cortex API client.\n *\n * Fetches the VC9A status + drives the VC9B actions against the localhost\n * dashboard server. PREVENT-PI-004: relative loopback paths only — the client\n * is served by the local dashboard server, so no external network call.\n */\n\nimport type {\n\tSetupCortexStatusResponse,\n\tSetupCortexActionRequest,\n\tSetupCortexActionResult,\n\tSetupCortexActionErrorBody,\n\tSetupCortexActionLogResponse,\n} from \"../types/setup-cortex\";\n\n/** Reader-only status aggregate (GET /api/setup-cortex-status). */\nexport async function fetchSetupCortexStatus(): Promise<SetupCortexStatusResponse> {\n\tconst r = await fetch(\"/api/setup-cortex-status\");\n\tif (!r.ok) throw new Error(`setup-cortex status: ${r.status}`);\n\treturn r.json() as Promise<SetupCortexStatusResponse>;\n}\n\n/**\n * Drive one Setup Cortex action (POST /api/setup-cortex-action).\n *\n * Returns a discriminated union so the UI can render the blocked /\n * confirmation-required / disabled states honestly instead of swallowing the\n * server's typed error body.\n */\nexport type SetupCortexActionOutcome =\n\t| { ok: true; result: SetupCortexActionResult }\n\t| { ok: false; status: number; error: SetupCortexActionErrorBody };\n\nexport async function postSetupCortexAction(\n\tbody: SetupCortexActionRequest,\n): Promise<SetupCortexActionOutcome> {\n\tconst r = await fetch(\"/api/setup-cortex-action\", {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\tbody: JSON.stringify(body),\n\t});\n\tif (r.ok) {\n\t\treturn { ok: true, result: (await r.json()) as SetupCortexActionResult };\n\t}\n\tlet error: SetupCortexActionErrorBody;\n\ttry {\n\t\terror = (await r.json()) as SetupCortexActionErrorBody;\n\t} catch {\n\t\terror = { error: \"disabled\" };\n\t}\n\treturn { ok: false, status: r.status, error };\n}\n\n/** Bounded, redacted log tail (GET /api/setup-cortex-action-log?name=...). */\nexport async function fetchSetupCortexActionLog(\n\tname: string,\n): Promise<SetupCortexActionLogResponse> {\n\tconst r = await fetch(`/api/setup-cortex-action-log?name=${encodeURIComponent(name)}`);\n\tif (!r.ok) throw new Error(`setup-cortex action-log: ${r.status}`);\n\treturn r.json() as Promise<SetupCortexActionLogResponse>;\n}\n","/**\n * useSetupCortexPoll — polls the VC9A setup-cortex status endpoint (a sibling\n * of useVectorCortexPoll, URL + payload differ only). Each fetch is\n * best-effort: a failure sets the error slice and leaves data as-is. The\n * Cortex sub-tab uses the returned payload to render the encoder card + the\n * status badge, and SetupTab uses it to filter the sub-tab when the status\n * reports the off/disabled shape.\n */\nimport { useState, useEffect, useCallback } from \"react\";\nimport { fetchSetupCortexStatus } from \"../api/setup-cortex\";\nimport type { SetupCortexStatusResponse } from \"../types/setup-cortex\";\n\nexport interface SetupCortexPollState {\n\tloading: boolean;\n\terror: string | null;\n\tdata: SetupCortexStatusResponse | null;\n}\n\n/**\n * Whether the Cortex sub-tab should be listed in SUB_TABS.\n *\n * The sub-tab is hidden (filtered from SUB_TABS) when the VC9A status payload\n * reports the off/disabled shape — either the flag is off (`enabled:false`) or\n * the derived status is \"off\" — exactly the VC0E honest-status gating the\n * sibling VC cards use. While the payload is still loading/absent we default to\n * visible so a transient poll isn't mistaken for the off state.\n */\nexport function isCortexSubTabVisible(\n\tdata: SetupCortexStatusResponse | null,\n): boolean {\n\tif (data === null) return true;\n\treturn data.enabled && data.status !== \"off\";\n}\n\nexport function useSetupCortexPoll(): [SetupCortexPollState, () => void] {\n\tconst [state, setState] = useState<SetupCortexPollState>({\n\t\tloading: true,\n\t\terror: null,\n\t\tdata: null,\n\t});\n\n\tconst poll = useCallback(() => {\n\t\tsetState((prev) => ({ ...prev, loading: true }));\n\t\tfetchSetupCortexStatus()\n\t\t\t.then((data) =>\n\t\t\t\tsetState((prev) => ({ ...prev, data, loading: false, error: null })),\n\t\t\t)\n\t\t\t.catch((e: unknown) =>\n\t\t\t\tsetState((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tloading: false,\n\t\t\t\t\terror: e instanceof Error ? e.message : String(e),\n\t\t\t\t})),\n\t\t\t);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tpoll();\n\t\tconst id = setInterval(poll, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [poll]);\n\n\treturn [state, poll];\n}\n","/**\n * SetupTab/CortexSetupStyles.ts — shared styles for the CortexSetup sub-tab.\n *\n * Mirrors EmbedderSetupStyles conventions so the Setup Cortex sub-tab reads\n * like the rest of the Setup tab. Split out so each Cortex card stays well\n * under the extensions/ soft line limit.\n */\nimport type React from \"react\";\n\nexport const styles: Record<string, React.CSSProperties> = {\n\tcontainer: {\n\t\tpadding: \"1rem\",\n\t\tmaxWidth: \"720px\",\n\t\tmargin: \"0 auto\",\n\t\tfontFamily: \"system-ui, sans-serif\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsection: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t},\n\tsectionTitle: {\n\t\tfontSize: \"1.1rem\",\n\t\tfontWeight: 700,\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t\tcolor: \"#e0e0e0\",\n\t\tborderBottom: \"1px solid #333\",\n\t\tpaddingBottom: \"0.5rem\",\n\t},\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\twarning: {\n\t\tbackground: \"#3a2a00\",\n\t\tborder: \"1px solid #665500\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"0.75rem\",\n\t\tmarginTop: \"0.5rem\",\n\t\tcolor: \"#ffcc00\",\n\t\tfontSize: \"0.85rem\",\n\t},\n\tblocked: {\n\t\tbackground: \"#3a1a1a\",\n\t\tborder: \"1px solid #662222\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"0.75rem\",\n\t\tmarginTop: \"0.5rem\",\n\t\tcolor: \"#ff6666\",\n\t\tfontSize: \"0.85rem\",\n\t},\n\tbadge: {\n\t\tdisplay: \"inline-block\",\n\t\tpadding: \"0.15rem 0.5rem\",\n\t\tborderRadius: \"4px\",\n\t\tfontSize: \"0.8rem\",\n\t\tfontWeight: 600,\n\t\tmarginLeft: \"0.5rem\",\n\t},\n\tbutton: {\n\t\tbackground: \"#3a5a9f\",\n\t\tcolor: \"#fff\",\n\t\tborder: \"none\",\n\t\tborderRadius: \"6px\",\n\t\tpadding: \"0.5rem 1rem\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"0.9rem\",\n\t\tfontWeight: 600,\n\t},\n\tbuttonDanger: {\n\t\tbackground: \"#6a2a2a\",\n\t\tcolor: \"#ffb3b3\",\n\t\tborder: \"1px solid #662222\",\n\t\tborderRadius: \"6px\",\n\t\tpadding: \"0.5rem 1rem\",\n\t\tcursor: \"pointer\",\n\t\tfontSize: \"0.9rem\",\n\t\tfontWeight: 600,\n\t},\n\tblockerRow: {\n\t\tdisplay: \"flex\",\n\t\tjustifyContent: \"space-between\",\n\t\talignItems: \"center\",\n\t\tgap: \"0.5rem\",\n\t\tpadding: \"0.5rem 0.6rem\",\n\t\tborderRadius: \"6px\",\n\t\tmarginBottom: \"0.35rem\",\n\t\tfontSize: \"0.85rem\",\n\t},\n\tblockerRowHighlighted: {\n\t\tbackground: \"#3a1a1a\",\n\t\tborder: \"1px solid #662222\",\n\t},\n\tmono: { fontFamily: \"ui-monospace, monospace\", fontSize: \"0.8rem\" },\n};\n","/**\n * SetupTab/CortexEncoderCard.tsx — encoder gate status card (VC9C).\n *\n * Projects the VC9A reader status: effective triad mode A/B/C, asset digest\n * prefix, qualification verdict + threshold failures, and encoder health. The\n * header carries the shared VcStatusBadge driven by the payload's status field\n * (VC0E honest-status pattern). Pure projection of the polled payload — never\n * payload bytes/prompts/ledger.\n */\nimport type React from \"react\";\nimport type { SetupCortexStatusResponse } from \"../../types/setup-cortex\";\nimport { VcStatusBadge } from \"../VcStatusBadge\";\nimport { styles } from \"./CortexSetupStyles\";\n\nfunction modeLabel(mode: \"A\" | \"B\" | \"C\" | undefined): string {\n\tswitch (mode) {\n\t\tcase \"A\":\n\t\t\treturn \"A — qualified learned encoder asset\";\n\t\tcase \"B\":\n\t\t\treturn \"B — demoted (heuristic/trigram)\";\n\t\tcase \"C\":\n\t\t\treturn \"C — absent (asset not verified)\";\n\t\tdefault:\n\t\t\treturn \"—\";\n\t}\n}\n\nfunction verdictBadge(\n\tverdict: \"qualified\" | \"demoted\" | \"unavailable\" | undefined,\n): React.ReactElement {\n\tconst bg =\n\t\tverdict === \"qualified\"\n\t\t\t? \"#1a5a1a\"\n\t\t\t: verdict === \"demoted\"\n\t\t\t\t? \"#3a3a1a\"\n\t\t\t\t: \"#3a1a1a\";\n\tconst color =\n\t\tverdict === \"qualified\"\n\t\t\t? \"#4caf50\"\n\t\t\t: verdict === \"demoted\"\n\t\t\t\t? \"#ffcc00\"\n\t\t\t\t: \"#f44336\";\n\treturn (\n\t\t<span style={{ ...styles.badge, background: bg, color }}>\n\t\t\t{verdict ?? \"unknown\"}\n\t\t</span>\n\t);\n}\n\nexport function CortexEncoderCard({\n\tdata,\n\terror,\n}: {\n\tdata: SetupCortexStatusResponse | null;\n\terror: string | null;\n}): React.ReactElement {\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>\n\t\t\t\t<span style={{ marginRight: \"0.5rem\" }}>Cortex Encoder</span>\n\t\t\t\t<VcStatusBadge status={data?.status} />\n\t\t\t</h3>\n\n\t\t\t{error && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>Error: {error}</p>\n\t\t\t)}\n\t\t\t{!data && !error && (\n\t\t\t\t<p style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tLoading cortex status...\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{!data?.enabled && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tCortex status disabled (VC9A off).\n\t\t\t\t</p>\n\t\t\t)}\n\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Mode:</span>\n\t\t\t\t<span style={styles.value}>{modeLabel(data?.encoderHealth.mode)}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Asset digest prefix:</span>\n\t\t\t\t<span style={{ ...styles.value, ...styles.mono }}>\n\t\t\t\t\t{data?.assetDigestPrefix ?? (\n\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not available</span>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Qualification:</span>\n\t\t\t\t{verdictBadge(data?.qualification.verdict)}\n\t\t\t</div>\n\t\t\t{(data?.qualification.thresholdFailures.length ?? 0) > 0 && (\n\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t<strong>Threshold failure(s):</strong>{\" \"}\n\t\t\t\t\t{data?.qualification.thresholdFailures.join(\", \")}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{data?.status === \"awaiting_data\" && (\n\t\t\t\t<p style={{ color: \"#a0a0c0\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tAwaiting encoder data. Qualification will appear once an asset is\n\t\t\t\t\tpresent.\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{data?.status === \"deferred\" && (\n\t\t\t\t<p style={{ color: \"#a0a0c0\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tEncoder status deferred.\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/CortexBlockersCard.tsx — open hard-gate blockers card (VC9C + ENC-0e).\n *\n * Renders the STATUS payload's `blockers` rows (id, title, severity, status,\n * resolution). When an action returns 423 action_blocked_by_open_item, the\n * matching blocker rows are highlighted so the user sees exactly which open\n * item(s) gate the action they tried.\n *\n * ENC-0e: when the payload carries `darwinX64:{demoted:true,reason}`, an\n * explicitly-diagnosed row is rendered so an Intel-Mac operator sees exactly why\n * mode A is unreachable. Unaffected (renders nothing) when absent or not demoted.\n */\nimport type React from \"react\";\nimport type { BlockerV1 } from \"../../types/setup-cortex\";\nimport { styles } from \"./CortexSetupStyles\";\n\nfunction severityColor(severity: BlockerV1[\"severity\"]): string {\n\tswitch (severity) {\n\t\tcase \"blocker\":\n\t\t\treturn \"#f44336\";\n\t\tcase \"high\":\n\t\t\treturn \"#ff9800\";\n\t\tdefault:\n\t\t\treturn \"#a0a0c0\";\n\t}\n}\n\nexport function CortexBlockersCard({\n\tblockers,\n\thighlight,\n\tdarwinX64,\n}: {\n\tblockers: BlockerV1[];\n\thighlight?: string[];\n\tdarwinX64?: { demoted: boolean; reason?: string };\n}): React.ReactElement {\n\tconst highlighted = highlight ?? [];\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>\n\t\t\t\tOpen Hard-Gate Blockers\n\t\t\t\t<span style={{ ...styles.badge, background: \"#3a1a1a\", color: \"#f44336\" }}>\n\t\t\t\t\t{blockers.length}\n\t\t\t\t</span>\n\t\t\t</h3>\n\t\t\t{blockers.length === 0 && (\n\t\t\t\t<p style={{ color: \"#4caf50\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tNo open hard-gate blockers.\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{darwinX64?.demoted === true && (\n\t\t\t\t<div style={styles.blockerRow} data-darwin-x64-demoted=\"true\">\n\t\t\t\t\t<span style={{ ...styles.mono, fontWeight: 700 }}>HG-4</span>\n\t\t\t\t\t<span style={{ flex: 1, color: \"#e0e0e0\" }}>\n\t\t\t\t\t\t{darwinX64.reason || \"darwin-x64: demoted to WASM (reason unavailable)\"}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span style={{ color: \"#ff9800\" }}>high</span>\n\t\t\t\t\t<span style={{ color: \"#4caf50\", fontStyle: \"italic\" }}>diagnosed</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{blockers.map((b) => {\n\t\t\t\tconst isHighlighted = highlighted.includes(b.id);\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={b.id}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...styles.blockerRow,\n\t\t\t\t\t\t\t...(isHighlighted ? styles.blockerRowHighlighted : {}),\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span style={{ ...styles.mono, fontWeight: 700 }}>{b.id}</span>\n\t\t\t\t\t\t<span style={{ flex: 1, color: \"#e0e0e0\" }}>{b.title}</span>\n\t\t\t\t\t\t<span style={{ color: severityColor(b.severity) }}>\n\t\t\t\t\t\t\t{b.severity}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span style={{ color: \"#a0a0c0\", fontStyle: \"italic\" }}>\n\t\t\t\t\t\t\t{isHighlighted ? \"gates this action\" : b.status}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{highlighted.length > 0 && (\n\t\t\t\t<div style={styles.blocked}>\n\t\t\t\t\t<strong>Blocked:</strong> the requested action is gated by the\n\t\t\t\t\thighlighted open hard-gate item(s). It was not run.\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/CortexActionsCard.tsx — confirmation-gated Setup Cortex actions.\n *\n * fetch-model / bench / verify-asset. Uses the MaintenanceTab ActionDef +\n * window.confirm pattern; the POST body ALWAYS carries confirm:true (the\n * server hard-requires it). A 423 action_blocked_by_open_item surfaces the\n * gating blocker ids to the parent (which highlights the rows), a 400\n * confirmation_required and a 404 disabled are rendered honestly, and on a\n * successful run the returned logName is shown with a bounded log tail fetch.\n */\nimport type React from \"react\";\nimport { useState, useCallback } from \"react\";\nimport type {\n\tSetupCortexActionKind,\n\tSetupCortexStatusResponse,\n} from \"../../types/setup-cortex\";\nimport {\n\tpostSetupCortexAction,\n\tfetchSetupCortexActionLog,\n} from \"../../api/setup-cortex\";\nimport { styles } from \"./CortexSetupStyles\";\n\ninterface ActionDef {\n\tkey: SetupCortexActionKind;\n\tlabel: string;\n\tdesc: string;\n\tdangerous: boolean;\n\tconfirm: string;\n}\n\nconst ACTIONS: ActionDef[] = [\n\t{\n\t\tkey: \"fetch-model\",\n\t\tlabel: \"Fetch Model\",\n\t\tdesc: \"Fetch the qualified encoder model asset\",\n\t\tdangerous: true,\n\t\tconfirm:\n\t\t\t\"Fetch the encoder model asset onto this host? (Gated by any open hard gate.)\",\n\t},\n\t{\n\t\tkey: \"bench\",\n\t\tlabel: \"Bench Encoder\",\n\t\tdesc: \"Benchmark the encoder runtime on this host\",\n\t\tdangerous: true,\n\t\tconfirm:\n\t\t\t\"Run an encoder benchmark on this host? (Gated by any open hard gate.)\",\n\t},\n\t{\n\t\tkey: \"verify-asset\",\n\t\tlabel: \"Verify Asset\",\n\t\tdesc: \"Re-verify the committed encoder asset\",\n\t\tdangerous: false,\n\t\tconfirm: \"Re-verify the committed encoder asset?\",\n\t},\n];\n\ninterface ActionResultDisplay {\n\taction: string;\n\tlogName: string;\n\ttail: string | null;\n\tcomplete: boolean | null;\n\tmessage: string;\n}\n\nexport function CortexActionsCard({\n\tdata,\n\tonBlocked,\n\tonAction,\n}: {\n\tdata: SetupCortexStatusResponse | null;\n\tonBlocked: (blockerIds: string[]) => void;\n\tonAction: () => void;\n}): React.ReactElement {\n\tconst [running, setRunning] = useState<SetupCortexActionKind | null>(null);\n\tconst [result, setResult] = useState<ActionResultDisplay | null>(null);\n\tconst [actionError, setActionError] = useState<string | null>(null);\n\tconst [disabled, setDisabled] = useState(false);\n\n\tconst runAction = useCallback(\n\t\tasync (def: ActionDef) => {\n\t\t\tsetRunning(def.key);\n\t\t\tsetActionError(null);\n\t\t\tsetResult(null);\n\t\t\tsetDisabled(false);\n\t\t\tonBlocked([]);\n\t\t\ttry {\n\t\t\t\tconst outcome = await postSetupCortexAction({\n\t\t\t\t\taction: def.key,\n\t\t\t\t\tconfirm: true,\n\t\t\t\t});\n\t\t\t\tif (outcome.ok) {\n\t\t\t\t\tconst r = outcome.result;\n\t\t\t\t\tlet tail: string | null = null;\n\t\t\t\t\tlet complete: boolean | null = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst log = await fetchSetupCortexActionLog(r.logName);\n\t\t\t\t\t\ttail = log.tail;\n\t\t\t\t\t\tcomplete = log.complete;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* log tail is best-effort */\n\t\t\t\t\t}\n\t\t\t\t\tsetResult({\n\t\t\t\t\t\taction: r.action,\n\t\t\t\t\t\tlogName: r.logName,\n\t\t\t\t\t\ttail,\n\t\t\t\t\t\tcomplete,\n\t\t\t\t\t\tmessage: r.ok\n\t\t\t\t\t\t\t? `${r.action} completed (spawned: ${r.spawned})`\n\t\t\t\t\t\t\t: `${r.action} did not complete cleanly`,\n\t\t\t\t\t});\n\t\t\t\t\tonAction();\n\t\t\t\t} else if (outcome.error.error === \"action_blocked_by_open_item\") {\n\t\t\t\t\tonBlocked(outcome.error.blockers);\n\t\t\t\t\tsetActionError(\n\t\t\t\t\t\t\"The action is blocked by an open hard-gate item and was not run.\",\n\t\t\t\t\t);\n\t\t\t\t} else if (outcome.error.error === \"confirmation_required\") {\n\t\t\t\t\tsetActionError(\n\t\t\t\t\t\t\"The server rejected the action: explicit confirmation is required.\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tsetDisabled(true);\n\t\t\t\t\tsetActionError(\n\t\t\t\t\t\toutcome.status === 404\n\t\t\t\t\t\t\t? \"Setup Cortex actions are disabled (off).\"\n\t\t\t\t\t\t\t: `Action failed (${outcome.status}).`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tsetActionError(e instanceof Error ? e.message : String(e));\n\t\t\t} finally {\n\t\t\t\tsetRunning(null);\n\t\t\t}\n\t\t},\n\t\t[onBlocked, onAction],\n\t);\n\n\tconst handleClick = (def: ActionDef) => {\n\t\tif (!window.confirm(def.confirm)) return;\n\t\tvoid runAction(def);\n\t};\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Cortex Actions</h3>\n\n\t\t\t{ACTIONS.map((def) => {\n\t\t\t\tconst isRunning = running === def.key;\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={def.key}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\t\t\t\tgap: \"0.5rem\",\n\t\t\t\t\t\t\tpadding: \"0.5rem 0\",\n\t\t\t\t\t\t\tborderBottom: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div style={{ fontWeight: 600 }}>{def.label}</div>\n\t\t\t\t\t\t\t<div style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\" }}>\n\t\t\t\t\t\t\t\t{def.desc}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tstyle={def.dangerous ? styles.buttonDanger : styles.button}\n\t\t\t\t\t\t\tdisabled={running !== null}\n\t\t\t\t\t\t\tonClick={() => handleClick(def)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isRunning ? \"Running…\" : \"Run\"}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\n\t\t\t{disabled && (\n\t\t\t\t<div style={styles.blocked}>\n\t\t\t\t\tSetup Cortex actions are disabled. Enable MEGACOMPACT_VC9B to run\n\t\t\t\t\tthem.\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{actionError && !disabled && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\", marginTop: \"0.5rem\" }}>\n\t\t\t\t\t{actionError}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{result && (\n\t\t\t\t<div style={styles.warning} data-testid=\"cortex-action-result\">\n\t\t\t\t\t<strong>Result ({result.action}):</strong> {result.message}\n\t\t\t\t\t{result.logName && (\n\t\t\t\t\t\t<span style={{ ...styles.mono, marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\tlog: {result.logName}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{result.tail !== null && (\n\t\t\t\t\t\t<pre\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\t\t\t\t\twordBreak: \"break-word\",\n\t\t\t\t\t\t\t\tfontSize: \"0.75rem\",\n\t\t\t\t\t\t\t\tmaxHeight: \"12rem\",\n\t\t\t\t\t\t\t\toverflow: \"auto\",\n\t\t\t\t\t\t\t\tmarginTop: \"0.5rem\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{result.tail}\n\t\t\t\t\t\t\t{result.complete === false && \"\\n… (truncated)\"}\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{!data?.enabled && !disabled && (\n\t\t\t\t<p style={{ color: \"#a0a0c0\", fontSize: \"0.8rem\", marginTop: \"0.5rem\" }}>\n\t\t\t\t\tCortex status unavailable — actions may not be schedulable.\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/CortexSetup.tsx — Setup Cortex sub-tab wizard shell (VC9C).\n *\n * Composes the encoder / blockers / actions cards. Polls the VC9A status via\n * useSetupCortexPoll (5s, best-effort) and shares one blocked-highlight set:\n * when an action returns 423 action_blocked_by_open_item, the gating blocker\n * rows are highlighted on the blockers card.\n *\n * Pure consumer of the VC9A status + VC9B action endpoints — NO server logic.\n */\nimport type React from \"react\";\nimport { useState, useCallback } from \"react\";\nimport { useSetupCortexPoll } from \"../useSetupCortexPoll\";\nimport { CortexEncoderCard } from \"./CortexEncoderCard\";\nimport { CortexBlockersCard } from \"./CortexBlockersCard\";\nimport { CortexActionsCard } from \"./CortexActionsCard\";\nimport { styles } from \"./CortexSetupStyles\";\n\nexport default function CortexSetup(): React.ReactElement {\n\tconst [state, poll] = useSetupCortexPoll();\n\tconst [highlight, setHighlight] = useState<string[]>([]);\n\n\tconst onBlocked = useCallback((blockerIds: string[]) => {\n\t\tsetHighlight(blockerIds);\n\t}, []);\n\n\tconst onAction = useCallback(() => {\n\t\tpoll();\n\t}, [poll]);\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h2 style={{ fontSize: \"1.3rem\", marginTop: 0, marginBottom: \"1rem\" }}>\n\t\t\t\tSetup Cortex\n\t\t\t</h2>\n\t\t\t<p style={{ fontSize: \"0.85rem\", color: \"#a0a0c0\", marginTop: 0 }}>\n\t\t\t\tVector-cortex encoder gate: mode, qualification, open hard-gate\n\t\t\t\tblockers, and the confirmation-gated fetch/bench/verify actions.\n\t\t\t</p>\n\n\t\t\t<CortexEncoderCard data={state.data} error={state.error} />\n\t\t\t<CortexBlockersCard\n\t\t\t\tblockers={state.data?.blockers ?? []}\n\t\t\t\thighlight={highlight}\n\t\t\t\tdarwinX64={state.data?.darwinX64}\n\t\t\t/>\n\t\t\t<CortexActionsCard\n\t\t\t\tdata={state.data}\n\t\t\t\tonBlocked={onBlocked}\n\t\t\t\tonAction={onAction}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","/**\n * dashboard-client/src/tabs/SetupTab.tsx — Setup wizard tab shell (P0b).\n *\n * Sub-tab shell routing between Embedder / Thresholds / Config / Game Mode /\n * Achievements / Cortex. The embedder setup section lives in\n * SetupTab/EmbedderSetup.tsx; the VC9C Cortex sub-tab lives in\n * SetupTab/CortexSetup.tsx.\n *\n * PREVENT-PI-004: all data comes from localhost dashboard API endpoints —\n * no external network calls.\n */\nimport type React from \"react\";\nimport { useState, useMemo } from \"react\";\nimport GameTab from \"./GameTab\";\nimport AchievementsTab from \"./AchievementsTab\";\nimport ConfigTab from \"./ConfigTab\";\nimport EmbedderSetup from \"./SetupTab/EmbedderSetup\";\nimport ThresholdsPanel from \"./SetupTab/ThresholdsPanel\";\nimport CortexSetup from \"./SetupTab/CortexSetup\";\nimport { Toggle } from \"../components/ui/toggle\";\nimport { useSetupCortexPoll, isCortexSubTabVisible } from \"./useSetupCortexPoll\";\n\ntype SetupSubTab =\n\t| \"embedder\"\n\t| \"thresholds\"\n\t| \"config\"\n\t| \"game\"\n\t| \"achievements\"\n\t| \"cortex\";\n\nconst BASE_SUB_TABS: ReadonlyArray<{ id: SetupSubTab; label: string }> = [\n\t{ id: \"embedder\", label: \"Embedder\" },\n\t{ id: \"thresholds\", label: \"Thresholds\" },\n\t{ id: \"config\", label: \"Config\" },\n\t{ id: \"game\", label: \"Game Mode\" },\n\t{ id: \"achievements\", label: \"Achievements\" },\n];\n\n/** The Cortex sub-tab is filtered out when VC9A reports the off/disabled shape. */\nconst CORTEX_TAB = { id: \"cortex\", label: \"Cortex\" } as const;\n\nexport default function SetupTab(): React.ReactElement {\n\tconst [subTab, setSubTab] = useState<SetupSubTab>(\"embedder\");\n\tconst [cortex] = useSetupCortexPoll();\n\n\tconst subTabs = useMemo(() => {\n\t\tconst tabs = [...BASE_SUB_TABS];\n\t\tif (isCortexSubTabVisible(cortex.data)) tabs.push(CORTEX_TAB);\n\t\treturn tabs;\n\t}, [cortex.data]);\n\n\treturn (\n\t\t<div className=\"mx-auto flex max-w-3xl flex-col gap-4 p-4\">\n\t\t\t<nav\n\t\t\t\tclassName=\"flex gap-2 border-b border-border pb-2\"\n\t\t\t\taria-label=\"Setup sections\"\n\t\t\t>\n\t\t\t\t{subTabs.map((t) => (\n\t\t\t\t\t<Toggle\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\tpressed={subTab === t.id}\n\t\t\t\t\t\tonClick={() => setSubTab(t.id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t.label}\n\t\t\t\t\t</Toggle>\n\t\t\t\t))}\n\t\t\t</nav>\n\n\t\t\t{subTab === \"embedder\" && <EmbedderSetup />}\n\t\t\t{subTab === \"thresholds\" && <ThresholdsPanel />}\n\t\t\t{subTab === \"config\" && <ConfigTab />}\n\t\t\t{subTab === \"game\" && <GameTab />}\n\t\t\t{subTab === \"achievements\" && <AchievementsTab />}\n\t\t\t{subTab === \"cortex\" && <CortexSetup />}\n\t\t</div>\n\t);\n}\n"],"names":["fmtUnlockDate","ts","AchievementTiles","achievements","lastMaxTsRef","useRef","toastText","setToastText","useState","maxTs","mx","a","prevMaxTs","useEffect","newly","text","t","tiles","jsxs","jsx","isNew","fmtPct","v","fmtDate","trophyMeta","m","repoBasename","path","LeaderboardCard","title","rows","badge","renderValue","GameTab","scores","setScores","reposCount","setReposCount","setAchievements","gameModeOn","setGameModeOn","loading","setLoading","megaToast","setMegaToast","lastMegaTsRef","fetchAll","useCallback","cache","dedupe","turns","megaCache","repos","ach","fetchGameScores","fetchAchievements","newRow","r","active","doFetch","timer","gs","fetchGameState","megaRows","bestMega","firstSeen","fs","showMega","turnsRows","maxTurns","lvl","hasData","Fragment","AchievementsTab","error","setError","e","run","THEMES","THEME_IDS","TOOLTIPS","formatThreshold","tokens","tierPct","cw","txt","formatPressure","pressure","ConfigTab","snapshot","setSnapshot","gameState","setGameState","saving","setSaving","s","fetchSnapshot","handlePatch","patch","result","putGameState","gmOn","themeVal","tuiVal","cfg","i","next","styles","EmbedderHealthCard","health","setHealth","loadHealth","fetchEmbedderHealth","id","ok","statusText","color","icon","SettingsSection","children","open","setOpen","panelId","o","ChevronDown","cn","INPUT_CLASS","LlmBadge","SettingRow","setting","llmActive","onUpdate","locked","timerRef","submit","raw","msg","scheduleSave","inputDisabled","Switch","checked","SettingsPanel","settings","setSettings","toast","setToast","load","fetchSettings","handleUpdate","key","res","postSetting","cat","CustomEndpointSection","customUrl","setCustomUrl","applyEmbedder","configuring","EmbedderSetup","status","setStatus","detect","setDetect","statusError","setStatusError","detectError","setDetectError","runningDetect","setRunningDetect","setConfiguring","configResult","setConfigResult","configError","setConfigError","loadStatus","fetchSetupStatus","embedder","url","configureEmbedder","runDetect","fetchSetupDetect","d","embedderLabel","trigramWarning","detectBadge","installed","bg","fmtWindow","n","usableTail","ctxWindow","maxTokens","safetyPct","reserve","usable","ThresholdSlider","label","value","min","max","step","onChange","warning","ModelThresholdRow","model","defaults","safetyRange","fireRange","onSave","onReset","safety","setSafety","fire","setFire","dirty","setDirty","err","setErr","safetyWarning","fireWarning","save","ThresholdsPanel","data","setData","fetchModelThresholds","modelId","safetyMarginPct","firePointPct","putModelThreshold","deleteModelThreshold","fetchSetupCortexStatus","postSetupCortexAction","body","fetchSetupCortexActionLog","name","isCortexSubTabVisible","useSetupCortexPoll","state","setState","poll","prev","modeLabel","mode","verdictBadge","verdict","CortexEncoderCard","VcStatusBadge","severityColor","severity","CortexBlockersCard","blockers","highlight","darwinX64","highlighted","b","isHighlighted","ACTIONS","CortexActionsCard","onBlocked","onAction","running","setRunning","setResult","actionError","setActionError","disabled","setDisabled","runAction","def","outcome","tail","complete","log","handleClick","isRunning","CortexSetup","setHighlight","blockerIds","BASE_SUB_TABS","CORTEX_TAB","SetupTab","subTab","setSubTab","cortex","subTabs","useMemo","tabs","Toggle"],"mappings":"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"}
|