pi-mega-compact 0.20.78 → 0.20.80

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.
Files changed (107) hide show
  1. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +1 -0
  2. package/dist/extensions/mega-config.js +2 -0
  3. package/dist/extensions/mega-events/analytics-handler.js +169 -0
  4. package/dist/extensions/mega-events/register.js +3 -0
  5. package/dist/src/queryExpansion.js +1 -0
  6. package/dist/src/store/analytics/connection.js +114 -0
  7. package/dist/src/store/analytics/contract-compliance.test/_helpers.js +39 -0
  8. package/dist/src/store/analytics/index.js +25 -0
  9. package/dist/src/store/analytics/memory-store.js +111 -0
  10. package/dist/src/store/analytics/schema.js +108 -0
  11. package/dist/src/store/analytics/sqlite-store/admin.js +84 -0
  12. package/dist/src/store/analytics/sqlite-store/ctx.js +1 -0
  13. package/dist/src/store/analytics/sqlite-store/read.js +25 -0
  14. package/dist/src/store/analytics/sqlite-store/rows.js +44 -0
  15. package/dist/src/store/analytics/sqlite-store/write.js +90 -0
  16. package/dist/src/store/analytics/sqlite-store.js +79 -0
  17. package/dist/src/store/analytics/types.js +17 -0
  18. package/dist/src/store/sqlite/utils.js +7 -0
  19. package/dist/src/store/turns/connection.js +1 -1
  20. package/dist/src/vector-cortex/ledger/sqlite.js +1 -0
  21. package/dist/vector-cortex/ledger/sqlite.js +1 -0
  22. package/extensions/dashboard-client/dist/assets/{AdminTab-BsA8-_bX.js → AdminTab-C-kTQx7a.js} +2 -2
  23. package/extensions/dashboard-client/dist/assets/{AdminTab-BsA8-_bX.js.map → AdminTab-C-kTQx7a.js.map} +1 -1
  24. package/extensions/dashboard-client/dist/assets/{AreaChart-BRHEfWhc.js → AreaChart-BmntvH86.js} +2 -2
  25. package/extensions/dashboard-client/dist/assets/{AreaChart-BRHEfWhc.js.map → AreaChart-BmntvH86.js.map} +1 -1
  26. package/extensions/dashboard-client/dist/assets/{BarChart-C-M0LaFc.js → BarChart-D_AStVsb.js} +2 -2
  27. package/extensions/dashboard-client/dist/assets/{BarChart-C-M0LaFc.js.map → BarChart-D_AStVsb.js.map} +1 -1
  28. package/extensions/dashboard-client/dist/assets/{CacheTab-Cj3n59U3.js → CacheTab-VRFk7EPo.js} +2 -2
  29. package/extensions/dashboard-client/dist/assets/{CacheTab-Cj3n59U3.js.map → CacheTab-VRFk7EPo.js.map} +1 -1
  30. package/extensions/dashboard-client/dist/assets/{ConfigTab-C016XTNC.js → ConfigTab-Ci5LOohz.js} +2 -2
  31. package/extensions/dashboard-client/dist/assets/{ConfigTab-C016XTNC.js.map → ConfigTab-Ci5LOohz.js.map} +1 -1
  32. package/extensions/dashboard-client/dist/assets/{EventsTab-DE29fuqe.js → EventsTab-8Y7if14O.js} +2 -2
  33. package/extensions/dashboard-client/dist/assets/{EventsTab-DE29fuqe.js.map → EventsTab-8Y7if14O.js.map} +1 -1
  34. package/extensions/dashboard-client/dist/assets/{HealthTab-D4eVI8ar.js → HealthTab-Cw5eYIYq.js} +2 -2
  35. package/extensions/dashboard-client/dist/assets/{HealthTab-D4eVI8ar.js.map → HealthTab-Cw5eYIYq.js.map} +1 -1
  36. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-4fJ7M4S4.js → MaintenanceTab-B0o3a57B.js} +2 -2
  37. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-4fJ7M4S4.js.map → MaintenanceTab-B0o3a57B.js.map} +1 -1
  38. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-CDbcK9e4.js → MemoryMapTab-JV8mLhsc.js} +2 -2
  39. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-CDbcK9e4.js.map → MemoryMapTab-JV8mLhsc.js.map} +1 -1
  40. package/extensions/dashboard-client/dist/assets/{MetricsCards-VUEcgGzo.js → MetricsCards-Bkcv7Nl8.js} +2 -2
  41. package/extensions/dashboard-client/dist/assets/{MetricsCards-VUEcgGzo.js.map → MetricsCards-Bkcv7Nl8.js.map} +1 -1
  42. package/extensions/dashboard-client/dist/assets/MetricsTab-CAG4VgbM.js +2 -0
  43. package/extensions/dashboard-client/dist/assets/{MetricsTab-CKqJ0Zl-.js.map → MetricsTab-CAG4VgbM.js.map} +1 -1
  44. package/extensions/dashboard-client/dist/assets/OverviewTab-gxdUR58S.js +16 -0
  45. package/extensions/dashboard-client/dist/assets/OverviewTab-gxdUR58S.js.map +1 -0
  46. package/extensions/dashboard-client/dist/assets/{ReposTab-C4iveqrP.js → ReposTab-2hMRSS76.js} +2 -2
  47. package/extensions/dashboard-client/dist/assets/{ReposTab-C4iveqrP.js.map → ReposTab-2hMRSS76.js.map} +1 -1
  48. package/extensions/dashboard-client/dist/assets/{SessionsTab-DSEwkMQm.js → SessionsTab-Pjx5TBtW.js} +2 -2
  49. package/extensions/dashboard-client/dist/assets/{SessionsTab-DSEwkMQm.js.map → SessionsTab-Pjx5TBtW.js.map} +1 -1
  50. package/extensions/dashboard-client/dist/assets/{SetupTab-CCyWgy4O.js → SetupTab-B6Y3eHXo.js} +2 -2
  51. package/extensions/dashboard-client/dist/assets/{SetupTab-CCyWgy4O.js.map → SetupTab-B6Y3eHXo.js.map} +1 -1
  52. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-CyD8e_e_.js → TimeSavedCard-BSo2lwSE.js} +2 -2
  53. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-CyD8e_e_.js.map → TimeSavedCard-BSo2lwSE.js.map} +1 -1
  54. package/extensions/dashboard-client/dist/assets/{TurnMemoryView-5tLbWkRv.js → TurnMemoryView-CdGCu8Af.js} +2 -2
  55. package/extensions/dashboard-client/dist/assets/{TurnMemoryView-5tLbWkRv.js.map → TurnMemoryView-CdGCu8Af.js.map} +1 -1
  56. package/extensions/dashboard-client/dist/assets/TurnsTab-Cc4kAoAR.js +2 -0
  57. package/extensions/dashboard-client/dist/assets/{TurnsTab-C7pm92Hg.js.map → TurnsTab-Cc4kAoAR.js.map} +1 -1
  58. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-ObhcIyfN.js → VcStatusBadge-DcLNLyy6.js} +2 -2
  59. package/extensions/dashboard-client/dist/assets/{VcStatusBadge-ObhcIyfN.js.map → VcStatusBadge-DcLNLyy6.js.map} +1 -1
  60. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-BtHZb7o7.js → VectorCortexTab-n-3v91td.js} +2 -2
  61. package/extensions/dashboard-client/dist/assets/{VectorCortexTab-BtHZb7o7.js.map → VectorCortexTab-n-3v91td.js.map} +1 -1
  62. package/extensions/dashboard-client/dist/assets/{WikiTab-lQ4l3QIK.js → WikiTab-BpwWUleH.js} +2 -2
  63. package/extensions/dashboard-client/dist/assets/{WikiTab-lQ4l3QIK.js.map → WikiTab-BpwWUleH.js.map} +1 -1
  64. package/extensions/dashboard-client/dist/assets/{button-DhQQAJGm.js → button-B38fJDBG.js} +2 -2
  65. package/extensions/dashboard-client/dist/assets/{button-DhQQAJGm.js.map → button-B38fJDBG.js.map} +1 -1
  66. package/extensions/dashboard-client/dist/assets/{card-Cfhz9X31.js → card-COtt-Q5y.js} +2 -2
  67. package/extensions/dashboard-client/dist/assets/{card-Cfhz9X31.js.map → card-COtt-Q5y.js.map} +1 -1
  68. package/extensions/dashboard-client/dist/assets/{client-extra-CKNOGEz_.js → client-extra-D659nPqu.js} +2 -2
  69. package/extensions/dashboard-client/dist/assets/{client-extra-CKNOGEz_.js.map → client-extra-D659nPqu.js.map} +1 -1
  70. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-JKjK9_cB.js → generateCategoricalChart-COFUvM7d.js} +2 -2
  71. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-JKjK9_cB.js.map → generateCategoricalChart-COFUvM7d.js.map} +1 -1
  72. package/extensions/dashboard-client/dist/assets/{index-iuxgtzEW.js → index-C3ZUU5vU.js} +3 -3
  73. package/extensions/dashboard-client/dist/assets/{index-iuxgtzEW.js.map → index-C3ZUU5vU.js.map} +1 -1
  74. package/extensions/dashboard-client/dist/assets/{switch-7EHEQMSP.js → switch-DvYCCZ0E.js} +2 -2
  75. package/extensions/dashboard-client/dist/assets/{switch-7EHEQMSP.js.map → switch-DvYCCZ0E.js.map} +1 -1
  76. package/extensions/dashboard-client/dist/assets/{toggle-z1lWY4UM.js → toggle-bJGW8eFJ.js} +2 -2
  77. package/extensions/dashboard-client/dist/assets/{toggle-z1lWY4UM.js.map → toggle-bJGW8eFJ.js.map} +1 -1
  78. package/extensions/dashboard-client/dist/assets/{useSSE-sctOZuRM.js → useSSE-D-OoWxa2.js} +2 -2
  79. package/extensions/dashboard-client/dist/assets/{useSSE-sctOZuRM.js.map → useSSE-D-OoWxa2.js.map} +1 -1
  80. package/extensions/dashboard-client/dist/index.html +1 -1
  81. package/extensions/dashboard-client/src/components/RepoContextStack.tsx +28 -21
  82. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +6 -0
  83. package/extensions/mega-config-types.ts +3 -0
  84. package/extensions/mega-config.ts +2 -0
  85. package/extensions/mega-events/analytics-handler.ts +236 -0
  86. package/extensions/mega-events/register.ts +3 -0
  87. package/package.json +1 -1
  88. package/src/queryExpansion.ts +1 -0
  89. package/src/store/analytics/connection.ts +128 -0
  90. package/src/store/analytics/contract-compliance.test/_helpers.ts +47 -0
  91. package/src/store/analytics/index.ts +61 -0
  92. package/src/store/analytics/memory-store.ts +161 -0
  93. package/src/store/analytics/schema.ts +132 -0
  94. package/src/store/analytics/sqlite-store/admin.ts +96 -0
  95. package/src/store/analytics/sqlite-store/ctx.ts +9 -0
  96. package/src/store/analytics/sqlite-store/read.ts +46 -0
  97. package/src/store/analytics/sqlite-store/rows.ts +58 -0
  98. package/src/store/analytics/sqlite-store/write.ts +111 -0
  99. package/src/store/analytics/sqlite-store.ts +119 -0
  100. package/src/store/analytics/types.ts +202 -0
  101. package/src/store/sqlite/utils.ts +7 -0
  102. package/src/store/turns/connection.ts +1 -1
  103. package/src/vector-cortex/ledger/sqlite.ts +1 -0
  104. package/extensions/dashboard-client/dist/assets/MetricsTab-CKqJ0Zl-.js +0 -2
  105. package/extensions/dashboard-client/dist/assets/OverviewTab-9Kxo79mi.js +0 -16
  106. package/extensions/dashboard-client/dist/assets/OverviewTab-9Kxo79mi.js.map +0 -1
  107. package/extensions/dashboard-client/dist/assets/TurnsTab-C7pm92Hg.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SetupTab-CCyWgy4O.js","sources":["../../src/components/AchievementTiles.tsx","../../src/tabs/GameTab.tsx","../../src/tabs/AchievementsTab.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/EmbedderSetupHelpers.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/CortexRuntimeCardStyles.ts","../../src/tabs/SetupTab/CortexRuntimeCard.tsx","../../src/tabs/SetupTab/CortexRuntimeInstallCard.tsx","../../src/tabs/SetupTab/CortexRetestCard.tsx","../../src/tabs/SetupTab/VectorCortexCosineFpCard.tsx","../../src/tabs/SetupTab/VectorCortexRepoCorpusCard.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 * 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 *\n * ENC-1a: an additive \"API key (optional Bearer)\" password input sits beside the\n * existing custom-URL input. The key is NEVER prefilled (the setup-status GET does\n * not echo it — only an \"is set\" boolean, embeddingApiKeySet) and it is only ever\n * sent up via the POST /api/setup-configure body. When the ENC-1a surface is\n * inactive (flag off, the server omits the new GET fields) the key input is hidden\n * and only the pre-existing URL row remains — byte-identical to the predecessor.\n */\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport type { SetupConfigureResponse } from \"@contracts\";\nimport { styles } from \"./EmbedderSetupStyles\";\n\n/** ENC-1a surfaced a successful custom-endpoint persistence on the card. */\nconst SAVED_NOTICE = \"Saved; takes effect on next session start\";\n\ninterface CustomEndpointSectionProps {\n\tcustomUrl: string;\n\tsetCustomUrl: (v: string) => void;\n\tapplyEmbedder: (\n\t\tembedder: \"ollama\" | \"llama\" | \"trigram\" | \"custom\" | \"onnx\",\n\t\turl?: string,\n\t\tapiKey?: string,\n\t\tdim?: string,\n\t\theaders?: string,\n\t\tallowRemote?: boolean,\n\t) => void;\n\tconfiguring: string | null;\n\t/** ENC-1a surface active — true when the new setup-status fields are present. */\n\tinputEnabled: boolean;\n\t/** Server-reported \"key is set\" marker (the key itself is never returned). */\n\tapiKeySet: boolean;\n\t/** ENC-1b: the persisted `embeddingDim` value (numeric string), or undefined. One-shot seed. */\n\tembeddingDim: string | undefined;\n\t/** ENC-1b: server-reported \"headers are set\" marker (the raw JSON is never returned). */\n\tembeddingHeadersSet: boolean;\n\t/** ENC-1b: the persisted allow-remote flag, or undefined. One-shot seed. */\n\tallowRemoteEmbedder: boolean | undefined;\n\tconfigureResult: SetupConfigureResponse | null;\n\tconfigureError: string | null;\n}\n\nexport default function CustomEndpointSection({\n\tcustomUrl,\n\tsetCustomUrl,\n\tapplyEmbedder,\n\tconfiguring,\n\tinputEnabled,\n\tapiKeySet,\n\tembeddingDim,\n\tembeddingHeadersSet,\n\tallowRemoteEmbedder,\n\tconfigureResult,\n\tconfigureError,\n}: CustomEndpointSectionProps): React.ReactElement {\n\t// The API key is intentionally local-only state: it always renders blank and\n\t// is never seeded from the persisted value (the server never returns it).\n\tconst [customApiKey, setCustomApiKey] = useState(\"\");\n\t// ENC-1b: the embedding dim, seeded once from the persisted value (never\n\t// re-seeded after a poll so the user's in-flight edits survive the 5s poll).\n\tconst [dim, setDim] = useState(\"\");\n\tconst [dimSeeded, setDimSeeded] = useState(false);\n\t// ENC-1b: the headers JSON is local-only, write-only state: NEVER prefilled,\n\t// never seeded, never shown back — the server persists it verbatim and only\n\t// ever reports its presence via `embeddingHeadersSet`.\n\tconst [headers, setHeaders] = useState(\"\");\n\t// ENC-1b: allow-remote toggle, seeded once from the persisted flag.\n\tconst [allowRemote, setAllowRemote] = useState(false);\n\tconst [allowRemoteSeeded, setAllowRemoteSeeded] = useState(false);\n\n\tif (inputEnabled && !dimSeeded && typeof embeddingDim === \"string\") {\n\t\tsetDim(embeddingDim);\n\t\tsetDimSeeded(true);\n\t}\n\tif (inputEnabled && !allowRemoteSeeded && typeof allowRemoteEmbedder === \"boolean\") {\n\t\tsetAllowRemote(allowRemoteEmbedder);\n\t\tsetAllowRemoteSeeded(true);\n\t}\n\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{inputEnabled && (\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tautoComplete=\"new-password\"\n\t\t\t\t\t\taria-label=\"API key (optional Bearer)\"\n\t\t\t\t\t\tplaceholder=\"API key (optional Bearer)\"\n\t\t\t\t\t\tvalue={customApiKey}\n\t\t\t\t\t\tonChange={(e) => setCustomApiKey(e.target.value)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: \"1 1 300px\",\n\t\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{inputEnabled && apiKeySet && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: \"0.75rem\",\n\t\t\t\t\t\t\tcolor: \"#81c784\",\n\t\t\t\t\t\t\tborder: \"1px solid #2a4e2a\",\n\t\t\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\t\t\tpadding: \"0.15rem 0.45rem\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tAPI key saved\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{inputEnabled && embeddingHeadersSet && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: \"0.75rem\",\n\t\t\t\t\t\t\tcolor: \"#81c784\",\n\t\t\t\t\t\t\tborder: \"1px solid #2a4e2a\",\n\t\t\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\t\t\tpadding: \"0.15rem 0.45rem\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tHeaders saved\n\t\t\t\t\t</span>\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={() =>\n\t\t\t\t\t\tapplyEmbedder(\"custom\", customUrl, customApiKey, dim, headers, allowRemote)\n\t\t\t\t\t}\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{inputEnabled && (\n\t\t\t\t<div style={{ marginTop: \"0.75rem\" }}>\n\t\t\t\t\t<div style={{ marginBottom: \"0.5rem\" }}>\n\t\t\t\t\t\t<label style={{ ...styles.label, display: \"block\", marginBottom: \"0.25rem\" }}>\n\t\t\t\t\t\t\tEmbedding dim (optional)\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tplaceholder=\"e.g. 384\"\n\t\t\t\t\t\t\tvalue={dim}\n\t\t\t\t\t\t\tonChange={(e) => setDim(e.target.value)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: \"200px\",\n\t\t\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ marginBottom: \"0.5rem\" }}>\n\t\t\t\t\t\t<label style={{ ...styles.label, display: \"block\", marginBottom: \"0.25rem\" }}>\n\t\t\t\t\t\t\tEmbedding headers (JSON, write-only — never re-displayed)\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tplaceholder={'{\"Authorization\": \"Bearer ...\"}'}\n\t\t\t\t\t\t\tvalue={headers}\n\t\t\t\t\t\t\tonChange={(e) => setHeaders(e.target.value)}\n\t\t\t\t\t\t\taria-label=\"Embedding headers JSON (write-only — never re-displayed)\"\n\t\t\t\t\t\t\trows={2}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t\t\tresize: \"vertical\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<label style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", fontSize: \"0.85rem\" }}>\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={allowRemote}\n\t\t\t\t\t\t\tonChange={(e) => setAllowRemote(e.target.checked)}\n\t\t\t\t\t\t\taria-label=\"Allow remote embedder (skips loopback-only check)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAllow remote embedder (skips loopback-only check)\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{configureError !== null && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\", marginTop: \"0.5rem\" }}>\n\t\t\t\t\tConfigure error: {configureError}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{configureResult !== null && configureResult.embedder === \"custom\" && (\n\t\t\t\t<div style={styles.warning}>{SAVED_NOTICE}</div>\n\t\t\t)}\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/EmbedderSetupHelpers.tsx — extracted render helpers for EmbedderSetup.\n *\n * Split from EmbedderSetup.tsx to respect the extensions/ 400-line soft limit\n * (ENC-1a pushed the embedder card over its cap, so the helpers were extracted).\n */\nimport type React from \"react\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport { styles } from \"./EmbedderSetupStyles\";\n\n/** Human label for an embedder identifier. */\nexport function embedderLabel(e: string): string {\n\tswitch (e) {\n\t\tcase \"trigram\":\n\t\t\treturn \"TrigramEmbedder (heuristic, default)\";\n\t\tcase \"http\":\n\t\t\treturn \"HTTP Embedder (BYO localhost)\";\n\t\tcase \"minilm\":\n\t\t\treturn \"MiniLM (experimental)\";\n\t\tdefault:\n\t\t\treturn \"Unknown\";\n\t}\n}\n\n/** Warn when the active embedder is the heuristic trigram default. */\nexport function trigramWarning(status: SetupStatusResponse | null): React.ReactElement | null {\n\tif (status?.currentEmbedder !== \"trigram\") return null;\n\treturn (\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\n/** Installed / not-found badge dot for a detection row. */\nexport function detectBadge(installed: boolean): React.ReactElement {\n\tconst bg = installed ? \"#1a5a1a\" : \"#3a1a1a\";\n\tconst color = installed ? \"#4caf50\" : \"#f44336\";\n\treturn (\n\t\t<span style={{ ...styles.badge, background: bg, color }}>\n\t\t\t{installed ? \"Detected\" : \"Not found\"}\n\t\t</span>\n\t);\n}\n\n/** The \"Current Embedder Configuration\" readout block. */\nexport function CurrentConfigSection({\n\tstatus,\n\tstatusError,\n}: {\n\tstatus: SetupStatusResponse | null;\n\tstatusError: string | null;\n}): React.ReactElement {\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>\n\t\t\t{statusError && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError: {statusError}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{status && (\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}>Active Embedder:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{embedderLabel(status.currentEmbedder)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{\"configuredEmbedder\" in status && status.configuredEmbedder !== status.currentEmbedder && (\n\t\t\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t\t\t<strong>Configured but not active:</strong>{\" \"}\n\t\t\t\t\t\t\t{embedderLabel(status.configuredEmbedder)} is configured in\n\t\t\t\t\t\t\t.mega-compact.env but not yet loaded.{\" \"}\n\t\t\t\t\t\t\t<strong>Restart pi</strong> to activate it.\n\t\t\t\t\t\t\t{status.configuredUrl && (\n\t\t\t\t\t\t\t\t<> ({status.configuredUrl})</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{\"restartRequired\" in status && status.restartRequired && (\n\t\t\t\t\t\t<div style={{ ...styles.row, color: \"#ff9800\" }}>\n\t\t\t\t\t\t\t<span style={styles.label}>Status:</span>\n\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\tRestart required to activate the configured embedder\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Embedding URL:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{status.embeddingUrl ?? (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not set</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<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Embed Cache:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{status.embedCache ?? (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not set</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<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>MiniLM:</span>\n\t\t\t\t\t\t<span style={styles.value}>{status.minilm ? \"enabled\" : \"disabled\"}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{trigramWarning(status)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{!status && !statusError && (\n\t\t\t\t<p style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tLoading configuration...\n\t\t\t\t</p>\n\t\t\t)}\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\";\nimport { detectBadge, CurrentConfigSection } from \"./EmbedderSetupHelpers\";\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\t// True once the URL field has been seeded from the persisted endpoint URL —\n\t// seeding runs only on the first status load that carries the field so the\n\t// user's in-flight edits are never clobbered by a poll refresh.\n\tconst [customUrlSeeded, setCustomUrlSeeded] = useState(false);\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(\n\t\t(\n\t\t\tembedder: \"ollama\" | \"llama\" | \"trigram\" | \"custom\" | \"onnx\",\n\t\t\turl?: string,\n\t\t\tapiKey?: string,\n\t\t\tdim?: string,\n\t\t\theaders?: string,\n\t\t\tallowRemote?: boolean,\n\t\t) => {\n\t\t\tsetConfiguring(embedder);\n\t\t\tsetConfigError(null);\n\t\t\tsetConfigResult(null);\n\t\t\t// ENC-1a: optional custom-endpoint URL + bearer key ride on the setup-configure POST (additive; flag-off ignores them).\n\t\t\t// ENC-1b: the dim / headers / allow-remote fields are forwarded additively, gated on the same\n\t\t\t// `embeddingHeadersSet` presence marker the aggregator/server uses (no separate client env read).\n\t\t\tconst enc1bOn = \"embeddingHeadersSet\" in (status ?? {});\n\t\t\tconfigureEmbedder({\n\t\t\t\tembedder,\n\t\t\t\turl,\n\t\t\t\tembeddingEndpointUrl: url,\n\t\t\t\tembeddingApiKey: apiKey,\n\t\t\t\t...(enc1bOn\n\t\t\t\t\t? { embeddingDim: dim, embeddingHeaders: headers, allowRemoteEmbedder: allowRemote }\n\t\t\t\t\t: {}),\n\t\t\t})\n\t\t\t\t.then((r) => {\n\t\t\t\t\tsetConfigResult(r);\n\t\t\t\t\tsetConfiguring(null);\n\t\t\t\t\tloadStatus();\n\t\t\t\t})\n\t\t\t\t.catch((e: unknown) => {\n\t\t\t\t\tsetConfigError(e instanceof Error ? e.message : String(e));\n\t\t\t\t\tsetConfiguring(null);\n\t\t\t\t});\n\t\t},\n\t\t[loadStatus, status],\n\t);\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// Seed the custom-endpoint URL field once from the persisted\n\t// `embeddingEndpointUrl` (ENC-1a). Later poll refreshes do NOT re-seed —\n\t// only the first load, so typed edits survive the 5s status poll.\n\tuseEffect(() => {\n\t\tif (customUrlSeeded) return;\n\t\tif (status && typeof status.embeddingEndpointUrl === \"string\" && status.embeddingEndpointUrl.length > 0) {\n\t\t\tsetCustomUrl(status.embeddingEndpointUrl);\n\t\t\tsetCustomUrlSeeded(true);\n\t\t}\n\t}, [status, customUrlSeeded]);\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\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<CurrentConfigSection status={status} statusError={statusError} />\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 && configResult.embedder !== \"custom\" && (\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\tinputEnabled={status !== null && \"embeddingApiKeySet\" in status}\n\t\t\t\tapiKeySet={status?.embeddingApiKeySet === true}\n\t\t\t\tembeddingDim={status?.embeddingDim}\n\t\t\t\tembeddingHeadersSet={status?.embeddingHeadersSet === true}\n\t\t\t\tallowRemoteEmbedder={status?.allowRemoteEmbedder}\n\t\t\t\tconfigureResult={configResult}\n\t\t\t\tconfigureError={configError}\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, plus the ENC-2c install-native-ort action\n * (rendered only while the native binding is NOT installed — derived from the\n * /api/setup-status poll's nativeOrtInstalledVersion). Uses the MaintenanceTab\n * ActionDef + window.confirm pattern; the POST body ALWAYS carries confirm:true\n * (the 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 * For install-native-ort the returned nativeOrtRetestResult (verdict/p95/RSS) is\n * rendered inline.\n */\nimport type React from \"react\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport type {\n\tSetupCortexActionKind,\n\tSetupCortexStatusResponse,\n} from \"../../types/setup-cortex\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport {\n\tpostSetupCortexAction,\n\tfetchSetupCortexActionLog,\n} from \"../../api/setup-cortex\";\nimport { fetchSetupStatus } from \"../../api/client\";\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\t{\n\t\tkey: \"install-native-ort\",\n\t\tlabel: \"Install Native ORT\",\n\t\tdesc: \"Lazy-download + install the native onnxruntime binding\",\n\t\tdangerous: true,\n\t\tconfirm:\n\t\t\t\"Download + install the native onnxruntime binding on this host? (npm-mediated, sha256-verified; then re-qualified.)\",\n\t},\n];\n\n/** ENC-2c: the retest portion rendered after a successful install-native-ort. */\ninterface RetestDisplay {\n\tverdict: string;\n\tp95Ms: number;\n\trssMiB: number;\n\tbackend: string | null;\n}\n\ninterface ActionResultDisplay {\n\taction: string;\n\tlogName: string;\n\ttail: string | null;\n\tcomplete: boolean | null;\n\tmessage: string;\n\tretest: RetestDisplay | null;\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\t// ENC-2c: poll the general setup status so we can hide the install button once\n\t// the native binding is present (CortexActionsCard's cortex status prop does\n\t// not carry nativeOrtInstalledVersion).\n\tconst [setupStatus, setSetupStatus] = useState<SetupStatusResponse | null>(null);\n\n\tconst loadSetupStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then((s) => {\n\t\t\t\tsetSetupStatus(s);\n\t\t\t\t// A successful poll proves the server is reachable and serving — any\n\t\t\t\t// latched \"actions disabled\" banner from an earlier transient error\n\t\t\t\t// (404/500 on a previous version) is stale; clear it.\n\t\t\t\tsetDisabled(false);\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* best-effort poll; hide install button when unavailable */\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadSetupStatus();\n\t\tconst id = setInterval(loadSetupStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadSetupStatus]);\n\n\tconst nativeInstalled = (setupStatus?.nativeOrtInstalledVersion ?? null) !== null;\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\tretest:\n\t\t\t\t\t\t\tr.nativeOrtRetestResult != null\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tverdict: r.nativeOrtRetestResult.verdict,\n\t\t\t\t\t\t\t\t\t\tp95Ms: r.nativeOrtRetestResult.p95Ms,\n\t\t\t\t\t\t\t\t\t\trssMiB: r.nativeOrtRetestResult.rssMiB,\n\t\t\t\t\t\t\t\t\t\tbackend: r.nativeOrtBackendEffective ?? null,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: null,\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 if (outcome.status === 404) {\n\t\t\t\t\t// 404 = the VC9B flag is genuinely off on the server — the only\n\t\t\t\t\t// response that justifies the \"actions are disabled\" banner.\n\t\t\t\t\tsetDisabled(true);\n\t\t\t\t\tsetActionError(\"Setup Cortex actions are disabled (off).\");\n\t\t\t\t} else {\n\t\t\t\t\t// Any other error (500, network, etc.) is transient — show it\n\t\t\t\t\t// inline, but do NOT latch the disabled banner on it.\n\t\t\t\t\tsetActionError(`Action failed (${outcome.status}).`);\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.filter(\n\t\t\t\t// ENC-2c: hide the install button once the native binding is present.\n\t\t\t\t(def) => def.key !== \"install-native-ort\" || !nativeInstalled,\n\t\t\t).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.retest !== null && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tmarginTop: \"0.5rem\",\n\t\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\t\t\tgap: \"0.75rem\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\tRe-qualified:{\" \"}\n\t\t\t\t\t\t\t\t<span style={{ color: \"#4caf50\", fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t\t{result.retest.verdict}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\tp95: {result.retest.p95Ms.toFixed(1)} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\tRSS: {result.retest.rssMiB.toFixed(1)} MiB\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{result.retest.backend !== null && (\n\t\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\t\tbackend: {result.retest.backend}\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\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/CortexRuntimeCardStyles.ts — extracted styles for CortexRuntimeCard.\n *\n * Split from CortexRuntimeCard.tsx to respect the extensions/ 400-line soft\n * limit (mirrors the EmbedderSetupStyles.tsx convention).\n */\nimport type React from \"react\";\n\nexport const 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.25rem\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsubtitle: {\n\t\tfontSize: \"0.85rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t},\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\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\ttoggleRow: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"0.5rem\",\n\t\tmarginBottom: \"0.75rem\",\n\t\tfontSize: \"0.9rem\",\n\t},\n};\n","/**\n * SetupTab/CortexRuntimeCard.tsx — Encoder Runtime selection card (ENC-1b +\n * ENC-2a budget knob).\n *\n * Rendered on the Setup Cortex sub-tab. Reads the ENC-1b Cortex trio AND the\n * ENC-2a install-budget knob from the SAME /api/setup-status endpoint (and\n * /api/setup-configure writer) the Embedder sub-tab uses — a single endpoint,\n * no /api/setup-cortex-status read.\n *\n * The native opt-in toggle POSTs `encoderNativeOptIn`; the install-budget\n * input POSTs `nativeOrtBudgetMib` (positive integer MiB string, 1..8192). The\n * effective backend (`wasm` | `native`), any demotion reason, AND the effective\n * budget (`installBudgetMib()` operand, incl. the 300 MiB default fallback)\n * are surfaced reader-only — no selection/install logic is reimplemented on\n * the client.\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 type { SetupStatusResponse } from \"@contracts\";\nimport { fetchSetupStatus, configureEmbedder } from \"../../api/client\";\nimport { styles } from \"./CortexRuntimeCardStyles\";\n\nconst BUDGET_INPUT_MAX = 8192;\n\nexport default function CortexRuntimeCard(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [saving, setSaving] = useState(false);\n\t// ENC-2a: local input state for the budget field, seeded from the persisted\n\t// value once when the ENC-2a surface becomes active (one-shot seed mirrors\n\t// CustomEndpointSection's dim-input pattern).\n\tconst [budgetInput, setBudgetInput] = useState<string>(\"\");\n\tconst [budgetSeeded, setBudgetSeeded] = useState(false);\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch((e: unknown) => setError(e instanceof Error ? e.message : String(e)));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t}, [loadStatus]);\n\n\t// Poll status every 5s — the same cadence as the Embedder sub-tab so the\n\t// runtime card reflects persisted opt-in + effective backend changes live.\n\tuseEffect(() => {\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\t// The card is only meaningful when the ENC-1b surface is active (the server\n\t// carries the Cortex trio). Flag off → the keys are absent → hide the card.\n\tconst enabled = status !== null && \"encoderNativeOptIn\" in status;\n\n\t// ENC-2a: seed the budget input once, when the ENC-2a surface becomes active\n\t// AND the persisted value is present. Falls back to the effective operand\n\t// (the runtime's resolution, incl. the 300 default) so the input shows the\n\t// operand the dashboard is actually using.\n\tconst budgetEffective = status?.nativeOrtBudgetEffectiveMib;\n\tuseEffect(() => {\n\t\tif (!budgetSeeded && status && \"nativeOrtBudgetEffectiveMib\" in status) {\n\t\t\tconst seed = status.nativeOrtBudgetMib ?? status.nativeOrtBudgetEffectiveMib ?? \"\";\n\t\t\tif (typeof seed === \"string\") setBudgetInput(seed);\n\t\t\tsetBudgetSeeded(true);\n\t\t}\n\t}, [budgetSeeded, status]);\n\n\t// Omit embedder/url when the card only manages runtime keys — the server's\n\t// tryEnc1bConfigure handles pure additive configure (no embedder change) and\n\t// returns before the embedder-validation gate.\n\tconst toggleNative = useCallback(\n\t\t(next: boolean) => {\n\t\t\tsetSaving(true);\n\t\t\tsetError(null);\n\t\t\tconfigureEmbedder({ encoderNativeOptIn: next })\n\t\t\t\t.then(() => {\n\t\t\t\t\tsetSaving(false);\n\t\t\t\t\tloadStatus();\n\t\t\t\t})\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\tsetSaving(false);\n\t\t\t\t});\n\t\t},\n\t\t[loadStatus],\n\t);\n\n\tconst saveBudget = useCallback(() => {\n\t\tconst trimmed = budgetInput.trim();\n\t\t// Client-side guard mirrors the server's ENC_2BUDGET_MAX_MIB clamp.\n\t\t// The server re-validates; this is purely a fast UX pre-check.\n\t\tif (!/^\\d+$/.test(trimmed)) {\n\t\t\tsetError(\"Install budget must be a positive integer (MiB)\");\n\t\t\treturn;\n\t\t}\n\t\tconst n = Number(trimmed);\n\t\tif (!Number.isSafeInteger(n) || n < 1 || n > BUDGET_INPUT_MAX) {\n\t\t\tsetError(`Install budget must be between 1 and ${BUDGET_INPUT_MAX} MiB`);\n\t\t\treturn;\n\t\t}\n\t\tsetSaving(true);\n\t\tsetError(null);\n\t\tconfigureEmbedder({ nativeOrtBudgetMib: trimmed })\n\t\t\t.then(() => {\n\t\t\t\tsetSaving(false);\n\t\t\t\tloadStatus();\n\t\t\t})\n\t\t\t.catch((e: unknown) => {\n\t\t\t\tsetError(e instanceof Error ? e.message : String(e));\n\t\t\t\tsetSaving(false);\n\t\t\t});\n\t}, [budgetInput, status, loadStatus]);\n\n\tif (!enabled) return <></>;\n\n\tconst backend = status?.encoderBackend ?? \"wasm\";\n\tconst demotion = status?.encoderDemotionReason ?? null;\n\tconst budgetVisible = status !== null && \"nativeOrtBudgetEffectiveMib\" in status;\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Encoder Runtime</h3>\n\t\t\t<p style={styles.subtitle}>ONNX backend selection</p>\n\t\t\t<div style={styles.toggleRow}>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={status?.encoderNativeOptIn === true}\n\t\t\t\t\tonChange={(e) => toggleNative(e.target.checked)}\n\t\t\t\t\tdisabled={saving}\n\t\t\t\t\taria-label=\"Native ONNX runtime (onnxruntime-node)\"\n\t\t\t\t/>\n\t\t\t\t<label>Native ONNX runtime (onnxruntime-node)</label>\n\t\t\t\t{saving && (\n\t\t\t\t\t<span style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\" }}>saving...</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Effective backend (selected):</span>\n\t\t\t\t<span style={styles.value}>{backend}</span>\n\t\t\t</div>\n\t\t\t{budgetVisible && (\n\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor=\"enc2-budget-input\"\n\t\t\t\t\t\tstyle={{ ...styles.label, marginRight: \"0.5rem\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\tNative install budget (MiB):\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"enc2-budget-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={BUDGET_INPUT_MAX}\n\t\t\t\t\t\tstep={1}\n\t\t\t\t\t\tvalue={budgetInput}\n\t\t\t\t\t\tonChange={(e) => setBudgetInput(e.target.value)}\n\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\tstyle={{ width: \"6rem\" }}\n\t\t\t\t\t\taria-label=\"Native onnxruntime install budget in MiB\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={saveBudget}\n\t\t\t\t\t\tdisabled={saving || budgetInput.trim().length === 0}\n\t\t\t\t\t\tstyle={{ marginLeft: \"0.5rem\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\tSave\n\t\t\t\t\t</button>\n\t\t\t\t\t{budgetEffective !== undefined && (\n\t\t\t\t\t\t<span style={{ ...styles.value, marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\t(effective: {budgetEffective} MiB)\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{demotion !== null && (\n\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t<strong>Demoted:</strong> {demotion}\n\t\t\t\t</div>\n\t\t\t)}\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</div>\n\t);\n}\n","/**\n * SetupTab/CortexRuntimeInstallCard.tsx — operator-run install guide card\n * (ENC-2a).\n *\n * Pure render. When `SetupStatusResponse.nativeOrtInstallGuide` is non-null\n * (opt-in on, effective runtime still wasm, platform installable), this card\n * surfaces the three copy-paste steps the operator runs OUTSIDE the dashboard:\n * install onnxruntime-node, restart via pi, and the expected next status. When\n * the guide is null the card hides entirely (the modifiers card already\n * surfaces the honest ENC-0g state).\n *\n * NO client-side execution — the install script is never spawned from here.\n * Data comes exclusively from the existing /api/setup-status poll.\n */\nimport type React from \"react\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport { fetchSetupStatus } from \"../../api/client\";\nimport { styles } from \"./CortexSetupStyles\";\n\nfunction useCopyState(): [boolean, (text: string) => Promise<void>] {\n\tconst [copied, setCopied] = useState(false);\n\tconst copy = useCallback(async (text: string) => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\tsetCopied(true);\n\t\t\twindow.setTimeout(() => setCopied(false), 1500);\n\t\t} catch {\n\t\t\tsetCopied(false);\n\t\t}\n\t}, []);\n\treturn [copied, copy];\n}\n\nexport default function CortexRuntimeInstallCard(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [copied, copy] = useCopyState();\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch(() => {\n\t\t\t\t/* best-effort poll; hide card when unavailable */\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\tconst guide = status?.nativeOrtInstallGuide ?? null;\n\tconst installedVersion = status?.nativeOrtInstalledVersion ?? null;\n\tif (!guide) return <></>;\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Encoder Runtime Install</h3>\n\t\t\t<p style={{ ...styles.label, fontSize: \"0.85rem\", marginBottom: \"0.75rem\" }}>\n\t\t\t\tPlatform: {guide.platform}\n\t\t\t</p>\n\t\t\t{installedVersion !== null && (\n\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t<span style={styles.label}>Detected:</span>\n\t\t\t\t\t<span style={styles.value}>{installedVersion}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{guide.commands.map((command, i) => (\n\t\t\t\t<div key={`${i}-${command}`} style={styles.row}>\n\t\t\t\t\t<span style={styles.label}>Step {i + 1}:</span>\n\t\t\t\t\t<code\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t\tmarginTop: \"0.15rem\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{command}\n\t\t\t\t\t</code>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid copy(command);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ marginLeft: \"0.5rem\", fontSize: \"0.8rem\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t\t<p style={{ ...styles.row, fontSize: \"0.85rem\" }}>\n\t\t\t\t<span style={styles.label}>Script:</span>{\" \"}\n\t\t\t\t<code style={styles.mono}>{guide.scriptPath}</code>\n\t\t\t</p>\n\t\t\t{copied && (\n\t\t\t\t<p style={{ color: \"#4caf50\", fontSize: \"0.8rem\", margin: \"0.25rem 0 0\" }}>\n\t\t\t\t\tCopied to clipboard\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/CortexRetestCard.tsx — native onnxruntime qualification retest\n * card (ENC-2b).\n *\n * Pure render. When `SetupStatusResponse.nativeOrtInstalledVersion` is non-null\n * (the ENC-2a guide detected an install) AND `nativeOrtRetestResult` is non-null\n * (the retest ran), this card surfaces the qualification outcome: platform,\n * version, verdict badge, p95 latency, RSS, tested-at timestamp, and the\n * effective backend after the retest.\n *\n * NO client-side execution of the binding — the retest runs server-side. The\n * \"Retest now\" button POSTs {nativeOrtRetest: true} and then refreshes the poll.\n * Data comes exclusively from the existing /api/setup-status poll.\n */\nimport type React from \"react\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport { fetchSetupStatus, configureEmbedder } from \"../../api/client\";\nimport { styles } from \"./CortexSetupStyles\";\n\n// The retest shape mirrors the server `RetestResult` interface; derived via\n// indexed access from the exported response type so no contract file changes.\ntype RetestResult = NonNullable<SetupStatusResponse[\"nativeOrtRetestResult\"]>;\n\nconst VERDICT_STYLE: Record<RetestResult[\"verdict\"], React.CSSProperties> = {\n\tqualified: { ...styles.badge, background: \"#1f3a2a\", color: \"#4caf50\" },\n\tdegraded: { ...styles.badge, background: \"#3a2f00\", color: \"#ff9800\" },\n\tfailed: { ...styles.badge, background: \"#3a1a1a\", color: \"#ff5252\" },\n};\n\nexport default function CortexRetestCard(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [retesting, setRetesting] = useState(false);\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch(() => {\n\t\t\t\t/* best-effort poll; hide card when unavailable */\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\tconst onRetest = useCallback(() => {\n\t\tsetRetesting(true);\n\t\t// `embedder: \"trigram\"` satisfies the required request field; the server\n\t\t// handles the additive nativeOrtRetest key BEFORE embedder validation, so\n\t\t// the value is never read on this path.\n\t\tconfigureEmbedder({ embedder: \"trigram\", nativeOrtRetest: true })\n\t\t\t.then(() => loadStatus())\n\t\t\t.finally(() => setRetesting(false));\n\t}, [loadStatus]);\n\n\tconst installedVersion = status?.nativeOrtInstalledVersion ?? null;\n\tconst retest = status?.nativeOrtRetestResult ?? null;\n\tconst effectiveBackend = status?.nativeOrtBackendEffective ?? null;\n\tif (installedVersion === null || retest === null) return <></>;\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Encoder Runtime Retest</h3>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Platform:</span>\n\t\t\t\t<span style={styles.value}>{retest.platform}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Version:</span>\n\t\t\t\t<span style={styles.value}>{retest.version}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Verdict:</span>\n\t\t\t\t<span style={VERDICT_STYLE[retest.verdict]}>{retest.verdict}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>p95 latency:</span>\n\t\t\t\t<span style={styles.value}>{retest.p95Ms} ms</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>RSS:</span>\n\t\t\t\t<span style={styles.value}>{retest.rssMiB} MiB</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Tested:</span>\n\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t{new Date(retest.testedAt).toISOString()}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{effectiveBackend !== null && (\n\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t<span style={styles.label}>Effective backend (measured):</span>\n\t\t\t\t\t<span style={styles.value}>{effectiveBackend}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{effectiveBackend !== null &&\n\t\t\t\tstatus?.encoderBackend != null &&\n\t\t\t\teffectiveBackend !== status.encoderBackend && (\n\t\t\t\t\t<p style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\", marginTop: \"0.25rem\" }}>\n\t\t\t\t\t\tMeasured backend differs from the selected backend above: the retest\n\t\t\t\t\t\tbenchmarked the native binding and found it over the p95/RSS gates, so\n\t\t\t\t\t\tthe runtime is demoted to <strong>{effectiveBackend}</strong> despite\n\t\t\t\t\t\tthe binding being installed.\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t<button type=\"button\" onClick={onRetest} disabled={retesting}>\n\t\t\t\t{retesting ? \"Retesting…\" : \"Retest now\"}\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/VectorCortexCosineFpCard.tsx — cosine-FP bench recommendation card\n * (COS-FP-A).\n *\n * Reader-only card on the Setup Cortex sub-tab. Polls GET /api/cosine-fp-report\n * and shows the last synthetic bench's recommended default + per-content-type\n * overrides + report digest + grid summary. The endpoint 404s on flag-off\n * (MEGACOMPACT_COSINE_FP_BENCH=0): the card renders an honest \"disabled\" state\n * matching the server's deriveVcStatus off path. Counts + fractions + digest\n * only — never template text (EVAL-REDACT-002).\n *\n * PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.\n */\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { getJson, ApiError } from \"../../api/client-http\";\nimport type { CosineFpReportV1 } from \"@contracts\";\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.25rem\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsubtitle: {\n\t\tfontSize: \"0.85rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t},\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\tdisabled: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tfontSize: \"0.85rem\",\n\t},\n};\n\nexport const VectorCortexCosineFpCard: React.FC = () => {\n\t// 404 (flag-off) resolves to null data; a live report resolves to the\n\t// CosineFpReportV1 payload. useApi<CosineFpReportV1 | null> lets us\n\t// distinguish \"bench disabled\" (null) from \"loading/error\".\n\tconst { data, error, loading } = useApi<CosineFpReportV1 | null>(\n\t\tuseMemo(\n\t\t\t() => () =>\n\t\t\t\tgetJson<CosineFpReportV1>(\"/api/cosine-fp-report\").catch((e: unknown) => {\n\t\t\t\t\t// 404 = flag-off: surface to the renderer as disabled.\n\t\t\t\t\tif (e instanceof ApiError && e.status === 404) return null;\n\t\t\t\t\tthrow e;\n\t\t\t\t}),\n\t\t\t[],\n\t\t),\n\t\t{ pollInterval: 5000 },\n\t);\n\n\t// 404 (flag-off) resolves to null data with no error and loading done →\n\t// bench disabled.\n\tif (data === null && !error && !loading) {\n\t\treturn (\n\t\t\t<div style={styles.disabled}>\n\t\t\t\tCosine FP synthetic bench: disabled (MEGACOMPACT_COSINE_FP_BENCH=0).\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Cosine FP threshold</h3>\n\t\t\t<p style={styles.subtitle}>Last synthetic bench threshold recommendation</p>\n\t\t\t{error !== null ? (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError loading report: {error.message}\n\t\t\t\t</p>\n\t\t\t) : data === null ? (\n\t\t\t\t<div style={styles.value}>Loading…</div>\n\t\t\t) : (\n\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}>Recommended default:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{data.recommendedDefault ?? \"—\"} (shipped{\" \"}\n\t\t\t\t\t\t\t{data.shippedDefault})\n\t\t\t\t\t\t</span>\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}>Overrides:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\tCODE {data.overrides?.code ?? \"—\"} · PROSE{\" \"}\n\t\t\t\t\t\t\t{data.overrides?.prose ?? \"—\"} · MIXED{\" \"}\n\t\t\t\t\t\t\t{data.overrides?.mixed ?? \"—\"}\n\t\t\t\t\t\t</span>\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}>Grid:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{data.grid\n\t\t\t\t\t\t\t\t? `${data.grid.lo} → ${data.grid.hi} (${data.grid.points} points)`\n\t\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<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Report digest:</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={styles.value}\n\t\t\t\t\t\t\ttitle={data.digest ?? undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{data.digest ? data.digest.slice(0, 16) + \"…\" : \"—\"}\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)}\n\t\t</div>\n\t);\n};\n","/**\n * SetupTab/VectorCortexRepoCorpusCard.tsx — REPO-A cross-repo corpus consent\n * status card.\n *\n * Reader-only card on the Setup Cortex sub-tab. Polls GET /api/repo-corpus and\n * shows each pseudonymous repo's consent state + cross-repo overlap + total\n * events. It NEVER submits consent — consent is CLI/ops-only (consent.mjs,\n * append-only). The endpoint 404s on flag-off (MEGACOMPACT_REPO_CORPUS=0): the\n * card renders an honest \"disabled\" state matching deriveVcStatus off. Counts +\n * IDs + status only — never payload content (EVAL-REDACT-002).\n *\n * PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.\n */\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { getJson, ApiError } from \"../../api/client-http\";\nimport type { RepoCorpusStatusV1 } from \"@contracts\";\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.25rem\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsubtitle: {\n\t\tfontSize: \"0.85rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t},\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\tdisabled: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tfontSize: \"0.85rem\",\n\t},\n};\n\nexport const VectorCortexRepoCorpusCard: React.FC = () => {\n\tconst { data, error, loading } = useApi<RepoCorpusStatusV1 | null>(\n\t\tuseMemo(\n\t\t\t() => () =>\n\t\t\t\tgetJson<RepoCorpusStatusV1>(\"/api/repo-corpus\").catch((e: unknown) => {\n\t\t\t\t\t// 404 = flag-off: surface to the renderer as disabled.\n\t\t\t\t\tif (e instanceof ApiError && e.status === 404) return null;\n\t\t\t\t\tthrow e;\n\t\t\t\t}),\n\t\t\t[],\n\t\t),\n\t\t{ pollInterval: 5000 },\n\t);\n\n\tif (data === null && !error && !loading) {\n\t\treturn (\n\t\t\t<div style={styles.disabled}>\n\t\t\t\tCross-repo corpus: disabled (MEGACOMPACT_REPO_CORPUS=0).\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Cross-Repo Corpus</h3>\n\t\t\t<p style={styles.subtitle}>\n\t\t\t\tPseudonymous consent status across donated repos\n\t\t\t</p>\n\t\t\t{error !== null ? (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError loading corpus: {error.message}\n\t\t\t\t</p>\n\t\t\t) : data === null ? (\n\t\t\t\t<div style={styles.value}>Loading…</div>\n\t\t\t) : (\n\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}>Status:</span>\n\t\t\t\t\t\t<span style={styles.value}>{data.status}</span>\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}>Total events:</span>\n\t\t\t\t\t\t<span style={styles.value}>{data.totalEvents}</span>\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}>Overlap pairs:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{data.corpus ? data.corpus.overlaps.length : 0}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ marginTop: \"0.5rem\" }}>\n\t\t\t\t\t\t{(data.perRepo ?? []).map((r) => (\n\t\t\t\t\t\t\t<div key={r.repoPseudonym} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\t\t{r.repoPseudonym.slice(0, 8)}:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\t\t{r.sessions} sessions ·{\" \"}\n\t\t\t\t\t\t\t\t\t{r.consentedCrossRepo\n\t\t\t\t\t\t\t\t\t\t? r.revokedAt\n\t\t\t\t\t\t\t\t\t\t\t? `revoked ${r.revokedAt}`\n\t\t\t\t\t\t\t\t\t\t\t: \"consented\"\n\t\t\t\t\t\t\t\t\t\t: \"not consented\"}\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</div>\n\t\t\t\t</div>\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 CortexRuntimeCard from \"./CortexRuntimeCard\";\nimport CortexRuntimeInstallCard from \"./CortexRuntimeInstallCard\";\nimport CortexRetestCard from \"./CortexRetestCard\";\nimport { VectorCortexCosineFpCard } from \"./VectorCortexCosineFpCard\";\nimport { VectorCortexRepoCorpusCard } from \"./VectorCortexRepoCorpusCard\";\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<CortexRuntimeCard />\n\t\t\t<CortexRuntimeInstallCard />\n\t\t\t<CortexRetestCard />\n\t\t\t<VectorCortexCosineFpCard />\n\t\t\t<VectorCortexRepoCorpusCard />\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, useCallback } from \"react\";\nimport type { SettingsResponse } from \"@contracts\";\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 { useApi } from \"../hooks/useApi\";\nimport { fetchSettings } from \"../api/client\";\nimport { useSetupCortexPoll, isCortexSubTabVisible } from \"./useSetupCortexPoll\";\n\nconst DASH_0C_KEY = \"MEGACOMPACT_DASH_0C\";\n\n/** Resolve the DASH-0c consolidation flag from the server settings state.\n * Absent/not-yet-loaded => false (flag-off posture), so flag-off users keep the\n * Config sub-tab; it is hidden only once settings confirm the flag is ON (the\n * config editor then lives solely on the Admin surface). */\nfunction dash0cEnabled(settings: SettingsResponse | null): boolean {\n\tif (!settings) return false;\n\tfor (const cat of settings.categories) {\n\t\tfor (const s of cat.settings) {\n\t\t\tif (s.key === DASH_0C_KEY && s.type === \"boolean\") return s.value === true;\n\t\t}\n\t}\n\treturn false;\n}\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\t/* DASH-0c: flag-ON hides the config sub-tab member (the config editor is then\n\t * reachable only via the Admin surface). Flag-OFF renders config as today. */\n\tconst { data: settingsData } = useApi<SettingsResponse>(\n\t\tuseCallback(() => fetchSettings(), []),\n\t\t{ pollInterval: 0, maxRetries: 0 },\n\t);\n\tconst dash0cOn = dash0cEnabled(settingsData);\n\n\tconst subTabs = useMemo(() => {\n\t\tconst tabs = dash0cOn\n\t\t\t? BASE_SUB_TABS.filter((t) => t.id !== \"config\")\n\t\t\t: [...BASE_SUB_TABS];\n\t\tif (isCortexSubTabVisible(cortex.data)) tabs.push(CORTEX_TAB);\n\t\treturn tabs;\n\t}, [cortex.data, dash0cOn]);\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\" && !dash0cOn && <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","r","GameTab","scores","setScores","reposCount","setReposCount","setAchievements","gameModeOn","setGameModeOn","loading","setLoading","megaToast","setMegaToast","lastMegaTsRef","fetchAll","useCallback","cache","dedupe","turns","megaCache","repos","ach","fetchGameScores","fetchAchievements","newRow","active","doFetch","timer","gs","fetchGameState","megaRows","bestMega","firstSeen","fs","showMega","turnsRows","maxTurns","lvl","hasData","Fragment","AchievementsTab","error","setError","e","run","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","saving","onUpdate","locked","timerRef","submit","raw","msg","scheduleSave","inputDisabled","Switch","checked","SettingsPanel","settings","setSettings","setSaving","toast","setToast","load","fetchSettings","handleUpdate","key","res","postSetting","cat","SAVED_NOTICE","CustomEndpointSection","customUrl","setCustomUrl","applyEmbedder","configuring","inputEnabled","apiKeySet","embeddingDim","embeddingHeadersSet","allowRemoteEmbedder","configureResult","configureError","customApiKey","setCustomApiKey","dim","setDim","dimSeeded","setDimSeeded","headers","setHeaders","allowRemote","setAllowRemote","allowRemoteSeeded","setAllowRemoteSeeded","embedderLabel","trigramWarning","status","detectBadge","installed","bg","CurrentConfigSection","statusError","EmbedderSetup","setStatus","detect","setDetect","setStatusError","detectError","setDetectError","runningDetect","setRunningDetect","setConfiguring","configResult","setConfigResult","configError","setConfigError","customUrlSeeded","setCustomUrlSeeded","loadStatus","fetchSetupStatus","embedder","url","apiKey","enc1bOn","configureEmbedder","runDetect","fetchSetupDetect","d","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","result","setResult","actionError","setActionError","disabled","setDisabled","setupStatus","setSetupStatus","loadSetupStatus","s","nativeInstalled","runAction","def","outcome","tail","complete","log","handleClick","isRunning","BUDGET_INPUT_MAX","CortexRuntimeCard","budgetInput","setBudgetInput","budgetSeeded","setBudgetSeeded","enabled","budgetEffective","seed","toggleNative","next","saveBudget","trimmed","backend","demotion","budgetVisible","useCopyState","copied","setCopied","copy","CortexRuntimeInstallCard","guide","installedVersion","command","i","VERDICT_STYLE","CortexRetestCard","retesting","setRetesting","onRetest","retest","effectiveBackend","VectorCortexCosineFpCard","useApi","useMemo","getJson","ApiError","VectorCortexRepoCorpusCard","CortexSetup","setHighlight","blockerIds","DASH_0C_KEY","dash0cEnabled","BASE_SUB_TABS","CORTEX_TAB","SetupTab","subTab","setSubTab","cortex","settingsData","dash0cOn","subTabs","tabs","Toggle","ConfigTab"],"mappings":"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"}
