pi-mega-compact 0.16.3 → 0.17.1

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 (207) hide show
  1. package/dist/config/vector-cortex.js +91 -0
  2. package/dist/dedup/digest.js +30 -0
  3. package/dist/dedup/l1-lsh-v2.js +60 -0
  4. package/dist/dedup/l1-lsh.js +52 -0
  5. package/dist/dedup/l1-minhash-v2.js +193 -0
  6. package/dist/dedup/l1-minhash.js +91 -0
  7. package/dist/dedup/l1-verify.js +54 -0
  8. package/dist/dedup/mmr.js +45 -0
  9. package/dist/dedup/normalize.js +39 -0
  10. package/dist/dedup/raptor/buildHistory.js +164 -0
  11. package/dist/dedup/raptor/guardrails.js +83 -0
  12. package/dist/dedup/raptor/incremental.js +304 -0
  13. package/dist/dedup/raptor/index.js +190 -0
  14. package/dist/dedup/raptor/kmeans.js +152 -0
  15. package/dist/dedup/raptor/multilevel.js +184 -0
  16. package/dist/dedup/raptor/retrieval.js +93 -0
  17. package/dist/dedup/raptor/summarizer.js +86 -0
  18. package/dist/dedup/raptor/tree.js +202 -0
  19. package/dist/dedup/topk.js +60 -0
  20. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry-ext.js +30 -0
  21. package/dist/extensions/dashboard-server/api-contracts/endpoints/registry.js +4 -14
  22. package/dist/extensions/dashboard-server/api-contracts/vector-cortex.js +12 -0
  23. package/dist/extensions/dashboard-server/routes-rag-settings-helpers.js +11 -0
  24. package/dist/extensions/dashboard-server/routes-vector-cortex.js +292 -0
  25. package/dist/extensions/dashboard-server/routes.js +1 -0
  26. package/dist/extensions/dashboard-server/server.js +9 -1
  27. package/dist/extensions/mega-events/context-handler.js +11 -0
  28. package/dist/extensions/mega-runtime/vector-cortex-ledger.js +131 -0
  29. package/dist/extensions/mega-runtime/vector-cortex-safety.js +100 -0
  30. package/dist/src/config/vector-cortex.js +91 -0
  31. package/dist/src/config.js +6 -0
  32. package/dist/src/dedup/l1-lsh-v2.js +60 -0
  33. package/dist/src/dedup/l1-minhash-v2.js +193 -0
  34. package/dist/src/dedup/normalize.js +1 -1
  35. package/dist/src/vector-cortex/conformance/emit.js +46 -0
  36. package/dist/src/vector-cortex/conformance/manifest.js +235 -0
  37. package/dist/src/vector-cortex/conformance/runner.js +111 -0
  38. package/dist/src/vector-cortex/conformance/triadB-reader.js +95 -0
  39. package/dist/src/vector-cortex/eval/annotations.js +41 -0
  40. package/dist/src/vector-cortex/eval/metrics.js +86 -0
  41. package/dist/src/vector-cortex/eval/observer.js +61 -0
  42. package/dist/src/vector-cortex/eval/persist.js +67 -0
  43. package/dist/src/vector-cortex/eval/reader.js +29 -0
  44. package/dist/src/vector-cortex/eval/types.js +33 -0
  45. package/dist/src/vector-cortex/ledger/adapter.js +55 -0
  46. package/dist/src/vector-cortex/ledger/compat-journal.js +206 -0
  47. package/dist/src/vector-cortex/ledger/emit.js +53 -0
  48. package/dist/src/vector-cortex/ledger/event-codec.js +72 -0
  49. package/dist/src/vector-cortex/ledger/event-codecB.js +76 -0
  50. package/dist/src/vector-cortex/ledger/sqlite.js +200 -0
  51. package/dist/src/vector-cortex/ledger/store.js +184 -0
  52. package/dist/src/vector-cortex/ledger/types.js +52 -0
  53. package/dist/src/vector-cortex/ledger/validator.js +117 -0
  54. package/dist/src/vector-cortex/migrations/effective-cut-v2.js +103 -0
  55. package/dist/src/vector-cortex/migrations/minhash-v2.js +209 -0
  56. package/dist/src/vector-cortex/migrations/occurrence-v2.js +139 -0
  57. package/dist/src/vector-cortex/replay/cut.js +123 -0
  58. package/dist/src/vector-cortex/replay/emit.js +58 -0
  59. package/dist/src/vector-cortex/replay/replay.js +260 -0
  60. package/dist/src/vector-cortex/replay/replayB.js +73 -0
  61. package/dist/src/vector-cortex/replay/types.js +52 -0
  62. package/dist/src/vector-cortex/resilience/breaker-core.js +359 -0
  63. package/dist/src/vector-cortex/resilience/breaker.js +12 -0
  64. package/dist/src/vector-cortex/resilience/emit.js +56 -0
  65. package/dist/src/vector-cortex/resilience/spool-core.js +347 -0
  66. package/dist/src/vector-cortex/resilience/spool.js +12 -0
  67. package/dist/src/vector-cortex/resilience/types.js +32 -0
  68. package/dist/vector-cortex/conformance/emit.js +46 -0
  69. package/dist/vector-cortex/conformance/manifest.js +235 -0
  70. package/dist/vector-cortex/conformance/runner.js +111 -0
  71. package/dist/vector-cortex/conformance/triadB-reader.js +95 -0
  72. package/dist/vector-cortex/eval/annotations.js +41 -0
  73. package/dist/vector-cortex/eval/metrics.js +86 -0
  74. package/dist/vector-cortex/eval/observer.js +61 -0
  75. package/dist/vector-cortex/eval/persist.js +67 -0
  76. package/dist/vector-cortex/eval/reader.js +29 -0
  77. package/dist/vector-cortex/eval/types.js +33 -0
  78. package/dist/vector-cortex/ledger/adapter.js +55 -0
  79. package/dist/vector-cortex/ledger/compat-journal.js +206 -0
  80. package/dist/vector-cortex/ledger/emit.js +53 -0
  81. package/dist/vector-cortex/ledger/event-codec.js +72 -0
  82. package/dist/vector-cortex/ledger/event-codecB.js +76 -0
  83. package/dist/vector-cortex/ledger/sqlite.js +200 -0
  84. package/dist/vector-cortex/ledger/store.js +184 -0
  85. package/dist/vector-cortex/ledger/types.js +52 -0
  86. package/dist/vector-cortex/ledger/validator.js +117 -0
  87. package/dist/vector-cortex/migrations/effective-cut-v2.js +103 -0
  88. package/dist/vector-cortex/migrations/minhash-v2.js +209 -0
  89. package/dist/vector-cortex/migrations/occurrence-v2.js +139 -0
  90. package/dist/vector-cortex/replay/cut.js +123 -0
  91. package/dist/vector-cortex/replay/emit.js +58 -0
  92. package/dist/vector-cortex/replay/replay.js +260 -0
  93. package/dist/vector-cortex/replay/replayB.js +73 -0
  94. package/dist/vector-cortex/replay/types.js +52 -0
  95. package/dist/vector-cortex/resilience/breaker-core.js +359 -0
  96. package/dist/vector-cortex/resilience/breaker.js +12 -0
  97. package/dist/vector-cortex/resilience/emit.js +56 -0
  98. package/dist/vector-cortex/resilience/spool-core.js +347 -0
  99. package/dist/vector-cortex/resilience/spool.js +12 -0
  100. package/dist/vector-cortex/resilience/types.js +32 -0
  101. package/extensions/dashboard-client/dist/assets/{AreaChart-Y_X0Bbjd.js → AreaChart-BQXFF7UI.js} +2 -2
  102. package/extensions/dashboard-client/dist/assets/{AreaChart-Y_X0Bbjd.js.map → AreaChart-BQXFF7UI.js.map} +1 -1
  103. package/extensions/dashboard-client/dist/assets/{BarChart-B9XDb-Ob.js → BarChart-BVtoz9Eg.js} +2 -2
  104. package/extensions/dashboard-client/dist/assets/{BarChart-B9XDb-Ob.js.map → BarChart-BVtoz9Eg.js.map} +1 -1
  105. package/extensions/dashboard-client/dist/assets/{CacheTab-BUGVb1G1.js → CacheTab-trI2TIGy.js} +2 -2
  106. package/extensions/dashboard-client/dist/assets/{CacheTab-BUGVb1G1.js.map → CacheTab-trI2TIGy.js.map} +1 -1
  107. package/extensions/dashboard-client/dist/assets/{EventsTab-dOqLYTsy.js → EventsTab-CNUbk9__.js} +2 -2
  108. package/extensions/dashboard-client/dist/assets/{EventsTab-dOqLYTsy.js.map → EventsTab-CNUbk9__.js.map} +1 -1
  109. package/extensions/dashboard-client/dist/assets/{HealthTab-c2vezKg1.js → HealthTab-K-bd_CM-.js} +2 -2
  110. package/extensions/dashboard-client/dist/assets/{HealthTab-c2vezKg1.js.map → HealthTab-K-bd_CM-.js.map} +1 -1
  111. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-bQYHIcdx.js → MaintenanceTab-CoEioKzx.js} +2 -2
  112. package/extensions/dashboard-client/dist/assets/{MaintenanceTab-bQYHIcdx.js.map → MaintenanceTab-CoEioKzx.js.map} +1 -1
  113. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-2L8pH6y2.js → MemoryMapTab-CJo24ulv.js} +2 -2
  114. package/extensions/dashboard-client/dist/assets/{MemoryMapTab-2L8pH6y2.js.map → MemoryMapTab-CJo24ulv.js.map} +1 -1
  115. package/extensions/dashboard-client/dist/assets/{MetricsTab-CzUx1jpo.js → MetricsTab-DCNlQWWP.js} +2 -2
  116. package/extensions/dashboard-client/dist/assets/{MetricsTab-CzUx1jpo.js.map → MetricsTab-DCNlQWWP.js.map} +1 -1
  117. package/extensions/dashboard-client/dist/assets/{OverviewTab-eCNoaclv.js → OverviewTab-CQQlyIQ6.js} +2 -2
  118. package/extensions/dashboard-client/dist/assets/{OverviewTab-eCNoaclv.js.map → OverviewTab-CQQlyIQ6.js.map} +1 -1
  119. package/extensions/dashboard-client/dist/assets/{ReposTab-tb0IW3NF.js → ReposTab-Cqm82_yn.js} +2 -2
  120. package/extensions/dashboard-client/dist/assets/{ReposTab-tb0IW3NF.js.map → ReposTab-Cqm82_yn.js.map} +1 -1
  121. package/extensions/dashboard-client/dist/assets/{SessionsTab-C-IoLw5h.js → SessionsTab-A8xTAdET.js} +2 -2
  122. package/extensions/dashboard-client/dist/assets/{SessionsTab-C-IoLw5h.js.map → SessionsTab-A8xTAdET.js.map} +1 -1
  123. package/extensions/dashboard-client/dist/assets/{SetupTab-BvmFi8gf.js → SetupTab-CqaSgaZl.js} +2 -2
  124. package/extensions/dashboard-client/dist/assets/{SetupTab-BvmFi8gf.js.map → SetupTab-CqaSgaZl.js.map} +1 -1
  125. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-DBH-cOlA.js → TimeSavedCard-C_f3q8GR.js} +2 -2
  126. package/extensions/dashboard-client/dist/assets/{TimeSavedCard-DBH-cOlA.js.map → TimeSavedCard-C_f3q8GR.js.map} +1 -1
  127. package/extensions/dashboard-client/dist/assets/{TurnsTab-DBMgmvnX.js → TurnsTab-BEsafACo.js} +2 -2
  128. package/extensions/dashboard-client/dist/assets/{TurnsTab-DBMgmvnX.js.map → TurnsTab-BEsafACo.js.map} +1 -1
  129. package/extensions/dashboard-client/dist/assets/VectorCortexTab-DD1CMK80.js +2 -0
  130. package/extensions/dashboard-client/dist/assets/VectorCortexTab-DD1CMK80.js.map +1 -0
  131. package/extensions/dashboard-client/dist/assets/{WikiTab-1LcQrXk3.js → WikiTab-Bf01M2_Z.js} +2 -2
  132. package/extensions/dashboard-client/dist/assets/{WikiTab-1LcQrXk3.js.map → WikiTab-Bf01M2_Z.js.map} +1 -1
  133. package/extensions/dashboard-client/dist/assets/{button-DtEsZTUE.js → button-BEJPTk_E.js} +2 -2
  134. package/extensions/dashboard-client/dist/assets/{button-DtEsZTUE.js.map → button-BEJPTk_E.js.map} +1 -1
  135. package/extensions/dashboard-client/dist/assets/{card-DcfTmw-4.js → card-DK1V382s.js} +2 -2
  136. package/extensions/dashboard-client/dist/assets/{card-DcfTmw-4.js.map → card-DK1V382s.js.map} +1 -1
  137. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-BsIxUDyw.js → generateCategoricalChart-CRtaPphL.js} +2 -2
  138. package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-BsIxUDyw.js.map → generateCategoricalChart-CRtaPphL.js.map} +1 -1
  139. package/extensions/dashboard-client/dist/assets/{index-B93cewiX.js → index-CB6BslE4.js} +34 -29
  140. package/extensions/dashboard-client/dist/assets/index-CB6BslE4.js.map +1 -0
  141. package/extensions/dashboard-client/dist/assets/index-CfvziyBi.css +1 -0
  142. package/extensions/dashboard-client/dist/assets/{switch-Bowd7jCD.js → switch-C4FV6B9k.js} +2 -2
  143. package/extensions/dashboard-client/dist/assets/{switch-Bowd7jCD.js.map → switch-C4FV6B9k.js.map} +1 -1
  144. package/extensions/dashboard-client/dist/assets/{toggle-Bo7kJZ4u.js → toggle-GBmeENMd.js} +2 -2
  145. package/extensions/dashboard-client/dist/assets/{toggle-Bo7kJZ4u.js.map → toggle-GBmeENMd.js.map} +1 -1
  146. package/extensions/dashboard-client/dist/assets/{useSSE-zNhb0c3u.js → useSSE-BOKZGSn1.js} +2 -2
  147. package/extensions/dashboard-client/dist/assets/{useSSE-zNhb0c3u.js.map → useSSE-BOKZGSn1.js.map} +1 -1
  148. package/extensions/dashboard-client/dist/index.html +2 -2
  149. package/extensions/dashboard-client/src/App.tsx +2 -0
  150. package/extensions/dashboard-client/src/api/vector-cortex.ts +54 -0
  151. package/extensions/dashboard-client/src/tabs/VectorCortexTab.tsx +272 -0
  152. package/extensions/dashboard-client/src/tabs/registry.ts +4 -1
  153. package/extensions/dashboard-client/src/types/vector-cortex.ts +84 -0
  154. package/extensions/dashboard-client/tsconfig.json +1 -1
  155. package/extensions/dashboard-server/api-contracts/endpoints/registry-ext.ts +67 -0
  156. package/extensions/dashboard-server/api-contracts/endpoints/registry.ts +4 -21
  157. package/extensions/dashboard-server/api-contracts/index.ts +3 -0
  158. package/extensions/dashboard-server/api-contracts/vector-cortex.ts +136 -0
  159. package/extensions/dashboard-server/routes-rag-settings-helpers.ts +41 -0
  160. package/extensions/dashboard-server/routes-vector-cortex.ts +332 -0
  161. package/extensions/dashboard-server/routes.ts +6 -0
  162. package/extensions/dashboard-server/server.ts +8 -0
  163. package/extensions/mega-events/context-handler.ts +16 -0
  164. package/extensions/mega-runtime/vector-cortex-ledger.ts +165 -0
  165. package/extensions/mega-runtime/vector-cortex-safety.ts +181 -0
  166. package/package.json +2 -1
  167. package/src/config/vector-cortex.ts +98 -0
  168. package/src/config.ts +28 -0
  169. package/src/dedup/l1-lsh-v2.ts +78 -0
  170. package/src/dedup/l1-minhash-v2.ts +221 -0
  171. package/src/dedup/normalize.ts +1 -1
  172. package/src/store/sqlite/game-scores.ts +2 -1
  173. package/src/vector-cortex/conformance/emit.ts +56 -0
  174. package/src/vector-cortex/conformance/manifest.ts +298 -0
  175. package/src/vector-cortex/conformance/runner.ts +165 -0
  176. package/src/vector-cortex/conformance/triadB-reader.ts +110 -0
  177. package/src/vector-cortex/eval/annotations.ts +70 -0
  178. package/src/vector-cortex/eval/metrics.ts +113 -0
  179. package/src/vector-cortex/eval/observer.ts +86 -0
  180. package/src/vector-cortex/eval/persist.ts +73 -0
  181. package/src/vector-cortex/eval/reader.ts +45 -0
  182. package/src/vector-cortex/eval/types.ts +89 -0
  183. package/src/vector-cortex/ledger/adapter.ts +71 -0
  184. package/src/vector-cortex/ledger/compat-journal.ts +234 -0
  185. package/src/vector-cortex/ledger/emit.ts +86 -0
  186. package/src/vector-cortex/ledger/event-codec.ts +79 -0
  187. package/src/vector-cortex/ledger/event-codecB.ts +87 -0
  188. package/src/vector-cortex/ledger/sqlite.ts +265 -0
  189. package/src/vector-cortex/ledger/store.ts +380 -0
  190. package/src/vector-cortex/ledger/types.ts +141 -0
  191. package/src/vector-cortex/ledger/validator.ts +124 -0
  192. package/src/vector-cortex/migrations/effective-cut-v2.ts +149 -0
  193. package/src/vector-cortex/migrations/minhash-v2.ts +263 -0
  194. package/src/vector-cortex/migrations/occurrence-v2.ts +192 -0
  195. package/src/vector-cortex/replay/cut.ts +169 -0
  196. package/src/vector-cortex/replay/emit.ts +89 -0
  197. package/src/vector-cortex/replay/replay.ts +308 -0
  198. package/src/vector-cortex/replay/replayB.ts +97 -0
  199. package/src/vector-cortex/replay/types.ts +145 -0
  200. package/src/vector-cortex/resilience/breaker-core.ts +444 -0
  201. package/src/vector-cortex/resilience/breaker.ts +22 -0
  202. package/src/vector-cortex/resilience/emit.ts +99 -0
  203. package/src/vector-cortex/resilience/spool-core.ts +411 -0
  204. package/src/vector-cortex/resilience/spool.ts +22 -0
  205. package/src/vector-cortex/resilience/types.ts +158 -0
  206. package/extensions/dashboard-client/dist/assets/index-B93cewiX.js.map +0 -1
  207. package/extensions/dashboard-client/dist/assets/index-C_tCbOI0.css +0 -1
