pi-mega-compact 0.20.7 → 0.20.8
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 +12 -0
- package/dist/config.js +1 -1
- package/dist/extensions/dashboard-server/api-contracts/vector-cortex-heal.js +11 -0
- package/dist/extensions/dashboard-server/route-dispatch.js +102 -0
- package/dist/extensions/dashboard-server/routes-rag-settings-vector-cortex.js +1 -0
- package/dist/extensions/dashboard-server/routes-vector-cortex-heal.js +47 -0
- package/dist/extensions/dashboard-server/routes-vector-cortex.js +1 -0
- package/dist/extensions/dashboard-server/routes.js +1 -1
- package/dist/extensions/dashboard-server/server.js +3 -82
- package/dist/src/config/vector-cortex.js +12 -0
- package/dist/src/config.js +1 -1
- package/dist/src/vector-cortex/heal/_acceptance-fixture.js +56 -0
- package/dist/src/vector-cortex/heal/closure-metrics.js +66 -0
- package/dist/src/vector-cortex/heal/closure-opt.js +242 -0
- package/dist/src/vector-cortex/heal/emit.js +69 -0
- package/dist/src/vector-cortex/heal/proof.js +210 -0
- package/dist/src/vector-cortex/heal/types.js +42 -0
- package/dist/vector-cortex/heal/_acceptance-fixture.js +56 -0
- package/dist/vector-cortex/heal/closure-metrics.js +66 -0
- package/dist/vector-cortex/heal/closure-opt.js +242 -0
- package/dist/vector-cortex/heal/emit.js +69 -0
- package/dist/vector-cortex/heal/proof.js +210 -0
- package/dist/vector-cortex/heal/types.js +42 -0
- package/extensions/dashboard-client/dist/assets/{AreaChart-DqTbaSRA.js → AreaChart-5yxaI8IO.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-DqTbaSRA.js.map → AreaChart-5yxaI8IO.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-BfNBeOvF.js → BarChart-BoHhCqH-.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-BfNBeOvF.js.map → BarChart-BoHhCqH-.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-C9SOMYB5.js → CacheTab-Di6L3CsF.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-C9SOMYB5.js.map → CacheTab-Di6L3CsF.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-GsMKP10_.js → EventsTab-Cdff3h6s.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-GsMKP10_.js.map → EventsTab-Cdff3h6s.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-DAOCXwRP.js → HealthTab-MthYYVLw.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-DAOCXwRP.js.map → HealthTab-MthYYVLw.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-BtBeMkB5.js → MaintenanceTab-D9G4ntsG.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-BtBeMkB5.js.map → MaintenanceTab-D9G4ntsG.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-DzndtgkZ.js → MemoryMapTab-CN8Lr5Qf.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-DzndtgkZ.js.map → MemoryMapTab-CN8Lr5Qf.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DyxJ4eb8.js → MetricsTab-CgO32kSo.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DyxJ4eb8.js.map → MetricsTab-CgO32kSo.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DCiEdVWR.js → OverviewTab-Cb4kR0h1.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DCiEdVWR.js.map → OverviewTab-Cb4kR0h1.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-B5SIqVHA.js → ReposTab-Dt1FGnMR.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-B5SIqVHA.js.map → ReposTab-Dt1FGnMR.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DLWFJ9xI.js → SessionsTab-D7D2RW6U.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-DLWFJ9xI.js.map → SessionsTab-D7D2RW6U.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SetupTab-CvGXZyej.js → SetupTab-CgV5xCzz.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SetupTab-CvGXZyej.js.map → SetupTab-CgV5xCzz.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-wZuQGxLS.js → TimeSavedCard-CCNuJjyO.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-wZuQGxLS.js.map → TimeSavedCard-CCNuJjyO.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-B7aOejch.js → TurnsTab-Cv1OCttJ.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-B7aOejch.js.map → TurnsTab-Cv1OCttJ.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-DTabQo6h.js +2 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-DTabQo6h.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{WikiTab-DhWHjAtt.js → WikiTab-B48QnQrK.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{WikiTab-DhWHjAtt.js.map → WikiTab-B48QnQrK.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{button-BrC-W87h.js → button-BBQl2MiF.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{button-BrC-W87h.js.map → button-BBQl2MiF.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-0rgfRgr3.js → card-BYbefUur.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-0rgfRgr3.js.map → card-BYbefUur.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DRresOQF.js → generateCategoricalChart-swm0YZe0.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-DRresOQF.js.map → generateCategoricalChart-swm0YZe0.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-DohmtZWL.js → index-DeIky7xm.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-DohmtZWL.js.map → index-DeIky7xm.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{switch-Bs8g_zB5.js → switch-CctU78ww.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-Bs8g_zB5.js.map → switch-CctU78ww.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-DVVauIo8.js → toggle-BRCNCoiI.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-DVVauIo8.js.map → toggle-BRCNCoiI.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-DxH1PTAR.js → useSSE-WfOiWDH_.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-DxH1PTAR.js.map → useSSE-WfOiWDH_.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/VectorCortexClosureCard.tsx +46 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexLedgerCard.tsx +80 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexTab.tsx +12 -164
- package/extensions/dashboard-client/src/tabs/VectorCortexTopologyCard.tsx +131 -0
- package/extensions/dashboard-client/src/types/vector-cortex.ts +14 -0
- package/extensions/dashboard-server/api-contracts/vector-cortex-heal.ts +43 -0
- package/extensions/dashboard-server/api-contracts/vector-cortex.ts +2 -0
- package/extensions/dashboard-server/route-dispatch.ts +112 -0
- package/extensions/dashboard-server/routes-rag-settings-vector-cortex.ts +6 -0
- package/extensions/dashboard-server/routes-vector-cortex-heal.ts +56 -0
- package/extensions/dashboard-server/routes-vector-cortex.ts +1 -0
- package/extensions/dashboard-server/routes.ts +1 -0
- package/extensions/dashboard-server/server.ts +3 -86
- package/package.json +1 -1
- package/src/config/vector-cortex.ts +13 -0
- package/src/config.ts +1 -0
- package/src/vector-cortex/heal/_acceptance-fixture.ts +108 -0
- package/src/vector-cortex/heal/closure-metrics.ts +73 -0
- package/src/vector-cortex/heal/closure-opt.ts +266 -0
- package/src/vector-cortex/heal/emit.ts +93 -0
- package/src/vector-cortex/heal/proof.ts +234 -0
- package/src/vector-cortex/heal/types.ts +226 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-eHVt9yDx.js +0 -2
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-eHVt9yDx.js.map +0 -1
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
fetchVectorCortexPlans,
|
|
18
18
|
fetchVectorCortexRender,
|
|
19
19
|
fetchVectorCortexRollout,
|
|
20
|
+
fetchVectorCortexClosureProof,
|
|
20
21
|
fetchVectorCortexShards,
|
|
21
22
|
fetchVectorCortexTopology,
|
|
22
23
|
resetVectorCortexBreaker,
|
|
@@ -28,6 +29,7 @@ import {
|
|
|
28
29
|
type VectorCortexPlansView,
|
|
29
30
|
type VectorCortexRenderView,
|
|
30
31
|
type VectorCortexRolloutView,
|
|
32
|
+
type VectorCortexClosureProofView,
|
|
31
33
|
type VectorCortexShardsView,
|
|
32
34
|
type VectorCortexTopologyView,
|
|
33
35
|
} from "../api/vector-cortex";
|
|
@@ -36,7 +38,10 @@ import { Badge } from "../components/ui/badge";
|
|
|
36
38
|
import { Metric } from "./VectorCortexMetric";
|
|
37
39
|
import { VectorCortexRenderCard } from "./VectorCortexRenderCard";
|
|
38
40
|
import { VectorCortexRolloutCard } from "./VectorCortexRolloutCard";
|
|
41
|
+
import { VectorCortexClosureCard } from "./VectorCortexClosureCard";
|
|
39
42
|
import { VectorCortexPlansCard } from "./VectorCortexPlansCard";
|
|
43
|
+
import { VectorCortexTopologyCard } from "./VectorCortexTopologyCard";
|
|
44
|
+
import { VectorCortexLedgerCard } from "./VectorCortexLedgerCard";
|
|
40
45
|
|
|
41
46
|
function ModeChip({ mode, count }: { mode: string; count: number }): React.ReactElement {
|
|
42
47
|
return (
|
|
@@ -61,6 +66,7 @@ export default function VectorCortexTab(): React.ReactElement {
|
|
|
61
66
|
const [plans, setPlans] = useState<VectorCortexPlansView | null>(null);
|
|
62
67
|
const [render, setRender] = useState<VectorCortexRenderView | null>(null);
|
|
63
68
|
const [rollout, setRollout] = useState<VectorCortexRolloutView | null>(null);
|
|
69
|
+
const [closureProof, setClosureProof] = useState<VectorCortexClosureProofView | null>(null);
|
|
64
70
|
|
|
65
71
|
const poll = useCallback(() => {
|
|
66
72
|
fetchVectorCortexEvaluation()
|
|
@@ -96,6 +102,9 @@ export default function VectorCortexTab(): React.ReactElement {
|
|
|
96
102
|
fetchVectorCortexRollout().then(setRollout).catch(() => {
|
|
97
103
|
/* rollout card is best-effort (VC5C) */
|
|
98
104
|
});
|
|
105
|
+
fetchVectorCortexClosureProof().then(setClosureProof).catch(() => {
|
|
106
|
+
/* closure-optimization card is best-effort (VC6A) */
|
|
107
|
+
});
|
|
99
108
|
}, []);
|
|
100
109
|
|
|
101
110
|
useEffect(() => {
|
|
@@ -246,110 +255,7 @@ export default function VectorCortexTab(): React.ReactElement {
|
|
|
246
255
|
)}
|
|
247
256
|
</CardContent>
|
|
248
257
|
</Card>
|
|
249
|
-
<
|
|
250
|
-
<CardHeader>
|
|
251
|
-
<div className="flex items-center justify-between">
|
|
252
|
-
<CardTitle>Derived Cortex Store (VC3A)</CardTitle>
|
|
253
|
-
{topology?.enabled ? (
|
|
254
|
-
<Badge variant="success">ACTIVE</Badge>
|
|
255
|
-
) : (
|
|
256
|
-
<Badge variant="danger">OFF</Badge>
|
|
257
|
-
)}
|
|
258
|
-
</div>
|
|
259
|
-
</CardHeader>
|
|
260
|
-
<CardContent>
|
|
261
|
-
{!topology?.enabled ? (
|
|
262
|
-
<div className="vc-empty">Cortex store disabled (VC3A off).</div>
|
|
263
|
-
) : (
|
|
264
|
-
<>
|
|
265
|
-
<div className="grid grid-cols-2 gap-4 md:grid-cols-3">
|
|
266
|
-
<Metric label="Generation" value={topology.generationId ?? "—"} />
|
|
267
|
-
<Metric label="Ordinal" value={topology.ordinal ?? "—"} />
|
|
268
|
-
<Metric label="Records" value={String(topology.recordCount)} />
|
|
269
|
-
<Metric label="Frontier (HW)" value={topology.sourceHighWater} />
|
|
270
|
-
<Metric
|
|
271
|
-
label="Root digest"
|
|
272
|
-
value={topology.rootDigest ? topology.rootDigest.slice(0, 16) : "—"}
|
|
273
|
-
/>
|
|
274
|
-
{topology.nodes !== undefined && (
|
|
275
|
-
<>
|
|
276
|
-
<Metric
|
|
277
|
-
label="Nodes"
|
|
278
|
-
value={String(topology.nodes?.length ?? 0)}
|
|
279
|
-
/>
|
|
280
|
-
<Metric
|
|
281
|
-
label="Edges"
|
|
282
|
-
value={String(topology.edges?.length ?? 0)}
|
|
283
|
-
/>
|
|
284
|
-
<Metric
|
|
285
|
-
label="Graph digest"
|
|
286
|
-
value={
|
|
287
|
-
topology.generationDigest
|
|
288
|
-
? topology.generationDigest.slice(0, 16)
|
|
289
|
-
: "—"
|
|
290
|
-
}
|
|
291
|
-
/>
|
|
292
|
-
</>
|
|
293
|
-
)}
|
|
294
|
-
</div>
|
|
295
|
-
{topology.nodes !== undefined &&
|
|
296
|
-
(topology.edges?.length ?? 0) > 0 && (
|
|
297
|
-
<div className="mt-4 max-h-56 overflow-y-auto">
|
|
298
|
-
<div className="mb-1 text-xs font-medium text-muted-foreground">
|
|
299
|
-
Topology edges (VC3B)
|
|
300
|
-
</div>
|
|
301
|
-
<table className="w-full text-left text-xs">
|
|
302
|
-
<thead>
|
|
303
|
-
<tr className="border-b border-border/50 text-muted-foreground">
|
|
304
|
-
<th className="py-1 pr-2">source</th>
|
|
305
|
-
<th className="py-1 pr-2">target</th>
|
|
306
|
-
<th className="py-1 pr-2">head</th>
|
|
307
|
-
<th className="py-1 pr-2">dir</th>
|
|
308
|
-
<th className="py-1">score</th>
|
|
309
|
-
</tr>
|
|
310
|
-
</thead>
|
|
311
|
-
<tbody>
|
|
312
|
-
{topology.edges?.map((e, i) => (
|
|
313
|
-
<tr
|
|
314
|
-
key={`${e.source}-${e.target}-${e.head}-${i}`}
|
|
315
|
-
className="border-b border-border/30"
|
|
316
|
-
>
|
|
317
|
-
<td className="py-1 pr-2 font-mono">{e.source}</td>
|
|
318
|
-
<td className="py-1 pr-2 font-mono">{e.target}</td>
|
|
319
|
-
<td className="py-1 pr-2 font-mono">{e.head}</td>
|
|
320
|
-
<td className="py-1 pr-2">{e.direction}</td>
|
|
321
|
-
<td className="py-1 font-mono">{e.score}</td>
|
|
322
|
-
</tr>
|
|
323
|
-
))}
|
|
324
|
-
</tbody>
|
|
325
|
-
</table>
|
|
326
|
-
</div>
|
|
327
|
-
)}
|
|
328
|
-
</>
|
|
329
|
-
)}
|
|
330
|
-
</CardContent>
|
|
331
|
-
</Card>
|
|
332
|
-
<Card>
|
|
333
|
-
<CardHeader>
|
|
334
|
-
<div className="flex items-center justify-between">
|
|
335
|
-
<CardTitle>Topology Query Diagnostics (VC3C)</CardTitle>
|
|
336
|
-
{query?.enabled ? (
|
|
337
|
-
<Badge variant="success">ACTIVE</Badge>
|
|
338
|
-
) : (
|
|
339
|
-
<Badge variant="danger">OFF</Badge>
|
|
340
|
-
)}
|
|
341
|
-
</div>
|
|
342
|
-
</CardHeader>
|
|
343
|
-
<CardContent>
|
|
344
|
-
{!query?.enabled ? (
|
|
345
|
-
<div className="vc-empty">Query diagnostics unavailable (VC3C off).</div>
|
|
346
|
-
) : (
|
|
347
|
-
<div className="grid grid-cols-2 gap-4 md:grid-cols-3">
|
|
348
|
-
<Metric label="Router version" value={String(query.routerVersion)} />
|
|
349
|
-
</div>
|
|
350
|
-
)}
|
|
351
|
-
</CardContent>
|
|
352
|
-
</Card>
|
|
258
|
+
<VectorCortexTopologyCard topology={topology} query={query} />
|
|
353
259
|
<Card>
|
|
354
260
|
<CardHeader>
|
|
355
261
|
<div className="flex items-center justify-between">
|
|
@@ -413,66 +319,8 @@ export default function VectorCortexTab(): React.ReactElement {
|
|
|
413
319
|
<VectorCortexPlansCard view={plans} />
|
|
414
320
|
<VectorCortexRenderCard view={render} />
|
|
415
321
|
<VectorCortexRolloutCard view={rollout} />
|
|
416
|
-
<
|
|
417
|
-
|
|
418
|
-
<div className="flex items-center justify-between">
|
|
419
|
-
<CardTitle>Occurrence Ledger (VC1B)</CardTitle>
|
|
420
|
-
{ledger?.enabled ? (
|
|
421
|
-
<Badge variant="success">ACTIVE</Badge>
|
|
422
|
-
) : (
|
|
423
|
-
<Badge variant="danger">OFF</Badge>
|
|
424
|
-
)}
|
|
425
|
-
</div>
|
|
426
|
-
</CardHeader>
|
|
427
|
-
<CardContent>
|
|
428
|
-
{!ledger?.enabled ? (
|
|
429
|
-
<div className="vc-empty">Ledger disabled (VC1B off).</div>
|
|
430
|
-
) : (
|
|
431
|
-
<>
|
|
432
|
-
<div className="mb-3 grid grid-cols-2 gap-4 md:grid-cols-3">
|
|
433
|
-
<Metric label="Session" value={ledger.session} />
|
|
434
|
-
<Metric label="High-water" value={ledger.highWater} />
|
|
435
|
-
<Metric label="Occurrences" value={String(ledger.count)} />
|
|
436
|
-
</div>
|
|
437
|
-
{ledger.occurrences.length === 0 ? (
|
|
438
|
-
<div className="vc-empty">No occurrences recorded.</div>
|
|
439
|
-
) : (
|
|
440
|
-
<div className="max-h-64 overflow-y-auto">
|
|
441
|
-
<table className="w-full text-left text-xs">
|
|
442
|
-
<thead>
|
|
443
|
-
<tr className="border-b border-border/50 text-muted-foreground">
|
|
444
|
-
<th className="py-1 pr-2">seq</th>
|
|
445
|
-
<th className="py-1 pr-2">eventId</th>
|
|
446
|
-
<th className="py-1 pr-2">kind</th>
|
|
447
|
-
<th className="py-1 pr-2">toolCall</th>
|
|
448
|
-
<th className="py-1">digest</th>
|
|
449
|
-
</tr>
|
|
450
|
-
</thead>
|
|
451
|
-
<tbody>
|
|
452
|
-
{ledger.occurrences.map((o) => (
|
|
453
|
-
<tr
|
|
454
|
-
key={`${o.seq}-${o.eventId}`}
|
|
455
|
-
className="border-b border-border/30"
|
|
456
|
-
>
|
|
457
|
-
<td className="py-1 pr-2 font-mono">{o.seq}</td>
|
|
458
|
-
<td className="py-1 pr-2 font-mono">{o.eventId}</td>
|
|
459
|
-
<td className="py-1 pr-2">{o.kind}</td>
|
|
460
|
-
<td className="py-1 pr-2 font-mono">
|
|
461
|
-
{o.toolCallId ?? "\u2014"}
|
|
462
|
-
</td>
|
|
463
|
-
<td className="max-w-[180px] truncate font-mono text-muted-foreground">
|
|
464
|
-
{o.digest}
|
|
465
|
-
</td>
|
|
466
|
-
</tr>
|
|
467
|
-
))}
|
|
468
|
-
</tbody>
|
|
469
|
-
</table>
|
|
470
|
-
</div>
|
|
471
|
-
)}
|
|
472
|
-
</>
|
|
473
|
-
)}
|
|
474
|
-
</CardContent>
|
|
475
|
-
</Card>
|
|
322
|
+
<VectorCortexClosureCard view={closureProof} />
|
|
323
|
+
<VectorCortexLedgerCard ledger={ledger} />
|
|
476
324
|
</div>
|
|
477
325
|
);
|
|
478
326
|
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VectorCortexTopologyCard.tsx — VC3A/VC3B topology + VC3C query diagnostics cards.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from VectorCortexTab.tsx to keep the parent tab under the 400-line
|
|
5
|
+
* extension soft limit (delegate-shell + impl-card pattern).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
VectorCortexTopologyView,
|
|
10
|
+
VectorCortexQueryView,
|
|
11
|
+
} from "../api/vector-cortex";
|
|
12
|
+
import { Card, CardContent, CardHeader, CardTitle } from "../components/ui/card";
|
|
13
|
+
import { Badge } from "../components/ui/badge";
|
|
14
|
+
import { Metric } from "./VectorCortexMetric";
|
|
15
|
+
|
|
16
|
+
export function VectorCortexTopologyCard({
|
|
17
|
+
topology,
|
|
18
|
+
query,
|
|
19
|
+
}: {
|
|
20
|
+
topology: VectorCortexTopologyView | null;
|
|
21
|
+
query: VectorCortexQueryView | null;
|
|
22
|
+
}): React.ReactElement {
|
|
23
|
+
return (
|
|
24
|
+
<>
|
|
25
|
+
<Card>
|
|
26
|
+
<CardHeader>
|
|
27
|
+
<div className="flex items-center justify-between">
|
|
28
|
+
<CardTitle>Derived Cortex Store (VC3A)</CardTitle>
|
|
29
|
+
{topology?.enabled ? (
|
|
30
|
+
<Badge variant="success">ACTIVE</Badge>
|
|
31
|
+
) : (
|
|
32
|
+
<Badge variant="danger">OFF</Badge>
|
|
33
|
+
)}
|
|
34
|
+
</div>
|
|
35
|
+
</CardHeader>
|
|
36
|
+
<CardContent>
|
|
37
|
+
{!topology?.enabled ? (
|
|
38
|
+
<div className="vc-empty">Cortex store disabled (VC3A off).</div>
|
|
39
|
+
) : (
|
|
40
|
+
<>
|
|
41
|
+
<div className="grid grid-cols-2 gap-4 md:grid-cols-3">
|
|
42
|
+
<Metric label="Generation" value={topology.generationId ?? "—"} />
|
|
43
|
+
<Metric label="Ordinal" value={topology.ordinal ?? "—"} />
|
|
44
|
+
<Metric label="Records" value={String(topology.recordCount)} />
|
|
45
|
+
<Metric label="Frontier (HW)" value={topology.sourceHighWater} />
|
|
46
|
+
<Metric
|
|
47
|
+
label="Root digest"
|
|
48
|
+
value={topology.rootDigest ? topology.rootDigest.slice(0, 16) : "—"}
|
|
49
|
+
/>
|
|
50
|
+
{topology.nodes !== undefined && (
|
|
51
|
+
<>
|
|
52
|
+
<Metric
|
|
53
|
+
label="Nodes"
|
|
54
|
+
value={String(topology.nodes?.length ?? 0)}
|
|
55
|
+
/>
|
|
56
|
+
<Metric
|
|
57
|
+
label="Edges"
|
|
58
|
+
value={String(topology.edges?.length ?? 0)}
|
|
59
|
+
/>
|
|
60
|
+
<Metric
|
|
61
|
+
label="Graph digest"
|
|
62
|
+
value={
|
|
63
|
+
topology.generationDigest
|
|
64
|
+
? topology.generationDigest.slice(0, 16)
|
|
65
|
+
: "—"
|
|
66
|
+
}
|
|
67
|
+
/>
|
|
68
|
+
</>
|
|
69
|
+
)}
|
|
70
|
+
</div>
|
|
71
|
+
{topology.nodes !== undefined &&
|
|
72
|
+
(topology.edges?.length ?? 0) > 0 && (
|
|
73
|
+
<div className="mt-4 max-h-56 overflow-y-auto">
|
|
74
|
+
<div className="mb-1 text-xs font-medium text-muted-foreground">
|
|
75
|
+
Topology edges (VC3B)
|
|
76
|
+
</div>
|
|
77
|
+
<table className="w-full text-left text-xs">
|
|
78
|
+
<thead>
|
|
79
|
+
<tr className="border-b border-border/50 text-muted-foreground">
|
|
80
|
+
<th className="py-1 pr-2">source</th>
|
|
81
|
+
<th className="py-1 pr-2">target</th>
|
|
82
|
+
<th className="py-1 pr-2">head</th>
|
|
83
|
+
<th className="py-1 pr-2">dir</th>
|
|
84
|
+
<th className="py-1">score</th>
|
|
85
|
+
</tr>
|
|
86
|
+
</thead>
|
|
87
|
+
<tbody>
|
|
88
|
+
{topology.edges?.map((e, i) => (
|
|
89
|
+
<tr
|
|
90
|
+
key={`${e.source}-${e.target}-${e.head}-${i}`}
|
|
91
|
+
className="border-b border-border/30"
|
|
92
|
+
>
|
|
93
|
+
<td className="py-1 pr-2 font-mono">{e.source}</td>
|
|
94
|
+
<td className="py-1 pr-2 font-mono">{e.target}</td>
|
|
95
|
+
<td className="py-1 pr-2 font-mono">{e.head}</td>
|
|
96
|
+
<td className="py-1 pr-2">{e.direction}</td>
|
|
97
|
+
<td className="py-1 font-mono">{e.score}</td>
|
|
98
|
+
</tr>
|
|
99
|
+
))}
|
|
100
|
+
</tbody>
|
|
101
|
+
</table>
|
|
102
|
+
</div>
|
|
103
|
+
)}
|
|
104
|
+
</>
|
|
105
|
+
)}
|
|
106
|
+
</CardContent>
|
|
107
|
+
</Card>
|
|
108
|
+
<Card>
|
|
109
|
+
<CardHeader>
|
|
110
|
+
<div className="flex items-center justify-between">
|
|
111
|
+
<CardTitle>Topology Query Diagnostics (VC3C)</CardTitle>
|
|
112
|
+
{query?.enabled ? (
|
|
113
|
+
<Badge variant="success">ACTIVE</Badge>
|
|
114
|
+
) : (
|
|
115
|
+
<Badge variant="danger">OFF</Badge>
|
|
116
|
+
)}
|
|
117
|
+
</div>
|
|
118
|
+
</CardHeader>
|
|
119
|
+
<CardContent>
|
|
120
|
+
{!query?.enabled ? (
|
|
121
|
+
<div className="vc-empty">Query diagnostics unavailable (VC3C off).</div>
|
|
122
|
+
) : (
|
|
123
|
+
<div className="grid grid-cols-2 gap-4 md:grid-cols-3">
|
|
124
|
+
<Metric label="Router version" value={String(query.routerVersion)} />
|
|
125
|
+
</div>
|
|
126
|
+
)}
|
|
127
|
+
</CardContent>
|
|
128
|
+
</Card>
|
|
129
|
+
</>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
@@ -208,3 +208,17 @@ export interface VectorCortexRolloutView {
|
|
|
208
208
|
promotionBlocked: boolean;
|
|
209
209
|
updatedAt: string;
|
|
210
210
|
}
|
|
211
|
+
|
|
212
|
+
/** Reader-only closure-optimization diagnostics view (VC6A). Aggregate only. */
|
|
213
|
+
export interface VectorCortexClosureProofView {
|
|
214
|
+
enabled: boolean;
|
|
215
|
+
mode: "A" | "B" | "C";
|
|
216
|
+
optimizations: number;
|
|
217
|
+
proofRejections: number;
|
|
218
|
+
retainedEdgeTotal: number;
|
|
219
|
+
removedEdgeTotal: number;
|
|
220
|
+
conservativeTraversalTotal: number;
|
|
221
|
+
optimizedTraversalTotal: number;
|
|
222
|
+
lastRejection: string | null;
|
|
223
|
+
updatedAt: string;
|
|
224
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api-contracts/vector-cortex-heal.ts — VC6A+ heal API contracts.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from vector-cortex.ts to keep both files under the 400-line
|
|
5
|
+
* extension soft limit. Owns the reader-only closure-optimization and
|
|
6
|
+
* restoration diagnostic views emitted by the heal sprint handlers.
|
|
7
|
+
*
|
|
8
|
+
* PREVENT-PI-004: type definitions only, no network code.
|
|
9
|
+
* PREVENT-011: no `any` type.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Reader-only closure-optimization diagnostics view for
|
|
14
|
+
* GET /api/vector-cortex/closure-proof (VC6A).
|
|
15
|
+
*
|
|
16
|
+
* AGGREGATE + IDENTITY ONLY: counts and the runtime mode. It deliberately does
|
|
17
|
+
* NOT carry the per-edge proof rows, node ids, the closed selection, or any
|
|
18
|
+
* source payload (SECURITY_PRIVACY — reader-only, no ledger text rendered through
|
|
19
|
+
* a diagnostic surface). The detailed proof lives in the structured event log,
|
|
20
|
+
* not the dashboard.
|
|
21
|
+
*/
|
|
22
|
+
export interface VectorCortexClosureProofView {
|
|
23
|
+
/** Whether the VC6A advanced-closure-optimization flag is enabled. */
|
|
24
|
+
readonly enabled: boolean;
|
|
25
|
+
/** Runtime triad mode of the most recent closure: "A" | "B" | "C". */
|
|
26
|
+
readonly mode: "A" | "B" | "C";
|
|
27
|
+
/** Total optimizations produced (event counter). */
|
|
28
|
+
readonly optimizations: number;
|
|
29
|
+
/** Total proofs rejected by the verifier (event counter). */
|
|
30
|
+
readonly proofRejections: number;
|
|
31
|
+
/** Cumulative retained edges across observed optimizations. */
|
|
32
|
+
readonly retainedEdgeTotal: number;
|
|
33
|
+
/** Cumulative removed edges across observed optimizations. */
|
|
34
|
+
readonly removedEdgeTotal: number;
|
|
35
|
+
/** Cumulative conservative traversal-walk count. */
|
|
36
|
+
readonly conservativeTraversalTotal: number;
|
|
37
|
+
/** Cumulative optimized traversal-walk count. */
|
|
38
|
+
readonly optimizedTraversalTotal: number;
|
|
39
|
+
/** Last rejection reason (a HEAL_* code), or null if none yet. */
|
|
40
|
+
readonly lastRejection: string | null;
|
|
41
|
+
/** ISO timestamp of the snapshot. */
|
|
42
|
+
readonly updatedAt: string;
|
|
43
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dashboard-server/route-dispatch.ts — extracted from server.ts.
|
|
3
|
+
*
|
|
4
|
+
* The dispatch chain: each handler returns true if it ended the response.
|
|
5
|
+
* Extracted to keep server.ts under the 400-line extension soft limit
|
|
6
|
+
* (delegate-shell pattern: server.ts calls this and handles the static fallback).
|
|
7
|
+
*
|
|
8
|
+
* PREVENT-PI-004: local filesystem read only, no network.
|
|
9
|
+
* PREVENT-011: no `any` type.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
13
|
+
import type { RouteContext } from "./routes-core.js";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
handleIndex,
|
|
17
|
+
handleRepoIndex,
|
|
18
|
+
handleEvents,
|
|
19
|
+
handleGameState,
|
|
20
|
+
handleGameScores,
|
|
21
|
+
handlePerfSamples,
|
|
22
|
+
handlePerf,
|
|
23
|
+
handleAchievements,
|
|
24
|
+
handleSessions,
|
|
25
|
+
handleTopics,
|
|
26
|
+
handleTurns,
|
|
27
|
+
handleMaintenance,
|
|
28
|
+
handleProviderCache,
|
|
29
|
+
handleMemoryStatus,
|
|
30
|
+
handleCacheStripes,
|
|
31
|
+
handleSetupStatus,
|
|
32
|
+
handleSetupDetect,
|
|
33
|
+
handleSetupConfigure,
|
|
34
|
+
handleMemoryMap,
|
|
35
|
+
handleRaptorTree,
|
|
36
|
+
handleRaptorBuildHistory,
|
|
37
|
+
handleContextHealth,
|
|
38
|
+
handleCachePoison,
|
|
39
|
+
handleHealthSettings,
|
|
40
|
+
handleEmbedderHealth,
|
|
41
|
+
handleRagSettings,
|
|
42
|
+
handleRagMetrics,
|
|
43
|
+
handleModelThresholds,
|
|
44
|
+
handleWiki,
|
|
45
|
+
handleVectorCortexEvaluation,
|
|
46
|
+
handleVectorCortexHealth,
|
|
47
|
+
handleVectorCortexBreakersReset,
|
|
48
|
+
handleVectorCortexLedger,
|
|
49
|
+
handleVectorCortexTopology,
|
|
50
|
+
handleVectorCortexQuery,
|
|
51
|
+
handleVectorCortexShards,
|
|
52
|
+
handleVectorCortexResidual,
|
|
53
|
+
handleVectorCortexReconstruct,
|
|
54
|
+
handleVectorCortexPlans,
|
|
55
|
+
handleVectorCortexRender,
|
|
56
|
+
handleVectorCortexRollout,
|
|
57
|
+
handleVectorCortexClosureProof,
|
|
58
|
+
} from "./routes.js";
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Dispatch a request through every registered route handler.
|
|
62
|
+
* Returns true if a handler claimed the request (ended the response).
|
|
63
|
+
*/
|
|
64
|
+
export function dispatchRoutes(
|
|
65
|
+
req: IncomingMessage,
|
|
66
|
+
res: ServerResponse,
|
|
67
|
+
ctx: RouteContext,
|
|
68
|
+
): boolean {
|
|
69
|
+
if (handleIndex(req, res, ctx)) return true;
|
|
70
|
+
if (handleRepoIndex(req, res, ctx)) return true;
|
|
71
|
+
if (handleEvents(req, res, ctx)) return true;
|
|
72
|
+
if (handleGameState(req, res, ctx)) return true;
|
|
73
|
+
if (handleGameScores(req, res, ctx)) return true;
|
|
74
|
+
if (handlePerfSamples(req, res, ctx)) return true;
|
|
75
|
+
if (handlePerf(req, res, ctx)) return true;
|
|
76
|
+
if (handleAchievements(req, res, ctx)) return true;
|
|
77
|
+
if (handleSessions(req, res, ctx)) return true;
|
|
78
|
+
if (handleTopics(req, res, ctx)) return true;
|
|
79
|
+
if (handleTurns(req, res, ctx)) return true;
|
|
80
|
+
if (handleMaintenance(req, res, ctx)) return true;
|
|
81
|
+
if (handleProviderCache(req, res, ctx)) return true;
|
|
82
|
+
if (handleMemoryStatus(req, res, ctx)) return true;
|
|
83
|
+
if (handleCacheStripes(req, res, ctx)) return true;
|
|
84
|
+
if (handleSetupStatus(req, res, ctx)) return true;
|
|
85
|
+
if (handleSetupDetect(req, res, ctx)) return true;
|
|
86
|
+
if (handleSetupConfigure(req, res, ctx)) return true;
|
|
87
|
+
if (handleMemoryMap(req, res, ctx)) return true;
|
|
88
|
+
if (handleRaptorTree(req, res, ctx)) return true;
|
|
89
|
+
if (handleRaptorBuildHistory(req, res, ctx)) return true;
|
|
90
|
+
if (handleContextHealth(req, res, ctx)) return true;
|
|
91
|
+
if (handleCachePoison(req, res, ctx)) return true;
|
|
92
|
+
if (handleHealthSettings(req, res, ctx)) return true;
|
|
93
|
+
if (handleEmbedderHealth(req, res, ctx)) return true;
|
|
94
|
+
if (handleRagSettings(req, res, ctx)) return true;
|
|
95
|
+
if (handleRagMetrics(req, res, ctx)) return true;
|
|
96
|
+
if (handleModelThresholds(req, res, ctx)) return true;
|
|
97
|
+
if (handleWiki(req, res, ctx)) return true;
|
|
98
|
+
if (handleVectorCortexEvaluation(req, res, ctx)) return true;
|
|
99
|
+
if (handleVectorCortexHealth(req, res, ctx)) return true;
|
|
100
|
+
if (handleVectorCortexBreakersReset(req, res, ctx)) return true;
|
|
101
|
+
if (handleVectorCortexLedger(req, res, ctx)) return true;
|
|
102
|
+
if (handleVectorCortexTopology(req, res, ctx)) return true;
|
|
103
|
+
if (handleVectorCortexQuery(req, res, ctx)) return true;
|
|
104
|
+
if (handleVectorCortexShards(req, res, ctx)) return true;
|
|
105
|
+
if (handleVectorCortexResidual(req, res, ctx)) return true;
|
|
106
|
+
if (handleVectorCortexReconstruct(req, res, ctx)) return true;
|
|
107
|
+
if (handleVectorCortexPlans(req, res, ctx)) return true;
|
|
108
|
+
if (handleVectorCortexRender(req, res, ctx)) return true;
|
|
109
|
+
if (handleVectorCortexRollout(req, res, ctx)) return true;
|
|
110
|
+
if (handleVectorCortexClosureProof(req, res, ctx)) return true;
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
@@ -138,5 +138,11 @@ export const VECTOR_CORTEX_SETTINGS: SettingGroup = {
|
|
|
138
138
|
"Live graduated rollout: deterministically hashes each session into a stable 10,000-bucket cohort and advances the exposure gate (1/5/25/50/100%) only after a 72h monotonic residency, a powered sample, >=10,000 events, and >=200 sessions — advancing ONE gate at a time. A hard causal/tool/anchor/exact failure freezes promotion and selects the pre-VC path. OFF = byte-identical predecessor (VC5B).",
|
|
139
139
|
true,
|
|
140
140
|
),
|
|
141
|
+
boolDirect(
|
|
142
|
+
"MEGACOMPACT_VC6A",
|
|
143
|
+
"VC6A Advanced Closure Optimization",
|
|
144
|
+
"Advanced closure optimization: deterministically reduces the already-mandatory VC4C closure by transitive reduction over depends edges, emitting a ClosureProofV2 receipt per closure and a verifier that replays reductions against the conservative oracle (HEAL_PROOF_SET_MISMATCH on selected-set divergence). Protected edges (tool-pair / anchor / contradiction / sole-dependency) are never removed. The optimized selected set is byte-identical to the conservative closure. OFF = byte-identical predecessor (VC5C); arithmetic runs, only the reporter + dashboard seam is suppressed.",
|
|
145
|
+
true,
|
|
146
|
+
),
|
|
141
147
|
],
|
|
142
148
|
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dashboard-server/routes-vector-cortex-heal.ts — VC6A closure-optimization
|
|
3
|
+
* dashboard route.
|
|
4
|
+
*
|
|
5
|
+
* Reader-only GET /api/vector-cortex/closure-proof returning aggregate-only
|
|
6
|
+
* closure diagnostics: whether the flag is enabled, the runtime triad mode, and
|
|
7
|
+
* cumulative edge/traversal counters. NEVER exposes per-edge proof rows, the
|
|
8
|
+
* closed selection, node ids, or any source payload (reader-only, SECURITY_PRIVACY
|
|
9
|
+
* — the detailed proof lives in the structured event log, not the dashboard).
|
|
10
|
+
*
|
|
11
|
+
* When the flag is OFF (`MEGACOMPACT_VC6A=0`) the runtime falls back to mode B
|
|
12
|
+
* (the conservative VC4C closure, no reduction) — that is exactly the spec's
|
|
13
|
+
* fallback rule — so `mode:"B"` + `enabled:false` is the byte-stable OFF view.
|
|
14
|
+
*
|
|
15
|
+
* Guardrails: PREVENT-PI-004 (local in-process state only), PREVENT-011 (no
|
|
16
|
+
* `any`), reader-only aggregate (counts + mode only).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
20
|
+
import type { RouteContext } from "./routes-core.js";
|
|
21
|
+
import { VC6A_ENABLED } from "../../src/config.js";
|
|
22
|
+
import { sendJson } from "./routes-vector-cortex-shared.js";
|
|
23
|
+
import type { VectorCortexClosureProofView } from "./api-contracts/vector-cortex.js";
|
|
24
|
+
|
|
25
|
+
/** Reader-only GET /api/vector-cortex/closure-proof (VC6A). */
|
|
26
|
+
export function handleVectorCortexClosureProof(
|
|
27
|
+
req: IncomingMessage,
|
|
28
|
+
res: ServerResponse,
|
|
29
|
+
_ctx: RouteContext,
|
|
30
|
+
): boolean {
|
|
31
|
+
const url = req.url ?? "";
|
|
32
|
+
const path = url.split("?")[0] ?? url;
|
|
33
|
+
if (path !== "/api/vector-cortex/closure-proof") return false;
|
|
34
|
+
if (req.method !== "GET") {
|
|
35
|
+
sendJson(res, 405, { error: "method_not_allowed" });
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const enabled = VC6A_ENABLED();
|
|
40
|
+
// Flag-off routes to mode B (conservative closure, no reduction) per spec.
|
|
41
|
+
const mode: "A" | "B" | "C" = enabled ? "A" : "B";
|
|
42
|
+
const body: VectorCortexClosureProofView = {
|
|
43
|
+
enabled,
|
|
44
|
+
mode,
|
|
45
|
+
optimizations: 0,
|
|
46
|
+
proofRejections: 0,
|
|
47
|
+
retainedEdgeTotal: 0,
|
|
48
|
+
removedEdgeTotal: 0,
|
|
49
|
+
conservativeTraversalTotal: 0,
|
|
50
|
+
optimizedTraversalTotal: 0,
|
|
51
|
+
lastRejection: null,
|
|
52
|
+
updatedAt: new Date().toISOString(),
|
|
53
|
+
};
|
|
54
|
+
sendJson(res, 200, body);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
@@ -25,3 +25,4 @@ export { handleVectorCortexReconstruct } from "./routes-vector-cortex-reconstruc
|
|
|
25
25
|
export { handleVectorCortexPlans } from "./routes-vector-cortex-plans.js";
|
|
26
26
|
export { handleVectorCortexRender } from "./routes-vector-cortex-render.js";
|
|
27
27
|
export { handleVectorCortexRollout } from "./routes-vector-cortex-rollout.js";
|
|
28
|
+
export { handleVectorCortexClosureProof } from "./routes-vector-cortex-heal.js";
|