pi-mega-compact 0.20.4 → 0.20.5
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/routes-rag-settings-helpers.js +1 -0
- package/dist/extensions/dashboard-server/routes-vector-cortex-render.js +40 -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 -1
- package/dist/extensions/mega-context/vector-cortex.js +128 -0
- package/dist/src/config/vector-cortex.js +12 -0
- package/dist/src/config.js +1 -1
- package/dist/src/store/sqlite/global-sessions.js +16 -4
- package/dist/src/vector-cortex/provider/registry.js +112 -0
- package/dist/src/vector-cortex/provider/types.js +30 -0
- package/dist/src/vector-cortex/render/_acceptance-fixture.js +58 -0
- package/dist/src/vector-cortex/render/_acceptance-helpers.js +17 -0
- package/dist/src/vector-cortex/render/_acceptance-provider.js +29 -0
- package/dist/src/vector-cortex/render/_acceptance-scenario.js +259 -0
- package/dist/src/vector-cortex/render/renderer.js +119 -0
- package/dist/src/vector-cortex/render/types.js +29 -0
- package/dist/src/vector-cortex/render/validator.js +90 -0
- package/dist/vector-cortex/provider/registry.js +112 -0
- package/dist/vector-cortex/provider/types.js +30 -0
- package/dist/vector-cortex/render/_acceptance-fixture.js +58 -0
- package/dist/vector-cortex/render/_acceptance-helpers.js +17 -0
- package/dist/vector-cortex/render/_acceptance-provider.js +29 -0
- package/dist/vector-cortex/render/_acceptance-scenario.js +259 -0
- package/dist/vector-cortex/render/renderer.js +119 -0
- package/dist/vector-cortex/render/types.js +29 -0
- package/dist/vector-cortex/render/validator.js +90 -0
- package/extensions/dashboard-client/dist/assets/{AreaChart-Cam9-nhT.js → AreaChart-CGL29Tcl.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{AreaChart-Cam9-nhT.js.map → AreaChart-CGL29Tcl.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{BarChart-DzIY8aM1.js → BarChart-OxhalIZa.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{BarChart-DzIY8aM1.js.map → BarChart-OxhalIZa.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{CacheTab-CKIiYsG_.js → CacheTab-VcMFwL-6.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{CacheTab-CKIiYsG_.js.map → CacheTab-VcMFwL-6.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{EventsTab-xaaBJLiK.js → EventsTab-DePofXDM.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{EventsTab-xaaBJLiK.js.map → EventsTab-DePofXDM.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{HealthTab-BGtUKOqG.js → HealthTab-nQd1tjSF.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{HealthTab-BGtUKOqG.js.map → HealthTab-nQd1tjSF.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-ABgQnTZ9.js → MaintenanceTab-CzvA8-F6.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MaintenanceTab-ABgQnTZ9.js.map → MaintenanceTab-CzvA8-F6.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-ChR2GAN-.js → MemoryMapTab-3lxgWBvU.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MemoryMapTab-ChR2GAN-.js.map → MemoryMapTab-3lxgWBvU.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DdCLAgcR.js → MetricsTab-D_FcA6kN.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{MetricsTab-DdCLAgcR.js.map → MetricsTab-D_FcA6kN.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DtemzJt6.js → OverviewTab-BU6R4aEs.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{OverviewTab-DtemzJt6.js.map → OverviewTab-BU6R4aEs.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{ReposTab-B9mvD9Ep.js → ReposTab-DFjy1isz.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{ReposTab-B9mvD9Ep.js.map → ReposTab-DFjy1isz.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SessionsTab-BcO38XLS.js → SessionsTab-UGIzIH25.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SessionsTab-BcO38XLS.js.map → SessionsTab-UGIzIH25.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{SetupTab-D_TBNP09.js → SetupTab-CECrgMKI.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{SetupTab-D_TBNP09.js.map → SetupTab-CECrgMKI.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-TjHpbUOo.js → TimeSavedCard-Dyy4SCDk.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TimeSavedCard-TjHpbUOo.js.map → TimeSavedCard-Dyy4SCDk.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{TurnsTab-DprxndCF.js → TurnsTab-B0LPcVs1.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{TurnsTab-DprxndCF.js.map → TurnsTab-B0LPcVs1.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-BWi3u_gp.js +2 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-BWi3u_gp.js.map +1 -0
- package/extensions/dashboard-client/dist/assets/{WikiTab-OKgSo15G.js → WikiTab-DWk9Qvut.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{WikiTab-OKgSo15G.js.map → WikiTab-DWk9Qvut.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{button-D_Qz4q7L.js → button-O59wPr5H.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{button-D_Qz4q7L.js.map → button-O59wPr5H.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{card-CsI6Jm3p.js → card-C-DxXv1-.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{card-CsI6Jm3p.js.map → card-C-DxXv1-.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-CvHKUdhX.js → generateCategoricalChart-Dw5YnE5s.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{generateCategoricalChart-CvHKUdhX.js.map → generateCategoricalChart-Dw5YnE5s.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{index-0Ye_un22.js → index-i9oaPE0a.js} +3 -3
- package/extensions/dashboard-client/dist/assets/{index-0Ye_un22.js.map → index-i9oaPE0a.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{switch-VQEoJl8Q.js → switch-B69QY3IM.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{switch-VQEoJl8Q.js.map → switch-B69QY3IM.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{toggle-CAPm4HJo.js → toggle-BJ4Kwggu.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{toggle-CAPm4HJo.js.map → toggle-BJ4Kwggu.js.map} +1 -1
- package/extensions/dashboard-client/dist/assets/{useSSE-pxsNTVkh.js → useSSE-BpuA8sPd.js} +2 -2
- package/extensions/dashboard-client/dist/assets/{useSSE-pxsNTVkh.js.map → useSSE-BpuA8sPd.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/VectorCortexMetric.tsx +10 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexPlansCard.tsx +39 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexRenderCard.tsx +38 -0
- package/extensions/dashboard-client/src/tabs/VectorCortexTab.tsx +11 -38
- package/extensions/dashboard-client/src/types/vector-cortex.ts +9 -0
- package/extensions/dashboard-server/api-contracts/vector-cortex.ts +20 -0
- package/extensions/dashboard-server/routes-rag-settings-helpers.ts +6 -0
- package/extensions/dashboard-server/routes-vector-cortex-render.ts +49 -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 +2 -0
- package/extensions/mega-context/vector-cortex.ts +163 -0
- package/package.json +1 -1
- package/src/config/vector-cortex.ts +13 -0
- package/src/config.ts +1 -0
- package/src/store/sqlite/global-sessions.ts +14 -2
- package/src/vector-cortex/provider/registry.ts +137 -0
- package/src/vector-cortex/provider/types.ts +163 -0
- package/src/vector-cortex/render/_acceptance-fixture.ts +128 -0
- package/src/vector-cortex/render/_acceptance-helpers.ts +39 -0
- package/src/vector-cortex/render/_acceptance-provider.ts +45 -0
- package/src/vector-cortex/render/_acceptance-scenario.ts +319 -0
- package/src/vector-cortex/render/renderer.ts +142 -0
- package/src/vector-cortex/render/types.ts +174 -0
- package/src/vector-cortex/render/validator.ts +120 -0
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-Bym21yVQ.js +0 -2
- package/extensions/dashboard-client/dist/assets/VectorCortexTab-Bym21yVQ.js.map +0 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vector-cortex/render/renderer.ts — validated prompt renderer (VC5B, task 3).
|
|
3
|
+
*
|
|
4
|
+
* The renderer consumes VC5A's handoff (`order` = stable Kahn order, `selectedNodeIds`,
|
|
5
|
+
* `dagDigest`, `tokenTotal`) plus the host node payloads and the resolved provider
|
|
6
|
+
* profile. It REPLAYS the validator's order verbatim — it NEVER re-orders. Tool
|
|
7
|
+
* bytes are preserved EXACTLY (PREVENT-PI-002). The compacted context is placed
|
|
8
|
+
* via the host `before_agent_start` systemPrompt PREPEND seam — NEVER as a
|
|
9
|
+
* `role:"system"` message (PREVENT-PI-003, critical).
|
|
10
|
+
*
|
|
11
|
+
* The renderer produces a `RenderManifestV1` (node order + request digest +
|
|
12
|
+
* profile ID), NOT a raw `role:"system"` message. The request digest is the
|
|
13
|
+
* SHA-256 of the ENTIRE canonical outbound request bytes; it depends on every
|
|
14
|
+
* outbound byte and on byte length/order, never on map/object insertion order.
|
|
15
|
+
*
|
|
16
|
+
* Pi-agnostic, dependency-free, zero network (PREVENT-PI-004 / PREVENT-011).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
|
|
21
|
+
import type {
|
|
22
|
+
CanonicalOutboundRequest,
|
|
23
|
+
RenderInput,
|
|
24
|
+
RenderManifestV1,
|
|
25
|
+
RenderResult,
|
|
26
|
+
RenderedNode,
|
|
27
|
+
} from "./types.js";
|
|
28
|
+
|
|
29
|
+
/** Encode a length-prefixed segment so the hash depends on exact byte length. */
|
|
30
|
+
function segment(bytes: Uint8Array): Buffer {
|
|
31
|
+
const len = Buffer.allocUnsafe(8);
|
|
32
|
+
len.writeBigUInt64LE(BigInt(bytes.length), 0);
|
|
33
|
+
return Buffer.concat([len, Buffer.from(bytes)]);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Serialize the canonical outbound request to a single byte stream whose SHA-256
|
|
38
|
+
* depends on EVERY outbound byte and on byte length + order. The prepend seam,
|
|
39
|
+
* the exact tool bytes (in validator order), and the node payloads (in validator
|
|
40
|
+
* order) are all folded in with length prefixes so a changed length, a swapped
|
|
41
|
+
* tool, or a reordered node produces a different digest. Map/object insertion
|
|
42
|
+
* order never affects the result.
|
|
43
|
+
*/
|
|
44
|
+
export function canonicalRequestBytes(req: CanonicalOutboundRequest): Buffer {
|
|
45
|
+
const parts: Buffer[] = [];
|
|
46
|
+
// 1. systemPromptPrepend (host prepend seam, never role:system).
|
|
47
|
+
parts.push(segment(Buffer.from(req.systemPromptPrepend, "utf8")));
|
|
48
|
+
// 2. tools in validator order — exact bytes.
|
|
49
|
+
for (const t of req.tools) {
|
|
50
|
+
parts.push(segment(Buffer.from(t.id, "utf8")));
|
|
51
|
+
parts.push(segment(Buffer.from(t.bytes, "utf8")));
|
|
52
|
+
}
|
|
53
|
+
// 3. nodes in validator order.
|
|
54
|
+
for (const n of req.nodes) {
|
|
55
|
+
parts.push(segment(Buffer.from(n.id, "utf8")));
|
|
56
|
+
parts.push(segment(Buffer.from(n.bytes)));
|
|
57
|
+
}
|
|
58
|
+
return Buffer.concat(parts);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** SHA-256 hex of the entire canonical outbound request. */
|
|
62
|
+
export function requestDigest(req: CanonicalOutboundRequest): string {
|
|
63
|
+
return createHash("sha256").update(canonicalRequestBytes(req)).digest("hex");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Render the prompt in validator order and produce a `RenderManifestV1`. The
|
|
68
|
+
* renderer never re-orders: `order` is replayed verbatim and every node's
|
|
69
|
+
* `orderIndex` is taken from `order`, not from map iteration.
|
|
70
|
+
*
|
|
71
|
+
* On an unknown profile (`profile === null`) the renderer returns a clean bypass
|
|
72
|
+
* decision (`REN_PROFILE_UNKNOWN`, triad C) — NOT an error. The host uses the
|
|
73
|
+
* predecessor prompt path.
|
|
74
|
+
*/
|
|
75
|
+
export function renderPrompt(input: RenderInput): RenderResult {
|
|
76
|
+
const { order, selectedNodeIds, dagDigest, nodes, profile, tokenTotal } = input;
|
|
77
|
+
|
|
78
|
+
// Set-equality between the validator order and the plan selection. The renderer
|
|
79
|
+
// replays `order`; a divergence is a hard REN_ORDER_MISMATCH.
|
|
80
|
+
const orderSet = new Set(order);
|
|
81
|
+
const selectedSet = new Set(selectedNodeIds);
|
|
82
|
+
if (orderSet.size !== selectedSet.size) {
|
|
83
|
+
return { ok: false, code: "REN_ORDER_MISMATCH", triad: "A" };
|
|
84
|
+
}
|
|
85
|
+
for (const id of selectedSet) {
|
|
86
|
+
if (!orderSet.has(id)) {
|
|
87
|
+
return { ok: false, code: "REN_ORDER_MISMATCH", triad: "A" };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Unknown profile → clean bypass (triad C), not an error.
|
|
92
|
+
if (profile === null) {
|
|
93
|
+
return { ok: false, code: "REN_PROFILE_UNKNOWN", triad: "C" };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Render nodes in validator order, preserving exact bytes.
|
|
97
|
+
const renderedNodes: RenderedNode[] = [];
|
|
98
|
+
for (let i = 0; i < order.length; i++) {
|
|
99
|
+
const id = order[i];
|
|
100
|
+
const node = nodes.get(id);
|
|
101
|
+
if (node === undefined) {
|
|
102
|
+
return { ok: false, code: "REN_ORDER_MISMATCH", triad: "A" };
|
|
103
|
+
}
|
|
104
|
+
renderedNodes.push({ id, kind: node.kind, bytes: node.bytes, orderIndex: i });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Exact tool bytes: one synthetic "tool" per selected node that carries a tool
|
|
108
|
+
// payload (we fold each node's bytes verbatim; the validator order is preserved
|
|
109
|
+
// by construction). The renderer never transcodes or reorders tool bytes.
|
|
110
|
+
const tools = renderedNodes.map((n) => ({
|
|
111
|
+
id: n.id,
|
|
112
|
+
bytes: Buffer.from(n.bytes).toString("utf8"),
|
|
113
|
+
}));
|
|
114
|
+
|
|
115
|
+
// systemPromptPrepend = the compacted context placed via the host prepend seam.
|
|
116
|
+
// NOT a role:system message (PREVENT-PI-003). The renderer emits the manifest,
|
|
117
|
+
// the host adapter prepends it on before_agent_start.
|
|
118
|
+
const systemPromptPrepend = renderedNodes
|
|
119
|
+
.map((n) => Buffer.from(n.bytes).toString("utf8"))
|
|
120
|
+
.join("");
|
|
121
|
+
|
|
122
|
+
const request: CanonicalOutboundRequest = {
|
|
123
|
+
systemPromptPrepend,
|
|
124
|
+
tools,
|
|
125
|
+
nodes: renderedNodes,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const digest = requestDigest(request);
|
|
129
|
+
|
|
130
|
+
const manifest: RenderManifestV1 = {
|
|
131
|
+
schema: "render-manifest-v1",
|
|
132
|
+
nodeOrder: order.slice(),
|
|
133
|
+
requestDigest: digest,
|
|
134
|
+
profileId: profile.profile.id,
|
|
135
|
+
profileVersion: profile.profile.version,
|
|
136
|
+
tokenTotal,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
void dagDigest; // captured for downstream validation / crystal keying.
|
|
140
|
+
|
|
141
|
+
return { ok: true, manifest, request };
|
|
142
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vector-cortex/render/types.ts — the validated prompt renderer contract (VC5B,
|
|
3
|
+
* task 1).
|
|
4
|
+
*
|
|
5
|
+
* The renderer consumes VC5A's handoff — a `PlanV1` (selected node IDs in stable
|
|
6
|
+
* Kahn order + `dagDigest` + `tokenTotal`) and the validator's `order` — and
|
|
7
|
+
* produces a `RenderManifestV1`: the EXACT node render order, the SHA-256 digest
|
|
8
|
+
* of the entire canonical outbound request, and the active profile ID. The
|
|
9
|
+
* renderer NEVER re-orders — it replays the validator's stable order verbatim.
|
|
10
|
+
*
|
|
11
|
+
* It renders through the host `before_agent_start` systemPrompt PREPEND seam,
|
|
12
|
+
* never as a `role:"system"` message (PREVENT-PI-003, critical). Tool bytes are
|
|
13
|
+
* preserved EXACTLY (PREVENT-PI-002 — a toolCall/toolResult pair is never split).
|
|
14
|
+
*
|
|
15
|
+
* Pure types + registered conformance IDs: no storage, no console, no network
|
|
16
|
+
* (PREVENT-PI-004 / PREVENT-011).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { ProviderProfileBundle } from "../provider/types.js";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A single rendered node in the outbound prompt. `bytes` are the EXACT serialized
|
|
23
|
+
* node bytes (tool bytes preserved verbatim). `orderIndex` is the validator's
|
|
24
|
+
* stable position — never mutated by the renderer.
|
|
25
|
+
*/
|
|
26
|
+
export interface RenderedNode {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly kind: string;
|
|
29
|
+
/** Exact serialized bytes (NFC UTF-8; tool bytes verbatim). */
|
|
30
|
+
readonly bytes: Uint8Array;
|
|
31
|
+
/** The validator's stable position for this node. */
|
|
32
|
+
readonly orderIndex: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The renderer output: a `RenderManifestV1`. This is NOT a raw `role:"system"`
|
|
37
|
+
* message — it is the validated render plan the validator and host consume.
|
|
38
|
+
*/
|
|
39
|
+
export interface RenderManifestV1 {
|
|
40
|
+
readonly schema: "render-manifest-v1";
|
|
41
|
+
/** The exact node render order (validator's stable Kahn order, replayed). */
|
|
42
|
+
readonly nodeOrder: readonly string[];
|
|
43
|
+
/** SHA-256 hex of the ENTIRE canonical outbound request bytes. */
|
|
44
|
+
readonly requestDigest: string;
|
|
45
|
+
/** Active provider profile ID (or "unknown" for a clean bypass). */
|
|
46
|
+
readonly profileId: string;
|
|
47
|
+
/** Active provider profile version (or "unknown" for a clean bypass). */
|
|
48
|
+
readonly profileVersion: string;
|
|
49
|
+
/** Total rendered token payload (framed-ish, for dashboard only). */
|
|
50
|
+
readonly tokenTotal: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The canonical outbound request the renderer emits through the host prepend seam.
|
|
55
|
+
* `systemPromptPrepend` carries the compacted context via the
|
|
56
|
+
* `before_agent_start` prepend — it is NEVER a `role:"system"` message. `tools`
|
|
57
|
+
* carries exact tool bytes, verbatim.
|
|
58
|
+
*/
|
|
59
|
+
export interface CanonicalOutboundRequest {
|
|
60
|
+
/** Compacted context placed via the host prepend seam (NOT role:system). */
|
|
61
|
+
readonly systemPromptPrepend: string;
|
|
62
|
+
/** Exact tool bytes, verbatim and in validator order. */
|
|
63
|
+
readonly tools: readonly { readonly id: string; readonly bytes: string }[];
|
|
64
|
+
/** The rendered node payloads in validator order. */
|
|
65
|
+
readonly nodes: readonly RenderedNode[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Render failure codes. The UNIQUE failure-injection code is
|
|
70
|
+
* `REN_PROFILE_DIGEST_MISMATCH`: the provider profile is changed AFTER render but
|
|
71
|
+
* BEFORE validation, so the re-hashed canonical request no longer matches the
|
|
72
|
+
* manifest digest — the renderer selects triad C (predecessor prompt path).
|
|
73
|
+
*/
|
|
74
|
+
export type RenderFailureCode =
|
|
75
|
+
/** The selected node set diverges from the validator's stable order. */
|
|
76
|
+
| "REN_ORDER_MISMATCH"
|
|
77
|
+
/** A tool's bytes differ from the source (exact-byte contract violated). */
|
|
78
|
+
| "REN_TOOL_BYTE_MISMATCH"
|
|
79
|
+
/** The rendered byte length diverges from the validator's pinned length. */
|
|
80
|
+
| "REN_BYTE_LENGTH_MISMATCH"
|
|
81
|
+
/** A provider constraint is violated by the rendered request. */
|
|
82
|
+
| "REN_PROVIDER_CONSTRAINT_VIOLATED"
|
|
83
|
+
/** Profile changed after render but before validation (unique injection). */
|
|
84
|
+
| "REN_PROFILE_DIGEST_MISMATCH"
|
|
85
|
+
/** No provider profile resolved (clean bypass, not an error). */
|
|
86
|
+
| "REN_PROFILE_UNKNOWN";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The render verdict. `ok:true` carries the manifest + the canonical request and
|
|
90
|
+
* its digest. `ok:false` carries exactly one failure code and the triad the
|
|
91
|
+
* renderer must select (A stays on the validated render; C falls back to the
|
|
92
|
+
* predecessor prompt path for an unknown profile).
|
|
93
|
+
*/
|
|
94
|
+
export type RenderResult =
|
|
95
|
+
| {
|
|
96
|
+
readonly ok: true;
|
|
97
|
+
readonly manifest: RenderManifestV1;
|
|
98
|
+
readonly request: CanonicalOutboundRequest;
|
|
99
|
+
}
|
|
100
|
+
| {
|
|
101
|
+
readonly ok: false;
|
|
102
|
+
readonly code: RenderFailureCode;
|
|
103
|
+
/** The triad the host must select: A validated render, C predecessor path. */
|
|
104
|
+
readonly triad: "A" | "C";
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Required inputs to the renderer. `order` is VC5A's validator order; `plan` is
|
|
109
|
+
* the VC5A plan handoff; `nodes` carries the raw node payloads keyed by ID.
|
|
110
|
+
*/
|
|
111
|
+
export interface RenderInput {
|
|
112
|
+
/** Validator's stable Kahn order (VC5A handoff — never reordered). */
|
|
113
|
+
readonly order: readonly string[];
|
|
114
|
+
/** Selected node IDs from the plan (must equal `order` as a set). */
|
|
115
|
+
readonly selectedNodeIds: readonly string[];
|
|
116
|
+
/** DAG structure digest (VC5A handoff — post-plan mutation is detectable). */
|
|
117
|
+
readonly dagDigest: string;
|
|
118
|
+
/** Raw node payloads keyed by node ID (exact bytes). */
|
|
119
|
+
readonly nodes: ReadonlyMap<string, { readonly kind: string; readonly bytes: Uint8Array }>;
|
|
120
|
+
/** Resolved provider profile bundle (unknown → clean bypass). */
|
|
121
|
+
readonly profile: ProviderProfileBundle | null;
|
|
122
|
+
/** The framing token overhead already accounted by VC5A. */
|
|
123
|
+
readonly tokenTotal: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* The triad mode VC5B selects (TRIAD_RESILIENCE). A/B/C are independent:
|
|
128
|
+
* A = validated profile render (the good outcome);
|
|
129
|
+
* B = uncached profile-safe render forced by a cache constraint;
|
|
130
|
+
* C = existing predecessor prompt path forced by an unknown profile.
|
|
131
|
+
*/
|
|
132
|
+
export type RenderMode = "A" | "B" | "C";
|
|
133
|
+
|
|
134
|
+
/** Injected emit callback — same (event, fields) shape as the other VC seams. */
|
|
135
|
+
export type RenderEmitter = (event: string, fields: Record<string, unknown>) => void;
|
|
136
|
+
|
|
137
|
+
/** The two structured events the VC5B render seam emits. */
|
|
138
|
+
export type RenderEventName =
|
|
139
|
+
| "vector_cortex_render_validated"
|
|
140
|
+
| "vector_cortex_provider_bypassed";
|
|
141
|
+
|
|
142
|
+
/** Typed, best-effort reporter bound to the two render event names. */
|
|
143
|
+
export interface RenderReporter {
|
|
144
|
+
readonly renderValidated: (fields: Record<string, unknown>) => void;
|
|
145
|
+
readonly providerBypassed: (fields: Record<string, unknown>) => void;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Aggregate-only render metrics for the dashboard (counts/tokens only, never
|
|
150
|
+
* prompt text or node payloads).
|
|
151
|
+
*/
|
|
152
|
+
export interface RenderMetricsV1 {
|
|
153
|
+
readonly rendersValidated: number;
|
|
154
|
+
readonly providersBypassed: number;
|
|
155
|
+
readonly nodesRendered: number;
|
|
156
|
+
readonly tokenTotal: number;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Registered REN conformance ID range (REN-001..020). The acceptance aggregator
|
|
161
|
+
* reads these rows from the v2 manifest and asserts each returns its manifest
|
|
162
|
+
* `ok`/`code` / pinned `requestDigest`.
|
|
163
|
+
*/
|
|
164
|
+
export const REN_IDS: readonly string[] = Array.from(
|
|
165
|
+
{ length: 20 },
|
|
166
|
+
(_v, i) => `REN-${String(i + 1).padStart(3, "0")}`,
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
/** Named VC5B render conformance assertions (the sprint's headline rows). */
|
|
170
|
+
export const REN_NAMED_IDS = [
|
|
171
|
+
"REN-ORDER-001",
|
|
172
|
+
"REN-TOOL-002",
|
|
173
|
+
"REN-BYPASS-003",
|
|
174
|
+
] as const;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vector-cortex/render/validator.ts — canonical request validator (VC5B, task 4).
|
|
3
|
+
*
|
|
4
|
+
* The validator runs BEFORE the provider invocation. It re-hashes the ENTIRE
|
|
5
|
+
* canonical outbound request and compares the result against the render manifest:
|
|
6
|
+
* - order — the request's node order equals the manifest's nodeOrder;
|
|
7
|
+
* - tools — every tool's bytes equal the source (exact-byte contract,
|
|
8
|
+
* PREVENT-PI-002);
|
|
9
|
+
* - byte lengths — every segment length equals the pinned length;
|
|
10
|
+
* - provider — the active profile still matches the manifest profile, and
|
|
11
|
+
* no provider constraint is violated.
|
|
12
|
+
*
|
|
13
|
+
* UNIQUE failure injection: the provider profile is changed AFTER render but
|
|
14
|
+
* BEFORE validation. The re-hashed request (folded under the new profile's
|
|
15
|
+
* hashMode/stableFields) no longer matches the manifest digest → the validator
|
|
16
|
+
* returns `REN_PROFILE_DIGEST_MISMATCH` and the host selects triad C (predecessor
|
|
17
|
+
* prompt path). A mismatch under an unchanged profile is an exact-byte/order
|
|
18
|
+
* violation (REN_ORDER_MISMATCH / REN_TOOL_BYTE_MISMATCH / REN_BYTE_LENGTH_MISMATCH
|
|
19
|
+
* / REN_PROVIDER_CONSTRAINT_VIOLATED).
|
|
20
|
+
*
|
|
21
|
+
* Pi-agnostic, dependency-free, zero network (PREVENT-PI-004 / PREVENT-011).
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { createHash } from "node:crypto";
|
|
25
|
+
|
|
26
|
+
import type {
|
|
27
|
+
CanonicalOutboundRequest,
|
|
28
|
+
RenderFailureCode,
|
|
29
|
+
RenderManifestV1,
|
|
30
|
+
RenderMode,
|
|
31
|
+
} from "./types.js";
|
|
32
|
+
import { canonicalRequestBytes } from "./renderer.js";
|
|
33
|
+
import type { ProviderProfileBundle } from "../provider/types.js";
|
|
34
|
+
|
|
35
|
+
/** A validated request verdict. `ok:true` carries the recomputed digest. */
|
|
36
|
+
export type ValidateResult =
|
|
37
|
+
| { readonly ok: true; readonly requestDigest: string }
|
|
38
|
+
| {
|
|
39
|
+
readonly ok: false;
|
|
40
|
+
readonly code: RenderFailureCode;
|
|
41
|
+
/** The triad the host must select. C = predecessor prompt path. */
|
|
42
|
+
readonly triad: "A" | "C";
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
function digestOf(req: CanonicalOutboundRequest): string {
|
|
46
|
+
return createHash("sha256").update(canonicalRequestBytes(req)).digest("hex");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Validate the canonical outbound request against the render manifest, using the
|
|
51
|
+
* profile that is active AT VALIDATION TIME. `sourceToolBytes` pins the exact
|
|
52
|
+
* source tool bytes keyed by node ID so the validator can detect a byte change.
|
|
53
|
+
*/
|
|
54
|
+
export function validateRender(
|
|
55
|
+
manifest: RenderManifestV1,
|
|
56
|
+
request: CanonicalOutboundRequest,
|
|
57
|
+
profile: ProviderProfileBundle | null,
|
|
58
|
+
sourceToolBytes: ReadonlyMap<string, string>,
|
|
59
|
+
pinnedToolLengths: ReadonlyMap<string, number>,
|
|
60
|
+
): ValidateResult {
|
|
61
|
+
// 1. Order must equal the manifest's nodeOrder exactly (validator order replayed).
|
|
62
|
+
if (request.nodes.length !== manifest.nodeOrder.length) {
|
|
63
|
+
return { ok: false, code: "REN_ORDER_MISMATCH", triad: "A" };
|
|
64
|
+
}
|
|
65
|
+
for (let i = 0; i < manifest.nodeOrder.length; i++) {
|
|
66
|
+
if (request.nodes[i].id !== manifest.nodeOrder[i]) {
|
|
67
|
+
return { ok: false, code: "REN_ORDER_MISMATCH", triad: "A" };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 2. Tool byte LENGTHS must match the pinned source lengths FIRST (catch a
|
|
72
|
+
// silent truncation/transcode as the more specific signal), then the exact
|
|
73
|
+
// byte content (PREVENT-PI-002). A length change is reported as
|
|
74
|
+
// REN_BYTE_LENGTH_MISMATCH before falling through to the content check.
|
|
75
|
+
if (request.tools.length !== sourceToolBytes.size) {
|
|
76
|
+
return { ok: false, code: "REN_TOOL_BYTE_MISMATCH", triad: "A" };
|
|
77
|
+
}
|
|
78
|
+
for (const t of request.tools) {
|
|
79
|
+
const src = sourceToolBytes.get(t.id);
|
|
80
|
+
if (src === undefined) {
|
|
81
|
+
return { ok: false, code: "REN_TOOL_BYTE_MISMATCH", triad: "A" };
|
|
82
|
+
}
|
|
83
|
+
const pinned = pinnedToolLengths.get(t.id);
|
|
84
|
+
if (pinned !== undefined && Buffer.byteLength(t.bytes, "utf8") !== pinned) {
|
|
85
|
+
return { ok: false, code: "REN_BYTE_LENGTH_MISMATCH", triad: "A" };
|
|
86
|
+
}
|
|
87
|
+
if (src !== t.bytes) {
|
|
88
|
+
return { ok: false, code: "REN_TOOL_BYTE_MISMATCH", triad: "A" };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 3. Provider constraint: the active profile at validation time must match the
|
|
93
|
+
// manifest's profile. A changed profile is the UNIQUE injection → mismatch.
|
|
94
|
+
if (profile === null) {
|
|
95
|
+
// Clean bypass case: the manifest should also be "unknown"; if it isn't, the
|
|
96
|
+
// profile was swapped after render → mismatch.
|
|
97
|
+
if (manifest.profileId !== "unknown") {
|
|
98
|
+
return { ok: false, code: "REN_PROFILE_DIGEST_MISMATCH", triad: "C" };
|
|
99
|
+
}
|
|
100
|
+
} else if (profile.profile.id !== manifest.profileId || profile.profile.version !== manifest.profileVersion) {
|
|
101
|
+
return { ok: false, code: "REN_PROFILE_DIGEST_MISMATCH", triad: "C" };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 4. Re-hash the ENTIRE canonical outbound request under the active profile's
|
|
105
|
+
// hash mode (entire-canonical-request is the only supported mode) and compare.
|
|
106
|
+
const digest = digestOf(request);
|
|
107
|
+
if (digest !== manifest.requestDigest) {
|
|
108
|
+
// A digest change under a consistent profile is a byte/order violation, not a
|
|
109
|
+
// profile swap. (The profile-swap case above already returned C.)
|
|
110
|
+
return { ok: false, code: "REN_PROVIDER_CONSTRAINT_VIOLATED", triad: "A" };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return { ok: true, requestDigest: digest };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Triad selection helper: fold a validation outcome into the host's triad choice. */
|
|
117
|
+
export function selectTriad(result: ValidateResult): RenderMode {
|
|
118
|
+
if (result.ok) return "A";
|
|
119
|
+
return result.triad; // "C" for profile swap / unknown; stays "A" otherwise
|
|
120
|
+
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as o,j as e,B as n}from"./index-0Ye_un22.js";import{C as i,a as d,b as x,c as h}from"./card-CsI6Jm3p.js";async function B(){const s=await fetch("/api/vector-cortex/evaluation");if(!s.ok)throw new Error(`vector-cortex evaluation: ${s.status}`);return s.json()}async function E(){const s=await fetch("/api/vector-cortex/health");if(!s.ok)throw new Error(`vector-cortex health: ${s.status}`);return s.json()}async function P(){const s=await fetch("/api/vector-cortex/topology");if(!s.ok)throw new Error(`vector-cortex topology: ${s.status}`);return s.json()}async function L(){const s=await fetch("/api/vector-cortex/query");if(!s.ok)throw new Error(`vector-cortex query: ${s.status}`);return s.json()}async function H(){const s=await fetch("/api/vector-cortex/shards");if(!s.ok)throw new Error(`vector-cortex shards: ${s.status}`);return s.json()}async function q(){const s=await fetch("/api/vector-cortex/reconstruct");if(!s.ok)throw new Error(`vector-cortex reconstruct: ${s.status}`);return s.json()}async function G(){const s=await fetch("/api/vector-cortex/plans");if(!s.ok)throw new Error(`vector-cortex plans: ${s.status}`);return s.json()}async function Q(s="default"){const c=await fetch(`/api/vector-cortex/ledger?session=${encodeURIComponent(s)}`);if(!c.ok)throw new Error(`vector-cortex ledger: ${c.status}`);return c.json()}async function W(s){const c=await fetch("/api/vector-cortex/breakers/reset",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({subsystem:s})});if(!c.ok)throw new Error(`vector-cortex reset: ${c.status}`);return c.json()}function b({mode:s,count:c}){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:c})]})}function t({label:s,value:c}){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:c})]})}function U(){const[s,c]=o.useState(null),[y,V]=o.useState(null),[F,$]=o.useState(!0),[a,N]=o.useState(null),[C,w]=o.useState(null),[m,R]=o.useState(null),[l,k]=o.useState(null),[f,A]=o.useState(null),[j,T]=o.useState(null),[u,M]=o.useState(null),[g,I]=o.useState(null),p=o.useCallback(()=>{B().then(c).catch(r=>V(r instanceof Error?r.message:String(r))).finally(()=>$(!1)),E().then(N).catch(()=>{}),Q().then(R).catch(()=>{}),P().then(k).catch(()=>{}),L().then(A).catch(()=>{}),H().then(T).catch(()=>{}),q().then(M).catch(()=>{}),G().then(I).catch(()=>{})},[]);o.useEffect(()=>{p();const r=setInterval(p,5e3);return()=>clearInterval(r)},[p]);const D=()=>{W("provider").then(r=>(w(`Breaker "${r.subsystem}" ${r.state}; evidence retained: ${r.failures} failures / ${r.attempts} attempts`),E())).then(N).catch(r=>w(r instanceof Error?r.message:String(r)))};if(F&&!s)return e.jsx("div",{className:"vc-loading",children:"Loading vector-cortex evaluation…"});if(y&&!s)return e.jsxs("div",{className:"vc-error",children:["Error: ",y]});if(!s)return e.jsx("div",{className:"vc-empty",children:"No evaluation data available."});const S=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(n,{variant:"warning",children:"OBSERVER PENDING (A)"}):e.jsx(n,{variant:"danger",children:"MODE C (OFF)"})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-3",children:[e.jsxs(i,{children:[e.jsx(d,{children:e.jsx(x,{children:"Samples"})}),e.jsxs(h,{children:[e.jsx("div",{className:"text-3xl font-bold",children:s.samples}),e.jsxs("div",{className:"mt-2 flex flex-col",children:[e.jsx(b,{mode:"A",count:s.byMode.A}),e.jsx(b,{mode:"B",count:s.byMode.B}),e.jsx(b,{mode:"C",count:s.byMode.C})]})]})]}),e.jsxs(i,{className:"md:col-span-2",children:[e.jsx(d,{children:e.jsx(x,{children:"Latency Histogram (ms, inclusive edges)"})}),e.jsxs(h,{children:[e.jsxs("div",{className:"flex items-end gap-2",style:{height:160},children:[s.histogram.edges.map((r,v)=>{const O=s.histogram.cells[v]/S*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[v]}),e.jsx("div",{className:"w-full rounded-t",style:{height:Math.max(2,O),background:"#6366f1"}}),e.jsxs("span",{className:"text-[10px] text-muted-foreground",children:["≤",r]})]},r)}),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/S*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(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Live Safety Envelope (VC0C)"}),e.jsxs("div",{className:"flex items-center gap-2",children:[a?.stateSource==="ephemeral"&&e.jsx(n,{variant:"outline",children:"EPHEMERAL (non-live)"}),e.jsx("button",{onClick:D,disabled:!a?.enabled,className:"rounded border border-border px-2 py-1 text-xs disabled:opacity-50",children:"Reset Cooldown"})]})]})}),e.jsxs(h,{children:[C&&e.jsx("div",{className:"mb-2 text-xs text-muted-foreground",children:C}),a?e.jsxs("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-4",children:[e.jsx(t,{label:"State",value:a.state}),e.jsx(t,{label:"Mode",value:a.mode}),e.jsx(t,{label:"Window",value:`${a.windowMs}ms`}),e.jsx(t,{label:"Probes",value:String(a.probeCount)}),e.jsx(t,{label:"Backoff",value:`${a.backoffDelayMs}ms`}),e.jsx(t,{label:"Failures",value:`${a.failures}/${a.attempts}`}),e.jsx(t,{label:"Frontier",value:a.stateSource==="ephemeral"?"non-live":a.frontierFrozen?"FROZEN":"LIVE"}),e.jsx(t,{label:"Spool lag",value:String(a.spoolLag)}),e.jsx(t,{label:"Encoder mode",value:a.encoderMode}),e.jsx(t,{label:"Encoder asset",value:a.encoderAssetDigest?a.encoderAssetDigest.slice(0,12):"none"})]}):e.jsx("div",{className:"vc-empty",children:"Health unavailable (VC0C off)."})]})]}),e.jsxs(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Derived Cortex Store (VC3A)"}),l?.enabled?e.jsx(n,{variant:"success",children:"ACTIVE"}):e.jsx(n,{variant:"danger",children:"OFF"})]})}),e.jsx(h,{children:l?.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:l.generationId??"—"}),e.jsx(t,{label:"Ordinal",value:l.ordinal??"—"}),e.jsx(t,{label:"Records",value:String(l.recordCount)}),e.jsx(t,{label:"Frontier (HW)",value:l.sourceHighWater}),e.jsx(t,{label:"Root digest",value:l.rootDigest?l.rootDigest.slice(0,16):"—"}),l.nodes!==void 0&&e.jsxs(e.Fragment,{children:[e.jsx(t,{label:"Nodes",value:String(l.nodes?.length??0)}),e.jsx(t,{label:"Edges",value:String(l.edges?.length??0)}),e.jsx(t,{label:"Graph digest",value:l.generationDigest?l.generationDigest.slice(0,16):"—"})]})]}),l.nodes!==void 0&&(l.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:l.edges?.map((r,v)=>e.jsxs("tr",{className:"border-b border-border/30",children:[e.jsx("td",{className:"py-1 pr-2 font-mono",children:r.source}),e.jsx("td",{className:"py-1 pr-2 font-mono",children:r.target}),e.jsx("td",{className:"py-1 pr-2 font-mono",children:r.head}),e.jsx("td",{className:"py-1 pr-2",children:r.direction}),e.jsx("td",{className:"py-1 font-mono",children:r.score})]},`${r.source}-${r.target}-${r.head}-${v}`))})]})]})]}):e.jsx("div",{className:"vc-empty",children:"Cortex store disabled (VC3A off)."})})]}),e.jsxs(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Topology Query Diagnostics (VC3C)"}),f?.enabled?e.jsx(n,{variant:"success",children:"ACTIVE"}):e.jsx(n,{variant:"danger",children:"OFF"})]})}),e.jsx(h,{children:f?.enabled?e.jsx("div",{className:"grid grid-cols-2 gap-4 md:grid-cols-3",children:e.jsx(t,{label:"Router version",value:String(f.routerVersion)})}):e.jsx("div",{className:"vc-empty",children:"Query diagnostics unavailable (VC3C off)."})})]}),e.jsxs(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Dual-Tier Shards (VC4A)"}),j?.enabled?e.jsx(n,{variant:"success",children:"ACTIVE"}):e.jsx(n,{variant:"danger",children:"OFF"})]})}),e.jsx(h,{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(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Reconstruction Fidelity (VC4C)"}),u?.enabled?e.jsx(n,{variant:"success",children:"ACTIVE"}):e.jsx(n,{variant:"danger",children:"OFF"})]})}),e.jsx(h,{children:u?.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(u.closureAttempts)}),e.jsx(t,{label:"Closure rejections",value:String(u.closureRejections)}),e.jsx(t,{label:"Validated",value:String(u.validatedCount)}),e.jsx(t,{label:"Invalidated",value:String(u.invalidatedCount)}),e.jsx(t,{label:"Span total",value:String(u.spanTotal)}),e.jsx(t,{label:"Byte total",value:String(u.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.jsxs(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Plan Manifests (VC5A)"}),g?.enabled?e.jsx(n,{variant:"success",children:"ACTIVE"}):e.jsx(n,{variant:"danger",children:"OFF"})]})}),e.jsx(h,{children:g?.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(g.dagCount)}),e.jsx(t,{label:"Plan fixtures",value:String(g.plannerCount)}),e.jsx(t,{label:"Plans exposed",value:String(g.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)."})})]}),e.jsxs(i,{children:[e.jsx(d,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(x,{children:"Occurrence Ledger (VC1B)"}),m?.enabled?e.jsx(n,{variant:"success",children:"ACTIVE"}):e.jsx(n,{variant:"danger",children:"OFF"})]})}),e.jsx(h,{children:m?.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:m.session}),e.jsx(t,{label:"High-water",value:m.highWater}),e.jsx(t,{label:"Occurrences",value:String(m.count)})]}),m.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:m.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)."})})]})]})}export{U as default};
|
|
2
|
-
//# sourceMappingURL=VectorCortexTab-Bym21yVQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VectorCortexTab-Bym21yVQ.js","sources":["../../src/api/vector-cortex.ts","../../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\tVectorCortexResetResult,\n\tVectorCortexShardsView,\n\tVectorCortexTopologyView,\n} from \"../types/vector-cortex\";\n\nexport type {\n\tVectorCortexEvaluationSummary,\n\tVectorCortexHealthCard,\n\tVectorCortexLedgerView,\n\tVectorCortexPlansView,\n\tVectorCortexQueryView,\n\tVectorCortexReconstructView,\n\tVectorCortexResetResult,\n\tVectorCortexShardsView,\n\tVectorCortexTopologyView,\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 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","/**\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\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 VectorCortexShardsView,\n\ttype VectorCortexTopologyView,\n} from \"../api/vector-cortex\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../components/ui/card\";\nimport { Badge } from \"../components/ui/badge\";\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\nfunction 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\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\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}, []);\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<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>Derived Cortex Store (VC3A)</CardTitle>\n\t\t\t\t\t\t{topology?.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{!topology?.enabled ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">Cortex store disabled (VC3A off).</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-4 md:grid-cols-3\">\n\t\t\t\t\t\t\t<Metric label=\"Generation\" value={topology.generationId ?? \"—\"} />\n\t\t\t\t\t\t\t<Metric label=\"Ordinal\" value={topology.ordinal ?? \"—\"} />\n\t\t\t\t\t\t\t<Metric label=\"Records\" value={String(topology.recordCount)} />\n\t\t\t\t\t\t\t<Metric label=\"Frontier (HW)\" value={topology.sourceHighWater} />\n\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\tlabel=\"Root digest\"\n\t\t\t\t\t\t\t\tvalue={topology.rootDigest ? topology.rootDigest.slice(0, 16) : \"—\"}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{topology.nodes !== undefined && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\t\t\tlabel=\"Nodes\"\n\t\t\t\t\t\t\t\t\t\tvalue={String(topology.nodes?.length ?? 0)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\t\t\tlabel=\"Edges\"\n\t\t\t\t\t\t\t\t\t\tvalue={String(topology.edges?.length ?? 0)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Metric\n\t\t\t\t\t\t\t\t\t\tlabel=\"Graph digest\"\n\t\t\t\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\t\t\t\ttopology.generationDigest\n\t\t\t\t\t\t\t\t\t\t\t\t? topology.generationDigest.slice(0, 16)\n\t\t\t\t\t\t\t\t\t\t\t\t: \"—\"\n\t\t\t\t\t\t\t\t\t\t}\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)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{topology.nodes !== undefined &&\n\t\t\t\t\t\t\t(topology.edges?.length ?? 0) > 0 && (\n\t\t\t\t\t\t\t\t<div className=\"mt-4 max-h-56 overflow-y-auto\">\n\t\t\t\t\t\t\t\t\t<div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\tTopology edges (VC3B)\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<table className=\"w-full text-left text-xs\">\n\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t<tr className=\"border-b border-border/50 text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">source</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">target</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">head</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">dir</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1\">score</th>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t{topology.edges?.map((e, i) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${e.source}-${e.target}-${e.head}-${i}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-b border-border/30\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2 font-mono\">{e.source}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2 font-mono\">{e.target}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2 font-mono\">{e.head}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2\">{e.direction}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 font-mono\">{e.score}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</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>Topology Query Diagnostics (VC3C)</CardTitle>\n\t\t\t\t\t\t{query?.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{!query?.enabled ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">Query diagnostics unavailable (VC3C 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-3\">\n\t\t\t\t\t\t\t<Metric label=\"Router version\" value={String(query.routerVersion)} />\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<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<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>Plan Manifests (VC5A)</CardTitle>\n\t\t\t\t\t\t{plans?.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{!plans?.enabled ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">PromptDagV1 + budgeted planner disabled (VC5A off).</div>\n\t\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=\"DAG fixtures\" value={String(plans.dagCount)} />\n\t\t\t\t\t\t\t<Metric label=\"Plan fixtures\" value={String(plans.plannerCount)} />\n\t\t\t\t\t\t\t<Metric label=\"Plans exposed\" value={String(plans.plans.length)} />\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 plan manifests only — no session payloads or prompt text.\n\t\t\t\t\t\t\tPer-run plan outputs are staged in-memory this sprint.\n\t\t\t\t\t\t</div>\n\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>Occurrence Ledger (VC1B)</CardTitle>\n\t\t\t\t\t\t{ledger?.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{!ledger?.enabled ? (\n\t\t\t\t\t\t<div className=\"vc-empty\">Ledger disabled (VC1B 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=\"mb-3 grid grid-cols-2 gap-4 md:grid-cols-3\">\n\t\t\t\t\t\t\t\t<Metric label=\"Session\" value={ledger.session} />\n\t\t\t\t\t\t\t\t<Metric label=\"High-water\" value={ledger.highWater} />\n\t\t\t\t\t\t\t\t<Metric label=\"Occurrences\" value={String(ledger.count)} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{ledger.occurrences.length === 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"vc-empty\">No occurrences recorded.</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"max-h-64 overflow-y-auto\">\n\t\t\t\t\t\t\t\t\t<table className=\"w-full text-left text-xs\">\n\t\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t\t<tr className=\"border-b border-border/50 text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">seq</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">eventId</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">kind</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1 pr-2\">toolCall</th>\n\t\t\t\t\t\t\t\t\t\t\t\t<th className=\"py-1\">digest</th>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t{ledger.occurrences.map((o) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${o.seq}-${o.eventId}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"border-b border-border/30\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2 font-mono\">{o.seq}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2 font-mono\">{o.eventId}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2\">{o.kind}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"py-1 pr-2 font-mono\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{o.toolCallId ?? \"\\u2014\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td className=\"max-w-[180px] truncate font-mono text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{o.digest}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t</div>\n\t);\n}\n"],"names":["fetchVectorCortexEvaluation","r","fetchVectorCortexHealth","fetchVectorCortexTopology","fetchVectorCortexQuery","fetchVectorCortexShards","fetchVectorCortexReconstruct","fetchVectorCortexPlans","fetchVectorCortexLedger","session","resetVectorCortexBreaker","subsystem","ModeChip","mode","count","jsxs","jsx","Metric","label","value","VectorCortexTab","data","setData","useState","err","setError","loading","setLoading","health","setHealth","resetMsg","setResetMsg","ledger","setLedger","topology","setTopology","query","setQuery","shards","setShards","reconstruct","setReconstruct","plans","setPlans","poll","useCallback","e","useEffect","id","onReset","max","Badge","Card","CardHeader","CardTitle","CardContent","edge","i","h","Fragment","o"],"mappings":"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"}
|