@@ -0,0 +1,54 @@
1
+ /**
2
+ * dashboard-client/src/api/vector-cortex.ts — vector-cortex API client.
3
+ * PREVENT-PI-004: relative path only (loopback dashboard).
4
+ */
5
+
6
+ import type {
7
+ VectorCortexEvaluationSummary,
8
+ VectorCortexHealthCard,
9
+ VectorCortexLedgerView,
10
+ VectorCortexResetResult,
11
+ } from "../types/vector-cortex";
12
+
13
+ export type {
14
+ VectorCortexEvaluationSummary,
15
+ VectorCortexHealthCard,
16
+ VectorCortexLedgerView,
17
+ VectorCortexResetResult,
18
+ };
19
+
20
+ export async function fetchVectorCortexEvaluation(): Promise<VectorCortexEvaluationSummary> {
21
+ const r = await fetch("/api/vector-cortex/evaluation");
22
+ if (!r.ok) throw new Error(`vector-cortex evaluation: ${r.status}`);
23
+ return r.json() as Promise<VectorCortexEvaluationSummary>;
24
+ }
25
+
26
+ export async function fetchVectorCortexHealth(): Promise<VectorCortexHealthCard> {
27
+ const r = await fetch("/api/vector-cortex/health");
28
+ if (!r.ok) throw new Error(`vector-cortex health: ${r.status}`);
29
+ return r.json() as Promise<VectorCortexHealthCard>;
30
+ }
31
+
32
+ /** Reader-only occurrence-ledger identity view (VC1B). */
33
+ export async function fetchVectorCortexLedger(
34
+ session = "default",
35
+ ): Promise<VectorCortexLedgerView> {
36
+ const r = await fetch(
37
+ `/api/vector-cortex/ledger?session=${encodeURIComponent(session)}`,
38
+ );
39
+ if (!r.ok) throw new Error(`vector-cortex ledger: ${r.status}`);
40
+ return r.json() as Promise<VectorCortexLedgerView>;
41
+ }
42
+
43
+ /** Admin capability: reset a breaker's cooldown (never evidence). */
44
+ export async function resetVectorCortexBreaker(
45
+ subsystem: string,
46
+ ): Promise<VectorCortexResetResult> {
47
+ const r = await fetch("/api/vector-cortex/breakers/reset", {
48
+ method: "POST",
49
+ headers: { "Content-Type": "application/json" },
50
+ body: JSON.stringify({ subsystem }),
51
+ });
52
+ if (!r.ok) throw new Error(`vector-cortex reset: ${r.status}`);
53
+ return r.json() as Promise<VectorCortexResetResult>;
54
+ }
@@ -0,0 +1,272 @@
1
+ /**
2
+ * VectorCortexTab.tsx — vector-cortex dashboard tab.
3
+ * VC0A: reader-only aggregate latency histogram + per-mode sample counts from
4
+ * GET /api/vector-cortex/evaluation. VC0C (task 5): live safety envelope health
5
+ * card (breaker state, window/probe/backoff, durable spool frontier/lag) from
6
+ * GET /api/vector-cortex/health plus an admin "reset cooldown" action. Polls
7
+ * every 5s.
8
+ */
9
+
10
+ import { useState, useEffect, useCallback } from "react";
11
+ import {
12
+ fetchVectorCortexEvaluation,
13
+ fetchVectorCortexHealth,
14
+ fetchVectorCortexLedger,
15
+ resetVectorCortexBreaker,
16
+ type VectorCortexEvaluationSummary,
17
+ type VectorCortexHealthCard,
18
+ type VectorCortexLedgerView,
19
+ } from "../api/vector-cortex";
20
+ import { Card, CardContent, CardHeader, CardTitle } from "../components/ui/card";
21
+ import { Badge } from "../components/ui/badge";
22
+
23
+ function ModeChip({ mode, count }: { mode: string; count: number }): React.ReactElement {
24
+ return (
25
+ <div className="flex items-center justify-between border-b border-border/50 py-1 text-sm">
26
+ <span className="text-muted-foreground">Mode {mode}</span>
27
+ <span className="font-mono">{count}</span>
28
+ </div>
29
+ );
30
+ }
31
+
32
+ function Metric({ label, value }: { label: string; value: string }): React.ReactElement {
33
+ return (
34
+ <div>
35
+ <div className="text-xs text-muted-foreground">{label}</div>
36
+ <div className="font-mono text-sm">{value}</div>
37
+ </div>
38
+ );
39
+ }
40
+
41
+ export default function VectorCortexTab(): React.ReactElement {
42
+ const [data, setData] = useState<VectorCortexEvaluationSummary | null>(null);
43
+ const [err, setError] = useState<string | null>(null);
44
+ const [loading, setLoading] = useState(true);
45
+ const [health, setHealth] = useState<VectorCortexHealthCard | null>(null);
46
+ const [resetMsg, setResetMsg] = useState<string | null>(null);
47
+ const [ledger, setLedger] = useState<VectorCortexLedgerView | null>(null);
48
+
49
+ const poll = useCallback(() => {
50
+ fetchVectorCortexEvaluation()
51
+ .then(setData)
52
+ .catch((e: unknown) =>
53
+ setError(e instanceof Error ? e.message : String(e)),
54
+ )
55
+ .finally(() => setLoading(false));
56
+ fetchVectorCortexHealth().then(setHealth).catch(() => {
57
+ /* health card is best-effort (VC0C) */
58
+ });
59
+ fetchVectorCortexLedger().then(setLedger).catch(() => {
60
+ /* ledger card is best-effort (VC1B) */
61
+ });
62
+ }, []);
63
+
64
+ useEffect(() => {
65
+ poll();
66
+ const id = setInterval(poll, 5000);
67
+ return () => clearInterval(id);
68
+ }, [poll]);
69
+
70
+ const onReset = () => {
71
+ resetVectorCortexBreaker("provider")
72
+ .then((r) => {
73
+ setResetMsg(
74
+ `Breaker "${r.subsystem}" ${r.state}; evidence retained: ${r.failures} failures / ${r.attempts} attempts`,
75
+ );
76
+ return fetchVectorCortexHealth();
77
+ })
78
+ .then(setHealth)
79
+ .catch((e: unknown) =>
80
+ setResetMsg(e instanceof Error ? e.message : String(e)),
81
+ );
82
+ };
83
+
84
+ if (loading && !data)
85
+ return <div className="vc-loading">Loading vector-cortex evaluation…</div>;
86
+ if (err && !data)
87
+ return <div className="vc-error">Error: {err}</div>;
88
+ if (!data)
89
+ return <div className="vc-empty">No evaluation data available.</div>;
90
+
91
+ const max = Math.max(1, ...data.histogram.cells, data.histogram.overflow);
92
+ return (
93
+ <div className="flex flex-col gap-4">
94
+ <div className="flex items-center gap-2">
95
+ <h2 className="text-lg font-semibold">Vector Cortex Evaluation</h2>
96
+ {data.enabled ? (
97
+ <Badge variant="warning">OBSERVER PENDING (A)</Badge>
98
+ ) : (
99
+ <Badge variant="danger">MODE C (OFF)</Badge>
100
+ )}
101
+ </div>
102
+
103
+ <div className="grid grid-cols-1 gap-4 md:grid-cols-3">
104
+ <Card>
105
+ <CardHeader>
106
+ <CardTitle>Samples</CardTitle>
107
+ </CardHeader>
108
+ <CardContent>
109
+ <div className="text-3xl font-bold">{data.samples}</div>
110
+ <div className="mt-2 flex flex-col">
111
+ <ModeChip mode="A" count={data.byMode.A} />
112
+ <ModeChip mode="B" count={data.byMode.B} />
113
+ <ModeChip mode="C" count={data.byMode.C} />
114
+ </div>
115
+ </CardContent>
116
+ </Card>
117
+
118
+ <Card className="md:col-span-2">
119
+ <CardHeader>
120
+ <CardTitle>Latency Histogram (ms, inclusive edges)</CardTitle>
121
+ </CardHeader>
122
+ <CardContent>
123
+ <div className="flex items-end gap-2" style={{ height: 160 }}>
124
+ {data.histogram.edges.map((edge, i) => {
125
+ const h = (data.histogram.cells[i] / max) * 140;
126
+ return (
127
+ <div key={edge} className="flex flex-1 flex-col items-center gap-1">
128
+ <span className="text-xs text-muted-foreground">
129
+ {data.histogram.cells[i]}
130
+ </span>
131
+ <div
132
+ className="w-full rounded-t"
133
+ style={{ height: Math.max(2, h), background: "#6366f1" }}
134
+ />
135
+ <span className="text-[10px] text-muted-foreground">&le;{edge}</span>
136
+ </div>
137
+ );
138
+ })}
139
+ <div className="flex flex-1 flex-col items-center gap-1">
140
+ <span className="text-xs text-muted-foreground">
141
+ {data.histogram.overflow}
142
+ </span>
143
+ <div
144
+ className="w-full rounded-t"
145
+ style={{
146
+ height: Math.max(2, (data.histogram.overflow / max) * 140),
147
+ background: "#f87171",
148
+ }}
149
+ />
150
+ <span className="text-[10px] text-muted-foreground">&gt;250</span>
151
+ </div>
152
+ </div>
153
+ <div className="mt-1 text-xs text-muted-foreground">
154
+ Total: {data.histogram.total} · Rejects: {data.rejects.length}
155
+ </div>
156
+ </CardContent>
157
+ </Card>
158
+ </div>
159
+
160
+ <Card>
161
+ <CardHeader>
162
+ <div className="flex items-center justify-between">
163
+ <CardTitle>Live Safety Envelope (VC0C)</CardTitle>
164
+ <div className="flex items-center gap-2">
165
+ {health?.stateSource === "ephemeral" && (
166
+ <Badge variant="outline">EPHEMERAL (non-live)</Badge>
167
+ )}
168
+ <button
169
+ onClick={onReset}
170
+ disabled={!health?.enabled}
171
+ className="rounded border border-border px-2 py-1 text-xs disabled:opacity-50"
172
+ >
173
+ Reset Cooldown
174
+ </button>
175
+ </div>
176
+ </div>
177
+ </CardHeader>
178
+ <CardContent>
179
+ {resetMsg && (
180
+ <div className="mb-2 text-xs text-muted-foreground">{resetMsg}</div>
181
+ )}
182
+ {!health ? (
183
+ <div className="vc-empty">Health unavailable (VC0C off).</div>
184
+ ) : (
185
+ <div className="grid grid-cols-2 gap-4 md:grid-cols-4">
186
+ <Metric label="State" value={health.state} />
187
+ <Metric label="Mode" value={health.mode} />
188
+ <Metric label="Window" value={`${health.windowMs}ms`} />
189
+ <Metric label="Probes" value={String(health.probeCount)} />
190
+ <Metric label="Backoff" value={`${health.backoffDelayMs}ms`} />
191
+ <Metric
192
+ label="Failures"
193
+ value={`${health.failures}/${health.attempts}`}
194
+ />
195
+ <Metric
196
+ label="Frontier"
197
+ value={
198
+ health.stateSource === "ephemeral"
199
+ ? "non-live"
200
+ : health.frontierFrozen
201
+ ? "FROZEN"
202
+ : "LIVE"
203
+ }
204
+ />
205
+ <Metric label="Spool lag" value={String(health.spoolLag)} />
206
+ </div>
207
+ )}
208
+ </CardContent>
209
+ </Card>
210
+ <Card>
211
+ <CardHeader>
212
+ <div className="flex items-center justify-between">
213
+ <CardTitle>Occurrence Ledger (VC1B)</CardTitle>
214
+ {ledger?.enabled ? (
215
+ <Badge variant="success">ACTIVE</Badge>
216
+ ) : (
217
+ <Badge variant="danger">OFF</Badge>
218
+ )}
219
+ </div>
220
+ </CardHeader>
221
+ <CardContent>
222
+ {!ledger?.enabled ? (
223
+ <div className="vc-empty">Ledger disabled (VC1B off).</div>
224
+ ) : (
225
+ <>
226
+ <div className="mb-3 grid grid-cols-2 gap-4 md:grid-cols-3">
227
+ <Metric label="Session" value={ledger.session} />
228
+ <Metric label="High-water" value={ledger.highWater} />
229
+ <Metric label="Occurrences" value={String(ledger.count)} />
230
+ </div>
231
+ {ledger.occurrences.length === 0 ? (
232
+ <div className="vc-empty">No occurrences recorded.</div>
233
+ ) : (
234
+ <div className="max-h-64 overflow-y-auto">
235
+ <table className="w-full text-left text-xs">
236
+ <thead>
237
+ <tr className="border-b border-border/50 text-muted-foreground">
238
+ <th className="py-1 pr-2">seq</th>
239
+ <th className="py-1 pr-2">eventId</th>
240
+ <th className="py-1 pr-2">kind</th>
241
+ <th className="py-1 pr-2">toolCall</th>
242
+ <th className="py-1">digest</th>
243
+ </tr>
244
+ </thead>
245
+ <tbody>
246
+ {ledger.occurrences.map((o) => (
247
+ <tr
248
+ key={`${o.seq}-${o.eventId}`}
249
+ className="border-b border-border/30"
250
+ >
251
+ <td className="py-1 pr-2 font-mono">{o.seq}</td>
252
+ <td className="py-1 pr-2 font-mono">{o.eventId}</td>
253
+ <td className="py-1 pr-2">{o.kind}</td>
254
+ <td className="py-1 pr-2 font-mono">
255
+ {o.toolCallId ?? "\u2014"}
256
+ </td>
257
+ <td className="max-w-[180px] truncate font-mono text-muted-foreground">
258
+ {o.digest}
259
+ </td>
260
+ </tr>
261
+ ))}
262
+ </tbody>
263
+ </table>
264
+ </div>
265
+ )}
266
+ </>
267
+ )}
268
+ </CardContent>
269
+ </Card>
270
+ </div>
271
+ );
272
+ }
@@ -12,6 +12,7 @@ import {
12
12
  BookOpen,
13
13
  Wrench,
14
14
  Network,
15
+ Activity,
15
16
  } from "lucide-react";
