pi-mega-compact 0.13.0 → 0.13.2

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 (212) hide show
  1. package/dist/extensions/dashboard-server/api-contracts/embedder-health.js +11 -0
  2. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry.js +225 -0
  3. package/dist/extensions/dashboard-server/api-contracts/endpoints/types.js +1 -0
  4. package/dist/extensions/dashboard-server/api-contracts/endpoints.js +5 -224
  5. package/dist/extensions/dashboard-server/api-contracts/raptor.js +8 -0
  6. package/dist/extensions/dashboard-server/api-contracts.test/_helpers.js +32 -0
  7. package/dist/extensions/dashboard-server/routes-cache.test/_helpers.js +48 -0
  8. package/dist/extensions/dashboard-server/routes-embedder-health.js +67 -0
  9. package/dist/extensions/dashboard-server/routes-raptor.js +88 -0
  10. package/dist/extensions/dashboard-server/routes-setup.js +1 -1
  11. package/dist/extensions/dashboard-server/routes.js +2 -0
  12. package/dist/extensions/dashboard-server/server.js +5 -1
  13. package/dist/extensions/mega-cache-replay.test/_helpers.js +175 -0
  14. package/dist/extensions/mega-commands/dataCommands.js +151 -0
  15. package/dist/extensions/mega-commands/helpers.js +61 -0
  16. package/dist/extensions/mega-commands/historyCommands.js +97 -0
  17. package/dist/extensions/mega-commands/setupCommand.js +200 -0
  18. package/dist/extensions/mega-commands.js +14 -499
  19. package/dist/extensions/mega-compact-s38.test/_helpers.js +194 -0
  20. package/dist/extensions/mega-compact.js +12 -2
  21. package/dist/extensions/mega-compact.test/_helpers.js +225 -0
  22. package/dist/extensions/mega-events/agent-handlers/agentEndHandler.js +211 -0
  23. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.js +49 -0
  24. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/contextHealth.js +33 -0
  25. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/errorRetry.js +387 -0
  26. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/event.js +7 -0
  27. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/gameScoring.js +55 -0
  28. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/lengthStop.js +12 -0
  29. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/memoryReview.js +22 -0
  30. package/dist/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.js +38 -0
  31. package/dist/extensions/mega-events/agent-handlers/turnEndHandler.js +36 -0
  32. package/dist/extensions/mega-events/agent-handlers.js +4 -799
  33. package/dist/extensions/mega-events/context-handler/afterCompact.js +163 -0
  34. package/dist/extensions/mega-events/context-handler/messageText.js +12 -0
  35. package/dist/extensions/mega-events/context-handler/tailResult.js +46 -0
  36. package/dist/extensions/mega-events/context-handler.js +11 -198
  37. package/dist/extensions/mega-events/separated-prompt.test/_helpers.js +25 -0
  38. package/dist/src/config.js +2 -0
  39. package/dist/src/dedup-engine.test/_helpers.js +55 -0
  40. package/dist/src/e2e.test/_helpers.js +52 -0
  41. package/dist/src/embedder.js +1 -0
  42. package/dist/src/httpEmbedder.js +6 -0
  43. package/dist/src/hyde.js +146 -0
  44. package/dist/src/importance.test/_helpers.js +5 -0
  45. package/dist/src/memoryGraph/sources/checkpoints.js +78 -0
  46. package/dist/src/memoryGraph/sources/edges.js +17 -0
  47. package/dist/src/memoryGraph/sources/flags.js +22 -0
  48. package/dist/src/memoryGraph/sources/helpers.js +14 -0
  49. package/dist/src/memoryGraph/sources/memories.js +88 -0
  50. package/dist/src/memoryGraph/sources/raptor.js +26 -0
  51. package/dist/src/memoryGraph/sources/turns.js +176 -0
  52. package/dist/src/memoryGraph/sources.js +15 -441
  53. package/dist/src/memoryGraph-gates.test/_helpers.js +120 -0
  54. package/dist/src/ratio.bench.test/_helpers.js +198 -0
  55. package/dist/src/recall/async.js +112 -0
  56. package/dist/src/recall/format.js +149 -0
  57. package/dist/src/recall/memory.js +62 -0
  58. package/dist/src/recall/reformulate.js +82 -0
  59. package/dist/src/recall/sync.js +169 -0
  60. package/dist/src/recall/types.js +1 -0
  61. package/dist/src/recall.js +13 -530
  62. package/dist/src/store/sqlite/schema/core.js +232 -0
  63. package/dist/src/store/sqlite/schema/game.js +65 -0
  64. package/dist/src/store/sqlite/schema/plan-v2.js +107 -0
  65. package/dist/src/store/sqlite/schema/turns.js +59 -0
  66. package/dist/src/store/sqlite/schema.js +8 -441
  67. package/dist/src/store/turns/contract-compliance.test/_helpers.js +21 -0
  68. package/dist/src/store/turns/sqlite-store/admin.js +171 -0
  69. package/dist/src/store/turns/sqlite-store/ctx.js +1 -0
  70. package/dist/src/store/turns/sqlite-store/read.js +111 -0
  71. package/dist/src/store/turns/sqlite-store/rows.js +42 -0
  72. package/dist/src/store/turns/sqlite-store/write.js +102 -0
  73. package/dist/src/store/turns/sqlite-store.js +31 -367
  74. package/dist/src/vectorStore/class.js +356 -0
  75. package/dist/src/vectorStore/hash.js +10 -0
  76. package/dist/src/vectorStore/types.js +2 -0
  77. package/dist/src/vectorStore.js +8 -359
  78. package/dist/src/vectorStore.test/_helpers.js +17 -0
  79. package/extensions/dashboard-client/dist/assets/{CacheTab-BZNnKhh5.js → CacheTab-DPRHjYZ0.js} +2 -2
  80. package/extensions/dashboard-client/dist/assets/{CacheTab-BZNnKhh5.js.map → CacheTab-DPRHjYZ0.js.map} +1 -1
  81. package/extensions/dashboard-client/dist/assets/{EventsTab-CzF5L42U.js → EventsTab-CgwYq-Qf.js} +2 -2
  82. package/extensions/dashboard-client/dist/assets/{EventsTab-CzF5L42U.js.map → EventsTab-CgwYq-Qf.js.map} +1 -1
  83. package/extensions/dashboard-client/dist/assets/{HealthTab-BLpidMrX.js → HealthTab-BgOCjVzR.js} +2 -2
  84. package/extensions/dashboard-client/dist/assets/{HealthTab-BLpidMrX.js.map → HealthTab-BgOCjVzR.js.map} +1 -1
  85. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Yw1yFpsy.js +2 -0
  86. package/extensions/dashboard-client/dist/assets/MaintenanceTab-Yw1yFpsy.js.map +1 -0
  87. package/extensions/dashboard-client/dist/assets/MemoryMapTab-yHUX7Yzi.js +2 -0
  88. package/extensions/dashboard-client/dist/assets/MemoryMapTab-yHUX7Yzi.js.map +1 -0
  89. package/extensions/dashboard-client/dist/assets/{MetricsTab-B0PCysqs.js → MetricsTab-CcH9fP8P.js} +2 -2
  90. package/extensions/dashboard-client/dist/assets/{MetricsTab-B0PCysqs.js.map → MetricsTab-CcH9fP8P.js.map} +1 -1
  91. package/extensions/dashboard-client/dist/assets/{OverviewTab-DsOhqFu4.js → OverviewTab-BOs8ZNev.js} +2 -2
  92. package/extensions/dashboard-client/dist/assets/{OverviewTab-DsOhqFu4.js.map → OverviewTab-BOs8ZNev.js.map} +1 -1
  93. package/extensions/dashboard-client/dist/assets/{ReposTab-B3YKYuOf.js → ReposTab-B-MfSPvg.js} +2 -2
  94. package/extensions/dashboard-client/dist/assets/{ReposTab-B3YKYuOf.js.map → ReposTab-B-MfSPvg.js.map} +1 -1
  95. package/extensions/dashboard-client/dist/assets/{SessionsTab-B96FWcrC.js → SessionsTab-BmeN649Q.js} +2 -2
  96. package/extensions/dashboard-client/dist/assets/{SessionsTab-B96FWcrC.js.map → SessionsTab-BmeN649Q.js.map} +1 -1
  97. package/extensions/dashboard-client/dist/assets/SetupTab-nOknoph5.js +2 -0
  98. package/extensions/dashboard-client/dist/assets/SetupTab-nOknoph5.js.map +1 -0
  99. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BfkUVTvA.js → TimeSavedCard-DnPg0L0z.js} +2 -2
  100. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-BfkUVTvA.js.map → TimeSavedCard-DnPg0L0z.js.map} +1 -1
  101. package/extensions/dashboard-client/dist/assets/{TopicsTab-DLRsZmXJ.js → TopicsTab-BODHOg_b.js} +2 -2
  102. package/extensions/dashboard-client/dist/assets/{TopicsTab-DLRsZmXJ.js.map → TopicsTab-BODHOg_b.js.map} +1 -1
  103. package/extensions/dashboard-client/dist/assets/{TurnsTab-DKGU2Bf6.js → TurnsTab-BK0I7hKr.js} +2 -2
  104. package/extensions/dashboard-client/dist/assets/{TurnsTab-DKGU2Bf6.js.map → TurnsTab-BK0I7hKr.js.map} +1 -1
  105. package/extensions/dashboard-client/dist/assets/{index-D-lPLRWB.js → index-mOlljTFI.js} +10 -10
  106. package/extensions/dashboard-client/dist/assets/index-mOlljTFI.js.map +1 -0
  107. package/extensions/dashboard-client/dist/assets/{useSSE-ClbbcgIp.js → useSSE-BYOtv1-3.js} +2 -2
  108. package/extensions/dashboard-client/dist/assets/{useSSE-ClbbcgIp.js.map → useSSE-BYOtv1-3.js.map} +1 -1
  109. package/extensions/dashboard-client/dist/index.html +1 -1
  110. package/extensions/dashboard-client/src/App.tsx +0 -4
  111. package/extensions/dashboard-client/src/api/client.ts +16 -0
  112. package/extensions/dashboard-client/src/tabs/MaintenanceTab/ActionsCard.tsx +178 -0
  113. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DbStatsCard.tsx +140 -0
  114. package/extensions/dashboard-client/src/tabs/MaintenanceTab/DebugBundleCard.tsx +109 -0
  115. package/extensions/dashboard-client/src/tabs/MaintenanceTab/HealthMitigationCard.tsx +98 -0
  116. package/extensions/dashboard-client/src/tabs/MaintenanceTab/SchemaHealthCard.tsx +108 -0
  117. package/extensions/dashboard-client/src/tabs/MaintenanceTab.tsx +12 -598
  118. package/extensions/dashboard-client/src/tabs/MemoryMapTab/MemoryMapView.tsx +476 -0
  119. package/extensions/dashboard-client/src/tabs/MemoryMapTab/RaptorTreeView.tsx +163 -0
  120. package/extensions/dashboard-client/src/tabs/MemoryMapTab.tsx +56 -466
  121. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderHealthCard.tsx +109 -0
  122. package/extensions/dashboard-client/src/tabs/SetupTab/EmbedderSetup.tsx +468 -0
  123. package/extensions/dashboard-client/src/tabs/SetupTab.tsx +23 -484
  124. package/extensions/dashboard-server/api-contracts/embedder-health.ts +32 -0
  125. package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +360 -0
  126. package/extensions/dashboard-server/api-contracts/endpoints/types.ts +350 -0
  127. package/extensions/dashboard-server/api-contracts/endpoints.ts +27 -648
  128. package/extensions/dashboard-server/api-contracts/index.ts +6 -0
  129. package/extensions/dashboard-server/api-contracts/raptor.ts +49 -0
  130. package/extensions/dashboard-server/api-contracts.test/_helpers.ts +47 -0
  131. package/extensions/dashboard-server/routes-cache.test/_helpers.ts +94 -0
  132. package/extensions/dashboard-server/routes-embedder-health.ts +77 -0
  133. package/extensions/dashboard-server/routes-raptor.ts +128 -0
  134. package/extensions/dashboard-server/routes-setup.ts +1 -1
  135. package/extensions/dashboard-server/routes.ts +2 -0
  136. package/extensions/dashboard-server/server.ts +4 -0
  137. package/extensions/mega-cache-replay.test/_helpers.ts +188 -0
  138. package/extensions/mega-commands/dataCommands.ts +169 -0
  139. package/extensions/mega-commands/helpers.ts +62 -0
  140. package/extensions/mega-commands/historyCommands.ts +117 -0
  141. package/extensions/mega-commands/setupCommand.ts +235 -0
  142. package/extensions/mega-commands.ts +25 -538
  143. package/extensions/mega-compact-s38.test/_helpers.ts +201 -0
  144. package/extensions/mega-compact.test/_helpers.ts +237 -0
  145. package/extensions/mega-compact.ts +12 -2
  146. package/extensions/mega-events/agent-handlers/agentEndHandler.ts +238 -0
  147. package/extensions/mega-events/agent-handlers/turnEndHandler/cacheStripe.ts +74 -0
  148. package/extensions/mega-events/agent-handlers/turnEndHandler/contextHealth.ts +50 -0
  149. package/extensions/mega-events/agent-handlers/turnEndHandler/errorRetry.ts +421 -0
  150. package/extensions/mega-events/agent-handlers/turnEndHandler/event.ts +16 -0
  151. package/extensions/mega-events/agent-handlers/turnEndHandler/gameScoring.ts +73 -0
  152. package/extensions/mega-events/agent-handlers/turnEndHandler/lengthStop.ts +29 -0
  153. package/extensions/mega-events/agent-handlers/turnEndHandler/memoryReview.ts +42 -0
  154. package/extensions/mega-events/agent-handlers/turnEndHandler/recordTurnRow.ts +61 -0
  155. package/extensions/mega-events/agent-handlers/turnEndHandler.ts +64 -0
  156. package/extensions/mega-events/agent-handlers.ts +15 -861
  157. package/extensions/mega-events/context-handler/afterCompact.ts +213 -0
  158. package/extensions/mega-events/context-handler/messageText.ts +20 -0
  159. package/extensions/mega-events/context-handler/tailResult.ts +63 -0
  160. package/extensions/mega-events/context-handler.ts +17 -235
  161. package/extensions/mega-events/separated-prompt.test/_helpers.ts +35 -0
  162. package/package.json +1 -1
  163. package/src/config.ts +4 -0
  164. package/src/dedup-engine.test/_helpers.ts +79 -0
  165. package/src/e2e.test/_helpers.ts +59 -0
  166. package/src/embedder.ts +4 -0
  167. package/src/httpEmbedder.ts +7 -0
  168. package/src/hyde.ts +162 -0
  169. package/src/importance.test/_helpers.ts +5 -0
  170. package/src/memoryGraph/sources/checkpoints.ts +99 -0
  171. package/src/memoryGraph/sources/edges.ts +23 -0
  172. package/src/memoryGraph/sources/flags.ts +26 -0
  173. package/src/memoryGraph/sources/helpers.ts +13 -0
  174. package/src/memoryGraph/sources/memories.ts +108 -0
  175. package/src/memoryGraph/sources/raptor.ts +37 -0
  176. package/src/memoryGraph/sources/turns.ts +226 -0
  177. package/src/memoryGraph/sources.ts +19 -544
  178. package/src/memoryGraph-gates.test/_helpers.ts +164 -0
  179. package/src/ratio.bench.test/_helpers.ts +268 -0
  180. package/src/recall/async.ts +142 -0
  181. package/src/recall/format.ts +173 -0
  182. package/src/recall/memory.ts +90 -0
  183. package/src/recall/reformulate.ts +111 -0
  184. package/src/recall/sync.ts +196 -0
  185. package/src/recall/types.ts +63 -0
  186. package/src/recall.ts +25 -712
  187. package/src/store/sqlite/schema/core.ts +233 -0
  188. package/src/store/sqlite/schema/game.ts +66 -0
  189. package/src/store/sqlite/schema/plan-v2.ts +108 -0
  190. package/src/store/sqlite/schema/turns.ts +60 -0
  191. package/src/store/sqlite/schema.ts +13 -441
  192. package/src/store/turns/contract-compliance.test/_helpers.ts +38 -0
  193. package/src/store/turns/sqlite-store/admin.ts +249 -0
  194. package/src/store/turns/sqlite-store/ctx.ts +14 -0
  195. package/src/store/turns/sqlite-store/read.ts +174 -0
  196. package/src/store/turns/sqlite-store/rows.ts +55 -0
  197. package/src/store/turns/sqlite-store/write.ts +193 -0
  198. package/src/store/turns/sqlite-store.ts +33 -514
  199. package/src/vectorStore/class.ts +433 -0
  200. package/src/vectorStore/hash.ts +11 -0
  201. package/src/vectorStore/types.ts +58 -0
  202. package/src/vectorStore.test/_helpers.ts +20 -0
  203. package/src/vectorStore.ts +13 -489
  204. package/extensions/dashboard-client/dist/assets/ConfigTab-DG0WkuuG.js +0 -2
  205. package/extensions/dashboard-client/dist/assets/ConfigTab-DG0WkuuG.js.map +0 -1
  206. package/extensions/dashboard-client/dist/assets/MaintenanceTab-BQF7W7xX.js +0 -2
  207. package/extensions/dashboard-client/dist/assets/MaintenanceTab-BQF7W7xX.js.map +0 -1
  208. package/extensions/dashboard-client/dist/assets/MemoryMapTab-CPtHLv0A.js +0 -2
  209. package/extensions/dashboard-client/dist/assets/MemoryMapTab-CPtHLv0A.js.map +0 -1
  210. package/extensions/dashboard-client/dist/assets/SetupTab-hbzQ_NZv.js +0 -2
  211. package/extensions/dashboard-client/dist/assets/SetupTab-hbzQ_NZv.js.map +0 -1
  212. package/extensions/dashboard-client/dist/assets/index-D-lPLRWB.js.map +0 -1
