@legioncodeinc/hive 0.1.0
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/LICENSE +661 -0
- package/README.md +262 -0
- package/dist/cli-commands.d.ts +41 -0
- package/dist/cli-commands.js +76 -0
- package/dist/cli-commands.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +46 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon/dashboard/app.js +118 -0
- package/dist/daemon/dashboard/host.d.ts +90 -0
- package/dist/daemon/dashboard/host.js +172 -0
- package/dist/daemon/dashboard/host.js.map +1 -0
- package/dist/daemon/dashboard/web-assets.d.ts +88 -0
- package/dist/daemon/dashboard/web-assets.js +195 -0
- package/dist/daemon/dashboard/web-assets.js.map +1 -0
- package/dist/daemon/fleet-status.d.ts +15 -0
- package/dist/daemon/fleet-status.js +56 -0
- package/dist/daemon/fleet-status.js.map +1 -0
- package/dist/daemon/gate.d.ts +55 -0
- package/dist/daemon/gate.js +128 -0
- package/dist/daemon/gate.js.map +1 -0
- package/dist/daemon/proxy.d.ts +38 -0
- package/dist/daemon/proxy.js +126 -0
- package/dist/daemon/proxy.js.map +1 -0
- package/dist/daemon/registry.d.ts +31 -0
- package/dist/daemon/registry.js +120 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/server.d.ts +41 -0
- package/dist/daemon/server.js +126 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/setup-auth.d.ts +37 -0
- package/dist/daemon/setup-auth.js +51 -0
- package/dist/daemon/setup-auth.js.map +1 -0
- package/dist/daemon/telemetry-proxy.d.ts +47 -0
- package/dist/daemon/telemetry-proxy.js +63 -0
- package/dist/daemon/telemetry-proxy.js.map +1 -0
- package/dist/dashboard/contracts.d.ts +235 -0
- package/dist/dashboard/contracts.js +43 -0
- package/dist/dashboard/contracts.js.map +1 -0
- package/dist/dashboard/web/app.d.ts +44 -0
- package/dist/dashboard/web/app.js +179 -0
- package/dist/dashboard/web/app.js.map +1 -0
- package/dist/dashboard/web/boot-route.d.ts +23 -0
- package/dist/dashboard/web/boot-route.js +29 -0
- package/dist/dashboard/web/boot-route.js.map +1 -0
- package/dist/dashboard/web/build-graph-button.d.ts +46 -0
- package/dist/dashboard/web/build-graph-button.js +81 -0
- package/dist/dashboard/web/build-graph-button.js.map +1 -0
- package/dist/dashboard/web/buzzing-screen.d.ts +30 -0
- package/dist/dashboard/web/buzzing-screen.js +135 -0
- package/dist/dashboard/web/buzzing-screen.js.map +1 -0
- package/dist/dashboard/web/folder-picker.d.ts +54 -0
- package/dist/dashboard/web/folder-picker.js +125 -0
- package/dist/dashboard/web/folder-picker.js.map +1 -0
- package/dist/dashboard/web/graph-layout.d.ts +101 -0
- package/dist/dashboard/web/graph-layout.js +0 -0
- package/dist/dashboard/web/graph-layout.js.map +1 -0
- package/dist/dashboard/web/harness-strip.d.ts +38 -0
- package/dist/dashboard/web/harness-strip.js +65 -0
- package/dist/dashboard/web/harness-strip.js.map +1 -0
- package/dist/dashboard/web/health-rail.d.ts +26 -0
- package/dist/dashboard/web/health-rail.js +61 -0
- package/dist/dashboard/web/health-rail.js.map +1 -0
- package/dist/dashboard/web/main.d.ts +22 -0
- package/dist/dashboard/web/main.js +51 -0
- package/dist/dashboard/web/main.js.map +1 -0
- package/dist/dashboard/web/needs-project.d.ts +51 -0
- package/dist/dashboard/web/needs-project.js +69 -0
- package/dist/dashboard/web/needs-project.js.map +1 -0
- package/dist/dashboard/web/page-frame.d.ts +95 -0
- package/dist/dashboard/web/page-frame.js +98 -0
- package/dist/dashboard/web/page-frame.js.map +1 -0
- package/dist/dashboard/web/pages/coming-soon.d.ts +23 -0
- package/dist/dashboard/web/pages/coming-soon.js +19 -0
- package/dist/dashboard/web/pages/coming-soon.js.map +1 -0
- package/dist/dashboard/web/pages/dashboard.d.ts +32 -0
- package/dist/dashboard/web/pages/dashboard.js +205 -0
- package/dist/dashboard/web/pages/dashboard.js.map +1 -0
- package/dist/dashboard/web/pages/graph.d.ts +72 -0
- package/dist/dashboard/web/pages/graph.js +362 -0
- package/dist/dashboard/web/pages/graph.js.map +1 -0
- package/dist/dashboard/web/pages/harnesses.d.ts +65 -0
- package/dist/dashboard/web/pages/harnesses.js +210 -0
- package/dist/dashboard/web/pages/harnesses.js.map +1 -0
- package/dist/dashboard/web/pages/health.d.ts +22 -0
- package/dist/dashboard/web/pages/health.js +91 -0
- package/dist/dashboard/web/pages/health.js.map +1 -0
- package/dist/dashboard/web/pages/lifecycle-panel.d.ts +60 -0
- package/dist/dashboard/web/pages/lifecycle-panel.js +187 -0
- package/dist/dashboard/web/pages/lifecycle-panel.js.map +1 -0
- package/dist/dashboard/web/pages/logs.d.ts +55 -0
- package/dist/dashboard/web/pages/logs.js +311 -0
- package/dist/dashboard/web/pages/logs.js.map +1 -0
- package/dist/dashboard/web/pages/memories.d.ts +35 -0
- package/dist/dashboard/web/pages/memories.js +439 -0
- package/dist/dashboard/web/pages/memories.js.map +1 -0
- package/dist/dashboard/web/pages/projects.d.ts +38 -0
- package/dist/dashboard/web/pages/projects.js +325 -0
- package/dist/dashboard/web/pages/projects.js.map +1 -0
- package/dist/dashboard/web/pages/roi-chart.d.ts +52 -0
- package/dist/dashboard/web/pages/roi-chart.js +133 -0
- package/dist/dashboard/web/pages/roi-chart.js.map +1 -0
- package/dist/dashboard/web/pages/roi.d.ts +93 -0
- package/dist/dashboard/web/pages/roi.js +375 -0
- package/dist/dashboard/web/pages/roi.js.map +1 -0
- package/dist/dashboard/web/pages/settings.d.ts +103 -0
- package/dist/dashboard/web/pages/settings.js +420 -0
- package/dist/dashboard/web/pages/settings.js.map +1 -0
- package/dist/dashboard/web/pages/sync.d.ts +59 -0
- package/dist/dashboard/web/pages/sync.js +280 -0
- package/dist/dashboard/web/pages/sync.js.map +1 -0
- package/dist/dashboard/web/panels.d.ts +178 -0
- package/dist/dashboard/web/panels.js +471 -0
- package/dist/dashboard/web/panels.js.map +1 -0
- package/dist/dashboard/web/primitives.d.ts +80 -0
- package/dist/dashboard/web/primitives.js +208 -0
- package/dist/dashboard/web/primitives.js.map +1 -0
- package/dist/dashboard/web/readiness-splash.d.ts +39 -0
- package/dist/dashboard/web/readiness-splash.js +201 -0
- package/dist/dashboard/web/readiness-splash.js.map +1 -0
- package/dist/dashboard/web/registry.d.ts +96 -0
- package/dist/dashboard/web/registry.js +99 -0
- package/dist/dashboard/web/registry.js.map +1 -0
- package/dist/dashboard/web/router.d.ts +48 -0
- package/dist/dashboard/web/router.js +76 -0
- package/dist/dashboard/web/router.js.map +1 -0
- package/dist/dashboard/web/scope-context.d.ts +155 -0
- package/dist/dashboard/web/scope-context.js +266 -0
- package/dist/dashboard/web/scope-context.js.map +1 -0
- package/dist/dashboard/web/service-icons.d.ts +33 -0
- package/dist/dashboard/web/service-icons.js +80 -0
- package/dist/dashboard/web/service-icons.js.map +1 -0
- package/dist/dashboard/web/setup-gate.d.ts +116 -0
- package/dist/dashboard/web/setup-gate.js +272 -0
- package/dist/dashboard/web/setup-gate.js.map +1 -0
- package/dist/dashboard/web/sidebar.d.ts +63 -0
- package/dist/dashboard/web/sidebar.js +91 -0
- package/dist/dashboard/web/sidebar.js.map +1 -0
- package/dist/dashboard/web/use-fleet-telemetry.d.ts +111 -0
- package/dist/dashboard/web/use-fleet-telemetry.js +278 -0
- package/dist/dashboard/web/use-fleet-telemetry.js.map +1 -0
- package/dist/dashboard/web/wire.d.ts +1937 -0
- package/dist/dashboard/web/wire.js +1837 -0
- package/dist/dashboard/web/wire.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/install/registry.d.ts +35 -0
- package/dist/install/registry.js +110 -0
- package/dist/install/registry.js.map +1 -0
- package/dist/lock.d.ts +10 -0
- package/dist/lock.js +87 -0
- package/dist/lock.js.map +1 -0
- package/dist/service/commands.d.ts +15 -0
- package/dist/service/commands.js +49 -0
- package/dist/service/commands.js.map +1 -0
- package/dist/service/index.d.ts +38 -0
- package/dist/service/index.js +174 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/platform.d.ts +37 -0
- package/dist/service/platform.js +67 -0
- package/dist/service/platform.js.map +1 -0
- package/dist/service/templates.d.ts +10 -0
- package/dist/service/templates.js +120 -0
- package/dist/service/templates.js.map +1 -0
- package/dist/shared/constants.d.ts +15 -0
- package/dist/shared/constants.js +19 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/daemon-routing.d.ts +11 -0
- package/dist/shared/daemon-routing.js +38 -0
- package/dist/shared/daemon-routing.js.map +1 -0
- package/dist/shared/fleet-readiness.d.ts +18 -0
- package/dist/shared/fleet-readiness.js +9 -0
- package/dist/shared/fleet-readiness.js.map +1 -0
- package/dist/shared/fleet-telemetry.d.ts +68 -0
- package/dist/shared/fleet-telemetry.js +61 -0
- package/dist/shared/fleet-telemetry.js.map +1 -0
- package/dist/shared/lifecycle-flags.d.ts +34 -0
- package/dist/shared/lifecycle-flags.js +39 -0
- package/dist/shared/lifecycle-flags.js.map +1 -0
- package/dist/shared/memory-types.d.ts +55 -0
- package/dist/shared/memory-types.js +75 -0
- package/dist/shared/memory-types.js.map +1 -0
- package/dist/shared/service-status.d.ts +82 -0
- package/dist/shared/service-status.js +97 -0
- package/dist/shared/service-status.js.map +1 -0
- package/dist/telemetry/emit.d.ts +197 -0
- package/dist/telemetry/emit.js +196 -0
- package/dist/telemetry/emit.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../../src/dashboard/web/pages/dashboard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The MEMORY GRAPH page — PRD-041 (the full-page interactive graph), memory-only.
|
|
3
|
+
*
|
|
4
|
+
* Mounted at the PRD-037 `#/graph` slot. It renders the daemon's MEMORY/knowledge graph full-viewport —
|
|
5
|
+
* every entity and relation the snapshot holds — with a real interactive layout, pan + bounded zoom,
|
|
6
|
+
* click-to-select with a side detail panel, kind filters, and search-to-node.
|
|
7
|
+
*
|
|
8
|
+
* ── Codebase view removed (PRD-041 follow-up) ─────────────────────────────────
|
|
9
|
+
* This page previously carried a Codebase ↔ Memory toggle. The codebase graph was too dense to be
|
|
10
|
+
* useful to look at, so the UI now shows ONLY the memory graph (`wire.memoryGraph()`). The codebase
|
|
11
|
+
* graph is NOT abandoned: the daemon keeps building it in the background (assemble.ts auto-build) so
|
|
12
|
+
* the stale-ref / memory-lifecycle σ(m,t) diagnostic that reads the snapshot stays fed — it simply no
|
|
13
|
+
* longer has a viewer here.
|
|
14
|
+
*
|
|
15
|
+
* ── REUSE, do not fork (D-1) ──────────────────────────────────────────────────
|
|
16
|
+
* Positioning is the SHIPPED pure `layout(nodes, edges, viewBox)` from `graph-layout.ts`
|
|
17
|
+
* (PRD-035c), parameterized here with full-page dimensions — there is ONE layout function, no
|
|
18
|
+
* second NODE_POS. Neighbor derivation reuses `neighborsOf` / the `splitNeighbors` direction+relation
|
|
19
|
+
* split (also pure, in `graph-layout.ts`). The legend reuses the `KIND_COLOR` map exported from
|
|
20
|
+
* `panels.tsx`. The page builds the full-page experience on the shared primitives.
|
|
21
|
+
*
|
|
22
|
+
* ── Security (D-8) ────────────────────────────────────────────────────────────
|
|
23
|
+
* Local-mode-only + XSS-safe: every label (memory/entity text — higher-risk) renders as React TEXT,
|
|
24
|
+
* never `dangerouslySetInnerHTML`. The page reads ONLY the loopback memory-graph endpoint through the
|
|
25
|
+
* injected `wire` (never `createWireClient`); it adds no token/secret. The shell owns the daemon-down
|
|
26
|
+
* view-swap (D-9) — this page renders its empty/loading state until the fetch resolves. Every visual
|
|
27
|
+
* value is an existing `var(--…)` DS token; no new dependency (pan/zoom is hand-rolled over the SVG
|
|
28
|
+
* viewBox transform).
|
|
29
|
+
*/
|
|
30
|
+
import React from "react";
|
|
31
|
+
import { neighborsOf } from "../graph-layout.js";
|
|
32
|
+
import type { PageProps } from "../page-frame.js";
|
|
33
|
+
import { type GraphWire } from "../wire.js";
|
|
34
|
+
/** The pan/zoom view transform over the SVG viewBox: a scale + an (x,y) translate of the base box. */
|
|
35
|
+
interface ViewTransform {
|
|
36
|
+
readonly scale: number;
|
|
37
|
+
readonly tx: number;
|
|
38
|
+
readonly ty: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute the SVG `viewBox` string from the base box + the pan/zoom transform. A larger `scale` shows
|
|
42
|
+
* LESS of the base box (zoom in): the visible width is `width / scale`. `tx`/`ty` translate the visible
|
|
43
|
+
* window. Pure — so a test can assert the exact viewBox for a transform (D-3).
|
|
44
|
+
*/
|
|
45
|
+
export declare function viewBoxFor(transform: ViewTransform): string;
|
|
46
|
+
/**
|
|
47
|
+
* The distinct node kinds present in a graph, in first-seen order (D-5 / FR-5). The filter controls are
|
|
48
|
+
* derived from THIS — the snapshot's REAL kinds, never a hardcoded list. Pure + unit-assertable.
|
|
49
|
+
*/
|
|
50
|
+
export declare function distinctKinds(graph: GraphWire): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Apply the kind filter to a graph (D-5 / FR-5): drop nodes whose `kind` is in `hidden`, then drop any
|
|
53
|
+
* edge incident to a hidden node (an edge survives only when BOTH endpoints survive). Returns the
|
|
54
|
+
* visible sub-graph; the counts the page shows come straight off its `nodes`/`edges` length. Pure.
|
|
55
|
+
*/
|
|
56
|
+
export declare function applyKindFilter(graph: GraphWire, hidden: ReadonlySet<string>): GraphWire;
|
|
57
|
+
/**
|
|
58
|
+
* Find the FIRST node matching a search query by `id` or `label` (case-insensitive substring) — D-6 /
|
|
59
|
+
* FR-6. An empty/whitespace query matches nothing (returns null). Pure + unit-assertable. The page
|
|
60
|
+
* focuses + selects the returned node's id.
|
|
61
|
+
*/
|
|
62
|
+
export declare function findNode(graph: GraphWire, query: string): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* The Memory Graph page (PRD-041, memory-only). Hydrates the memory graph via `wire.memoryGraph()`
|
|
65
|
+
* through the shared `wire`, and renders the full-page interactive graph: the shared pure `layout(...)`,
|
|
66
|
+
* pan/zoom over the SVG viewBox, click-to-select → side detail panel, kind filters from the snapshot's
|
|
67
|
+
* real kinds, and search-to-node. `built:false` → the honest full-page empty state. The shell owns the
|
|
68
|
+
* daemon-down swap (D-9), so this page just renders empty/loading until its fetch resolves.
|
|
69
|
+
*/
|
|
70
|
+
export declare function GraphPage({ wire }: PageProps): React.JSX.Element;
|
|
71
|
+
/** Re-export the pure neighbor helper the page's detail panel relies on (test convenience). */
|
|
72
|
+
export { neighborsOf };
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The MEMORY GRAPH page — PRD-041 (the full-page interactive graph), memory-only.
|
|
4
|
+
*
|
|
5
|
+
* Mounted at the PRD-037 `#/graph` slot. It renders the daemon's MEMORY/knowledge graph full-viewport —
|
|
6
|
+
* every entity and relation the snapshot holds — with a real interactive layout, pan + bounded zoom,
|
|
7
|
+
* click-to-select with a side detail panel, kind filters, and search-to-node.
|
|
8
|
+
*
|
|
9
|
+
* ── Codebase view removed (PRD-041 follow-up) ─────────────────────────────────
|
|
10
|
+
* This page previously carried a Codebase ↔ Memory toggle. The codebase graph was too dense to be
|
|
11
|
+
* useful to look at, so the UI now shows ONLY the memory graph (`wire.memoryGraph()`). The codebase
|
|
12
|
+
* graph is NOT abandoned: the daemon keeps building it in the background (assemble.ts auto-build) so
|
|
13
|
+
* the stale-ref / memory-lifecycle σ(m,t) diagnostic that reads the snapshot stays fed — it simply no
|
|
14
|
+
* longer has a viewer here.
|
|
15
|
+
*
|
|
16
|
+
* ── REUSE, do not fork (D-1) ──────────────────────────────────────────────────
|
|
17
|
+
* Positioning is the SHIPPED pure `layout(nodes, edges, viewBox)` from `graph-layout.ts`
|
|
18
|
+
* (PRD-035c), parameterized here with full-page dimensions — there is ONE layout function, no
|
|
19
|
+
* second NODE_POS. Neighbor derivation reuses `neighborsOf` / the `splitNeighbors` direction+relation
|
|
20
|
+
* split (also pure, in `graph-layout.ts`). The legend reuses the `KIND_COLOR` map exported from
|
|
21
|
+
* `panels.tsx`. The page builds the full-page experience on the shared primitives.
|
|
22
|
+
*
|
|
23
|
+
* ── Security (D-8) ────────────────────────────────────────────────────────────
|
|
24
|
+
* Local-mode-only + XSS-safe: every label (memory/entity text — higher-risk) renders as React TEXT,
|
|
25
|
+
* never `dangerouslySetInnerHTML`. The page reads ONLY the loopback memory-graph endpoint through the
|
|
26
|
+
* injected `wire` (never `createWireClient`); it adds no token/secret. The shell owns the daemon-down
|
|
27
|
+
* view-swap (D-9) — this page renders its empty/loading state until the fetch resolves. Every visual
|
|
28
|
+
* value is an existing `var(--…)` DS token; no new dependency (pan/zoom is hand-rolled over the SVG
|
|
29
|
+
* viewBox transform).
|
|
30
|
+
*/
|
|
31
|
+
import React from "react";
|
|
32
|
+
import { layout, neighborsOf, splitNeighbors } from "../graph-layout.js";
|
|
33
|
+
import { KIND_COLOR, KIND_COLOR_FALLBACK } from "../panels.js";
|
|
34
|
+
import { Badge } from "../primitives.js";
|
|
35
|
+
import { isTabHidden, PageFrame } from "../page-frame.js";
|
|
36
|
+
import { useScope } from "../scope-context.js";
|
|
37
|
+
import { NeedsProjectSelection } from "../needs-project.js";
|
|
38
|
+
import { capGraphForRender, EMPTY_GRAPH, MAX_RENDER_NODES } from "../wire.js";
|
|
39
|
+
/** How often the page re-hydrates the memory graph (ms). Light refresh, stopped on unmount. */
|
|
40
|
+
const GRAPH_POLL_MS = 8000;
|
|
41
|
+
/**
|
|
42
|
+
* The full-page layout canvas extent — the pure `layout(...)` fits node positions inside this box. Far
|
|
43
|
+
* larger than the mini-widget's 540×200 so a real entity set spreads out (D-2). The SVG scales to its
|
|
44
|
+
* container via `viewBox`; pan/zoom transforms this base box (it is NOT the rendered pixel size).
|
|
45
|
+
*/
|
|
46
|
+
const GRAPH_VIEW = { width: 1600, height: 1000 };
|
|
47
|
+
/** Zoom bounds (D-3): the viewBox scale never goes below/above these so the graph can never invert/vanish. */
|
|
48
|
+
const MIN_ZOOM = 0.25;
|
|
49
|
+
const MAX_ZOOM = 4;
|
|
50
|
+
/** The multiplicative zoom step per wheel notch / button press. */
|
|
51
|
+
const ZOOM_STEP = 1.15;
|
|
52
|
+
/** The identity transform — the fit/reset baseline (whole base box framed, no pan). */
|
|
53
|
+
const IDENTITY_TRANSFORM = { scale: 1, tx: 0, ty: 0 };
|
|
54
|
+
/** Clamp a number into `[lo, hi]`. */
|
|
55
|
+
function clamp(n, lo, hi) {
|
|
56
|
+
return Math.min(hi, Math.max(lo, n));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Compute the SVG `viewBox` string from the base box + the pan/zoom transform. A larger `scale` shows
|
|
60
|
+
* LESS of the base box (zoom in): the visible width is `width / scale`. `tx`/`ty` translate the visible
|
|
61
|
+
* window. Pure — so a test can assert the exact viewBox for a transform (D-3).
|
|
62
|
+
*/
|
|
63
|
+
export function viewBoxFor(transform) {
|
|
64
|
+
const w = GRAPH_VIEW.width / transform.scale;
|
|
65
|
+
const h = GRAPH_VIEW.height / transform.scale;
|
|
66
|
+
return `${transform.tx} ${transform.ty} ${w} ${h}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The distinct node kinds present in a graph, in first-seen order (D-5 / FR-5). The filter controls are
|
|
70
|
+
* derived from THIS — the snapshot's REAL kinds, never a hardcoded list. Pure + unit-assertable.
|
|
71
|
+
*/
|
|
72
|
+
export function distinctKinds(graph) {
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const n of graph.nodes) {
|
|
76
|
+
if (!seen.has(n.kind)) {
|
|
77
|
+
seen.add(n.kind);
|
|
78
|
+
out.push(n.kind);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Apply the kind filter to a graph (D-5 / FR-5): drop nodes whose `kind` is in `hidden`, then drop any
|
|
85
|
+
* edge incident to a hidden node (an edge survives only when BOTH endpoints survive). Returns the
|
|
86
|
+
* visible sub-graph; the counts the page shows come straight off its `nodes`/`edges` length. Pure.
|
|
87
|
+
*/
|
|
88
|
+
export function applyKindFilter(graph, hidden) {
|
|
89
|
+
if (hidden.size === 0)
|
|
90
|
+
return graph;
|
|
91
|
+
const nodes = graph.nodes.filter((n) => !hidden.has(n.kind));
|
|
92
|
+
const visibleIds = new Set(nodes.map((n) => n.id));
|
|
93
|
+
const edges = graph.edges.filter((e) => visibleIds.has(e.from) && visibleIds.has(e.to));
|
|
94
|
+
return { built: graph.built, nodes, edges };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Find the FIRST node matching a search query by `id` or `label` (case-insensitive substring) — D-6 /
|
|
98
|
+
* FR-6. An empty/whitespace query matches nothing (returns null). Pure + unit-assertable. The page
|
|
99
|
+
* focuses + selects the returned node's id.
|
|
100
|
+
*/
|
|
101
|
+
export function findNode(graph, query) {
|
|
102
|
+
const q = query.trim().toLowerCase();
|
|
103
|
+
if (q === "")
|
|
104
|
+
return null;
|
|
105
|
+
const hit = graph.nodes.find((n) => n.id.toLowerCase().includes(q) || n.label.toLowerCase().includes(q));
|
|
106
|
+
return hit?.id ?? null;
|
|
107
|
+
}
|
|
108
|
+
/** Center the view on a node position: pick a `tx`/`ty` that frames `p` in the middle of the visible box. */
|
|
109
|
+
function centerOn(p, scale) {
|
|
110
|
+
const w = GRAPH_VIEW.width / scale;
|
|
111
|
+
const h = GRAPH_VIEW.height / scale;
|
|
112
|
+
return { scale, tx: p.x - w / 2, ty: p.y - h / 2 };
|
|
113
|
+
}
|
|
114
|
+
// ── The kind-filter legend (D-5) ─────────────────────────────────────────────
|
|
115
|
+
/** One kind toggle + its swatch + visible count. Toggling flips the kind's hidden state. */
|
|
116
|
+
function KindToggle({ kind, count, hidden, onToggle, }) {
|
|
117
|
+
const color = KIND_COLOR[kind] ?? KIND_COLOR_FALLBACK;
|
|
118
|
+
return (_jsxs("button", { type: "button", role: "switch", "aria-checked": !hidden, "data-testid": `kind-toggle-${kind}`, "data-hidden": hidden, onClick: onToggle, style: {
|
|
119
|
+
display: "inline-flex",
|
|
120
|
+
alignItems: "center",
|
|
121
|
+
gap: 7,
|
|
122
|
+
height: 28,
|
|
123
|
+
padding: "0 11px",
|
|
124
|
+
background: hidden ? "var(--bg-elevated)" : "var(--bg-surface)",
|
|
125
|
+
border: "1px solid var(--border-default)",
|
|
126
|
+
borderRadius: "var(--radius-full)",
|
|
127
|
+
color: hidden ? "var(--text-tertiary)" : "var(--text-secondary)",
|
|
128
|
+
fontFamily: "var(--font-mono)",
|
|
129
|
+
fontSize: 12,
|
|
130
|
+
cursor: "pointer",
|
|
131
|
+
opacity: hidden ? 0.55 : 1,
|
|
132
|
+
}, children: [_jsx("span", { style: { width: 9, height: 9, borderRadius: "50%", background: color, flex: "none" } }), kind || "node", _jsx("span", { style: { color: "var(--text-tertiary)" }, children: count })] }));
|
|
133
|
+
}
|
|
134
|
+
// ── The node detail panel (D-4 / FR-4) ───────────────────────────────────────
|
|
135
|
+
/** One relation group row in the detail panel: the relation kind + its neighbor labels, as TEXT. */
|
|
136
|
+
function RelationRow({ kind, labels }) {
|
|
137
|
+
return (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: 3, marginBottom: 8 }, children: [_jsxs("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-tertiary)", textTransform: "uppercase", letterSpacing: "0.06em" }, children: [kind || "—", " \u00B7 ", labels.length] }), _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--text-secondary)", wordBreak: "break-word" }, children: labels.join(", ") })] }));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The right-hand node DETAIL panel (D-4 / OQ-4). Shows the selected node's `id`, `label`, `kind`, and
|
|
141
|
+
* its neighbors split by DIRECTION (outgoing/incoming) and RELATION (`depends_on`/`supersedes`/… for the
|
|
142
|
+
* memory graph — no special-casing). EVERY rendered value is React text (XSS-safe). `mapLabel` resolves a
|
|
143
|
+
* neighbor id to its display label.
|
|
144
|
+
*/
|
|
145
|
+
function NodeDetailPanel({ node, graph, onClear, }) {
|
|
146
|
+
const { outgoing, incoming } = splitNeighbors(node.id, graph.edges);
|
|
147
|
+
const labelOf = (id) => graph.nodes.find((n) => n.id === id)?.label || id;
|
|
148
|
+
const toLabels = (ids) => ids.map(labelOf);
|
|
149
|
+
const hasNeighbors = outgoing.length > 0 || incoming.length > 0;
|
|
150
|
+
return (_jsxs("aside", { "data-testid": "graph-detail-panel", style: {
|
|
151
|
+
width: 320,
|
|
152
|
+
flex: "none",
|
|
153
|
+
alignSelf: "stretch",
|
|
154
|
+
padding: 16,
|
|
155
|
+
background: "var(--bg-surface)",
|
|
156
|
+
border: "1px solid var(--border-default)",
|
|
157
|
+
borderRadius: "var(--radius-lg)",
|
|
158
|
+
display: "flex",
|
|
159
|
+
flexDirection: "column",
|
|
160
|
+
gap: 10,
|
|
161
|
+
overflow: "auto",
|
|
162
|
+
}, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [_jsx("span", { style: { width: 9, height: 9, borderRadius: "50%", background: KIND_COLOR[node.kind] ?? KIND_COLOR_FALLBACK, flex: "none" } }), _jsx("span", { style: { fontSize: 14, color: "var(--text-primary)", minWidth: 0, wordBreak: "break-word" }, children: node.label }), _jsx("span", { style: { flex: 1 } }), _jsx(Badge, { tone: "neutral", mono: true, children: node.kind || "node" })] }), _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-tertiary)", wordBreak: "break-all" }, children: node.id }), _jsx("div", { style: { height: 1, background: "var(--border-subtle)", margin: "2px 0" } }), !hasNeighbors && _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--text-tertiary)" }, children: "no neighbors" }), outgoing.length > 0 && (_jsxs("div", { "data-testid": "detail-outgoing", children: [_jsx("div", { style: { fontSize: 12, fontWeight: 600, color: "var(--text-primary)", marginBottom: 6 }, children: "Outgoing" }), outgoing.map((g) => (_jsx(RelationRow, { kind: g.kind, labels: toLabels(g.ids) }, `out-${g.kind}`)))] })), incoming.length > 0 && (_jsxs("div", { "data-testid": "detail-incoming", children: [_jsx("div", { style: { fontSize: 12, fontWeight: 600, color: "var(--text-primary)", marginBottom: 6 }, children: "Incoming" }), incoming.map((g) => (_jsx(RelationRow, { kind: g.kind, labels: toLabels(g.ids) }, `in-${g.kind}`)))] })), _jsx("button", { type: "button", onClick: onClear, style: { height: 28, padding: "0 12px", background: "transparent", border: "1px solid var(--border-default)", borderRadius: "var(--radius-md)", color: "var(--text-secondary)", fontFamily: "var(--font-mono)", fontSize: 12, cursor: "pointer", alignSelf: "flex-start", marginTop: "auto" }, children: "clear selection" })] }));
|
|
163
|
+
}
|
|
164
|
+
// ── The interactive SVG canvas (D-2 / D-3) ────────────────────────────────────
|
|
165
|
+
/**
|
|
166
|
+
* The full-page interactive graph canvas. Positions come from the SHARED pure `layout(...)` (D-1),
|
|
167
|
+
* parameterized with {@link GRAPH_VIEW}. Draws one `<line>` per edge whose endpoints both exist and one
|
|
168
|
+
* node group per node (a `<circle>` mark + a `<text>` label — XSS-safe). Pan (drag the background) and
|
|
169
|
+
* bounded zoom (wheel) transform the viewBox via the controlled `transform` prop. Clicking a node
|
|
170
|
+
* selects it; clicking the background clears. Node labels are React text only.
|
|
171
|
+
*/
|
|
172
|
+
function GraphCanvasFull({ graph, selected, transform, onSelect, onClear, onPanZoom, }) {
|
|
173
|
+
const positions = React.useMemo(() => layout(graph.nodes, graph.edges, GRAPH_VIEW), [graph]);
|
|
174
|
+
// Track an in-progress background drag (pan). We store the starting client point + the transform at
|
|
175
|
+
// drag start, then translate by the delta scaled into base-box units.
|
|
176
|
+
const drag = React.useRef(null);
|
|
177
|
+
const onPointerDown = (ev) => {
|
|
178
|
+
// Only a background drag pans — a node click is handled on the node group (stopPropagation).
|
|
179
|
+
drag.current = { x: ev.clientX, y: ev.clientY, tx: transform.tx, ty: transform.ty };
|
|
180
|
+
ev.currentTarget.setPointerCapture?.(ev.pointerId);
|
|
181
|
+
};
|
|
182
|
+
const onPointerMove = (ev) => {
|
|
183
|
+
const d = drag.current;
|
|
184
|
+
if (d === null)
|
|
185
|
+
return;
|
|
186
|
+
// Convert a client-pixel delta into base-box units: the visible box is `width/scale` wide across
|
|
187
|
+
// the rendered element, so 1 client px ≈ (1/scale) base units (approximate — good enough for pan).
|
|
188
|
+
const dx = (ev.clientX - d.x) / transform.scale;
|
|
189
|
+
const dy = (ev.clientY - d.y) / transform.scale;
|
|
190
|
+
onPanZoom({ scale: transform.scale, tx: d.tx - dx, ty: d.ty - dy });
|
|
191
|
+
};
|
|
192
|
+
const endDrag = () => {
|
|
193
|
+
drag.current = null;
|
|
194
|
+
};
|
|
195
|
+
const onWheel = (ev) => {
|
|
196
|
+
// Bounded zoom (D-3): a wheel notch multiplies/divides the scale, clamped to [MIN,MAX]. Keep the
|
|
197
|
+
// translate anchored to the base-box origin (a simple, predictable zoom; fit/reset re-frames).
|
|
198
|
+
const factor = ev.deltaY < 0 ? ZOOM_STEP : 1 / ZOOM_STEP;
|
|
199
|
+
const scale = clamp(transform.scale * factor, MIN_ZOOM, MAX_ZOOM);
|
|
200
|
+
onPanZoom({ scale, tx: transform.tx, ty: transform.ty });
|
|
201
|
+
};
|
|
202
|
+
return (_jsxs("svg", { "data-testid": "graph-canvas", viewBox: viewBoxFor(transform), onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: endDrag, onPointerLeave: endDrag, onWheel: onWheel, onClick: onClear, style: { width: "100%", height: "100%", display: "block", cursor: "grab", touchAction: "none", background: "var(--bg-canvas)" }, children: [graph.edges.map((e, i) => {
|
|
203
|
+
const a = positions.get(e.from);
|
|
204
|
+
const b = positions.get(e.to);
|
|
205
|
+
if (a === undefined || b === undefined)
|
|
206
|
+
return null;
|
|
207
|
+
return _jsx("line", { x1: a.x, y1: a.y, x2: b.x, y2: b.y, stroke: "var(--border-strong)", strokeWidth: 1.5 }, i);
|
|
208
|
+
}), graph.nodes.map((n) => {
|
|
209
|
+
const p = positions.get(n.id);
|
|
210
|
+
if (p === undefined)
|
|
211
|
+
return null;
|
|
212
|
+
const isSelected = n.id === selected;
|
|
213
|
+
return (_jsxs("g", { role: "button", tabIndex: 0, "aria-label": `node ${n.label}`, "aria-pressed": isSelected, "data-node-id": n.id, style: { cursor: "pointer" }, onClick: (ev) => {
|
|
214
|
+
ev.stopPropagation();
|
|
215
|
+
onSelect(n.id);
|
|
216
|
+
}, children: [isSelected && _jsx("circle", { cx: p.x, cy: p.y, r: 16, fill: "none", stroke: "var(--honey)", strokeWidth: 2 }), _jsx("circle", { cx: p.x, cy: p.y, r: isSelected ? 12 : 9, fill: KIND_COLOR[n.kind] ?? KIND_COLOR_FALLBACK }), _jsx("text", { x: p.x + 15, y: p.y + 4, fontFamily: "var(--font-mono)", fontSize: 13, fill: "var(--text-secondary)", children: n.label })] }, n.id));
|
|
217
|
+
})] }));
|
|
218
|
+
}
|
|
219
|
+
// ── Empty state (D-7) ──────────────────────────────────────────────────────────
|
|
220
|
+
/**
|
|
221
|
+
* The full-page memory-graph empty state. The knowledge graph is populated automatically as memories and
|
|
222
|
+
* entities accrue (PRD-008) — there is no build command to invent (OQ-6), so this is an honest neutral
|
|
223
|
+
* note, never a faked graph or a dead command.
|
|
224
|
+
*/
|
|
225
|
+
function GraphEmptyState() {
|
|
226
|
+
return (_jsxs("div", { "data-testid": "graph-empty-state", style: {
|
|
227
|
+
display: "flex",
|
|
228
|
+
flexDirection: "column",
|
|
229
|
+
alignItems: "center",
|
|
230
|
+
justifyContent: "center",
|
|
231
|
+
gap: 10,
|
|
232
|
+
minHeight: 360,
|
|
233
|
+
padding: "48px 16px",
|
|
234
|
+
background: "var(--bg-surface)",
|
|
235
|
+
border: "1px solid var(--border-default)",
|
|
236
|
+
borderRadius: "var(--radius-lg)",
|
|
237
|
+
textAlign: "center",
|
|
238
|
+
}, children: [_jsx("div", { style: { fontSize: 15, color: "var(--text-tertiary)" }, children: "No memory graph yet for this workspace." }), _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--text-tertiary)", maxWidth: 460 }, children: "The knowledge graph is populated automatically as memories and entities accrue." })] }));
|
|
239
|
+
}
|
|
240
|
+
// ── Small toolbar controls ────────────────────────────────────────────────────
|
|
241
|
+
/** A compact toolbar button (zoom in/out, fit). Mono, bordered, transparent — matches the kit. */
|
|
242
|
+
function ToolButton({ label, ariaLabel, onClick }) {
|
|
243
|
+
return (_jsx("button", { type: "button", "aria-label": ariaLabel, onClick: onClick, style: { width: 30, height: 30, padding: 0, background: "transparent", border: "1px solid var(--border-default)", borderRadius: "var(--radius-md)", color: "var(--text-secondary)", fontFamily: "var(--font-mono)", fontSize: 14, lineHeight: 1, cursor: "pointer" }, children: label }));
|
|
244
|
+
}
|
|
245
|
+
// ── The routed page ───────────────────────────────────────────────────────────
|
|
246
|
+
/**
|
|
247
|
+
* The Memory Graph page (PRD-041, memory-only). Hydrates the memory graph via `wire.memoryGraph()`
|
|
248
|
+
* through the shared `wire`, and renders the full-page interactive graph: the shared pure `layout(...)`,
|
|
249
|
+
* pan/zoom over the SVG viewBox, click-to-select → side detail panel, kind filters from the snapshot's
|
|
250
|
+
* real kinds, and search-to-node. `built:false` → the honest full-page empty state. The shell owns the
|
|
251
|
+
* daemon-down swap (D-9), so this page just renders empty/loading until its fetch resolves.
|
|
252
|
+
*/
|
|
253
|
+
export function GraphPage({ wire }) {
|
|
254
|
+
// PRD-049e (49e-AC-2): the dashboard-selected project. Threaded into the graph fetcher (so a scope
|
|
255
|
+
// switch re-queries for the new project on the NEXT render) and gating the needs-selection state.
|
|
256
|
+
const { scope } = useScope();
|
|
257
|
+
const project = scope.project;
|
|
258
|
+
const [graph, setGraph] = React.useState(EMPTY_GRAPH);
|
|
259
|
+
const [selected, setSelected] = React.useState(null);
|
|
260
|
+
const [hiddenKinds, setHiddenKinds] = React.useState(new Set());
|
|
261
|
+
const [search, setSearch] = React.useState("");
|
|
262
|
+
const [transform, setTransform] = React.useState(IDENTITY_TRANSFORM);
|
|
263
|
+
// Hydrate the MEMORY graph. Fetches immediately, then a light poll keeps it fresh. A failure degrades
|
|
264
|
+
// to EMPTY_GRAPH (the wire is fail-soft) → the empty state. An `alive` guard prevents a late-resolving
|
|
265
|
+
// fetch from updating after unmount/scope-switch.
|
|
266
|
+
React.useEffect(() => {
|
|
267
|
+
// 49e-AC-5: with NO project selected, do not fetch (and below we render the needs-selection
|
|
268
|
+
// state) — never show another project's graph. The effect is keyed on `project` so a scope
|
|
269
|
+
// switch re-fetches for the new project on the next render (49e-AC-2).
|
|
270
|
+
if (project === undefined) {
|
|
271
|
+
setGraph(EMPTY_GRAPH);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
let alive = true;
|
|
275
|
+
const tick = async () => {
|
|
276
|
+
if (!alive || isTabHidden())
|
|
277
|
+
return; // background-tab pause: no graph poll while hidden
|
|
278
|
+
const next = await wire.memoryGraph(project);
|
|
279
|
+
if (alive)
|
|
280
|
+
setGraph(next);
|
|
281
|
+
};
|
|
282
|
+
void tick();
|
|
283
|
+
const id = setInterval(() => void tick(), GRAPH_POLL_MS);
|
|
284
|
+
return () => {
|
|
285
|
+
alive = false;
|
|
286
|
+
clearInterval(id);
|
|
287
|
+
};
|
|
288
|
+
}, [wire, project]);
|
|
289
|
+
const kinds = React.useMemo(() => distinctKinds(graph), [graph]);
|
|
290
|
+
// The visible sub-graph after the kind filter (D-5).
|
|
291
|
+
const visible = React.useMemo(() => applyKindFilter(graph, hiddenKinds), [graph, hiddenKinds]);
|
|
292
|
+
// graph memory cap: bound what the canvas actually draws. The daemon already caps the payload (`graph.meta`);
|
|
293
|
+
// this is the client-side backstop so the page never mounts an unbounded number of SVG nodes. This
|
|
294
|
+
// `rendered` set is what the canvas, counts, selection, and search all read.
|
|
295
|
+
const { graph: rendered, capped } = React.useMemo(() => capGraphForRender(visible, MAX_RENDER_NODES), [visible]);
|
|
296
|
+
// graph memory cap — TWO distinct, separately-reported reductions (never conflated with the kind FILTER,
|
|
297
|
+
// which is a user action, not truncation):
|
|
298
|
+
// • serverTruncated — the daemon dropped nodes from the snapshot; its honest counts are in `graph.meta`
|
|
299
|
+
// (shownNodes of totalNodes), independent of any local filter.
|
|
300
|
+
// • capped — the client render backstop fired (the fetched graph still exceeded MAX_RENDER_NODES).
|
|
301
|
+
const serverTruncated = graph.meta?.truncated ?? false;
|
|
302
|
+
const truncated = serverTruncated || capped;
|
|
303
|
+
// The selected node still present in the RENDERED graph (clears if it was filtered/capped away).
|
|
304
|
+
const selectedNode = selected !== null ? rendered.nodes.find((n) => n.id === selected) ?? null : null;
|
|
305
|
+
const toggleKind = React.useCallback((kind) => {
|
|
306
|
+
setHiddenKinds((prev) => {
|
|
307
|
+
const next = new Set(prev);
|
|
308
|
+
if (next.has(kind))
|
|
309
|
+
next.delete(kind);
|
|
310
|
+
else
|
|
311
|
+
next.add(kind);
|
|
312
|
+
return next;
|
|
313
|
+
});
|
|
314
|
+
}, []);
|
|
315
|
+
const onSearch = React.useCallback((raw) => {
|
|
316
|
+
setSearch(raw);
|
|
317
|
+
const hit = findNode(rendered, raw);
|
|
318
|
+
if (hit === null)
|
|
319
|
+
return;
|
|
320
|
+
setSelected(hit);
|
|
321
|
+
// Focus the match: center the view on its computed position at a comfortable zoom (D-6).
|
|
322
|
+
const positions = layout(rendered.nodes, rendered.edges, GRAPH_VIEW);
|
|
323
|
+
const p = positions.get(hit);
|
|
324
|
+
if (p !== undefined)
|
|
325
|
+
setTransform(centerOn(p, Math.max(transform.scale, 1.4)));
|
|
326
|
+
}, [rendered, transform.scale]);
|
|
327
|
+
const fit = React.useCallback(() => setTransform(IDENTITY_TRANSFORM), []);
|
|
328
|
+
const zoomIn = React.useCallback(() => setTransform((t) => ({ ...t, scale: clamp(t.scale * ZOOM_STEP, MIN_ZOOM, MAX_ZOOM) })), []);
|
|
329
|
+
const zoomOut = React.useCallback(() => setTransform((t) => ({ ...t, scale: clamp(t.scale / ZOOM_STEP, MIN_ZOOM, MAX_ZOOM) })), []);
|
|
330
|
+
const onSelect = React.useCallback((id) => setSelected((cur) => (cur === id ? null : id)), []);
|
|
331
|
+
const clearSelection = React.useCallback(() => setSelected(null), []);
|
|
332
|
+
const eyebrow = `${rendered.nodes.length} nodes · ${rendered.edges.length} edges`;
|
|
333
|
+
return (_jsx(PageFrame, { title: "Memory Graph", eyebrow: project === undefined ? "memory graph" : eyebrow, children: project === undefined ? (_jsx(NeedsProjectSelection, { surface: "memory graph" })) : !graph.built ? (_jsx(GraphEmptyState, {})) : (_jsxs(_Fragment, { children: [truncated && (_jsxs("div", { "data-testid": "graph-truncation-notice", style: {
|
|
334
|
+
display: "flex",
|
|
335
|
+
alignItems: "center",
|
|
336
|
+
gap: 8,
|
|
337
|
+
marginBottom: 14,
|
|
338
|
+
padding: "9px 12px",
|
|
339
|
+
background: "var(--bg-elevated)",
|
|
340
|
+
border: "1px solid var(--border-subtle)",
|
|
341
|
+
borderRadius: "var(--radius-md)",
|
|
342
|
+
fontFamily: "var(--font-mono)",
|
|
343
|
+
fontSize: 12,
|
|
344
|
+
color: "var(--text-tertiary)",
|
|
345
|
+
}, children: [_jsx("span", { style: { width: 7, height: 7, borderRadius: "50%", background: "var(--severity-warning)", flex: "none" } }), serverTruncated
|
|
346
|
+
? `Showing the ${(graph.meta?.shownNodes ?? graph.nodes.length).toLocaleString()} most-connected of ${(graph.meta?.totalNodes ?? graph.nodes.length).toLocaleString()} nodes. Use search and kind filters to focus.`
|
|
347
|
+
: `Rendering is capped at ${MAX_RENDER_NODES.toLocaleString()} nodes. Use search and kind filters to focus.`] })), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 12, marginBottom: 14, flexWrap: "wrap" }, children: [_jsx("input", { "aria-label": "search nodes", "data-testid": "graph-search", type: "text", value: search, placeholder: "search id or label\u2026", onChange: (e) => onSearch(e.target.value), style: { height: 30, padding: "0 12px", minWidth: 220, background: "var(--bg-surface)", border: "1px solid var(--border-default)", borderRadius: "var(--radius-md)", color: "var(--text-primary)", fontFamily: "var(--font-mono)", fontSize: 13 } }), _jsx("div", { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: kinds.map((k) => {
|
|
348
|
+
const count = graph.nodes.filter((n) => n.kind === k).length;
|
|
349
|
+
return _jsx(KindToggle, { kind: k, count: count, hidden: hiddenKinds.has(k), onToggle: () => toggleKind(k) }, k);
|
|
350
|
+
}) }), _jsx("span", { style: { flex: 1 } }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [_jsx(ToolButton, { label: "\u2212", ariaLabel: "zoom out", onClick: zoomOut }), _jsx(ToolButton, { label: "+", ariaLabel: "zoom in", onClick: zoomIn }), _jsx("button", { type: "button", "data-testid": "fit-view", onClick: fit, style: { height: 30, padding: "0 12px", background: "transparent", border: "1px solid var(--border-default)", borderRadius: "var(--radius-md)", color: "var(--text-secondary)", fontFamily: "var(--font-mono)", fontSize: 12, cursor: "pointer" }, children: "fit" })] })] }), _jsxs("div", { style: { display: "flex", gap: 16, alignItems: "stretch" }, children: [_jsx("div", { style: {
|
|
351
|
+
flex: 1,
|
|
352
|
+
minWidth: 0,
|
|
353
|
+
height: "70vh",
|
|
354
|
+
background: "var(--bg-surface)",
|
|
355
|
+
border: "1px solid var(--border-default)",
|
|
356
|
+
borderRadius: "var(--radius-lg)",
|
|
357
|
+
overflow: "hidden",
|
|
358
|
+
}, children: _jsx(GraphCanvasFull, { graph: rendered, selected: selectedNode?.id ?? null, transform: transform, onSelect: onSelect, onClear: clearSelection, onPanZoom: setTransform }) }), selectedNode !== null && _jsx(NodeDetailPanel, { node: selectedNode, graph: graph, onClear: clearSelection })] })] })) }));
|
|
359
|
+
}
|
|
360
|
+
/** Re-export the pure neighbor helper the page's detail panel relies on (test convenience). */
|
|
361
|
+
export { neighborsOf };
|
|
362
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../src/dashboard/web/pages/graph.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The HARNESSES page — PRD-039b (overview) + PRD-039c (per-harness detail).
|
|
3
|
+
*
|
|
4
|
+
* Mounted at the PRD-037 `#/harnesses` slot. The shell's `Outlet` resolves BOTH `#/harnesses` and a
|
|
5
|
+
* deep `#/harnesses/<name>` to THIS component (the registry prefix-match, 037c), so the page reads the
|
|
6
|
+
* active hash and renders:
|
|
7
|
+
* - `#/harnesses` → the OVERVIEW (039b): six per-harness KPI cards + an installed/active
|
|
8
|
+
* matrix, hydrated from `GET /api/diagnostics/harnesses` (039a) via the
|
|
9
|
+
* shared wire — no hardcoded list, uninstalled rendered honestly as greyed
|
|
10
|
+
* "not installed". Each card / matrix row drills into `#/harnesses/<name>`.
|
|
11
|
+
* - `#/harnesses/<name>` → the DETAIL (039c): the harness's summary header (from the SAME 039a
|
|
12
|
+
* status), its live activity filtered from the existing `/api/logs` stream
|
|
13
|
+
* (client-side per c-OQ-1 — no second log pipe), and capability panels
|
|
14
|
+
* DRIVEN BY the server-folded descriptor (c-OQ-2). A harness lacking a
|
|
15
|
+
* capability OMITS that panel (c-AC-3) — Cursor shows Agents, Claude Code
|
|
16
|
+
* does not.
|
|
17
|
+
*
|
|
18
|
+
* Every value is hydrated from the daemon's live endpoint through the shared wire (one source, D-3);
|
|
19
|
+
* every visual value is an existing `var(--…)` DS token + an existing primitive (`Kpi`/`Badge`/`Panel`).
|
|
20
|
+
* NO new dependency, NO CDN React, NO secret in the page/route/streamed lines (PRD-037 D-9 inherited).
|
|
21
|
+
*/
|
|
22
|
+
import React from "react";
|
|
23
|
+
import type { PageProps } from "../page-frame.js";
|
|
24
|
+
import { type HarnessStatusWire, type LogRecordWire } from "../wire.js";
|
|
25
|
+
/** Parse the harness `<name>` from the active hash route, or `null` for the overview route. */
|
|
26
|
+
export declare function harnessNameFromRoute(route: string): string | null;
|
|
27
|
+
/** The status a harness reads at-a-glance: `not installed` < `idle` < `active` (b-AC-3). */
|
|
28
|
+
export type HarnessUiStatus = "active" | "idle" | "not installed";
|
|
29
|
+
/**
|
|
30
|
+
* Derive the at-a-glance status (b-AC-3): `not installed` when `!installed`; else `active` when the
|
|
31
|
+
* endpoint's `active` flag is set (mirrors 039a rather than re-deriving from the count, D-3); else
|
|
32
|
+
* `idle`. The endpoint already sets `active = turnsCaptured > 0`, so this stays consistent.
|
|
33
|
+
*/
|
|
34
|
+
export declare function uiStatus(h: HarnessStatusWire): HarnessUiStatus;
|
|
35
|
+
/**
|
|
36
|
+
* Render a last-seen value as a relative "4m ago" string (b-AC-1), or "never" when null. `nowMs` is
|
|
37
|
+
* injectable so a test renders deterministically. Absolute time rides the title (hover) at the call site.
|
|
38
|
+
*/
|
|
39
|
+
export declare function relativeLastSeen(lastSeen: string | null, nowMs?: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* Filter the `/api/logs` records to a harness's activity (c-OQ-1, client-side). The request-log
|
|
42
|
+
* record carries `method`/`path`/`status` (NO `agent` tag — logs/api.ts), so the only honest signal
|
|
43
|
+
* is the harness name appearing in the request PATH (e.g. a per-harness install/sync route). A record
|
|
44
|
+
* is kept iff its path mentions the harness; when none match, the live panel shows its waiting state —
|
|
45
|
+
* NEVER a fabricated line. The records carry no secret by construction, so the filtered lines inherit
|
|
46
|
+
* that guarantee (c-AC-2).
|
|
47
|
+
*/
|
|
48
|
+
export declare function filterRecordsForHarness(records: readonly LogRecordWire[], name: string): LogRecordWire[];
|
|
49
|
+
/**
|
|
50
|
+
* The Harnesses page (039b/039c). Hydrates the six `HarnessStatus`es from the shared wire (039a — the
|
|
51
|
+
* single backbone) and renders the OVERVIEW for `/harnesses` or the DETAIL for `/harnesses/<name>`,
|
|
52
|
+
* deciding off the active path route (PRD-003c). The detail page additionally polls the existing
|
|
53
|
+
* `/api/logs` records and filters them to the harness for its live stream (no second log pipe — D-4 / c-OQ-1).
|
|
54
|
+
*/
|
|
55
|
+
export declare function HarnessesPage({ wire }: PageProps): React.JSX.Element;
|
|
56
|
+
/**
|
|
57
|
+
* The 037c DYNAMIC registry resolver (parent D-6): given the live 039a harness list, compute the
|
|
58
|
+
* per-harness sub-items (`#/harnesses/<name>`) the dynamic group renders. Exported so the registry
|
|
59
|
+
* entry carries it; a narrow `unknown` → `HarnessStatusWire[]` narrowing keeps the registry the
|
|
60
|
+
* CONTRACT while THIS page owns the data shape (037c `DynamicGroup.resolve` is `(live: unknown)`).
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveHarnessSubItems(live: unknown): readonly {
|
|
63
|
+
route: string;
|
|
64
|
+
label: string;
|
|
65
|
+
}[];
|