16
17
 
17
18
  export type TabId =
@@ -26,7 +27,8 @@ export type TabId =
26
27
  | "turns"
27
28
  | "maintenance"
28
29
  | "memory-map"
29
- | "health";
30
+ | "health"
31
+ | "vector-cortex";
30
32
 
31
33
  export interface TabDef {
32
34
  id: TabId;
@@ -50,6 +52,7 @@ export const ADVANCED_TABS: TabDef[] = [
50
52
  { id: "wiki", label: "Wiki", icon: BookOpen },
51
53
  { id: "maintenance", label: "Maintenance", icon: Wrench },
52
54
  { id: "memory-map", label: "Memory Map", icon: Network },
55
+ { id: "vector-cortex", label: "Vector Cortex", icon: Activity },
53
56
  ];
54
57
 
55
58
  export const ADVANCED_TAB_IDS: ReadonlySet<TabId> = new Set(
@@ -0,0 +1,84 @@
1
+ /**
2
+ * dashboard-client/src/types/vector-cortex.ts — vector-cortex client types.
3
+ * Mirrors the reader-only evaluation summary (VC0A). Contains only aggregates
4
+ * (histogram cells + counts), never payloads/prompts/ledger.
5
+ */
6
+
7
+ export interface VectorCortexEvaluationSummary {
8
+ enabled: boolean;
9
+ mode: "A" | "B" | "C";
10
+ samples: number;
11
+ byMode: { A: number; B: number; C: number };
12
+ histogram: {
13
+ edges: number[];
14
+ cells: number[];
15
+ overflow: number;
16
+ total: number;
17
+ };
18
+ rejects: string[];
19
+ updatedAt: string;
20
+ }
21
+
22
+ /**
23
+ * Health card (VC0C, task 5): breaker state + durable spool frontier/lag.
24
+ * Aggregate only — never payloads/prompts/ledger.
25
+ */
26
+ export interface VectorCortexHealthCard {
27
+ enabled: boolean;
28
+ mode: "A" | "B" | "C";
29
+ state:
30
+ | "CLOSED_A"
31
+ | "OPEN_B"
32
+ | "OPEN_C"
33
+ | "PROBE_B"
34
+ | "PROBE_A"
35
+ | "MANUAL_HALT";
36
+ subsystem: string;
37
+ sinceMs: number;
38
+ reason?: string;
39
+ windowMs: number;
40
+ probeCount: number;
41
+ backoffDelayMs: number;
42
+ frontierFrozen: boolean;
43
+ authorityOutage: boolean;
44
+ spoolLag: number;
45
+ attempts: number;
46
+ failures: number;
47
+ p95Ms: number;
48
+ failureRate: number;
49
+ updatedAt: string;
50
+ aggregate: string;
51
+ /** "ephemeral" = per-process/in-memory breaker (non-live until VC0D). */
52
+ stateSource: "ephemeral" | "live";
53
+ }
54
+
55
+ /** Admin reset result (VC0C, task 5). */
56
+ export interface VectorCortexResetResult {
57
+ subsystem: string;
58
+ state: string;
59
+ cooldownCleared: boolean;
60
+ attempts: number;
61
+ failures: number;
62
+ probeCount: number;
63
+ manualReason?: string;
64
+ updatedAt: string;
65
+ }
66
+
67
+ /**
68
+ * Occurrence-ledger identity view (VC1B, GET /api/vector-cortex/ledger).
69
+ * Reader-only: seq/eventId/kind/digest + high-water, never source payloads.
70
+ */
71
+ export interface VectorCortexLedgerView {
72
+ enabled: boolean;
73
+ session: string;
74
+ highWater: string;
75
+ count: number;
76
+ occurrences: Array<{
77
+ seq: string;
78
+ eventId: string;
79
+ kind: string;
80
+ digest: string;
81
+ toolCallId?: string;
82
+ }>;
83
+ updatedAt: string;
84
+ }
@@ -16,7 +16,7 @@
16
16
  "verbatimModuleSyntax": true,
17
17
  "noEmit": true,
18
18
  "allowImportingTsExtensions": true,
19
- "types": [],
19
+ "types": ["node"],
20
20
  "baseUrl": ".",
21
21
  "paths": {
22
22
  "@/*": ["./src/*"],
@@ -0,0 +1,67 @@
1
+ /**
2
+ * api-contracts/endpoints/registry-ext.ts — additive endpoint registry groups.
3
+ *
4
+ * Split out of registry.ts (delegate-shell) so the registry stays under the
5
+ * 500-line extension hard limit. Holds the newest endpoint groups (per-model
6
+ * thresholds, vector-cortex) that are appended to the ENDPOINTS registry via
7
+ * object spread. Types are identical to sibling entries (`EndpointDef`).
8
+ *
9
+ * Sprint A1 — PREVENT-PI-004: zero network code (type definitions only).
10
+ * PREVENT-011: no `any` type.
11
+ */
12
+ import type { EndpointDef } from "../core.js";
13
+ import type { RagMetricsResponse } from "../rag-metrics.js";
14
+ import type { ModelThresholdsResponse } from "../model-thresholds.js";
15
+ import type {
16
+ VectorCortexEvaluationSummary,
17
+ VectorCortexLedgerView,
18
+ } from "../vector-cortex.js";
19
+
20
+ /** Additive endpoint entries spread into the ENDPOINTS registry. */
21
+ export const EXTRA_ENDPOINTS = {
22
+ // ─── Per-model compaction thresholds (S52 / v0.16.1) ───────────────
23
+
24
+ /** GET /api/model-thresholds — List known models + their thresholds. */
25
+ modelThresholds: {
26
+ method: "GET",
27
+ path: "/api/model-thresholds",
28
+ description:
29
+ "Every known model (from model_snapshots) with its per-model threshold override (or defaults).",
30
+ } as const satisfies EndpointDef<"GET", undefined, ModelThresholdsResponse>,
31
+
32
+ // ─── RAG Metrics (Sprint H2) ──────────────────────────────────────
33
+
34
+ /** GET /api/rag-metrics — HyDE + recall-quality telemetry aggregates. */
35
+ ragMetrics: {
36
+ method: "GET",
37
+ path: "/api/rag-metrics",
38
+ description:
39
+ "HyDE invocation + recall-quality telemetry: flags, totals, recent turns, and daily series.",
40
+ } as const satisfies EndpointDef<"GET", undefined, RagMetricsResponse>,
41
+
42
+ // ─── Vector Cortex (VC0A) ────────────────────────────────────────
43
+
44
+ /** GET /api/vector-cortex/evaluation — reader-only eval aggregate (VC0A). */
45
+ vectorCortexEvaluation: {
46
+ method: "GET",
47
+ path: "/api/vector-cortex/evaluation",
48
+ description:
49
+ "Reader-only vector-cortex evaluation summary: latency histogram + per-mode sample counts (never payloads).",
50
+ } as const satisfies EndpointDef<
51
+ "GET",
52
+ undefined,
53
+ VectorCortexEvaluationSummary
54
+ >,
55
+
56
+ /** GET /api/vector-cortex/ledger — reader-only occurrence ledger view (VC1B). */
57
+ vectorCortexLedger: {
58
+ method: "GET",
59
+ path: "/api/vector-cortex/ledger",
60
+ description:
61
+ "Reader-only occurrence-ledger identity view: seq/eventId/kind/digest + high-water (never source payloads).",
62
+ } as const satisfies EndpointDef<
63
+ "GET",
64
+ undefined,
65
+ VectorCortexLedgerView
66
+ >,
67
+ } as const;
@@ -32,8 +32,7 @@ import type {
32
32
  RagSettingsRequest,
33
33
  RagSettingsResponsePost,
34
34
  } from "../rag-settings.js";
35
- import type { RagMetricsResponse } from "../rag-metrics.js";
36
- import type { ModelThresholdsResponse } from "../model-thresholds.js";
35
+ import { EXTRA_ENDPOINTS } from "./registry-ext.js";
37
36
  import type {
38
37
  TurnsResponse,
39
38
  ConversationTurnsResponse,
@@ -491,23 +490,7 @@ export const ENDPOINTS = {
491
490
  RagSettingsResponsePost
492
491
  >,
493
492
 
494
- // ─── RAG Metrics (Sprint H2) ──────────────────────────────────────
495
-
496
- /** GET /api/rag-metrics — HyDE + recall-quality telemetry aggregates. */
497
- ragMetrics: {
498
- method: "GET",
499
- path: "/api/rag-metrics",
500
- description:
501
- "HyDE invocation + recall-quality telemetry: flags, totals, recent turns, and daily series.",
502
- } as const satisfies EndpointDef<"GET", undefined, RagMetricsResponse>,
503
-
504
- // ─── Per-model compaction thresholds (S52 / v0.16.1) ───────────────
505
-
506
- /** GET /api/model-thresholds — List known models + their thresholds. */
507
- modelThresholds: {
508
- method: "GET",
509
- path: "/api/model-thresholds",
510
- description:
511
- "Every known model (from model_snapshots) with its per-model threshold override (or defaults).",
512
- } as const satisfies EndpointDef<"GET", undefined, ModelThresholdsResponse>,
493
+ // ─── Additive groups (rag-metrics, thresholds, vector-cortex) live in
494
+ // ─── registry-ext.ts so this registry stays under the 500-line limit.
495
+ ...EXTRA_ENDPOINTS,
513
496
  } as const;
@@ -242,6 +242,9 @@ export type {
242
242
  // Embedder health probe
243
243
  export type { EmbedderHealthResponse } from "./embedder-health.js";
244
244
 
245
+ // VC0A — vector-cortex evaluation summary (reader-only)
246
+ export type { VectorCortexEvaluationSummary } from "./vector-cortex.js";
247
+
245
248
  // S46/D3 — memory graph (visual memory map) + validation report
246
249
  export type {
247
250
  MemoryMapResponse,