@@ -1,497 +1,28 @@
1
1
  /**
2
- * dashboard-client/src/tabs/SetupTab.tsx — Setup wizard tab (P0b).
2
+ * dashboard-client/src/tabs/SetupTab.tsx — Setup wizard tab shell (P0b).
3
3
  *
4
- * Shows current embedder configuration, warns about trigram recall quality,
5
- * and mirrors the /megasetup command with detection results.
4
+ * Sub-tab shell routing between Embedder / Config / Game Mode / Achievements.
5
+ * The embedder setup section lives in SetupTab/EmbedderSetup.tsx.
6
6
  *
7
7
  * PREVENT-PI-004: all data comes from localhost dashboard API endpoints —
8
8
  * no external network calls.
9
9
  */
10
-
11
10
  import type React from "react";
12
- import { useState, useEffect, useCallback } from "react";
13
- import type { SetupStatusResponse, SetupDetectResponse, SetupConfigureResponse } from "@contracts";
14
- import { fetchSetupStatus, fetchSetupDetect, configureEmbedder } from "../api/client";
11
+ import { useState } from "react";
15
12
  import GameTab from "./GameTab";
16
13
  import AchievementsTab from "./AchievementsTab";
17
-
18
- // ---------------------------------------------------------------------------
19
- // Style constants
20
- // ---------------------------------------------------------------------------
21
-
22
- const styles: Record<string, React.CSSProperties> = {
23
- container: {
24
- padding: "1rem",
25
- maxWidth: "720px",
26
- margin: "0 auto",
27
- fontFamily: "system-ui, sans-serif",
28
- color: "#e0e0e0",
29
- },
30
- section: {
31
- background: "#1a1a2e",
32
- borderRadius: "8px",
33
- padding: "1rem",
34
- marginBottom: "1rem",
35
- border: "1px solid #2a2a4e",
36
- },
37
- sectionTitle: {
38
- fontSize: "1.1rem",
39
- fontWeight: 700,
40
- marginTop: 0,
41
- marginBottom: "0.75rem",
42
- color: "#e0e0e0",
43
- borderBottom: "1px solid #333",
44
- paddingBottom: "0.5rem",
45
- },
46
- label: { fontWeight: 600, color: "#a0a0c0", marginRight: "0.5rem" },
47
- value: { color: "#e0e0e0" },
48
- row: { marginBottom: "0.4rem", fontSize: "0.9rem" },
49
- warning: {
50
- background: "#3a2a00",
51
- border: "1px solid #665500",
52
- borderRadius: "8px",
53
- padding: "0.75rem",
54
- marginTop: "0.5rem",
55
- color: "#ffcc00",
56
- fontSize: "0.85rem",
57
- },
58
- badge: {
59
- display: "inline-block",
60
- padding: "0.15rem 0.5rem",
61
- borderRadius: "4px",
62
- fontSize: "0.8rem",
63
- fontWeight: 600,
64
- marginLeft: "0.5rem",
65
- },
66
- detectRow: {
67
- display: "flex",
68
- justifyContent: "space-between",
69
- alignItems: "center",
70
- padding: "0.5rem 0",
71
- borderBottom: "1px solid #2a2a4e",
72
- },
73
- button: {
74
- background: "#3a5a9f",
75
- color: "#fff",
76
- border: "none",
77
- borderRadius: "6px",
78
- padding: "0.5rem 1rem",
79
- cursor: "pointer",
80
- fontSize: "0.9rem",
81
- fontWeight: 600,
82
- },
14
+ import ConfigTab from "./ConfigTab";
15
+ import EmbedderSetup from "./SetupTab/EmbedderSetup";
16
+
17
+ const containerStyle: React.CSSProperties = {
18
+ padding: "1rem",
19
+ maxWidth: "720px",
20
+ margin: "0 auto",
21
+ fontFamily: "system-ui, sans-serif",
22
+ color: "#e0e0e0",
83
23
  };
84
24
 
85
- // ---------------------------------------------------------------------------
86
- // SetupTab component
87
- // ---------------------------------------------------------------------------
88
-
89
- export function EmbedderSetup(): React.ReactElement {
90
- const [status, setStatus] = useState<SetupStatusResponse | null>(null);
91
- const [detect, setDetect] = useState<SetupDetectResponse | null>(null);
92
- const [statusError, setStatusError] = useState<string | null>(null);
93
- const [detectError, setDetectError] = useState<string | null>(null);
94
- const [runningDetect, setRunningDetect] = useState(false);
95
- const [configuring, setConfiguring] = useState<string | null>(null);
96
- const [configResult, setConfigResult] = useState<SetupConfigureResponse | null>(null);
97
- const [configError, setConfigError] = useState<string | null>(null);
98
- const [customUrl, setCustomUrl] = useState("");
99
-
100
- const loadStatus = useCallback(() => {
101
- fetchSetupStatus()
102
- .then(setStatus)
103
- .catch((e: unknown) =>
104
- setStatusError(e instanceof Error ? e.message : String(e)),
105
- );
106
- }, []);
107
-
108
- const applyEmbedder = useCallback((embedder: "ollama" | "llama" | "trigram" | "custom", url?: string) => {
109
- setConfiguring(embedder);
110
- setConfigError(null);
111
- setConfigResult(null);
112
- configureEmbedder({ embedder, url })
113
- .then((r) => {
114
- setConfigResult(r);
115
- setConfiguring(null);
116
- loadStatus();
117
- })
118
- .catch((e: unknown) => {
119
- setConfigError(e instanceof Error ? e.message : String(e));
120
- setConfiguring(null);
121
- });
122
- }, [loadStatus]);
123
-
124
- const runDetect = useCallback(() => {
125
- setRunningDetect(true);
126
- setDetectError(null);
127
- fetchSetupDetect()
128
- .then((d) => {
129
- setDetect(d);
130
- setRunningDetect(false);
131
- })
132
- .catch((e: unknown) => {
133
- setDetectError(e instanceof Error ? e.message : String(e));
134
- setRunningDetect(false);
135
- });
136
- }, []);
137
-
138
- useEffect(() => {
139
- loadStatus();
140
- }, [loadStatus]);
141
-
142
- // Poll status every 30s
143
- useEffect(() => {
144
- const id = setInterval(loadStatus, 30000);
145
- return () => clearInterval(id);
146
- }, [loadStatus]);
147
-
148
- // -----------------------------------------------------------------------
149
- // Render helpers
150
- // -----------------------------------------------------------------------
151
-
152
- const embedderLabel = (e: string): string => {
153
- switch (e) {
154
- case "trigram":
155
- return "TrigramEmbedder (heuristic, default)";
156
- case "http":
157
- return "HTTP Embedder (BYO localhost)";
158
- case "minilm":
159
- return "MiniLM (experimental)";
160
- default:
161
- return "Unknown";
162
- }
163
- };
164
-
165
- const trigramWarning = status?.currentEmbedder === "trigram" && (
166
- <div style={styles.warning}>
167
- <strong>Note:</strong> TrigramEmbedder is a heuristic-strength default
168
- embedder. It works without any setup but recall quality may be lower
169
- than a dedicated embedding backend. If you notice poor recall results,
170
- consider installing Ollama and running the{" "}
171
- <code>/megasetup</code> command, or set{" "}
172
- <code>MEGACOMPACT_EMBEDDING_URL</code> to point at your own localhost
173
- embedding server.
174
- </div>
175
- );
176
-
177
- const detectBadge = (installed: boolean): React.ReactElement => {
178
- const bg = installed ? "#1a5a1a" : "#3a1a1a";
179
- const color = installed ? "#4caf50" : "#f44336";
180
- return (
181
- <span style={{ ...styles.badge, background: bg, color }}>
182
- {installed ? "Detected" : "Not found"}
183
- </span>
184
- );
185
- };
186
-
187
- // -----------------------------------------------------------------------
188
- // Main render
189
- // -----------------------------------------------------------------------
190
-
191
- return (
192
- <div style={styles.container}>
193
- <h2 style={{ fontSize: "1.3rem", marginTop: 0, marginBottom: "1rem" }}>
194
- Embedder Setup
195
- </h2>
196
-
197
- {/* Current Config Section */}
198
- <div style={styles.section}>
199
- <h3 style={styles.sectionTitle}>Current Embedder Configuration</h3>
200
- {statusError && (
201
- <p style={{ color: "#f44336", fontSize: "0.85rem" }}>
202
- Error: {statusError}
203
- </p>
204
- )}
205
- {status && (
206
- <>
207
- <div style={styles.row}>
208
- <span style={styles.label}>Active Embedder:</span>
209
- <span style={styles.value}>
210
- {embedderLabel(status.currentEmbedder)}
211
- </span>
212
- </div>
213
- {"configuredEmbedder" in status && status.configuredEmbedder !== status.currentEmbedder && (
214
- <div style={styles.warning}>
215
- <strong>Configured but not active:</strong>{" "}
216
- {embedderLabel(status.configuredEmbedder)} is configured in
217
- .mega-compact.env but not yet loaded.{" "}
218
- <strong>Restart pi</strong> to activate it.
219
- {status.configuredUrl && (
220
- <> ({status.configuredUrl})</>
221
- )}
222
- </div>
223
- )}
224
- {"restartRequired" in status && status.restartRequired && (
225
- <div style={{ ...styles.row, color: "#ff9800" }}>
226
- <span style={styles.label}>Status:</span>
227
- <span style={styles.value}>
228
- Restart required to activate the configured embedder
229
- </span>
230
- </div>
231
- )}
232
- <div style={styles.row}>
233
- <span style={styles.label}>Embedding URL:</span>
234
- <span style={styles.value}>
235
- {status.embeddingUrl ?? (
236
- <span style={{ color: "#888" }}>not set</span>
237
- )}
238
- </span>
239
- </div>
240
- <div style={styles.row}>
241
- <span style={styles.label}>Embed Cache:</span>
242
- <span style={styles.value}>
243
- {status.embedCache ?? (
244
- <span style={{ color: "#888" }}>not set</span>
245
- )}
246
- </span>
247
- </div>
248
- <div style={styles.row}>
249
- <span style={styles.label}>MiniLM:</span>
250
- <span style={styles.value}>{status.minilm ? "enabled" : "disabled"}</span>
251
- </div>
252
- {trigramWarning}
253
- </>
254
- )}
255
- {!status && !statusError && (
256
- <p style={{ color: "#888", fontSize: "0.85rem" }}>
257
- Loading configuration...
258
- </p>
259
- )}
260
- </div>
261
-
262
- {/* Detection Section */}
263
- <div style={styles.section}>
264
- <h3 style={styles.sectionTitle}>Local Embedder Detection</h3>
265
- <p style={{ fontSize: "0.85rem", color: "#a0a0c0", marginTop: 0 }}>
266
- Detect which local embedding backends are available on this machine.
267
- No software is installed — detection only.
268
- </p>
269
-
270
- {detect && (
271
- <>
272
- {/* Ollama */}
273
- <div style={styles.detectRow}>
274
- <span>
275
- <strong>Ollama</strong>
276
- </span>
277
- {detect.ollama !== null ? (
278
- <span>
279
- {detectBadge(detect.ollama.installed)}
280
- {detect.ollama.installed && (
281
- <span style={{ fontSize: "0.8rem", color: "#a0a0c0", marginLeft: "0.5rem" }}>
282
- {detect.ollama.running
283
- ? `server running, ${detect.ollama.models.length} model(s)`
284
- : "server not running"}
285
- </span>
286
- )}
287
- </span>
288
- ) : (
289
- <span style={{ color: "#888", fontSize: "0.85rem" }}>
290
- not checked
291
- </span>
292
- )}
293
- </div>
294
-
295
- {/* llama.cpp */}
296
- <div style={styles.detectRow}>
297
- <span>
298
- <strong>llama.cpp</strong>
299
- </span>
300
- {detect.llamaCpp !== null ? (
301
- <span>
302
- {detectBadge(detect.llamaCpp.installed)}
303
- {detect.llamaCpp.installed && detect.llamaCpp.detail && (
304
- <span style={{ fontSize: "0.8rem", color: "#a0a0c0", marginLeft: "0.5rem" }}>
305
- {detect.llamaCpp.detail}
306
- </span>
307
- )}
308
- </span>
309
- ) : (
310
- <span style={{ color: "#888", fontSize: "0.85rem" }}>
311
- not checked
312
- </span>
313
- )}
314
- </div>
315
-
316
- {/* ONNX */}
317
- <div style={styles.detectRow}>
318
- <span>
319
- <strong>ONNX Runtime</strong>
320
- </span>
321
- {detect.onnx !== null ? (
322
- <span>
323
- {detectBadge(detect.onnx.installed)}
324
- {detect.onnx.installed && detect.onnx.detail && (
325
- <span style={{ fontSize: "0.8rem", color: "#a0a0c0", marginLeft: "0.5rem" }}>
326
- {detect.onnx.detail}
327
- </span>
328
- )}
329
- </span>
330
- ) : (
331
- <span style={{ color: "#888", fontSize: "0.85rem" }}>
332
- not checked
333
- </span>
334
- )}
335
- </div>
336
-
337
- {detect.error && (
338
- <p style={{ color: "#f44336", fontSize: "0.8rem", marginTop: "0.5rem" }}>
339
- Detection error: {detect.error}
340
- </p>
341
- )}
342
- </>
343
- )}
344
-
345
- {detectError && (
346
- <p style={{ color: "#f44336", fontSize: "0.85rem" }}>
347
- Error: {detectError}
348
- </p>
349
- )}
350
-
351
- <div style={{ marginTop: "1rem" }}>
352
- <button
353
- style={styles.button}
354
- onClick={runDetect}
355
- disabled={runningDetect}
356
- >
357
- {runningDetect ? "Detecting..." : "Run Detection"}
358
- </button>
359
- <span style={{ fontSize: "0.8rem", color: "#888", marginLeft: "0.75rem" }}>
360
- Or run <code>/megasetup</code> in the chat for an interactive wizard.
361
- </span>
362
- </div>
363
-
364
- {/* Configure buttons — appear after detection runs */}
365
- {detect && (
366
- <div style={{ marginTop: "1rem", paddingTop: "0.75rem", borderTop: "1px solid #2a2a4e" }}>
367
- <div style={{ fontSize: "0.9rem", fontWeight: 600, marginBottom: "0.5rem" }}>
368
- Configure
369
- </div>
370
- <div style={{ display: "flex", gap: "0.5rem", flexWrap: "wrap" }}>
371
- <button
372
- style={{ ...styles.button, opacity: detect.ollama?.installed ? 1 : 0.4 }}
373
- onClick={() => applyEmbedder("ollama")}
374
- disabled={!detect.ollama?.installed || configuring !== null}
375
- >
376
- {configuring === "ollama" ? "Writing..." : "Use Ollama"}
377
- </button>
378
- <button
379
- style={{ ...styles.button, opacity: detect.llamaCpp?.installed ? 1 : 0.4 }}
380
- onClick={() => applyEmbedder("llama")}
381
- disabled={!detect.llamaCpp?.installed || configuring !== null}
382
- >
383
- {configuring === "llama" ? "Writing..." : "Use llama.cpp"}
384
- </button>
385
- <button
386
- style={{ ...styles.button, background: "#444" }}
387
- onClick={() => applyEmbedder("trigram")}
388
- disabled={configuring !== null}
389
- >
390
- {configuring === "trigram" ? "Writing..." : "Use Trigram (default)"}
391
- </button>
392
- </div>
393
- {configResult && (
394
- <div style={styles.warning}>
395
- {configResult.alreadyActive
396
- ? "Already active — no restart needed."
397
- : `Configured ${configResult.embedder}. Restart pi to activate (config written to ${configResult.envPath}).`}
398
- </div>
399
- )}
400
- {configError && (
401
- <p style={{ color: "#f44336", fontSize: "0.85rem", marginTop: "0.5rem" }}>
402
- Configure error: {configError}
403
- </p>
404
- )}
405
- </div>
406
- )}
407
- </div>
408
-
409
- {/* Custom (remote) embedder — third-party / hosted endpoint */}
410
- <div style={styles.section}>
411
- <h3 style={styles.sectionTitle}>Custom Endpoint (remote / third-party)</h3>
412
- <p style={{ fontSize: "0.85rem", color: "#a0a0c0", marginTop: 0 }}>
413
- Point at any OpenAI-compatible embeddings API or hosted endpoint.
414
- This opts in to a non-loopback connection (sets{" "}
415
- <code>MEGACOMPACT_ALLOW_REMOTE_EMBEDDER=1</code>) — your prompts'
416
- embedding requests will be sent to the URL you enter. Default is
417
- loopback-only.
418
- </p>
419
- <div style={{ display: "flex", gap: "0.5rem", flexWrap: "wrap", alignItems: "center" }}>
420
- <input
421
- type="url"
422
- placeholder="https://api.example.com/v1/embeddings"
423
- value={customUrl}
424
- onChange={(e) => setCustomUrl(e.target.value)}
425
- style={{
426
- flex: "1 1 300px",
427
- background: "#12122a",
428
- color: "#e0e0e0",
429
- border: "1px solid #2a2a4e",
430
- borderRadius: "6px",
431
- padding: "0.4rem 0.6rem",
432
- fontSize: "0.85rem",
433
- fontFamily: "monospace",
434
- }}
435
- />
436
- <button
437
- style={{ ...styles.button, opacity: customUrl ? 1 : 0.4 }}
438
- onClick={() => applyEmbedder("custom", customUrl)}
439
- disabled={!customUrl || configuring !== null}
440
- >
441
- {configuring === "custom" ? "Writing..." : "Use Custom URL"}
442
- </button>
443
- </div>
444
- <div style={styles.warning}>
445
- <strong>Heads up:</strong> a remote endpoint receives the text you embed
446
- (it does NOT receive your full conversation — only the strings passed to
447
- <code> embed()</code> for recall/dedup). Verify the endpoint's privacy
448
- policy before use.
449
- </div>
450
- </div>
451
-
452
- {/* Help Section */}
453
- <div style={styles.section}>
454
- <h3 style={styles.sectionTitle}>How to Upgrade</h3>
455
- <ul style={{ fontSize: "0.85rem", lineHeight: 1.6, paddingLeft: "1.25rem" }}>
456
- <li>
457
- <strong>Ollama:</strong> Install from{" "}
458
- <a
459
- href="https://ollama.com"
460
- style={{ color: "#6a9fff" }}
461
- target="_blank"
462
- rel="noopener noreferrer"
463
- >
464
- ollama.com
465
- </a>
466
- , then <code>ollama pull nomic-embed-text</code> and restart pi.
467
- Set <code>MEGACOMPACT_EMBEDDING_URL=http://localhost:11434/api/embeddings</code>.
468
- </li>
469
- <li>
470
- <strong>llama.cpp:</strong> Build or install llama.cpp, run{" "}
471
- <code>llama-server</code> with an embedding model, and set
472
- the URL accordingly.
473
- </li>
474
- <li>
475
- <strong>ONNX Runtime:</strong> Install{" "}
476
- <code>onnxruntime-node</code> in the project root. Not yet
477
- integrated — see docs for manual setup.
478
- </li>
479
- </ul>
480
- </div>
481
- </div>
482
- );
483
- }
484
-
485
-
486
- // ---------------------------------------------------------------------------
487
- // SetupTab shell — sub-tabs for Embedder / Game Mode / Achievements.
488
- // Game + Achievements moved here from the top-level tab bar (audit #9: 15 tabs
489
- // was too many; the novelty surfaces crowd the bar for the 95% who don't use
490
- // them). The sub-tab nav reuses the inline-style approach of the embedder
491
- // section for visual consistency.
492
- // ---------------------------------------------------------------------------
493
-
494
- type SetupSubTab = "embedder" | "game" | "achievements";
25
+ type SetupSubTab = "embedder" | "config" | "game" | "achievements";
495
26
 
496
27
  const subTabNavStyle: React.CSSProperties = {
497
28
  display: "flex",
@@ -519,7 +50,7 @@ export default function SetupTab(): React.ReactElement {
519
50
  const [subTab, setSubTab] = useState<SetupSubTab>("embedder");
520
51
 
521
52
  return (
522
- <div style={styles.container}>
53
+ <div style={containerStyle}>
523
54
  <nav style={subTabNavStyle} aria-label="Setup sections">
524
55
  <button
525
56
  type="button"
@@ -528,6 +59,13 @@ export default function SetupTab(): React.ReactElement {
528
59
  >
529
60
  Embedder
530
61
  </button>
62
+ <button
63
+ type="button"
64
+ style={subTabBtnStyle(subTab === "config")}
65
+ onClick={() => setSubTab("config")}
66
+ >
67
+ Config
68
+ </button>
531
69
  <button
532
70
  type="button"
533
71
  style={subTabBtnStyle(subTab === "game")}
@@ -545,6 +83,7 @@ export default function SetupTab(): React.ReactElement {
545
83
  </nav>
546
84
 
547
85
  {subTab === "embedder" && <EmbedderSetup />}
86
+ {subTab === "config" && <ConfigTab />}
548
87
  {subTab === "game" && <GameTab />}
549
88
  {subTab === "achievements" && <AchievementsTab />}
550
89
  </div>
@@ -0,0 +1,32 @@
1
+ /**
2
+ * api-contracts/embedder-health.ts — Embedder health probe response types.
3
+ *
4
+ * Types for the GET /api/embedder-health endpoint used by the dashboard Setup
5
+ * tab's EmbedderHealthCard. Describes the result of round-tripping a test
6
+ * embed through the active embedder (latency + dimensions + reachability).
7
+ *
8
+ * PREVENT-PI-004: type definitions only, no network code.
9
+ * PREVENT-011: no `any` type — all types are explicit.
10
+ */
11
+
12
+ /**
13
+ * Response for GET /api/embedder-health.
14
+ * Probes the active embedder with a single test embed and reports reachability,
15
+ * latency, vector dimensionality, and a masked endpoint URL.
16
+ */
17
+ export interface EmbedderHealthResponse {
18
+ /** Which embedder implementation is currently active in the running process. */
19
+ readonly activeEmbedder: "trigram" | "http" | "minilm" | "unknown";
20
+ /** "ok" — test embed succeeded; "unreachable" — endpoint not reachable (http
21
+ * embedder); "error" — probe threw some other error. */
22
+ readonly status: "ok" | "unreachable" | "error";
23
+ /** Round-trip latency of the test embed in milliseconds. */
24
+ readonly latencyMs: number;
25
+ /** Vector dimensionality reported by the active embedder, or 0 on error. */
26
+ readonly dim: number;
27
+ /** Masked endpoint URL (scheme://hostname:port, secrets/paths stripped), or
28
+ * null when no URL is configured. */
29
+ readonly url: string | null;
30
+ /** Error message when status is "unreachable" or "error", otherwise absent. */
31
+ readonly error?: string;
32
+ }