1
+ {"version":3,"file":"SetupTab-B6Y3eHXo.js","sources":["../../src/components/AchievementTiles.tsx","../../src/tabs/GameTab.tsx","../../src/tabs/AchievementsTab.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/EmbedderSetupHelpers.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/CortexRuntimeCardStyles.ts","../../src/tabs/SetupTab/CortexRuntimeCard.tsx","../../src/tabs/SetupTab/CortexRuntimeInstallCard.tsx","../../src/tabs/SetupTab/CortexRetestCard.tsx","../../src/tabs/SetupTab/VectorCortexCosineFpCard.tsx","../../src/tabs/SetupTab/VectorCortexRepoCorpusCard.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 * 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 *\n * ENC-1a: an additive \"API key (optional Bearer)\" password input sits beside the\n * existing custom-URL input. The key is NEVER prefilled (the setup-status GET does\n * not echo it — only an \"is set\" boolean, embeddingApiKeySet) and it is only ever\n * sent up via the POST /api/setup-configure body. When the ENC-1a surface is\n * inactive (flag off, the server omits the new GET fields) the key input is hidden\n * and only the pre-existing URL row remains — byte-identical to the predecessor.\n */\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport type { SetupConfigureResponse } from \"@contracts\";\nimport { styles } from \"./EmbedderSetupStyles\";\n\n/** ENC-1a surfaced a successful custom-endpoint persistence on the card. */\nconst SAVED_NOTICE = \"Saved; takes effect on next session start\";\n\ninterface CustomEndpointSectionProps {\n\tcustomUrl: string;\n\tsetCustomUrl: (v: string) => void;\n\tapplyEmbedder: (\n\t\tembedder: \"ollama\" | \"llama\" | \"trigram\" | \"custom\" | \"onnx\",\n\t\turl?: string,\n\t\tapiKey?: string,\n\t\tdim?: string,\n\t\theaders?: string,\n\t\tallowRemote?: boolean,\n\t) => void;\n\tconfiguring: string | null;\n\t/** ENC-1a surface active — true when the new setup-status fields are present. */\n\tinputEnabled: boolean;\n\t/** Server-reported \"key is set\" marker (the key itself is never returned). */\n\tapiKeySet: boolean;\n\t/** ENC-1b: the persisted `embeddingDim` value (numeric string), or undefined. One-shot seed. */\n\tembeddingDim: string | undefined;\n\t/** ENC-1b: server-reported \"headers are set\" marker (the raw JSON is never returned). */\n\tembeddingHeadersSet: boolean;\n\t/** ENC-1b: the persisted allow-remote flag, or undefined. One-shot seed. */\n\tallowRemoteEmbedder: boolean | undefined;\n\tconfigureResult: SetupConfigureResponse | null;\n\tconfigureError: string | null;\n}\n\nexport default function CustomEndpointSection({\n\tcustomUrl,\n\tsetCustomUrl,\n\tapplyEmbedder,\n\tconfiguring,\n\tinputEnabled,\n\tapiKeySet,\n\tembeddingDim,\n\tembeddingHeadersSet,\n\tallowRemoteEmbedder,\n\tconfigureResult,\n\tconfigureError,\n}: CustomEndpointSectionProps): React.ReactElement {\n\t// The API key is intentionally local-only state: it always renders blank and\n\t// is never seeded from the persisted value (the server never returns it).\n\tconst [customApiKey, setCustomApiKey] = useState(\"\");\n\t// ENC-1b: the embedding dim, seeded once from the persisted value (never\n\t// re-seeded after a poll so the user's in-flight edits survive the 5s poll).\n\tconst [dim, setDim] = useState(\"\");\n\tconst [dimSeeded, setDimSeeded] = useState(false);\n\t// ENC-1b: the headers JSON is local-only, write-only state: NEVER prefilled,\n\t// never seeded, never shown back — the server persists it verbatim and only\n\t// ever reports its presence via `embeddingHeadersSet`.\n\tconst [headers, setHeaders] = useState(\"\");\n\t// ENC-1b: allow-remote toggle, seeded once from the persisted flag.\n\tconst [allowRemote, setAllowRemote] = useState(false);\n\tconst [allowRemoteSeeded, setAllowRemoteSeeded] = useState(false);\n\n\tif (inputEnabled && !dimSeeded && typeof embeddingDim === \"string\") {\n\t\tsetDim(embeddingDim);\n\t\tsetDimSeeded(true);\n\t}\n\tif (inputEnabled && !allowRemoteSeeded && typeof allowRemoteEmbedder === \"boolean\") {\n\t\tsetAllowRemote(allowRemoteEmbedder);\n\t\tsetAllowRemoteSeeded(true);\n\t}\n\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{inputEnabled && (\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\tautoComplete=\"new-password\"\n\t\t\t\t\t\taria-label=\"API key (optional Bearer)\"\n\t\t\t\t\t\tplaceholder=\"API key (optional Bearer)\"\n\t\t\t\t\t\tvalue={customApiKey}\n\t\t\t\t\t\tonChange={(e) => setCustomApiKey(e.target.value)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tflex: \"1 1 300px\",\n\t\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{inputEnabled && apiKeySet && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: \"0.75rem\",\n\t\t\t\t\t\t\tcolor: \"#81c784\",\n\t\t\t\t\t\t\tborder: \"1px solid #2a4e2a\",\n\t\t\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\t\t\tpadding: \"0.15rem 0.45rem\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tAPI key saved\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{inputEnabled && embeddingHeadersSet && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontSize: \"0.75rem\",\n\t\t\t\t\t\t\tcolor: \"#81c784\",\n\t\t\t\t\t\t\tborder: \"1px solid #2a4e2a\",\n\t\t\t\t\t\t\tborderRadius: \"4px\",\n\t\t\t\t\t\t\tpadding: \"0.15rem 0.45rem\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tHeaders saved\n\t\t\t\t\t</span>\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={() =>\n\t\t\t\t\t\tapplyEmbedder(\"custom\", customUrl, customApiKey, dim, headers, allowRemote)\n\t\t\t\t\t}\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{inputEnabled && (\n\t\t\t\t<div style={{ marginTop: \"0.75rem\" }}>\n\t\t\t\t\t<div style={{ marginBottom: \"0.5rem\" }}>\n\t\t\t\t\t\t<label style={{ ...styles.label, display: \"block\", marginBottom: \"0.25rem\" }}>\n\t\t\t\t\t\t\tEmbedding dim (optional)\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\tplaceholder=\"e.g. 384\"\n\t\t\t\t\t\t\tvalue={dim}\n\t\t\t\t\t\t\tonChange={(e) => setDim(e.target.value)}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: \"200px\",\n\t\t\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ marginBottom: \"0.5rem\" }}>\n\t\t\t\t\t\t<label style={{ ...styles.label, display: \"block\", marginBottom: \"0.25rem\" }}>\n\t\t\t\t\t\t\tEmbedding headers (JSON, write-only — never re-displayed)\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tplaceholder={'{\"Authorization\": \"Bearer ...\"}'}\n\t\t\t\t\t\t\tvalue={headers}\n\t\t\t\t\t\t\tonChange={(e) => setHeaders(e.target.value)}\n\t\t\t\t\t\t\taria-label=\"Embedding headers JSON (write-only — never re-displayed)\"\n\t\t\t\t\t\t\trows={2}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t\t\tbackground: \"#12122a\",\n\t\t\t\t\t\t\t\tcolor: \"#e0e0e0\",\n\t\t\t\t\t\t\t\tborder: \"1px solid #2a2a4e\",\n\t\t\t\t\t\t\t\tborderRadius: \"6px\",\n\t\t\t\t\t\t\t\tpadding: \"0.4rem 0.6rem\",\n\t\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\t\tfontFamily: \"monospace\",\n\t\t\t\t\t\t\t\tresize: \"vertical\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<label style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", fontSize: \"0.85rem\" }}>\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={allowRemote}\n\t\t\t\t\t\t\tonChange={(e) => setAllowRemote(e.target.checked)}\n\t\t\t\t\t\t\taria-label=\"Allow remote embedder (skips loopback-only check)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAllow remote embedder (skips loopback-only check)\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{configureError !== null && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\", marginTop: \"0.5rem\" }}>\n\t\t\t\t\tConfigure error: {configureError}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{configureResult !== null && configureResult.embedder === \"custom\" && (\n\t\t\t\t<div style={styles.warning}>{SAVED_NOTICE}</div>\n\t\t\t)}\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/EmbedderSetupHelpers.tsx — extracted render helpers for EmbedderSetup.\n *\n * Split from EmbedderSetup.tsx to respect the extensions/ 400-line soft limit\n * (ENC-1a pushed the embedder card over its cap, so the helpers were extracted).\n */\nimport type React from \"react\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport { styles } from \"./EmbedderSetupStyles\";\n\n/** Human label for an embedder identifier. */\nexport function embedderLabel(e: string): string {\n\tswitch (e) {\n\t\tcase \"trigram\":\n\t\t\treturn \"TrigramEmbedder (heuristic, default)\";\n\t\tcase \"http\":\n\t\t\treturn \"HTTP Embedder (BYO localhost)\";\n\t\tcase \"minilm\":\n\t\t\treturn \"MiniLM (experimental)\";\n\t\tdefault:\n\t\t\treturn \"Unknown\";\n\t}\n}\n\n/** Warn when the active embedder is the heuristic trigram default. */\nexport function trigramWarning(status: SetupStatusResponse | null): React.ReactElement | null {\n\tif (status?.currentEmbedder !== \"trigram\") return null;\n\treturn (\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\n/** Installed / not-found badge dot for a detection row. */\nexport function detectBadge(installed: boolean): React.ReactElement {\n\tconst bg = installed ? \"#1a5a1a\" : \"#3a1a1a\";\n\tconst color = installed ? \"#4caf50\" : \"#f44336\";\n\treturn (\n\t\t<span style={{ ...styles.badge, background: bg, color }}>\n\t\t\t{installed ? \"Detected\" : \"Not found\"}\n\t\t</span>\n\t);\n}\n\n/** The \"Current Embedder Configuration\" readout block. */\nexport function CurrentConfigSection({\n\tstatus,\n\tstatusError,\n}: {\n\tstatus: SetupStatusResponse | null;\n\tstatusError: string | null;\n}): React.ReactElement {\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>\n\t\t\t{statusError && (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError: {statusError}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{status && (\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}>Active Embedder:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{embedderLabel(status.currentEmbedder)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{\"configuredEmbedder\" in status && status.configuredEmbedder !== status.currentEmbedder && (\n\t\t\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t\t\t<strong>Configured but not active:</strong>{\" \"}\n\t\t\t\t\t\t\t{embedderLabel(status.configuredEmbedder)} is configured in\n\t\t\t\t\t\t\t.mega-compact.env but not yet loaded.{\" \"}\n\t\t\t\t\t\t\t<strong>Restart pi</strong> to activate it.\n\t\t\t\t\t\t\t{status.configuredUrl && (\n\t\t\t\t\t\t\t\t<> ({status.configuredUrl})</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{\"restartRequired\" in status && status.restartRequired && (\n\t\t\t\t\t\t<div style={{ ...styles.row, color: \"#ff9800\" }}>\n\t\t\t\t\t\t\t<span style={styles.label}>Status:</span>\n\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\tRestart required to activate the configured embedder\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Embedding URL:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{status.embeddingUrl ?? (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not set</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<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Embed Cache:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{status.embedCache ?? (\n\t\t\t\t\t\t\t\t<span style={{ color: \"#888\" }}>not set</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<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>MiniLM:</span>\n\t\t\t\t\t\t<span style={styles.value}>{status.minilm ? \"enabled\" : \"disabled\"}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{trigramWarning(status)}\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{!status && !statusError && (\n\t\t\t\t<p style={{ color: \"#888\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tLoading configuration...\n\t\t\t\t</p>\n\t\t\t)}\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\";\nimport { detectBadge, CurrentConfigSection } from \"./EmbedderSetupHelpers\";\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\t// True once the URL field has been seeded from the persisted endpoint URL —\n\t// seeding runs only on the first status load that carries the field so the\n\t// user's in-flight edits are never clobbered by a poll refresh.\n\tconst [customUrlSeeded, setCustomUrlSeeded] = useState(false);\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(\n\t\t(\n\t\t\tembedder: \"ollama\" | \"llama\" | \"trigram\" | \"custom\" | \"onnx\",\n\t\t\turl?: string,\n\t\t\tapiKey?: string,\n\t\t\tdim?: string,\n\t\t\theaders?: string,\n\t\t\tallowRemote?: boolean,\n\t\t) => {\n\t\t\tsetConfiguring(embedder);\n\t\t\tsetConfigError(null);\n\t\t\tsetConfigResult(null);\n\t\t\t// ENC-1a: optional custom-endpoint URL + bearer key ride on the setup-configure POST (additive; flag-off ignores them).\n\t\t\t// ENC-1b: the dim / headers / allow-remote fields are forwarded additively, gated on the same\n\t\t\t// `embeddingHeadersSet` presence marker the aggregator/server uses (no separate client env read).\n\t\t\tconst enc1bOn = \"embeddingHeadersSet\" in (status ?? {});\n\t\t\tconfigureEmbedder({\n\t\t\t\tembedder,\n\t\t\t\turl,\n\t\t\t\tembeddingEndpointUrl: url,\n\t\t\t\tembeddingApiKey: apiKey,\n\t\t\t\t...(enc1bOn\n\t\t\t\t\t? { embeddingDim: dim, embeddingHeaders: headers, allowRemoteEmbedder: allowRemote }\n\t\t\t\t\t: {}),\n\t\t\t})\n\t\t\t\t.then((r) => {\n\t\t\t\t\tsetConfigResult(r);\n\t\t\t\t\tsetConfiguring(null);\n\t\t\t\t\tloadStatus();\n\t\t\t\t})\n\t\t\t\t.catch((e: unknown) => {\n\t\t\t\t\tsetConfigError(e instanceof Error ? e.message : String(e));\n\t\t\t\t\tsetConfiguring(null);\n\t\t\t\t});\n\t\t},\n\t\t[loadStatus, status],\n\t);\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// Seed the custom-endpoint URL field once from the persisted\n\t// `embeddingEndpointUrl` (ENC-1a). Later poll refreshes do NOT re-seed —\n\t// only the first load, so typed edits survive the 5s status poll.\n\tuseEffect(() => {\n\t\tif (customUrlSeeded) return;\n\t\tif (status && typeof status.embeddingEndpointUrl === \"string\" && status.embeddingEndpointUrl.length > 0) {\n\t\t\tsetCustomUrl(status.embeddingEndpointUrl);\n\t\t\tsetCustomUrlSeeded(true);\n\t\t}\n\t}, [status, customUrlSeeded]);\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\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<CurrentConfigSection status={status} statusError={statusError} />\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 && configResult.embedder !== \"custom\" && (\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\tinputEnabled={status !== null && \"embeddingApiKeySet\" in status}\n\t\t\t\tapiKeySet={status?.embeddingApiKeySet === true}\n\t\t\t\tembeddingDim={status?.embeddingDim}\n\t\t\t\tembeddingHeadersSet={status?.embeddingHeadersSet === true}\n\t\t\t\tallowRemoteEmbedder={status?.allowRemoteEmbedder}\n\t\t\t\tconfigureResult={configResult}\n\t\t\t\tconfigureError={configError}\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, plus the ENC-2c install-native-ort action\n * (rendered only while the native binding is NOT installed — derived from the\n * /api/setup-status poll's nativeOrtInstalledVersion). Uses the MaintenanceTab\n * ActionDef + window.confirm pattern; the POST body ALWAYS carries confirm:true\n * (the 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 * For install-native-ort the returned nativeOrtRetestResult (verdict/p95/RSS) is\n * rendered inline.\n */\nimport type React from \"react\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport type {\n\tSetupCortexActionKind,\n\tSetupCortexStatusResponse,\n} from \"../../types/setup-cortex\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport {\n\tpostSetupCortexAction,\n\tfetchSetupCortexActionLog,\n} from \"../../api/setup-cortex\";\nimport { fetchSetupStatus } from \"../../api/client\";\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\t{\n\t\tkey: \"install-native-ort\",\n\t\tlabel: \"Install Native ORT\",\n\t\tdesc: \"Lazy-download + install the native onnxruntime binding\",\n\t\tdangerous: true,\n\t\tconfirm:\n\t\t\t\"Download + install the native onnxruntime binding on this host? (npm-mediated, sha256-verified; then re-qualified.)\",\n\t},\n];\n\n/** ENC-2c: the retest portion rendered after a successful install-native-ort. */\ninterface RetestDisplay {\n\tverdict: string;\n\tp95Ms: number;\n\trssMiB: number;\n\tbackend: string | null;\n}\n\ninterface ActionResultDisplay {\n\taction: string;\n\tlogName: string;\n\ttail: string | null;\n\tcomplete: boolean | null;\n\tmessage: string;\n\tretest: RetestDisplay | null;\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\t// ENC-2c: poll the general setup status so we can hide the install button once\n\t// the native binding is present (CortexActionsCard's cortex status prop does\n\t// not carry nativeOrtInstalledVersion).\n\tconst [setupStatus, setSetupStatus] = useState<SetupStatusResponse | null>(null);\n\n\tconst loadSetupStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then((s) => {\n\t\t\t\tsetSetupStatus(s);\n\t\t\t\t// A successful poll proves the server is reachable and serving — any\n\t\t\t\t// latched \"actions disabled\" banner from an earlier transient error\n\t\t\t\t// (404/500 on a previous version) is stale; clear it.\n\t\t\t\tsetDisabled(false);\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* best-effort poll; hide install button when unavailable */\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadSetupStatus();\n\t\tconst id = setInterval(loadSetupStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadSetupStatus]);\n\n\tconst nativeInstalled = (setupStatus?.nativeOrtInstalledVersion ?? null) !== null;\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\tretest:\n\t\t\t\t\t\t\tr.nativeOrtRetestResult != null\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tverdict: r.nativeOrtRetestResult.verdict,\n\t\t\t\t\t\t\t\t\t\tp95Ms: r.nativeOrtRetestResult.p95Ms,\n\t\t\t\t\t\t\t\t\t\trssMiB: r.nativeOrtRetestResult.rssMiB,\n\t\t\t\t\t\t\t\t\t\tbackend: r.nativeOrtBackendEffective ?? null,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: null,\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 if (outcome.status === 404) {\n\t\t\t\t\t// 404 = the VC9B flag is genuinely off on the server — the only\n\t\t\t\t\t// response that justifies the \"actions are disabled\" banner.\n\t\t\t\t\tsetDisabled(true);\n\t\t\t\t\tsetActionError(\"Setup Cortex actions are disabled (off).\");\n\t\t\t\t} else {\n\t\t\t\t\t// Any other error (500, network, etc.) is transient — show it\n\t\t\t\t\t// inline, but do NOT latch the disabled banner on it.\n\t\t\t\t\tsetActionError(`Action failed (${outcome.status}).`);\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.filter(\n\t\t\t\t// ENC-2c: hide the install button once the native binding is present.\n\t\t\t\t(def) => def.key !== \"install-native-ort\" || !nativeInstalled,\n\t\t\t).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.retest !== null && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tmarginTop: \"0.5rem\",\n\t\t\t\t\t\t\t\tfontSize: \"0.85rem\",\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\t\t\t\t\tgap: \"0.75rem\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\tRe-qualified:{\" \"}\n\t\t\t\t\t\t\t\t<span style={{ color: \"#4caf50\", fontWeight: 600 }}>\n\t\t\t\t\t\t\t\t\t{result.retest.verdict}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\tp95: {result.retest.p95Ms.toFixed(1)} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\tRSS: {result.retest.rssMiB.toFixed(1)} MiB\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{result.retest.backend !== null && (\n\t\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\t\tbackend: {result.retest.backend}\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\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/CortexRuntimeCardStyles.ts — extracted styles for CortexRuntimeCard.\n *\n * Split from CortexRuntimeCard.tsx to respect the extensions/ 400-line soft\n * limit (mirrors the EmbedderSetupStyles.tsx convention).\n */\nimport type React from \"react\";\n\nexport const 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.25rem\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsubtitle: {\n\t\tfontSize: \"0.85rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t},\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\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\ttoggleRow: {\n\t\tdisplay: \"flex\",\n\t\talignItems: \"center\",\n\t\tgap: \"0.5rem\",\n\t\tmarginBottom: \"0.75rem\",\n\t\tfontSize: \"0.9rem\",\n\t},\n};\n","/**\n * SetupTab/CortexRuntimeCard.tsx — Encoder Runtime selection card (ENC-1b +\n * ENC-2a budget knob).\n *\n * Rendered on the Setup Cortex sub-tab. Reads the ENC-1b Cortex trio AND the\n * ENC-2a install-budget knob from the SAME /api/setup-status endpoint (and\n * /api/setup-configure writer) the Embedder sub-tab uses — a single endpoint,\n * no /api/setup-cortex-status read.\n *\n * The native opt-in toggle POSTs `encoderNativeOptIn`; the install-budget\n * input POSTs `nativeOrtBudgetMib` (positive integer MiB string, 1..8192). The\n * effective backend (`wasm` | `native`), any demotion reason, AND the effective\n * budget (`installBudgetMib()` operand, incl. the 300 MiB default fallback)\n * are surfaced reader-only — no selection/install logic is reimplemented on\n * the client.\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 type { SetupStatusResponse } from \"@contracts\";\nimport { fetchSetupStatus, configureEmbedder } from \"../../api/client\";\nimport { styles } from \"./CortexRuntimeCardStyles\";\n\nconst BUDGET_INPUT_MAX = 8192;\n\nexport default function CortexRuntimeCard(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [saving, setSaving] = useState(false);\n\t// ENC-2a: local input state for the budget field, seeded from the persisted\n\t// value once when the ENC-2a surface becomes active (one-shot seed mirrors\n\t// CustomEndpointSection's dim-input pattern).\n\tconst [budgetInput, setBudgetInput] = useState<string>(\"\");\n\tconst [budgetSeeded, setBudgetSeeded] = useState(false);\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch((e: unknown) => setError(e instanceof Error ? e.message : String(e)));\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t}, [loadStatus]);\n\n\t// Poll status every 5s — the same cadence as the Embedder sub-tab so the\n\t// runtime card reflects persisted opt-in + effective backend changes live.\n\tuseEffect(() => {\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\t// The card is only meaningful when the ENC-1b surface is active (the server\n\t// carries the Cortex trio). Flag off → the keys are absent → hide the card.\n\tconst enabled = status !== null && \"encoderNativeOptIn\" in status;\n\n\t// ENC-2a: seed the budget input once, when the ENC-2a surface becomes active\n\t// AND the persisted value is present. Falls back to the effective operand\n\t// (the runtime's resolution, incl. the 300 default) so the input shows the\n\t// operand the dashboard is actually using.\n\tconst budgetEffective = status?.nativeOrtBudgetEffectiveMib;\n\tuseEffect(() => {\n\t\tif (!budgetSeeded && status && \"nativeOrtBudgetEffectiveMib\" in status) {\n\t\t\tconst seed = status.nativeOrtBudgetMib ?? status.nativeOrtBudgetEffectiveMib ?? \"\";\n\t\t\tif (typeof seed === \"string\") setBudgetInput(seed);\n\t\t\tsetBudgetSeeded(true);\n\t\t}\n\t}, [budgetSeeded, status]);\n\n\t// Omit embedder/url when the card only manages runtime keys — the server's\n\t// tryEnc1bConfigure handles pure additive configure (no embedder change) and\n\t// returns before the embedder-validation gate.\n\tconst toggleNative = useCallback(\n\t\t(next: boolean) => {\n\t\t\tsetSaving(true);\n\t\t\tsetError(null);\n\t\t\tconfigureEmbedder({ encoderNativeOptIn: next })\n\t\t\t\t.then(() => {\n\t\t\t\t\tsetSaving(false);\n\t\t\t\t\tloadStatus();\n\t\t\t\t})\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\tsetSaving(false);\n\t\t\t\t});\n\t\t},\n\t\t[loadStatus],\n\t);\n\n\tconst saveBudget = useCallback(() => {\n\t\tconst trimmed = budgetInput.trim();\n\t\t// Client-side guard mirrors the server's ENC_2BUDGET_MAX_MIB clamp.\n\t\t// The server re-validates; this is purely a fast UX pre-check.\n\t\tif (!/^\\d+$/.test(trimmed)) {\n\t\t\tsetError(\"Install budget must be a positive integer (MiB)\");\n\t\t\treturn;\n\t\t}\n\t\tconst n = Number(trimmed);\n\t\tif (!Number.isSafeInteger(n) || n < 1 || n > BUDGET_INPUT_MAX) {\n\t\t\tsetError(`Install budget must be between 1 and ${BUDGET_INPUT_MAX} MiB`);\n\t\t\treturn;\n\t\t}\n\t\tsetSaving(true);\n\t\tsetError(null);\n\t\tconfigureEmbedder({ nativeOrtBudgetMib: trimmed })\n\t\t\t.then(() => {\n\t\t\t\tsetSaving(false);\n\t\t\t\tloadStatus();\n\t\t\t})\n\t\t\t.catch((e: unknown) => {\n\t\t\t\tsetError(e instanceof Error ? e.message : String(e));\n\t\t\t\tsetSaving(false);\n\t\t\t});\n\t}, [budgetInput, status, loadStatus]);\n\n\tif (!enabled) return <></>;\n\n\tconst backend = status?.encoderBackend ?? \"wasm\";\n\tconst demotion = status?.encoderDemotionReason ?? null;\n\tconst budgetVisible = status !== null && \"nativeOrtBudgetEffectiveMib\" in status;\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Encoder Runtime</h3>\n\t\t\t<p style={styles.subtitle}>ONNX backend selection</p>\n\t\t\t<div style={styles.toggleRow}>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\tchecked={status?.encoderNativeOptIn === true}\n\t\t\t\t\tonChange={(e) => toggleNative(e.target.checked)}\n\t\t\t\t\tdisabled={saving}\n\t\t\t\t\taria-label=\"Native ONNX runtime (onnxruntime-node)\"\n\t\t\t\t/>\n\t\t\t\t<label>Native ONNX runtime (onnxruntime-node)</label>\n\t\t\t\t{saving && (\n\t\t\t\t\t<span style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\" }}>saving...</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Effective backend (selected):</span>\n\t\t\t\t<span style={styles.value}>{backend}</span>\n\t\t\t</div>\n\t\t\t{budgetVisible && (\n\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor=\"enc2-budget-input\"\n\t\t\t\t\t\tstyle={{ ...styles.label, marginRight: \"0.5rem\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\tNative install budget (MiB):\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"enc2-budget-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\tmax={BUDGET_INPUT_MAX}\n\t\t\t\t\t\tstep={1}\n\t\t\t\t\t\tvalue={budgetInput}\n\t\t\t\t\t\tonChange={(e) => setBudgetInput(e.target.value)}\n\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\tstyle={{ width: \"6rem\" }}\n\t\t\t\t\t\taria-label=\"Native onnxruntime install budget in MiB\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={saveBudget}\n\t\t\t\t\t\tdisabled={saving || budgetInput.trim().length === 0}\n\t\t\t\t\t\tstyle={{ marginLeft: \"0.5rem\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\tSave\n\t\t\t\t\t</button>\n\t\t\t\t\t{budgetEffective !== undefined && (\n\t\t\t\t\t\t<span style={{ ...styles.value, marginLeft: \"0.5rem\" }}>\n\t\t\t\t\t\t\t(effective: {budgetEffective} MiB)\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{demotion !== null && (\n\t\t\t\t<div style={styles.warning}>\n\t\t\t\t\t<strong>Demoted:</strong> {demotion}\n\t\t\t\t</div>\n\t\t\t)}\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</div>\n\t);\n}\n","/**\n * SetupTab/CortexRuntimeInstallCard.tsx — operator-run install guide card\n * (ENC-2a).\n *\n * Pure render. When `SetupStatusResponse.nativeOrtInstallGuide` is non-null\n * (opt-in on, effective runtime still wasm, platform installable), this card\n * surfaces the three copy-paste steps the operator runs OUTSIDE the dashboard:\n * install onnxruntime-node, restart via pi, and the expected next status. When\n * the guide is null the card hides entirely (the modifiers card already\n * surfaces the honest ENC-0g state).\n *\n * NO client-side execution — the install script is never spawned from here.\n * Data comes exclusively from the existing /api/setup-status poll.\n */\nimport type React from \"react\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport { fetchSetupStatus } from \"../../api/client\";\nimport { styles } from \"./CortexSetupStyles\";\n\nfunction useCopyState(): [boolean, (text: string) => Promise<void>] {\n\tconst [copied, setCopied] = useState(false);\n\tconst copy = useCallback(async (text: string) => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\tsetCopied(true);\n\t\t\twindow.setTimeout(() => setCopied(false), 1500);\n\t\t} catch {\n\t\t\tsetCopied(false);\n\t\t}\n\t}, []);\n\treturn [copied, copy];\n}\n\nexport default function CortexRuntimeInstallCard(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [copied, copy] = useCopyState();\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch(() => {\n\t\t\t\t/* best-effort poll; hide card when unavailable */\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\tconst guide = status?.nativeOrtInstallGuide ?? null;\n\tconst installedVersion = status?.nativeOrtInstalledVersion ?? null;\n\tif (!guide) return <></>;\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Encoder Runtime Install</h3>\n\t\t\t<p style={{ ...styles.label, fontSize: \"0.85rem\", marginBottom: \"0.75rem\" }}>\n\t\t\t\tPlatform: {guide.platform}\n\t\t\t</p>\n\t\t\t{installedVersion !== null && (\n\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t<span style={styles.label}>Detected:</span>\n\t\t\t\t\t<span style={styles.value}>{installedVersion}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{guide.commands.map((command, i) => (\n\t\t\t\t<div key={`${i}-${command}`} style={styles.row}>\n\t\t\t\t\t<span style={styles.label}>Step {i + 1}:</span>\n\t\t\t\t\t<code\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...styles.mono,\n\t\t\t\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\t\t\tmarginTop: \"0.15rem\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{command}\n\t\t\t\t\t</code>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid copy(command);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tstyle={{ marginLeft: \"0.5rem\", fontSize: \"0.8rem\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t))}\n\t\t\t<p style={{ ...styles.row, fontSize: \"0.85rem\" }}>\n\t\t\t\t<span style={styles.label}>Script:</span>{\" \"}\n\t\t\t\t<code style={styles.mono}>{guide.scriptPath}</code>\n\t\t\t</p>\n\t\t\t{copied && (\n\t\t\t\t<p style={{ color: \"#4caf50\", fontSize: \"0.8rem\", margin: \"0.25rem 0 0\" }}>\n\t\t\t\t\tCopied to clipboard\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/CortexRetestCard.tsx — native onnxruntime qualification retest\n * card (ENC-2b).\n *\n * Pure render. When `SetupStatusResponse.nativeOrtInstalledVersion` is non-null\n * (the ENC-2a guide detected an install) AND `nativeOrtRetestResult` is non-null\n * (the retest ran), this card surfaces the qualification outcome: platform,\n * version, verdict badge, p95 latency, RSS, tested-at timestamp, and the\n * effective backend after the retest.\n *\n * NO client-side execution of the binding — the retest runs server-side. The\n * \"Retest now\" button POSTs {nativeOrtRetest: true} and then refreshes the poll.\n * Data comes exclusively from the existing /api/setup-status poll.\n */\nimport type React from \"react\";\nimport { useState, useCallback, useEffect } from \"react\";\nimport type { SetupStatusResponse } from \"@contracts\";\nimport { fetchSetupStatus, configureEmbedder } from \"../../api/client\";\nimport { styles } from \"./CortexSetupStyles\";\n\n// The retest shape mirrors the server `RetestResult` interface; derived via\n// indexed access from the exported response type so no contract file changes.\ntype RetestResult = NonNullable<SetupStatusResponse[\"nativeOrtRetestResult\"]>;\n\nconst VERDICT_STYLE: Record<RetestResult[\"verdict\"], React.CSSProperties> = {\n\tqualified: { ...styles.badge, background: \"#1f3a2a\", color: \"#4caf50\" },\n\tdegraded: { ...styles.badge, background: \"#3a2f00\", color: \"#ff9800\" },\n\tfailed: { ...styles.badge, background: \"#3a1a1a\", color: \"#ff5252\" },\n};\n\nexport default function CortexRetestCard(): React.ReactElement {\n\tconst [status, setStatus] = useState<SetupStatusResponse | null>(null);\n\tconst [retesting, setRetesting] = useState(false);\n\n\tconst loadStatus = useCallback(() => {\n\t\tfetchSetupStatus()\n\t\t\t.then(setStatus)\n\t\t\t.catch(() => {\n\t\t\t\t/* best-effort poll; hide card when unavailable */\n\t\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tloadStatus();\n\t\tconst id = setInterval(loadStatus, 5000);\n\t\treturn () => clearInterval(id);\n\t}, [loadStatus]);\n\n\tconst onRetest = useCallback(() => {\n\t\tsetRetesting(true);\n\t\t// `embedder: \"trigram\"` satisfies the required request field; the server\n\t\t// handles the additive nativeOrtRetest key BEFORE embedder validation, so\n\t\t// the value is never read on this path.\n\t\tconfigureEmbedder({ embedder: \"trigram\", nativeOrtRetest: true })\n\t\t\t.then(() => loadStatus())\n\t\t\t.finally(() => setRetesting(false));\n\t}, [loadStatus]);\n\n\tconst installedVersion = status?.nativeOrtInstalledVersion ?? null;\n\tconst retest = status?.nativeOrtRetestResult ?? null;\n\tconst effectiveBackend = status?.nativeOrtBackendEffective ?? null;\n\tif (installedVersion === null || retest === null) return <></>;\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Encoder Runtime Retest</h3>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Platform:</span>\n\t\t\t\t<span style={styles.value}>{retest.platform}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Version:</span>\n\t\t\t\t<span style={styles.value}>{retest.version}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Verdict:</span>\n\t\t\t\t<span style={VERDICT_STYLE[retest.verdict]}>{retest.verdict}</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>p95 latency:</span>\n\t\t\t\t<span style={styles.value}>{retest.p95Ms} ms</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>RSS:</span>\n\t\t\t\t<span style={styles.value}>{retest.rssMiB} MiB</span>\n\t\t\t</div>\n\t\t\t<div style={styles.row}>\n\t\t\t\t<span style={styles.label}>Tested:</span>\n\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t{new Date(retest.testedAt).toISOString()}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{effectiveBackend !== null && (\n\t\t\t\t<div style={styles.row}>\n\t\t\t\t\t<span style={styles.label}>Effective backend (measured):</span>\n\t\t\t\t\t<span style={styles.value}>{effectiveBackend}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{effectiveBackend !== null &&\n\t\t\t\tstatus?.encoderBackend != null &&\n\t\t\t\teffectiveBackend !== status.encoderBackend && (\n\t\t\t\t\t<p style={{ fontSize: \"0.8rem\", color: \"#a0a0c0\", marginTop: \"0.25rem\" }}>\n\t\t\t\t\t\tMeasured backend differs from the selected backend above: the retest\n\t\t\t\t\t\tbenchmarked the native binding and found it over the p95/RSS gates, so\n\t\t\t\t\t\tthe runtime is demoted to <strong>{effectiveBackend}</strong> despite\n\t\t\t\t\t\tthe binding being installed.\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t<button type=\"button\" onClick={onRetest} disabled={retesting}>\n\t\t\t\t{retesting ? \"Retesting…\" : \"Retest now\"}\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","/**\n * SetupTab/VectorCortexCosineFpCard.tsx — cosine-FP bench recommendation card\n * (COS-FP-A).\n *\n * Reader-only card on the Setup Cortex sub-tab. Polls GET /api/cosine-fp-report\n * and shows the last synthetic bench's recommended default + per-content-type\n * overrides + report digest + grid summary. The endpoint 404s on flag-off\n * (MEGACOMPACT_COSINE_FP_BENCH=0): the card renders an honest \"disabled\" state\n * matching the server's deriveVcStatus off path. Counts + fractions + digest\n * only — never template text (EVAL-REDACT-002).\n *\n * PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.\n */\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { getJson, ApiError } from \"../../api/client-http\";\nimport type { CosineFpReportV1 } from \"@contracts\";\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.25rem\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsubtitle: {\n\t\tfontSize: \"0.85rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t},\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\tdisabled: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tfontSize: \"0.85rem\",\n\t},\n};\n\nexport const VectorCortexCosineFpCard: React.FC = () => {\n\t// 404 (flag-off) resolves to null data; a live report resolves to the\n\t// CosineFpReportV1 payload. useApi<CosineFpReportV1 | null> lets us\n\t// distinguish \"bench disabled\" (null) from \"loading/error\".\n\tconst { data, error, loading } = useApi<CosineFpReportV1 | null>(\n\t\tuseMemo(\n\t\t\t() => () =>\n\t\t\t\tgetJson<CosineFpReportV1>(\"/api/cosine-fp-report\").catch((e: unknown) => {\n\t\t\t\t\t// 404 = flag-off: surface to the renderer as disabled.\n\t\t\t\t\tif (e instanceof ApiError && e.status === 404) return null;\n\t\t\t\t\tthrow e;\n\t\t\t\t}),\n\t\t\t[],\n\t\t),\n\t\t{ pollInterval: 5000 },\n\t);\n\n\t// 404 (flag-off) resolves to null data with no error and loading done →\n\t// bench disabled.\n\tif (data === null && !error && !loading) {\n\t\treturn (\n\t\t\t<div style={styles.disabled}>\n\t\t\t\tCosine FP synthetic bench: disabled (MEGACOMPACT_COSINE_FP_BENCH=0).\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Cosine FP threshold</h3>\n\t\t\t<p style={styles.subtitle}>Last synthetic bench threshold recommendation</p>\n\t\t\t{error !== null ? (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError loading report: {error.message}\n\t\t\t\t</p>\n\t\t\t) : data === null ? (\n\t\t\t\t<div style={styles.value}>Loading…</div>\n\t\t\t) : (\n\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}>Recommended default:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{data.recommendedDefault ?? \"—\"} (shipped{\" \"}\n\t\t\t\t\t\t\t{data.shippedDefault})\n\t\t\t\t\t\t</span>\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}>Overrides:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\tCODE {data.overrides?.code ?? \"—\"} · PROSE{\" \"}\n\t\t\t\t\t\t\t{data.overrides?.prose ?? \"—\"} · MIXED{\" \"}\n\t\t\t\t\t\t\t{data.overrides?.mixed ?? \"—\"}\n\t\t\t\t\t\t</span>\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}>Grid:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{data.grid\n\t\t\t\t\t\t\t\t? `${data.grid.lo} → ${data.grid.hi} (${data.grid.points} points)`\n\t\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<div style={styles.row}>\n\t\t\t\t\t\t<span style={styles.label}>Report digest:</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tstyle={styles.value}\n\t\t\t\t\t\t\ttitle={data.digest ?? undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{data.digest ? data.digest.slice(0, 16) + \"…\" : \"—\"}\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)}\n\t\t</div>\n\t);\n};\n","/**\n * SetupTab/VectorCortexRepoCorpusCard.tsx — REPO-A cross-repo corpus consent\n * status card.\n *\n * Reader-only card on the Setup Cortex sub-tab. Polls GET /api/repo-corpus and\n * shows each pseudonymous repo's consent state + cross-repo overlap + total\n * events. It NEVER submits consent — consent is CLI/ops-only (consent.mjs,\n * append-only). The endpoint 404s on flag-off (MEGACOMPACT_REPO_CORPUS=0): the\n * card renders an honest \"disabled\" state matching deriveVcStatus off. Counts +\n * IDs + status only — never payload content (EVAL-REDACT-002).\n *\n * PREVENT-PI-004: relative-path fetch to the same-origin dashboard server.\n */\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { useApi } from \"../../hooks/useApi\";\nimport { getJson, ApiError } from \"../../api/client-http\";\nimport type { RepoCorpusStatusV1 } from \"@contracts\";\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.25rem\",\n\t\tcolor: \"#e0e0e0\",\n\t},\n\tsubtitle: {\n\t\tfontSize: \"0.85rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tmarginTop: 0,\n\t\tmarginBottom: \"0.75rem\",\n\t},\n\trow: { marginBottom: \"0.4rem\", fontSize: \"0.9rem\" },\n\tlabel: { fontWeight: 600, color: \"#a0a0c0\", marginRight: \"0.5rem\" },\n\tvalue: { color: \"#e0e0e0\" },\n\tdisabled: {\n\t\tbackground: \"#1a1a2e\",\n\t\tborder: \"1px solid #2a2a4e\",\n\t\tborderRadius: \"8px\",\n\t\tpadding: \"1rem\",\n\t\tmarginBottom: \"1rem\",\n\t\tcolor: \"#a0a0c0\",\n\t\tfontSize: \"0.85rem\",\n\t},\n};\n\nexport const VectorCortexRepoCorpusCard: React.FC = () => {\n\tconst { data, error, loading } = useApi<RepoCorpusStatusV1 | null>(\n\t\tuseMemo(\n\t\t\t() => () =>\n\t\t\t\tgetJson<RepoCorpusStatusV1>(\"/api/repo-corpus\").catch((e: unknown) => {\n\t\t\t\t\t// 404 = flag-off: surface to the renderer as disabled.\n\t\t\t\t\tif (e instanceof ApiError && e.status === 404) return null;\n\t\t\t\t\tthrow e;\n\t\t\t\t}),\n\t\t\t[],\n\t\t),\n\t\t{ pollInterval: 5000 },\n\t);\n\n\tif (data === null && !error && !loading) {\n\t\treturn (\n\t\t\t<div style={styles.disabled}>\n\t\t\t\tCross-repo corpus: disabled (MEGACOMPACT_REPO_CORPUS=0).\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div style={styles.section}>\n\t\t\t<h3 style={styles.sectionTitle}>Cross-Repo Corpus</h3>\n\t\t\t<p style={styles.subtitle}>\n\t\t\t\tPseudonymous consent status across donated repos\n\t\t\t</p>\n\t\t\t{error !== null ? (\n\t\t\t\t<p style={{ color: \"#f44336\", fontSize: \"0.85rem\" }}>\n\t\t\t\t\tError loading corpus: {error.message}\n\t\t\t\t</p>\n\t\t\t) : data === null ? (\n\t\t\t\t<div style={styles.value}>Loading…</div>\n\t\t\t) : (\n\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}>Status:</span>\n\t\t\t\t\t\t<span style={styles.value}>{data.status}</span>\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}>Total events:</span>\n\t\t\t\t\t\t<span style={styles.value}>{data.totalEvents}</span>\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}>Overlap pairs:</span>\n\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t{data.corpus ? data.corpus.overlaps.length : 0}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style={{ marginTop: \"0.5rem\" }}>\n\t\t\t\t\t\t{(data.perRepo ?? []).map((r) => (\n\t\t\t\t\t\t\t<div key={r.repoPseudonym} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.label}>\n\t\t\t\t\t\t\t\t\t{r.repoPseudonym.slice(0, 8)}:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span style={styles.value}>\n\t\t\t\t\t\t\t\t\t{r.sessions} sessions ·{\" \"}\n\t\t\t\t\t\t\t\t\t{r.consentedCrossRepo\n\t\t\t\t\t\t\t\t\t\t? r.revokedAt\n\t\t\t\t\t\t\t\t\t\t\t? `revoked ${r.revokedAt}`\n\t\t\t\t\t\t\t\t\t\t\t: \"consented\"\n\t\t\t\t\t\t\t\t\t\t: \"not consented\"}\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</div>\n\t\t\t\t</div>\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 CortexRuntimeCard from \"./CortexRuntimeCard\";\nimport CortexRuntimeInstallCard from \"./CortexRuntimeInstallCard\";\nimport CortexRetestCard from \"./CortexRetestCard\";\nimport { VectorCortexCosineFpCard } from \"./VectorCortexCosineFpCard\";\nimport { VectorCortexRepoCorpusCard } from \"./VectorCortexRepoCorpusCard\";\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<CortexRuntimeCard />\n\t\t\t<CortexRuntimeInstallCard />\n\t\t\t<CortexRetestCard />\n\t\t\t<VectorCortexCosineFpCard />\n\t\t\t<VectorCortexRepoCorpusCard />\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, useCallback } from \"react\";\nimport type { SettingsResponse } from \"@contracts\";\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 { useApi } from \"../hooks/useApi\";\nimport { fetchSettings } from \"../api/client\";\nimport { useSetupCortexPoll, isCortexSubTabVisible } from \"./useSetupCortexPoll\";\n\nconst DASH_0C_KEY = \"MEGACOMPACT_DASH_0C\";\n\n/** Resolve the DASH-0c consolidation flag from the server settings state.\n * Absent/not-yet-loaded => false (flag-off posture), so flag-off users keep the\n * Config sub-tab; it is hidden only once settings confirm the flag is ON (the\n * config editor then lives solely on the Admin surface). */\nfunction dash0cEnabled(settings: SettingsResponse | null): boolean {\n\tif (!settings) return false;\n\tfor (const cat of settings.categories) {\n\t\tfor (const s of cat.settings) {\n\t\t\tif (s.key === DASH_0C_KEY && s.type === \"boolean\") return s.value === true;\n\t\t}\n\t}\n\treturn false;\n}\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\t/* DASH-0c: flag-ON hides the config sub-tab member (the config editor is then\n\t * reachable only via the Admin surface). Flag-OFF renders config as today. */\n\tconst { data: settingsData } = useApi<SettingsResponse>(\n\t\tuseCallback(() => fetchSettings(), []),\n\t\t{ pollInterval: 0, maxRetries: 0 },\n\t);\n\tconst dash0cOn = dash0cEnabled(settingsData);\n\n\tconst subTabs = useMemo(() => {\n\t\tconst tabs = dash0cOn\n\t\t\t? BASE_SUB_TABS.filter((t) => t.id !== \"config\")\n\t\t\t: [...BASE_SUB_TABS];\n\t\tif (isCortexSubTabVisible(cortex.data)) tabs.push(CORTEX_TAB);\n\t\treturn tabs;\n\t}, [cortex.data, dash0cOn]);\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\" && !dash0cOn && <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","r","GameTab","scores","setScores","reposCount","setReposCount","setAchievements","gameModeOn","setGameModeOn","loading","setLoading","megaToast","setMegaToast","lastMegaTsRef","fetchAll","useCallback","cache","dedupe","turns","megaCache","repos","ach","fetchGameScores","fetchAchievements","newRow","active","doFetch","timer","gs","fetchGameState","megaRows","bestMega","firstSeen","fs","showMega","turnsRows","maxTurns","lvl","hasData","Fragment","AchievementsTab","error","setError","e","run","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","saving","onUpdate","locked","timerRef","submit","raw","msg","scheduleSave","inputDisabled","Switch","checked","SettingsPanel","settings","setSettings","setSaving","toast","setToast","load","fetchSettings","handleUpdate","key","res","postSetting","cat","SAVED_NOTICE","CustomEndpointSection","customUrl","setCustomUrl","applyEmbedder","configuring","inputEnabled","apiKeySet","embeddingDim","embeddingHeadersSet","allowRemoteEmbedder","configureResult","configureError","customApiKey","setCustomApiKey","dim","setDim","dimSeeded","setDimSeeded","headers","setHeaders","allowRemote","setAllowRemote","allowRemoteSeeded","setAllowRemoteSeeded","embedderLabel","trigramWarning","status","detectBadge","installed","bg","CurrentConfigSection","statusError","EmbedderSetup","setStatus","detect","setDetect","setStatusError","detectError","setDetectError","runningDetect","setRunningDetect","setConfiguring","configResult","setConfigResult","configError","setConfigError","customUrlSeeded","setCustomUrlSeeded","loadStatus","fetchSetupStatus","embedder","url","apiKey","enc1bOn","configureEmbedder","runDetect","fetchSetupDetect","d","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","result","setResult","actionError","setActionError","disabled","setDisabled","setupStatus","setSetupStatus","loadSetupStatus","s","nativeInstalled","runAction","def","outcome","tail","complete","log","handleClick","isRunning","BUDGET_INPUT_MAX","CortexRuntimeCard","budgetInput","setBudgetInput","budgetSeeded","setBudgetSeeded","enabled","budgetEffective","seed","toggleNative","next","saveBudget","trimmed","backend","demotion","budgetVisible","useCopyState","copied","setCopied","copy","CortexRuntimeInstallCard","guide","installedVersion","command","i","VERDICT_STYLE","CortexRetestCard","retesting","setRetesting","onRetest","retest","effectiveBackend","VectorCortexCosineFpCard","useApi","useMemo","getJson","ApiError","VectorCortexRepoCorpusCard","CortexSetup","setHighlight","blockerIds","DASH_0C_KEY","dash0cEnabled","BASE_SUB_TABS","CORTEX_TAB","SetupTab","subTab","setSubTab","cortex","settingsData","dash0cOn","subTabs","tabs","Toggle","ConfigTab"],"mappings":"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"}