pi-mega-compact 0.20.9 → 0.20.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/vector-cortex.js +16 -0
- package/dist/config.js +1 -1
- package/dist/extensions/dashboard-server/route-dispatch.js +5 -0
- package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -0
- package/dist/extensions/dashboard-server/routes-vector-cortex-repair.js +63 -0
- package/dist/src/config/vector-cortex.js +16 -0
- package/dist/src/config.js +1 -1
- package/dist/src/vector-cortex/cache/types.js +73 -0
- package/dist/src/vector-cortex/heal/_repair-fixture.js +70 -0
- package/dist/src/vector-cortex/heal/controller.js +165 -0
- package/dist/src/vector-cortex/heal/rebuild.js +136 -0
- package/dist/src/vector-cortex/heal/repair-emit.js +83 -0
- package/dist/src/vector-cortex/heal/repair-types.js +74 -0
- package/dist/src/vector-cortex/heal/types.js +1 -0
- package/dist/vector-cortex/heal/_repair-fixture.js +70 -0
- package/dist/vector-cortex/heal/controller.js +165 -0
- package/dist/vector-cortex/heal/rebuild.js +136 -0
- package/dist/vector-cortex/heal/repair-emit.js +83 -0
- package/dist/vector-cortex/heal/repair-types.js +74 -0
- package/dist/vector-cortex/heal/types.js +1 -0
- package/extensions/dashboard-client/dist/assets/{AreaChart-fxyq2KaH.js → AreaChart-BDMjyRQp.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-fxyq2KaH.js.map → AreaChart-BDMjyRQp.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-D5EqAINP.js → BarChart-CqzPzOkj.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-D5EqAINP.js.map → BarChart-CqzPzOkj.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-D4UWbzLo.js → CacheTab-Bo8SH9q8.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-D4UWbzLo.js.map → CacheTab-Bo8SH9q8.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-BiXquGrX.js → EventsTab-DIEs6zC-.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-BiXquGrX.js.map → EventsTab-DIEs6zC-.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-D5QvoTjy.js → HealthTab-3a8IjwIK.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-D5QvoTjy.js.map → HealthTab-3a8IjwIK.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-Cy_-CWgM.js → MaintenanceTab-CdKwAcXo.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-Cy_-CWgM.js.map → MaintenanceTab-CdKwAcXo.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-DrAjgGOR.js → MemoryMapTab-D2hHuNj-.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-DrAjgGOR.js.map → MemoryMapTab-D2hHuNj-.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-BvPHcuFN.js → MetricsTab-CFhIhqrr.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-BvPHcuFN.js.map → MetricsTab-CFhIhqrr.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DsbIigOQ.js → OverviewTab-Dzp5ZoiA.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DsbIigOQ.js.map → OverviewTab-Dzp5ZoiA.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-7v_uZX_a.js → ReposTab-CFJT9mDR.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-7v_uZX_a.js.map → ReposTab-CFJT9mDR.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-BXGrv-6C.js → SessionsTab-BhP1z6_y.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-BXGrv-6C.js.map → SessionsTab-BhP1z6_y.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SetupTab-QRUXa65y.js → SetupTab-2Glh7MKk.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SetupTab-QRUXa65y.js.map → SetupTab-2Glh7MKk.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-p327ZZKT.js → TimeSavedCard-DmwBDhkw.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-p327ZZKT.js.map → TimeSavedCard-DmwBDhkw.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-BcmBSlik.js → TurnsTab-CYIaOUUZ.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-BcmBSlik.js.map → TurnsTab-CYIaOUUZ.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-DD7vGaRS.js +2 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-DD7vGaRS.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{WikiTab-DLXFMuNy.js → WikiTab-CP-JEd17.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{WikiTab-DLXFMuNy.js.map → WikiTab-CP-JEd17.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{button-C9CghmRx.js → button-B1RhLsGs.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{button-C9CghmRx.js.map → button-B1RhLsGs.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-DWU-1y3t.js → card-BLPT2-8G.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-DWU-1y3t.js.map → card-BLPT2-8G.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-Dayy9dGn.js → generateCategoricalChart-DVOMJzL2.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-Dayy9dGn.js.map → generateCategoricalChart-DVOMJzL2.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-D9PsW3VZ.js → index-CuLdiHRl.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-D9PsW3VZ.js.map → index-CuLdiHRl.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{switch-CnLFAmVT.js → switch-C5tqzhcl.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-CnLFAmVT.js.map → switch-C5tqzhcl.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-HN5C7_vy.js → toggle-HcM6W2Yl.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-HN5C7_vy.js.map → toggle-HcM6W2Yl.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-DoJfk3Ce.js → useSSE-BtWUs2kL.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-DoJfk3Ce.js.map → useSSE-BtWUs2kL.js.map} +1 -1
- package/extensions/dashboard-client/dist/index.html +1 -1
- package/extensions/dashboard-client/src/api/vector-cortex.ts +9 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexRepairCard.tsx +43 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexShardsCard.tsx +89 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexTab.tsx +14 -60
- package/extensions/dashboard-client/src/types/vector-cortex.ts +17 -0
- package/extensions/dashboard-server/api-contracts/vector-cortex-heal.ts +38 -0
- package/extensions/dashboard-server/api-contracts/vector-cortex.ts +1 -0
- package/extensions/dashboard-server/route-dispatch.ts +4 -0
- package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +6 -0
- package/extensions/dashboard-server/routes-vector-cortex-repair.ts +72 -0
- package/package.json +1 -1
- package/src/config/vector-cortex.ts +17 -0
- package/src/config.ts +1 -0
- package/src/vector-cortex/cache/types.ts +206 -0
- package/src/vector-cortex/heal/_repair-fixture.ts +138 -0
- package/src/vector-cortex/heal/controller.ts +189 -0
- package/src/vector-cortex/heal/rebuild.ts +200 -0
- package/src/vector-cortex/heal/repair-emit.ts +118 -0
- package/src/vector-cortex/heal/repair-types.ts +227 -0
- package/src/vector-cortex/heal/types.ts +28 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-D2fjKNyT.js +0 -2
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-D2fjKNyT.js.map +0 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vector-cortex/heal/repair-types.ts — VC6C self-healing derived controller.
|
|
3
|
+
*
|
|
4
|
+
* VC6B answered "when a node's bytes are gone, WHERE do they come from?". VC6C
|
|
5
|
+
* answers the question one level up: when a DERIVED subsystem (topology, shards,
|
|
6
|
+
* closure) has fallen BEHIND the durable authority, how do we notice, and how do
|
|
7
|
+
* we catch it up without ever risking the authority itself?
|
|
8
|
+
*
|
|
9
|
+
* THE AUTHORITY IS READ-ONLY, ALWAYS. The controller compares each derived
|
|
10
|
+
* source's high-water to the durable authority high-water and plans work. It has
|
|
11
|
+
* no write path to the authority — not a guarded one, not an admin one. Derived
|
|
12
|
+
* state is disposable and can always be rebuilt from the byte ledger; the
|
|
13
|
+
* authority is not, so the repair path is deliberately one-directional. This is
|
|
14
|
+
* why `RepairState` carries `authorityHighWater` as a plain readonly field and
|
|
15
|
+
* why no function in `controller.ts` returns anything that could be applied to it.
|
|
16
|
+
*
|
|
17
|
+
* NEVER READ PAST THE AUTHORITY (TRIAD_RESILIENCE §frontier). A derived builder
|
|
18
|
+
* may not read beyond the durable CONTIGUOUS authority high-water. During an
|
|
19
|
+
* authority outage that high-water FREEZES even though the spool keeps accepting
|
|
20
|
+
* frames — so a derived subsystem that is "behind" a frozen frontier is CORRECT,
|
|
21
|
+
* not broken, and planning a rebuild against the spool tail would materialize
|
|
22
|
+
* frames that are not yet durable. `detectGaps` therefore treats
|
|
23
|
+
* `authorityFrozen` as a hard stop (`HEAL_REPAIR_AUTHORITY_FROZEN`) rather than
|
|
24
|
+
* as a large gap to chase. After the drain, catch-up resumes from the OLD
|
|
25
|
+
* high-water; it never jumps to the tail.
|
|
26
|
+
*
|
|
27
|
+
* REBUILD IS COPY-THEN-SWITCH, NEVER IN-PLACE. `rebuild.ts` materializes a NEW
|
|
28
|
+
* generation, verifies its root digest, and only then flips the pointer. A failed
|
|
29
|
+
* verification keeps the old pointer and DELETES NO EVIDENCE: the corrupt
|
|
30
|
+
* generation stays on disk to be inspected. An in-place repair would, by
|
|
31
|
+
* construction, destroy the only copy of the thing that was about to be proven
|
|
32
|
+
* wrong.
|
|
33
|
+
*
|
|
34
|
+
* RATE LIMIT + BACKOFF ARE THE BLAST RADIUS. A subsystem that fails to rebuild
|
|
35
|
+
* will fail again, usually instantly, so an unbounded retry loop turns one broken
|
|
36
|
+
* shard into a CPU-saturating rebuild storm. One rebuild per subsystem per 5
|
|
37
|
+
* minutes bounds the steady state, and the deterministic exponential backoff
|
|
38
|
+
* (30s * 2^attempt, capped at 15 min, ±10% jitter derived from the SUBSYSTEM
|
|
39
|
+
* DIGEST rather than `Math.random`) bounds the failure state while keeping the
|
|
40
|
+
* schedule reproducible in a fixture.
|
|
41
|
+
*
|
|
42
|
+
* Pure types + registered conformance IDs: no storage, no console, no clock, no
|
|
43
|
+
* network (PREVENT-PI-004 / PREVENT-011).
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
import type { ShardRange } from "../shards/types.js";
|
|
47
|
+
import type { EventV2 } from "../ledger/types.js";
|
|
48
|
+
|
|
49
|
+
/** The triad mode, mirroring TRIAD_RESILIENCE (A targeted / B full / C disable). */
|
|
50
|
+
export type Mode = "A" | "B" | "C";
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* A derived subsystem name (e.g. "topology", "shards", "closure").
|
|
54
|
+
*
|
|
55
|
+
* Deliberately a plain string rather than a closed union: the set of derived
|
|
56
|
+
* subsystems grows every sprint, and a union here would force an unrelated
|
|
57
|
+
* contract edit (and a conformance-corpus regeneration) every time a new derived
|
|
58
|
+
* tier is added. The subsystem name is also the jitter seed, so it must be stable.
|
|
59
|
+
*/
|
|
60
|
+
export type RepairSubsystem = string;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* A planned rebuild for ONE subsystem.
|
|
64
|
+
*
|
|
65
|
+
* `range` is the gap to rebuild — derived high-water (exclusive) to authority
|
|
66
|
+
* high-water (inclusive) — so a plan is self-describing: an operator can read the
|
|
67
|
+
* exact seq window that will be materialized. `generation` is the NEW generation
|
|
68
|
+
* the rebuild will write into (never the live one). `backoffMs` is the delay
|
|
69
|
+
* BEFORE the plan may execute, and `scheduledAt` is the monotonic timestamp it
|
|
70
|
+
* becomes eligible.
|
|
71
|
+
*/
|
|
72
|
+
export interface RepairPlanV1 {
|
|
73
|
+
readonly schema: "repair-plan-v1";
|
|
74
|
+
readonly subsystem: RepairSubsystem;
|
|
75
|
+
/** The seq/byte window to rebuild (derived high-water .. authority high-water). */
|
|
76
|
+
readonly range: ShardRange;
|
|
77
|
+
/** The NEW generation number the rebuild materializes into. */
|
|
78
|
+
readonly generation: number;
|
|
79
|
+
/** Deterministic delay before this plan is eligible to run. */
|
|
80
|
+
readonly backoffMs: number;
|
|
81
|
+
/** Monotonic ms at which the plan becomes eligible (`now + backoffMs`). */
|
|
82
|
+
readonly scheduledAt: bigint;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A repair lifecycle record. Emitted as a structured event AND retained for the
|
|
87
|
+
* dashboard's repair state, so it carries identity and counters only — never a
|
|
88
|
+
* rebuilt byte, never a node id, never transcript text (SECURITY_PRIVACY).
|
|
89
|
+
*/
|
|
90
|
+
export interface RepairEventV1 {
|
|
91
|
+
readonly schema: "repair-event-v1";
|
|
92
|
+
readonly subsystem: RepairSubsystem;
|
|
93
|
+
/**
|
|
94
|
+
* `planned` — a gap was detected and a rebuild scheduled.
|
|
95
|
+
* `pointer-switched` — a verified generation became live (the ONLY success).
|
|
96
|
+
* `backoff` — a rebuild was suppressed (rate limit) or failed and is
|
|
97
|
+
* now waiting out its exponential delay.
|
|
98
|
+
*/
|
|
99
|
+
readonly kind: "planned" | "pointer-switched" | "backoff";
|
|
100
|
+
readonly generation: number;
|
|
101
|
+
/** Monotonic ms of the transition. */
|
|
102
|
+
readonly ts: bigint;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** VC6C failure codes (registered HEAL codes). */
|
|
106
|
+
export type RepairFailureCode =
|
|
107
|
+
/**
|
|
108
|
+
* The authority high-water is frozen (outage). Derived state is CORRECTLY
|
|
109
|
+
* behind and must not chase the spool tail — planning is refused, not delayed.
|
|
110
|
+
*/
|
|
111
|
+
| "HEAL_REPAIR_AUTHORITY_FROZEN"
|
|
112
|
+
/** A rebuilt generation's root digest does not match — pointer NOT switched. */
|
|
113
|
+
| "HEAL_REPAIR_DIGEST_MISMATCH"
|
|
114
|
+
/** The rebuild itself could not produce a generation (mode C disable). */
|
|
115
|
+
| "HEAL_REBUILD_FAILED"
|
|
116
|
+
/** A second rebuild for this subsystem inside the 5-minute window. */
|
|
117
|
+
| "HEAL_REPAIR_RATE_LIMITED";
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The controller's view of ONE derived subsystem.
|
|
121
|
+
*
|
|
122
|
+
* `authorityHighWater` is READ, never written (see the file header). `mode`
|
|
123
|
+
* records which triad arm this subsystem is currently served by, so a subsystem
|
|
124
|
+
* already in mode C (derived state disabled) is not repeatedly re-planned.
|
|
125
|
+
*/
|
|
126
|
+
export interface RepairState {
|
|
127
|
+
readonly subsystem: RepairSubsystem;
|
|
128
|
+
/** How far the derived source has been built (inclusive seq). */
|
|
129
|
+
readonly derivedHighWater: bigint;
|
|
130
|
+
/** Durable CONTIGUOUS authority high-water (inclusive seq). Read-only. */
|
|
131
|
+
readonly authorityHighWater: bigint;
|
|
132
|
+
/** Monotonic ms of the last rebuild, or null if never rebuilt. */
|
|
133
|
+
readonly lastRebuildAt: bigint | null;
|
|
134
|
+
/** The CURRENT live generation. A plan targets `generation + 1`. */
|
|
135
|
+
readonly generation: number;
|
|
136
|
+
/** Which triad arm currently serves this subsystem. */
|
|
137
|
+
readonly mode: Mode;
|
|
138
|
+
/**
|
|
139
|
+
* Consecutive failed rebuild attempts, the exponent in `30s * 2^attempt`.
|
|
140
|
+
* Reset to 0 on a successful pointer switch.
|
|
141
|
+
*/
|
|
142
|
+
readonly failedAttempts?: number;
|
|
143
|
+
/**
|
|
144
|
+
* True while the durable authority frontier is frozen (outage). A frozen
|
|
145
|
+
* authority makes a derived lag EXPECTED, so no plan may be produced.
|
|
146
|
+
*/
|
|
147
|
+
readonly authorityFrozen?: boolean;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** The gap-detection + planning surface. Pure: no clock of its own, no I/O. */
|
|
151
|
+
export interface RepairController {
|
|
152
|
+
/** Plan a rebuild for every subsystem with a real, actionable gap. */
|
|
153
|
+
readonly detectGaps: (
|
|
154
|
+
states: readonly RepairState[],
|
|
155
|
+
nowMs: bigint,
|
|
156
|
+
) => readonly RepairPlanV1[];
|
|
157
|
+
/** Build a single plan for one subsystem's gap. */
|
|
158
|
+
readonly planRebuild: (state: RepairState, nowMs: bigint) => RepairPlanV1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* One rebuild per subsystem per 5 minutes. Bounds a rebuild storm: a subsystem
|
|
163
|
+
* that fails will fail again immediately, and without this an unhealthy tier
|
|
164
|
+
* would saturate the box re-materializing the same broken generation.
|
|
165
|
+
*/
|
|
166
|
+
export const REPAIR_RATE_LIMIT_MS = 5 * 60_000;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Exponential backoff base/cap, matching the breaker's retry rule
|
|
170
|
+
* (TRIAD_RESILIENCE): `30s * 2^attempt`, capped at 15 minutes.
|
|
171
|
+
*/
|
|
172
|
+
export const REPAIR_BACKOFF_BASE_MS = 30_000;
|
|
173
|
+
export const REPAIR_BACKOFF_CAP_MS = 15 * 60_000;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* ±10% deterministic jitter. Derived from the SUBSYSTEM DIGEST, not a PRNG, so
|
|
177
|
+
* two subsystems desynchronize (no thundering herd) while any single subsystem's
|
|
178
|
+
* schedule stays reproducible in a fixture.
|
|
179
|
+
*/
|
|
180
|
+
export const REPAIR_BACKOFF_JITTER = 0.1;
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Registered VC6C conformance ID range (HEAL-031..045), continuing VC6B's
|
|
184
|
+
* HEAL-016..030. The acceptance test reads these rows from the v2 manifest and
|
|
185
|
+
* asserts each returns its manifest `ok`/`code`.
|
|
186
|
+
*/
|
|
187
|
+
export const REPAIR_IDS: readonly string[] = Array.from(
|
|
188
|
+
{ length: 15 },
|
|
189
|
+
(_v, i) => `HEAL-${String(i + 31).padStart(3, "0")}`,
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
/** Named VC6C conformance assertions (the sprint's headline rows). */
|
|
193
|
+
export const REPAIR_NAMED_IDS = [
|
|
194
|
+
"HEAL-GAP-001",
|
|
195
|
+
"HEAL-RATE-002",
|
|
196
|
+
"HEAL-SWITCH-003",
|
|
197
|
+
] as const;
|
|
198
|
+
|
|
199
|
+
/** The three structured events the VC6C reporter emits. */
|
|
200
|
+
export type RepairEventName =
|
|
201
|
+
| "vector_cortex_repair_planned"
|
|
202
|
+
| "vector_cortex_repair_pointer_switched"
|
|
203
|
+
| "vector_cortex_repair_backoff";
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Reader-only dashboard aggregate. Counters and the runtime mode only — no
|
|
207
|
+
* subsystem payload, no rebuilt bytes, no gap ranges, no high-water marks, no
|
|
208
|
+
* root digests (SECURITY_PRIVACY).
|
|
209
|
+
*
|
|
210
|
+
* Field names mirror `VectorCortexRepairView` in
|
|
211
|
+
* `extensions/dashboard-server/api-contracts/vector-cortex-heal.ts` EXACTLY.
|
|
212
|
+
* The dashboard contract is the shipped shape; keeping a differently-named
|
|
213
|
+
* mirror here would guarantee a silent drift the compiler could never catch,
|
|
214
|
+
* since the route builds its body from the extensions-side type.
|
|
215
|
+
*/
|
|
216
|
+
export interface RepairView {
|
|
217
|
+
readonly enabled: boolean;
|
|
218
|
+
readonly mode: Mode;
|
|
219
|
+
readonly repairAttempts: number;
|
|
220
|
+
readonly repairsPlanned: number;
|
|
221
|
+
readonly pointersSwitched: number;
|
|
222
|
+
readonly backoffs: number;
|
|
223
|
+
readonly lastBackoffMs: number | null;
|
|
224
|
+
readonly lastFailure: RepairFailureCode | null;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export type { EventV2, ShardRange };
|
|
@@ -246,3 +246,31 @@ export {
|
|
|
246
246
|
RESTORE_LIMIT_SPANS,
|
|
247
247
|
RESTORE_LIMIT_BYTES,
|
|
248
248
|
} from "./restore-types.js";
|
|
249
|
+
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
// VC6C self-healing derived controller (repair-types.ts). Re-exported here so
|
|
252
|
+
// the heal contract keeps ONE entry point: VC6B restores the BYTES a plan needs,
|
|
253
|
+
// and these types describe rebuilding the DERIVED state that indexes them —
|
|
254
|
+
// detect a gap against durable authority, rebuild into a new generation, verify
|
|
255
|
+
// its root digest, then switch the pointer.
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
|
|
258
|
+
export type {
|
|
259
|
+
Mode,
|
|
260
|
+
RepairSubsystem,
|
|
261
|
+
RepairPlanV1,
|
|
262
|
+
RepairEventV1,
|
|
263
|
+
RepairEventName,
|
|
264
|
+
RepairFailureCode,
|
|
265
|
+
RepairState,
|
|
266
|
+
RepairController,
|
|
267
|
+
RepairView,
|
|
268
|
+
} from "./repair-types.js";
|
|
269
|
+
export {
|
|
270
|
+
REPAIR_IDS,
|
|
271
|
+
REPAIR_NAMED_IDS,
|
|
272
|
+
REPAIR_RATE_LIMIT_MS,
|
|
273
|
+
REPAIR_BACKOFF_BASE_MS,
|
|
274
|
+
REPAIR_BACKOFF_CAP_MS,
|
|
275
|
+
REPAIR_BACKOFF_JITTER,
|
|
276
|
+
} from "./repair-types.js";
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,B as a,r as l}from"./index-D9PsW3VZ.js";import{C as o,a as d,b as i,c as x}from"./card-DWU-1y3t.js";async function U(){const s=await fetch("/api/vector-cortex/evaluation");if(!s.ok)throw new Error(`vector-cortex evaluation: ${s.status}`);return s.json()}async function y(){const s=await fetch("/api/vector-cortex/health");if(!s.ok)throw new Error(`vector-cortex health: ${s.status}`);return s.json()}async function W(){const s=await fetch("/api/vector-cortex/topology");if(!s.ok)throw new Error(`vector-cortex topology: ${s.status}`);return s.json()}async function Y(){const s=await fetch("/api/vector-cortex/query");if(!s.ok)throw new Error(`vector-cortex query: ${s.status}`);return s.json()}async function _(){const s=await fetch("/api/vector-cortex/shards");if(!s.ok)throw new Error(`vector-cortex shards: ${s.status}`);return s.json()}async function Z(){const s=await fetch("/api/vector-cortex/reconstruct");if(!s.ok)throw new Error(`vector-cortex reconstruct: ${s.status}`);return s.json()}async function J(){const s=await fetch("/api/vector-cortex/plans");if(!s.ok)throw new Error(`vector-cortex plans: ${s.status}`);return s.json()}async function K(){const s=await fetch("/api/vector-cortex/render");if(!s.ok)throw new Error(`vector-cortex render: ${s.status}`);return s.json()}async function X(){const s=await fetch("/api/vector-cortex/rollout");if(!s.ok)throw new Error(`vector-cortex rollout: ${s.status}`);return s.json()}async function ee(){const s=await fetch("/api/vector-cortex/closure-proof");if(!s.ok)throw new Error(`vector-cortex closure-proof: ${s.status}`);return s.json()}async function se(){const s=await fetch("/api/vector-cortex/restore");if(!s.ok)throw new Error(`vector-cortex restore: ${s.status}`);return s.json()}async function te(s="default"){const r=await fetch(`/api/vector-cortex/ledger?session=${encodeURIComponent(s)}`);if(!r.ok)throw new Error(`vector-cortex ledger: ${r.status}`);return r.json()}async function re(s){const r=await fetch("/api/vector-cortex/breakers/reset",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({subsystem:s})});if(!r.ok)throw new Error(`vector-cortex reset: ${r.status}`);return r.json()}function t({label:s,value:r}){return e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:s}),e.jsx("div",{className:"font-mono text-sm",children:r})]})}function ae({view:s}){return e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Validated Prompt Renderer (VC5B)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"Render fixtures",value:String(s.renderCount)}),e.jsx(t,{label:"Provider profiles",value:String(s.providerCount)}),e.jsx(t,{label:"Known profiles",value:String(s.knownProfiles.length)})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only render conformance route — no prompt text or session payloads exposed."})]}):e.jsx("div",{className:"vc-empty",children:"Renderer disabled (VC5B off)."})})]})}function ne({view:s}){return e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Live Graduated Rollout (VC5C)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"Gate",value:`${s.gatePct}%`}),e.jsx(t,{label:"Exposed buckets",value:String(s.bucketCount)}),e.jsx(t,{label:"Total buckets",value:String(s.buckets)}),e.jsx(t,{label:"Promotion",value:s.promotionBlocked?"FROZEN":"OPEN"}),e.jsx(t,{label:"Events",value:String(s.events)}),e.jsx(t,{label:"Sessions",value:String(s.sessions)})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only rollout route — no session payloads or bucket→session mappings exposed."})]}):e.jsx("div",{className:"vc-empty",children:"Rollout disabled (VC5C off)."})})]})}function le({view:s}){return e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Closure Optimization (VC6A)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"Mode",value:s.mode}),e.jsx(t,{label:"Optimizations",value:String(s.optimizations)}),e.jsx(t,{label:"Proof rejections",value:String(s.proofRejections)}),e.jsx(t,{label:"Last rejection",value:s.lastRejection??"none"}),e.jsx(t,{label:"Retained edges",value:String(s.retainedEdgeTotal)}),e.jsx(t,{label:"Removed edges",value:String(s.removedEdgeTotal)}),e.jsx(t,{label:"Conservative walks",value:String(s.conservativeTraversalTotal)}),e.jsx(t,{label:"Optimized walks",value:String(s.optimizedTraversalTotal)})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only closure diagnostics — aggregate counts only; per-edge proof rows, node ids, and source payloads are never exposed (SECURITY_PRIVACY)."})]}):e.jsx("div",{className:"vc-empty",children:"Closure optimization disabled (VC6A off) — conservative VC4C closure used directly (mode B)."})})]})}function ce({view:s}){return e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Exact Source Restoration (VC6B)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"Mode",value:s.mode}),e.jsx(t,{label:"Restore attempts",value:String(s.restoreAttempts)}),e.jsx(t,{label:"Restored",value:String(s.restoredCount)}),e.jsx(t,{label:"Missing source",value:String(s.missingCount)}),e.jsx(t,{label:"Digest rejections",value:String(s.digestRejections)}),e.jsx(t,{label:"Last rejection",value:s.lastRejection??"none"}),e.jsx(t,{label:"Updated",value:s.updatedAt})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only restore diagnostics — counts and HEAL_RESTORE_* codes only. There is no payload endpoint: restored bytes, span ids, node ids, and ledger text are never exposed (SECURITY_PRIVACY)."})]}):e.jsx("div",{className:"vc-empty",children:"Exact source restoration disabled (VC6B off) — no exact source is restored; omitted context is disclosed as loss (mode C)."})})]})}function oe({view:s}){return e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Plan Manifests (VC5A)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"DAG fixtures",value:String(s.dagCount)}),e.jsx(t,{label:"Plan fixtures",value:String(s.plannerCount)}),e.jsx(t,{label:"Plans exposed",value:String(s.plans.length)})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only plan manifests only — no session payloads or prompt text. Per-run plan outputs are staged in-memory this sprint."})]}):e.jsx("div",{className:"vc-empty",children:"PromptDagV1 + budgeted planner disabled (VC5A off)."})})]})}function de({topology:s,query:r}){return e.jsxs(e.Fragment,{children:[e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Derived Cortex Store (VC3A)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-3",children:[e.jsx(t,{label:"Generation",value:s.generationId??"—"}),e.jsx(t,{label:"Ordinal",value:s.ordinal??"—"}),e.jsx(t,{label:"Records",value:String(s.recordCount)}),e.jsx(t,{label:"Frontier (HW)",value:s.sourceHighWater}),e.jsx(t,{label:"Root digest",value:s.rootDigest?s.rootDigest.slice(0,16):"—"}),s.nodes!==void 0&&e.jsxs(e.Fragment,{children:[e.jsx(t,{label:"Nodes",value:String(s.nodes?.length??0)}),e.jsx(t,{label:"Edges",value:String(s.edges?.length??0)}),e.jsx(t,{label:"Graph digest",value:s.generationDigest?s.generationDigest.slice(0,16):"—"})]})]}),s.nodes!==void 0&&(s.edges?.length??0)>0&&e.jsxs("div",{className:"mt-4 max-h-56 overflow-y-auto",children:[e.jsx("div",{className:"mb-1 text-xs font-medium text-muted-foreground",children:"Topology edges (VC3B)"}),e.jsxs("table",{className:"w-full text-left text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border/50 text-muted-foreground",children:[e.jsx("th",{className:"py-1 pr-2",children:"source"}),e.jsx("th",{className:"py-1 pr-2",children:"target"}),e.jsx("th",{className:"py-1 pr-2",children:"head"}),e.jsx("th",{className:"py-1 pr-2",children:"dir"}),e.jsx("th",{className:"py-1",children:"score"})]})}),e.jsx("tbody",{children:s.edges?.map((u,m)=>e.jsxs("tr",{className:"border-b border-border/30",children:[e.jsx("td",{className:"py-1 pr-2 font-mono",children:u.source}),e.jsx("td",{className:"py-1 pr-2 font-mono",children:u.target}),e.jsx("td",{className:"py-1 pr-2 font-mono",children:u.head}),e.jsx("td",{className:"py-1 pr-2",children:u.direction}),e.jsx("td",{className:"py-1 font-mono",children:u.score})]},`${u.source}-${u.target}-${u.head}-${m}`))})]})]})]}):e.jsx("div",{className:"vc-empty",children:"Cortex store disabled (VC3A off)."})})]}),e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Topology Query Diagnostics (VC3C)"}),r?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:r?.enabled?e.jsx("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-3",children:e.jsx(t,{label:"Router version",value:String(r.routerVersion)})}):e.jsx("div",{className:"vc-empty",children:"Query diagnostics unavailable (VC3C off)."})})]})]})}function ie({ledger:s}){return e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Occurrence Ledger (VC1B)"}),s?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:s?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-3 grid grid-cols-2 gap-4 md:grid-cols-3",children:[e.jsx(t,{label:"Session",value:s.session}),e.jsx(t,{label:"High-water",value:s.highWater}),e.jsx(t,{label:"Occurrences",value:String(s.count)})]}),s.occurrences.length===0?e.jsx("div",{className:"vc-empty",children:"No occurrences recorded."}):e.jsx("div",{className:"max-h-64 overflow-y-auto",children:e.jsxs("table",{className:"w-full text-left text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border/50 text-muted-foreground",children:[e.jsx("th",{className:"py-1 pr-2",children:"seq"}),e.jsx("th",{className:"py-1 pr-2",children:"eventId"}),e.jsx("th",{className:"py-1 pr-2",children:"kind"}),e.jsx("th",{className:"py-1 pr-2",children:"toolCall"}),e.jsx("th",{className:"py-1",children:"digest"})]})}),e.jsx("tbody",{children:s.occurrences.map(r=>e.jsxs("tr",{className:"border-b border-border/30",children:[e.jsx("td",{className:"py-1 pr-2 font-mono",children:r.seq}),e.jsx("td",{className:"py-1 pr-2 font-mono",children:r.eventId}),e.jsx("td",{className:"py-1 pr-2",children:r.kind}),e.jsx("td",{className:"py-1 pr-2 font-mono",children:r.toolCallId??"—"}),e.jsx("td",{className:"max-w-[180px] truncate font-mono text-muted-foreground",children:r.digest})]},`${r.seq}-${r.eventId}`))})]})})]}):e.jsx("div",{className:"vc-empty",children:"Ledger disabled (VC1B off)."})})]})}function v({mode:s,count:r}){return e.jsxs("div",{className:"flex items-center justify-between border-b border-border/50 py-1 text-sm",children:[e.jsxs("span",{className:"text-muted-foreground",children:["Mode ",s]}),e.jsx("span",{className:"font-mono",children:r})]})}function he(){const[s,r]=l.useState(null),[u,m]=l.useState(null),[S,V]=l.useState(!0),[c,f]=l.useState(null),[p,b]=l.useState(null),[E,R]=l.useState(null),[w,F]=l.useState(null),[T,k]=l.useState(null),[j,A]=l.useState(null),[h,$]=l.useState(null),[I,O]=l.useState(null),[P,M]=l.useState(null),[B,D]=l.useState(null),[L,H]=l.useState(null),[z,G]=l.useState(null),g=l.useCallback(()=>{U().then(r).catch(n=>m(n instanceof Error?n.message:String(n))).finally(()=>V(!1)),y().then(f).catch(()=>{}),te().then(R).catch(()=>{}),W().then(F).catch(()=>{}),Y().then(k).catch(()=>{}),_().then(A).catch(()=>{}),Z().then($).catch(()=>{}),J().then(O).catch(()=>{}),K().then(M).catch(()=>{}),X().then(D).catch(()=>{}),ee().then(H).catch(()=>{}),se().then(G).catch(()=>{})},[]);l.useEffect(()=>{g();const n=setInterval(g,5e3);return()=>clearInterval(n)},[g]);const q=()=>{re("provider").then(n=>(b(`Breaker "${n.subsystem}" ${n.state}; evidence retained: ${n.failures} failures / ${n.attempts} attempts`),y())).then(f).catch(n=>b(n instanceof Error?n.message:String(n)))};if(S&&!s)return e.jsx("div",{className:"vc-loading",children:"Loading vector-cortex evaluation…"});if(u&&!s)return e.jsxs("div",{className:"vc-error",children:["Error: ",u]});if(!s)return e.jsx("div",{className:"vc-empty",children:"No evaluation data available."});const C=Math.max(1,...s.histogram.cells,s.histogram.overflow);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"Vector Cortex Evaluation"}),s.enabled?e.jsx(a,{variant:"warning",children:"OBSERVER PENDING (A)"}):e.jsx(a,{variant:"danger",children:"MODE C (OFF)"})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-3",children:[e.jsxs(o,{children:[e.jsx(d,{children:e.jsx(i,{children:"Samples"})}),e.jsxs(x,{children:[e.jsx("div",{className:"text-3xl font-bold",children:s.samples}),e.jsxs("div",{className:"mt-2 flex flex-col",children:[e.jsx(v,{mode:"A",count:s.byMode.A}),e.jsx(v,{mode:"B",count:s.byMode.B}),e.jsx(v,{mode:"C",count:s.byMode.C})]})]})]}),e.jsxs(o,{className:"md:col-span-2",children:[e.jsx(d,{children:e.jsx(i,{children:"Latency Histogram (ms, inclusive edges)"})}),e.jsxs(x,{children:[e.jsxs("div",{className:"flex items-end gap-2",style:{height:160},children:[s.histogram.edges.map((n,N)=>{const Q=s.histogram.cells[N]/C*140;return e.jsxs("div",{className:"flex flex-1 flex-col items-center gap-1",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:s.histogram.cells[N]}),e.jsx("div",{className:"w-full rounded-t",style:{height:Math.max(2,Q),background:"#6366f1"}}),e.jsxs("span",{className:"text-[10px] text-muted-foreground",children:["≤",n]})]},n)}),e.jsxs("div",{className:"flex flex-1 flex-col items-center gap-1",children:[e.jsx("span",{className:"text-xs text-muted-foreground",children:s.histogram.overflow}),e.jsx("div",{className:"w-full rounded-t",style:{height:Math.max(2,s.histogram.overflow/C*140),background:"#f87171"}}),e.jsx("span",{className:"text-[10px] text-muted-foreground",children:">250"})]})]}),e.jsxs("div",{className:"mt-1 text-xs text-muted-foreground",children:["Total: ",s.histogram.total," · Rejects: ",s.rejects.length]})]})]})]}),e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Live Safety Envelope (VC0C)"}),e.jsxs("div",{className:"flex items-center gap-2",children:[c?.stateSource==="ephemeral"&&e.jsx(a,{variant:"outline",children:"EPHEMERAL (non-live)"}),e.jsx("button",{onClick:q,disabled:!c?.enabled,className:"rounded border border-border px-2 py-1 text-xs disabled:opacity-50",children:"Reset Cooldown"})]})]})}),e.jsxs(x,{children:[p&&e.jsx("div",{className:"mb-2 text-xs text-muted-foreground",children:p}),c?e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"State",value:c.state}),e.jsx(t,{label:"Mode",value:c.mode}),e.jsx(t,{label:"Window",value:`${c.windowMs}ms`}),e.jsx(t,{label:"Probes",value:String(c.probeCount)}),e.jsx(t,{label:"Backoff",value:`${c.backoffDelayMs}ms`}),e.jsx(t,{label:"Failures",value:`${c.failures}/${c.attempts}`}),e.jsx(t,{label:"Frontier",value:c.stateSource==="ephemeral"?"non-live":c.frontierFrozen?"FROZEN":"LIVE"}),e.jsx(t,{label:"Spool lag",value:String(c.spoolLag)}),e.jsx(t,{label:"Encoder mode",value:c.encoderMode}),e.jsx(t,{label:"Encoder asset",value:c.encoderAssetDigest?c.encoderAssetDigest.slice(0,12):"none"})]}):e.jsx("div",{className:"vc-empty",children:"Health unavailable (VC0C off)."})]})]}),e.jsx(de,{topology:w,query:T}),e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Dual-Tier Shards (VC4A)"}),j?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:j?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"Semantic shards",value:String(j.semanticCount)}),e.jsx(t,{label:"Exact shards",value:String(j.exactCount)}),e.jsx(t,{label:"Byte total",value:String(j.byteTotal)}),e.jsx(t,{label:"Protected bytes",value:String(j.protectedByteTotal)})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only count/byte aggregate; staged in-memory this sprint."})]}):e.jsx("div",{className:"vc-empty",children:"Dual-tier shards disabled (VC4A off)."})})]}),e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(i,{children:"Reconstruction Fidelity (VC4C)"}),h?.enabled?e.jsx(a,{variant:"success",children:"ACTIVE"}):e.jsx(a,{variant:"danger",children:"OFF"})]})}),e.jsx(x,{children:h?.enabled?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"Closure attempts",value:String(h.closureAttempts)}),e.jsx(t,{label:"Closure rejections",value:String(h.closureRejections)}),e.jsx(t,{label:"Validated",value:String(h.validatedCount)}),e.jsx(t,{label:"Invalidated",value:String(h.invalidatedCount)}),e.jsx(t,{label:"Span total",value:String(h.spanTotal)}),e.jsx(t,{label:"Byte total",value:String(h.byteTotal)})]}),e.jsx("div",{className:"mt-3 text-xs text-muted-foreground",children:"Reader-only closure/validation aggregate; staged in-memory this sprint."})]}):e.jsx("div",{className:"vc-empty",children:"Reconstruction fidelity disabled (VC4C off)."})})]}),e.jsx(oe,{view:I}),e.jsx(ae,{view:P}),e.jsx(ne,{view:B}),e.jsx(le,{view:L}),e.jsx(ce,{view:z}),e.jsx(ie,{ledger:E})]})}export{he as default};
|
|
2
|
-
//# sourceMappingURL=VectorCortexTab-D2fjKNyT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VectorCortexTab-D2fjKNyT.js","sources":["../../src/api/vector-cortex.ts","../../src/tabs/VectorCortexMetric.tsx","../../src/tabs/VectorCortexRenderCard.tsx","../../src/tabs/VectorCortexRolloutCard.tsx","../../src/tabs/VectorCortexClosureCard.tsx","../../src/tabs/VectorCortexRestoreCard.tsx","../../src/tabs/VectorCortexPlansCard.tsx","../../src/tabs/VectorCortexTopologyCard.tsx","../../src/tabs/VectorCortexLedgerCard.tsx","../../src/tabs/VectorCortexTab.tsx"],"sourcesContent":["/**\n * dashboard-client/src/api/vector-cortex.ts — vector-cortex API client.\n * PREVENT-PI-004: relative path only (loopback dashboard).\n */\n\nimport type {\n\tVectorCortexEvaluationSummary,\n\tVectorCortexHealthCard,\n\tVectorCortexLedgerView,\n\tVectorCortexPlansView,\n\tVectorCortexQueryView,\n\tVectorCortexReconstructView,\n\tVectorCortexRenderView,\n\tVectorCortexResetResult,\n\tVectorCortexRolloutView,\n\tVectorCortexShardsView,\n\tVectorCortexTopologyView,\n\tVectorCortexClosureProofView,\n\tVectorCortexRestoreView,\n} from \"../types/vector-cortex\";\n\nexport type {\n\tVectorCortexEvaluationSummary,\n\tVectorCortexHealthCard,\n\tVectorCortexLedgerView,\n\tVectorCortexPlansView,\n\tVectorCortexQueryView,\n\tVectorCortexReconstructView,\n\tVectorCortexRenderView,\n\tVectorCortexResetResult,\n\tVectorCortexRolloutView,\n\tVectorCortexShardsView,\n\tVectorCortexTopologyView,\n\tVectorCortexClosureProofView,\n\tVectorCortexRestoreView,\n};\n\nexport async function fetchVectorCortexEvaluation(): Promise<VectorCortexEvaluationSummary> {\n\tconst r = await fetch(\"/api/vector-cortex/evaluation\");\n\tif (!r.ok) throw new Error(`vector-cortex evaluation: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexEvaluationSummary>;\n}\n\nexport async function fetchVectorCortexHealth(): Promise<VectorCortexHealthCard> {\n\tconst r = await fetch(\"/api/vector-cortex/health\");\n\tif (!r.ok) throw new Error(`vector-cortex health: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexHealthCard>;\n}\n\n/** Reader-only cortex topology view (VC3A). */\nexport async function fetchVectorCortexTopology(): Promise<VectorCortexTopologyView> {\n\tconst r = await fetch(\"/api/vector-cortex/topology\");\n\tif (!r.ok) throw new Error(`vector-cortex topology: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexTopologyView>;\n}\n\n/** Reader-only query-layer diagnostics view (VC3C). */\nexport async function fetchVectorCortexQuery(): Promise<VectorCortexQueryView> {\n\tconst r = await fetch(\"/api/vector-cortex/query\");\n\tif (!r.ok) throw new Error(`vector-cortex query: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexQueryView>;\n}\n\n/** Reader-only dual-tier shard aggregate (VC4A). */\nexport async function fetchVectorCortexShards(): Promise<VectorCortexShardsView> {\n\tconst r = await fetch(\"/api/vector-cortex/shards\");\n\tif (!r.ok) throw new Error(`vector-cortex shards: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexShardsView>;\n}\n\n/** Reader-only reconstruction-fidelity aggregate (VC4C). */\nexport async function fetchVectorCortexReconstruct(): Promise<VectorCortexReconstructView> {\n\tconst r = await fetch(\"/api/vector-cortex/reconstruct\");\n\tif (!r.ok) throw new Error(`vector-cortex reconstruct: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexReconstructView>;\n}\n\n/** Reader-only plan manifest view (VC5A). Exposes only plan manifests. */\nexport async function fetchVectorCortexPlans(): Promise<VectorCortexPlansView> {\n\tconst r = await fetch(\"/api/vector-cortex/plans\");\n\tif (!r.ok) throw new Error(`vector-cortex plans: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexPlansView>;\n}\n\n/** Reader-only render + provider-profile view (VC5B). */\nexport async function fetchVectorCortexRender(): Promise<VectorCortexRenderView> {\n\tconst r = await fetch(\"/api/vector-cortex/render\");\n\tif (!r.ok) throw new Error(`vector-cortex render: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexRenderView>;\n}\n\n/** Reader-only live graduated-rollout view (VC5C). */\nexport async function fetchVectorCortexRollout(): Promise<VectorCortexRolloutView> {\n\tconst r = await fetch(\"/api/vector-cortex/rollout\");\n\tif (!r.ok) throw new Error(`vector-cortex rollout: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexRolloutView>;\n}\n\n/** Reader-only closure-optimization diagnostics view (VC6A). */\nexport async function fetchVectorCortexClosureProof(): Promise<VectorCortexClosureProofView> {\n\tconst r = await fetch(\"/api/vector-cortex/closure-proof\");\n\tif (!r.ok) throw new Error(`vector-cortex closure-proof: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexClosureProofView>;\n}\n\n/** Reader-only exact-source-restoration view (VC6B). Counts + codes only. */\nexport async function fetchVectorCortexRestore(): Promise<VectorCortexRestoreView> {\n\tconst r = await fetch(\"/api/vector-cortex/restore\");\n\tif (!r.ok) throw new Error(`vector-cortex restore: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexRestoreView>;\n}\n\n/** Reader-only occurrence-ledger identity view (VC1B). */\nexport async function fetchVectorCortexLedger(\n\tsession = \"default\",\n): Promise<VectorCortexLedgerView> {\n\tconst r = await fetch(\n\t\t`/api/vector-cortex/ledger?session=${encodeURIComponent(session)}`,\n\t);\n\tif (!r.ok) throw new Error(`vector-cortex ledger: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexLedgerView>;\n}\n\n/** Admin capability: reset a breaker's cooldown (never evidence). */\nexport async function resetVectorCortexBreaker(\n\tsubsystem: string,\n): Promise<VectorCortexResetResult> {\n\tconst r = await fetch(\"/api/vector-cortex/breakers/reset\", {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\tbody: JSON.stringify({ subsystem }),\n\t});\n\tif (!r.ok) throw new Error(`vector-cortex reset: ${r.status}`);\n\treturn r.json() as Promise<VectorCortexResetResult>;\n}\n","import type React from \"react\";\n\nexport function Metric({ label, value }: { label: string; value: string }): React.ReactElement {\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"text-xs text-muted-foreground\">{label}</div>\n\t\t\t<div className=\"font-mono text-sm\">{value}</div>\n\t\t</div>\n\t);\n}\n","import type React from \"react\";\nimport type { VectorCortexRenderView } from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexRenderCard({ view }: { view: VectorCortexRenderView | null }): React.ReactElement {\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader>\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<CardTitle>Validated Prompt Renderer (VC5B)</CardTitle>\n\t\t\t\t\t{view?.enabled ? (\n\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t{!view?.enabled ? (\n\t\t\t\t\t<div className=\"vc-empty\">Renderer disabled (VC5B off).</div>\n\t\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t<Metric label=\"Render fixtures\" value={String(view.renderCount)} />\n\t\t\t\t\t\t<Metric label=\"Provider profiles\" value={String(view.providerCount)} />\n\t\t\t\t\t\t<Metric label=\"Known profiles\" value={String(view.knownProfiles.length)} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\tReader-only render conformance route — no prompt text or session payloads exposed.\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type React from \"react\";\nimport type { VectorCortexRolloutView } from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexRolloutCard({ view }: { view: VectorCortexRolloutView | null }): React.ReactElement {\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader>\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<CardTitle>Live Graduated Rollout (VC5C)</CardTitle>\n\t\t\t\t\t{view?.enabled ? (\n\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t{!view?.enabled ? (\n\t\t\t\t\t<div className=\"vc-empty\">Rollout disabled (VC5C off).</div>\n\t\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t<Metric label=\"Gate\" value={`${view.gatePct}%`} />\n\t\t\t\t\t\t<Metric label=\"Exposed buckets\" value={String(view.bucketCount)} />\n\t\t\t\t\t\t<Metric label=\"Total buckets\" value={String(view.buckets)} />\n\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\tlabel=\"Promotion\"\n\t\t\t\t\t\t\tvalue={view.promotionBlocked ? \"FROZEN\" : \"OPEN\"}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Metric label=\"Events\" value={String(view.events)} />\n\t\t\t\t\t\t<Metric label=\"Sessions\" value={String(view.sessions)} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\tReader-only rollout route — no session payloads or bucket→session mappings exposed.\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type React from \"react\";\nimport type { VectorCortexClosureProofView } from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexClosureCard({ view }: { view: VectorCortexClosureProofView | null }): React.ReactElement {\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader>\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<CardTitle>Closure Optimization (VC6A)</CardTitle>\n\t\t\t\t\t{view?.enabled ? (\n\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t{!view?.enabled ? (\n\t\t\t\t\t<div className=\"vc-empty\">Closure optimization disabled (VC6A off) — conservative VC4C closure used directly (mode B).</div>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t\t<Metric label=\"Mode\" value={view.mode} />\n\t\t\t\t\t\t\t<Metric label=\"Optimizations\" value={String(view.optimizations)} />\n\t\t\t\t\t\t\t<Metric label=\"Proof rejections\" value={String(view.proofRejections)} />\n\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\tlabel=\"Last rejection\"\n\t\t\t\t\t\t\t\tvalue={view.lastRejection ?? \"none\"}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Metric label=\"Retained edges\" value={String(view.retainedEdgeTotal)} />\n\t\t\t\t\t\t\t<Metric label=\"Removed edges\" value={String(view.removedEdgeTotal)} />\n\t\t\t\t\t\t\t<Metric label=\"Conservative walks\" value={String(view.conservativeTraversalTotal)} />\n\t\t\t\t\t\t\t<Metric label=\"Optimized walks\" value={String(view.optimizedTraversalTotal)} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tReader-only closure diagnostics — aggregate counts only; per-edge proof rows, node ids, and source payloads are never exposed (SECURITY_PRIVACY).\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type React from \"react\";\nimport type { VectorCortexRestoreView } from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexRestoreCard({ view }: { view: VectorCortexRestoreView | null }): React.ReactElement {\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader>\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<CardTitle>Exact Source Restoration (VC6B)</CardTitle>\n\t\t\t\t\t{view?.enabled ? (\n\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t{!view?.enabled ? (\n\t\t\t\t\t<div className=\"vc-empty\">Exact source restoration disabled (VC6B off) — no exact source is restored; omitted context is disclosed as loss (mode C).</div>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t\t<Metric label=\"Mode\" value={view.mode} />\n\t\t\t\t\t\t\t<Metric label=\"Restore attempts\" value={String(view.restoreAttempts)} />\n\t\t\t\t\t\t\t<Metric label=\"Restored\" value={String(view.restoredCount)} />\n\t\t\t\t\t\t\t<Metric label=\"Missing source\" value={String(view.missingCount)} />\n\t\t\t\t\t\t\t<Metric label=\"Digest rejections\" value={String(view.digestRejections)} />\n\t\t\t\t\t\t\t<Metric label=\"Last rejection\" value={view.lastRejection ?? \"none\"} />\n\t\t\t\t\t\t\t<Metric label=\"Updated\" value={view.updatedAt} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tReader-only restore diagnostics — counts and HEAL_RESTORE_* codes only. There is no payload endpoint: restored bytes, span ids, node ids, and ledger text are never exposed (SECURITY_PRIVACY).\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","import type React from \"react\";\nimport type { VectorCortexPlansView } from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexPlansCard({ view }: { view: VectorCortexPlansView | null }): React.ReactElement {\n\treturn (\n\t\t<Card>\n\t\t\t<CardHeader>\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<CardTitle>Plan Manifests (VC5A)</CardTitle>\n\t\t\t\t\t{view?.enabled ? (\n\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</CardHeader>\n\t\t\t<CardContent>\n\t\t\t\t{!view?.enabled ? (\n\t\t\t\t\t<div className=\"vc-empty\">PromptDagV1 + budgeted planner disabled (VC5A off).</div>\n\t\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t<Metric label=\"DAG fixtures\" value={String(view.dagCount)} />\n\t\t\t\t\t\t<Metric label=\"Plan fixtures\" value={String(view.plannerCount)} />\n\t\t\t\t\t\t<Metric label=\"Plans exposed\" value={String(view.plans.length)} />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\tReader-only plan manifests only — no session payloads or prompt text.\n\t\t\t\t\t\tPer-run plan outputs are staged in-memory this sprint.\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</CardContent>\n\t\t</Card>\n\t);\n}\n","/**\n * VectorCortexTopologyCard.tsx — VC3A/VC3B topology + VC3C query diagnostics cards.\n *\n * Extracted from VectorCortexTab.tsx to keep the parent tab under the 400-line\n * extension soft limit (delegate-shell + impl-card pattern).\n */\n\nimport type {\n VectorCortexTopologyView,\n VectorCortexQueryView,\n} from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexTopologyCard({\n topology,\n query,\n}: {\n topology: VectorCortexTopologyView | null;\n query: VectorCortexQueryView | null;\n}): React.ReactElement {\n return (\n <>\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Derived Cortex Store (VC3A)</CardTitle>\n {topology?.enabled ? (\n <Badge variant=\"success\">ACTIVE</Badge>\n ) : (\n <Badge variant=\"danger\">OFF</Badge>\n )}\n </div>\n </CardHeader>\n <CardContent>\n {!topology?.enabled ? (\n <div className=\"vc-empty\">Cortex store disabled (VC3A off).</div>\n ) : (\n <>\n <div className=\"grid grid-cols-2 gap-4 md:grid-cols-3\">\n <Metric label=\"Generation\" value={topology.generationId ?? \"—\"} />\n <Metric label=\"Ordinal\" value={topology.ordinal ?? \"—\"} />\n <Metric label=\"Records\" value={String(topology.recordCount)} />\n <Metric label=\"Frontier (HW)\" value={topology.sourceHighWater} />\n <Metric\n label=\"Root digest\"\n value={topology.rootDigest ? topology.rootDigest.slice(0, 16) : \"—\"}\n />\n {topology.nodes !== undefined && (\n <>\n <Metric\n label=\"Nodes\"\n value={String(topology.nodes?.length ?? 0)}\n />\n <Metric\n label=\"Edges\"\n value={String(topology.edges?.length ?? 0)}\n />\n <Metric\n label=\"Graph digest\"\n value={\n topology.generationDigest\n ? topology.generationDigest.slice(0, 16)\n : \"—\"\n }\n />\n </>\n )}\n </div>\n {topology.nodes !== undefined &&\n (topology.edges?.length ?? 0) > 0 && (\n <div className=\"mt-4 max-h-56 overflow-y-auto\">\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n Topology edges (VC3B)\n </div>\n <table className=\"w-full text-left text-xs\">\n <thead>\n <tr className=\"border-b border-border/50 text-muted-foreground\">\n <th className=\"py-1 pr-2\">source</th>\n <th className=\"py-1 pr-2\">target</th>\n <th className=\"py-1 pr-2\">head</th>\n <th className=\"py-1 pr-2\">dir</th>\n <th className=\"py-1\">score</th>\n </tr>\n </thead>\n <tbody>\n {topology.edges?.map((e, i) => (\n <tr\n key={`${e.source}-${e.target}-${e.head}-${i}`}\n className=\"border-b border-border/30\"\n >\n <td className=\"py-1 pr-2 font-mono\">{e.source}</td>\n <td className=\"py-1 pr-2 font-mono\">{e.target}</td>\n <td className=\"py-1 pr-2 font-mono\">{e.head}</td>\n <td className=\"py-1 pr-2\">{e.direction}</td>\n <td className=\"py-1 font-mono\">{e.score}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n )}\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Topology Query Diagnostics (VC3C)</CardTitle>\n {query?.enabled ? (\n <Badge variant=\"success\">ACTIVE</Badge>\n ) : (\n <Badge variant=\"danger\">OFF</Badge>\n )}\n </div>\n </CardHeader>\n <CardContent>\n {!query?.enabled ? (\n <div className=\"vc-empty\">Query diagnostics unavailable (VC3C off).</div>\n ) : (\n <div className=\"grid grid-cols-2 gap-4 md:grid-cols-3\">\n <Metric label=\"Router version\" value={String(query.routerVersion)} />\n </div>\n )}\n </CardContent>\n </Card>\n </>\n );\n}\n","/**\n * VectorCortexLedgerCard.tsx — VC1B occurrence ledger card.\n *\n * Extracted from VectorCortexTab.tsx to keep the parent tab under the 400-line\n * extension soft limit (delegate-shell + impl-card pattern).\n */\n\nimport type { VectorCortexLedgerView } from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\n\nexport function VectorCortexLedgerCard({\n ledger,\n}: {\n ledger: VectorCortexLedgerView | null;\n}): React.ReactElement {\n return (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Occurrence Ledger (VC1B)</CardTitle>\n {ledger?.enabled ? (\n <Badge variant=\"success\">ACTIVE</Badge>\n ) : (\n <Badge variant=\"danger\">OFF</Badge>\n )}\n </div>\n </CardHeader>\n <CardContent>\n {!ledger?.enabled ? (\n <div className=\"vc-empty\">Ledger disabled (VC1B off).</div>\n ) : (\n <>\n <div className=\"mb-3 grid grid-cols-2 gap-4 md:grid-cols-3\">\n <Metric label=\"Session\" value={ledger.session} />\n <Metric label=\"High-water\" value={ledger.highWater} />\n <Metric label=\"Occurrences\" value={String(ledger.count)} />\n </div>\n {ledger.occurrences.length === 0 ? (\n <div className=\"vc-empty\">No occurrences recorded.</div>\n ) : (\n <div className=\"max-h-64 overflow-y-auto\">\n <table className=\"w-full text-left text-xs\">\n <thead>\n <tr className=\"border-b border-border/50 text-muted-foreground\">\n <th className=\"py-1 pr-2\">seq</th>\n <th className=\"py-1 pr-2\">eventId</th>\n <th className=\"py-1 pr-2\">kind</th>\n <th className=\"py-1 pr-2\">toolCall</th>\n <th className=\"py-1\">digest</th>\n </tr>\n </thead>\n <tbody>\n {ledger.occurrences.map((o) => (\n <tr\n key={`${o.seq}-${o.eventId}`}\n className=\"border-b border-border/30\"\n >\n <td className=\"py-1 pr-2 font-mono\">{o.seq}</td>\n <td className=\"py-1 pr-2 font-mono\">{o.eventId}</td>\n <td className=\"py-1 pr-2\">{o.kind}</td>\n <td className=\"py-1 pr-2 font-mono\">\n {o.toolCallId ?? \"—\"}\n </td>\n <td className=\"max-w-[180px] truncate font-mono text-muted-foreground\">\n {o.digest}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * VectorCortexTab.tsx — vector-cortex dashboard tab.\n * VC0A: reader-only aggregate latency histogram + per-mode sample counts from\n * GET /api/vector-cortex/evaluation. VC0C (task 5): live safety envelope health\n * card (breaker state, window/probe/backoff, durable spool frontier/lag) from\n * GET /api/vector-cortex/health plus an admin \"reset cooldown\" action. Polls\n * every 5s.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport {\n\tfetchVectorCortexEvaluation,\n\tfetchVectorCortexHealth,\n\tfetchVectorCortexLedger,\n\tfetchVectorCortexQuery,\n\tfetchVectorCortexReconstruct,\n\tfetchVectorCortexPlans,\n\tfetchVectorCortexRender,\n\tfetchVectorCortexRollout,\n\tfetchVectorCortexClosureProof,\n\tfetchVectorCortexRestore,\n\tfetchVectorCortexShards,\n\tfetchVectorCortexTopology,\n\tresetVectorCortexBreaker,\n\ttype VectorCortexEvaluationSummary,\n\ttype VectorCortexHealthCard,\n\ttype VectorCortexLedgerView,\n\ttype VectorCortexQueryView,\n\ttype VectorCortexReconstructView,\n\ttype VectorCortexPlansView,\n\ttype VectorCortexRenderView,\n\ttype VectorCortexRolloutView,\n\ttype VectorCortexClosureProofView,\n\ttype VectorCortexRestoreView,\n\ttype VectorCortexShardsView,\n\ttype VectorCortexTopologyView,\n} from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\nimport { Metric } from \"./VectorCortexMetric\";\nimport { VectorCortexRenderCard } from \"./VectorCortexRenderCard\";\nimport { VectorCortexRolloutCard } from \"./VectorCortexRolloutCard\";\nimport { VectorCortexClosureCard } from \"./VectorCortexClosureCard\";\nimport { VectorCortexRestoreCard } from \"./VectorCortexRestoreCard\";\nimport { VectorCortexPlansCard } from \"./VectorCortexPlansCard\";\nimport { VectorCortexTopologyCard } from \"./VectorCortexTopologyCard\";\nimport { VectorCortexLedgerCard } from \"./VectorCortexLedgerCard\";\n\nfunction ModeChip({ mode, count }: { mode: string; count: number }): React.ReactElement {\n\treturn (\n\t\t<div className=\"flex items-center justify-between border-b border-border/50 py-1 text-sm\">\n\t\t\t<span className=\"text-muted-foreground\">Mode {mode}</span>\n\t\t\t<span className=\"font-mono\">{count}</span>\n\t\t</div>\n\t);\n}\n\nexport default function VectorCortexTab(): React.ReactElement {\n\tconst [data, setData] = useState<VectorCortexEvaluationSummary | null>(null);\n\tconst [err, setError] = useState<string | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst [health, setHealth] = useState<VectorCortexHealthCard | null>(null);\n\tconst [resetMsg, setResetMsg] = useState<string | null>(null);\n\tconst [ledger, setLedger] = useState<VectorCortexLedgerView | null>(null);\n\tconst [topology, setTopology] = useState<VectorCortexTopologyView | null>(null);\n\tconst [query, setQuery] = useState<VectorCortexQueryView | null>(null);\n\tconst [shards, setShards] = useState<VectorCortexShardsView | null>(null);\n\tconst [reconstruct, setReconstruct] = useState<VectorCortexReconstructView | null>(null);\n\tconst [plans, setPlans] = useState<VectorCortexPlansView | null>(null);\n\tconst [render, setRender] = useState<VectorCortexRenderView | null>(null);\n\tconst [rollout, setRollout] = useState<VectorCortexRolloutView | null>(null);\n\tconst [closureProof, setClosureProof] = useState<VectorCortexClosureProofView | null>(null);\n\tconst [restore, setRestore] = useState<VectorCortexRestoreView | null>(null);\n\n\tconst poll = useCallback(() => {\n\t\tfetchVectorCortexEvaluation()\n\t\t\t.then(setData)\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\t\t.finally(() => setLoading(false));\n\t\tfetchVectorCortexHealth().then(setHealth).catch(() => {\n\t\t\t/* health card is best-effort (VC0C) */\n\t\t});\n\t\tfetchVectorCortexLedger().then(setLedger).catch(() => {\n\t\t\t/* ledger card is best-effort (VC1B) */\n\t\t});\n\t\tfetchVectorCortexTopology().then(setTopology).catch(() => {\n\t\t\t/* topology card is best-effort (VC3A) */\n\t\t});\n\t\tfetchVectorCortexQuery().then(setQuery).catch(() => {\n\t\t\t/* query diagnostics card is best-effort (VC3C) */\n\t\t});\n\t\tfetchVectorCortexShards().then(setShards).catch(() => {\n\t\t\t/* dual-tier shards card is best-effort (VC4A) */\n\t\t});\n\t\tfetchVectorCortexReconstruct().then(setReconstruct).catch(() => {\n\t\t\t/* reconstruction-fidelity card is best-effort (VC4C) */\n\t\t});\n\t\tfetchVectorCortexPlans().then(setPlans).catch(() => {\n\t\t\t/* plan manifest card is best-effort (VC5A) */\n\t\t});\n\t\tfetchVectorCortexRender().then(setRender).catch(() => {\n\t\t\t/* render conformance card is best-effort (VC5B) */\n\t\t});\n\t\tfetchVectorCortexRollout().then(setRollout).catch(() => {\n\t\t\t/* rollout card is best-effort (VC5C) */\n\t\t});\n\t\tfetchVectorCortexClosureProof().then(setClosureProof).catch(() => {\n\t\t\t/* closure-optimization card is best-effort (VC6A) */\n\t\t});\n\t\tfetchVectorCortexRestore().then(setRestore).catch(() => {\n\t\t\t/* exact-source-restoration card is best-effort (VC6B) */\n\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\tconst onReset = () => {\n\t\tresetVectorCortexBreaker(\"provider\")\n\t\t\t.then((r) => {\n\t\t\t\tsetResetMsg(\n\t\t\t\t\t`Breaker \"${r.subsystem}\" ${r.state}; evidence retained: ${r.failures} failures / ${r.attempts} attempts`,\n\t\t\t\t);\n\t\t\t\treturn fetchVectorCortexHealth();\n\t\t\t})\n\t\t\t.then(setHealth)\n\t\t\t.catch((e: unknown) =>\n\t\t\t\tsetResetMsg(e instanceof Error ? e.message : String(e)),\n\t\t\t);\n\t};\n\n\tif (loading && !data)\n\t\treturn <div className=\"vc-loading\">Loading vector-cortex evaluation…</div>;\n\tif (err && !data)\n\t\treturn <div className=\"vc-error\">Error: {err}</div>;\n\tif (!data)\n\t\treturn <div className=\"vc-empty\">No evaluation data available.</div>;\n\n\tconst max = Math.max(1, ...data.histogram.cells, data.histogram.overflow);\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<h2 className=\"text-lg font-semibold\">Vector Cortex Evaluation</h2>\n\t\t\t\t{data.enabled ? (\n\t\t\t\t\t<Badge variant=\"warning\">OBSERVER PENDING (A)</Badge>\n\t\t\t\t) : (\n\t\t\t\t\t<Badge variant=\"danger\">MODE C (OFF)</Badge>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Samples</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"text-3xl font-bold\">{data.samples}</div>\n\t\t\t\t\t\t<div className=\"mt-2 flex flex-col\">\n\t\t\t\t\t\t\t<ModeChip mode=\"A\" count={data.byMode.A} />\n\t\t\t\t\t\t\t<ModeChip mode=\"B\" count={data.byMode.B} />\n\t\t\t\t\t\t\t<ModeChip mode=\"C\" count={data.byMode.C} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card className=\"md:col-span-2\">\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Latency Histogram (ms, inclusive edges)</CardTitle>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"flex items-end gap-2\" style={{ height: 160 }}>\n\t\t\t\t\t\t\t{data.histogram.edges.map((edge, i) => {\n\t\t\t\t\t\t\t\tconst h = (data.histogram.cells[i] / max) * 140;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div key={edge} className=\"flex flex-1 flex-col items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{data.histogram.cells[i]}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full rounded-t\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ height: Math.max(2, h), background: \"#6366f1\" }}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] text-muted-foreground\">≤{edge}</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t<div className=\"flex flex-1 flex-col items-center gap-1\">\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{data.histogram.overflow}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"w-full rounded-t\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\theight: Math.max(2, (data.histogram.overflow / max) * 140),\n\t\t\t\t\t\t\t\t\t\tbackground: \"#f87171\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"text-[10px] text-muted-foreground\">>250</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-1 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tTotal: {data.histogram.total} · Rejects: {data.rejects.length}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t</div>\n\n\t\t\t<Card>\n\t\t\t\t<CardHeader>\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<CardTitle>Live Safety Envelope (VC0C)</CardTitle>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t{health?.stateSource === \"ephemeral\" && (\n\t\t\t\t\t\t\t\t<Badge variant=\"outline\">EPHEMERAL (non-live)</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tonClick={onReset}\n\t\t\t\t\t\t\t\tdisabled={!health?.enabled}\n\t\t\t\t\t\t\t\tclassName=\"rounded border border-border px-2 py-1 text-xs disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tReset Cooldown\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\t\t\t\t<CardContent>\n\t\t\t\t\t{resetMsg && (\n\t\t\t\t\t\t<div className=\"mb-2 text-xs text-muted-foreground\">{resetMsg}</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{!health ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">Health unavailable (VC0C off).</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t\t<Metric label=\"State\" value={health.state} />\n\t\t\t\t\t\t\t<Metric label=\"Mode\" value={health.mode} />\n\t\t\t\t\t\t\t<Metric label=\"Window\" value={`${health.windowMs}ms`} />\n\t\t\t\t\t\t\t<Metric label=\"Probes\" value={String(health.probeCount)} />\n\t\t\t\t\t\t\t<Metric label=\"Backoff\" value={`${health.backoffDelayMs}ms`} />\n\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\tlabel=\"Failures\"\n\t\t\t\t\t\t\t\tvalue={`${health.failures}/${health.attempts}`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\tlabel=\"Frontier\"\n\t\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\t\thealth.stateSource === \"ephemeral\"\n\t\t\t\t\t\t\t\t\t\t? \"non-live\"\n\t\t\t\t\t\t\t\t\t\t: health.frontierFrozen\n\t\t\t\t\t\t\t\t\t\t\t? \"FROZEN\"\n\t\t\t\t\t\t\t\t\t\t\t: \"LIVE\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Metric label=\"Spool lag\" value={String(health.spoolLag)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Encoder mode\" value={health.encoderMode} />\n\t\t\t\t\t\t\t\t<Metric label=\"Encoder asset\" value={health.encoderAssetDigest ? health.encoderAssetDigest.slice(0, 12) : \"none\"} />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t\t<VectorCortexTopologyCard topology={topology} query={query} />\n\t\t\t<Card>\n\t\t\t\t<CardHeader>\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<CardTitle>Dual-Tier Shards (VC4A)</CardTitle>\n\t\t\t\t\t\t{shards?.enabled ? (\n\t\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\t\t\t\t<CardContent>\n\t\t\t\t\t{!shards?.enabled ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">Dual-tier shards disabled (VC4A off).</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t\t\t<Metric label=\"Semantic shards\" value={String(shards.semanticCount)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Exact shards\" value={String(shards.exactCount)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Byte total\" value={String(shards.byteTotal)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Protected bytes\" value={String(shards.protectedByteTotal)} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tReader-only count/byte aggregate; staged in-memory this sprint.\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</CardContent>\n\t\t\t</Card>\n\t\t\t<Card>\n\t\t\t\t<CardHeader>\n\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t<CardTitle>Reconstruction Fidelity (VC4C)</CardTitle>\n\t\t\t\t\t\t{reconstruct?.enabled ? (\n\t\t\t\t\t\t\t<Badge variant=\"success\">ACTIVE</Badge>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Badge variant=\"danger\">OFF</Badge>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\t\t\t\t<CardContent>\n\t\t\t\t\t{!reconstruct?.enabled ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">Reconstruction fidelity disabled (VC4C off).</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n\t\t\t\t\t\t\t\t<Metric label=\"Closure attempts\" value={String(reconstruct.closureAttempts)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Closure rejections\" value={String(reconstruct.closureRejections)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Validated\" value={String(reconstruct.validatedCount)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Invalidated\" value={String(reconstruct.invalidatedCount)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Span total\" value={String(reconstruct.spanTotal)} />\n\t\t\t\t\t\t\t\t<Metric label=\"Byte total\" value={String(reconstruct.byteTotal)} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"mt-3 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tReader-only closure/validation aggregate; staged in-memory this sprint.\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</CardContent>\n\t\t\t</Card>\n\t\t\t<VectorCortexPlansCard view={plans} />\n\t\t\t<VectorCortexRenderCard view={render} />\n\t\t\t<VectorCortexRolloutCard view={rollout} />\n\t\t\t<VectorCortexClosureCard view={closureProof} />\n\t\t\t<VectorCortexRestoreCard view={restore} />\n\t\t\t<VectorCortexLedgerCard ledger={ledger} />\n\t\t</div>\n\t);\n}\n"],"names":["fetchVectorCortexEvaluation","r","fetchVectorCortexHealth","fetchVectorCortexTopology","fetchVectorCortexQuery","fetchVectorCortexShards","fetchVectorCortexReconstruct","fetchVectorCortexPlans","fetchVectorCortexRender","fetchVectorCortexRollout","fetchVectorCortexClosureProof","fetchVectorCortexRestore","fetchVectorCortexLedger","session","resetVectorCortexBreaker","subsystem","Metric","label","value","jsx","VectorCortexRenderCard","view","Card","CardHeader","jsxs","CardTitle","Badge","CardContent","Fragment","VectorCortexRolloutCard","VectorCortexClosureCard","VectorCortexRestoreCard","VectorCortexPlansCard","VectorCortexTopologyCard","topology","query","e","i","VectorCortexLedgerCard","ledger","o","ModeChip","mode","count","VectorCortexTab","data","setData","useState","err","setError","loading","setLoading","health","setHealth","resetMsg","setResetMsg","setLedger","setTopology","setQuery","shards","setShards","reconstruct","setReconstruct","plans","setPlans","render","setRender","rollout","setRollout","closureProof","setClosureProof","restore","setRestore","poll","useCallback","useEffect","id","onReset","max","edge","h"],"mappings":"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"}
|