@schlessera/brain-ui-react 0.6.3 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/graph/graph-canvas.d.ts +20 -0
- package/dist/components/graph/graph-canvas.d.ts.map +1 -0
- package/dist/components/graph/graph-canvas.js +387 -0
- package/dist/components/graph/graph-canvas.js.map +1 -0
- package/dist/components/graph/graph-controls.d.ts +8 -0
- package/dist/components/graph/graph-controls.d.ts.map +1 -0
- package/dist/components/graph/graph-controls.js +132 -0
- package/dist/components/graph/graph-controls.js.map +1 -0
- package/dist/components/graph/graph-empty-state.d.ts +15 -0
- package/dist/components/graph/graph-empty-state.d.ts.map +1 -0
- package/dist/components/graph/graph-empty-state.js +21 -0
- package/dist/components/graph/graph-empty-state.js.map +1 -0
- package/dist/components/graph/graph-page.d.ts +7 -0
- package/dist/components/graph/graph-page.d.ts.map +1 -0
- package/dist/components/graph/graph-page.js +400 -0
- package/dist/components/graph/graph-page.js.map +1 -0
- package/dist/components/graph/lib/graph-helpers.d.ts +98 -0
- package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -0
- package/dist/components/graph/lib/graph-helpers.js +240 -0
- package/dist/components/graph/lib/graph-helpers.js.map +1 -0
- package/dist/components/graph/node-popover.d.ts +11 -0
- package/dist/components/graph/node-popover.d.ts.map +1 -0
- package/dist/components/graph/node-popover.js +39 -0
- package/dist/components/graph/node-popover.js.map +1 -0
- package/dist/components/graph/use-graph-theme.d.ts +19 -0
- package/dist/components/graph/use-graph-theme.d.ts.map +1 -0
- package/dist/components/graph/use-graph-theme.js +38 -0
- package/dist/components/graph/use-graph-theme.js.map +1 -0
- package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
- package/dist/components/layout/mobile-tab-bar.js +16 -5
- package/dist/components/layout/mobile-tab-bar.js.map +1 -1
- package/dist/components/layout/side-rail.d.ts.map +1 -1
- package/dist/components/layout/side-rail.js +14 -4
- package/dist/components/layout/side-rail.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/stores/graph-store.d.ts +85 -0
- package/dist/stores/graph-store.d.ts.map +1 -0
- package/dist/stores/graph-store.js +236 -0
- package/dist/stores/graph-store.js.map +1 -0
- package/dist/stores/ui-store.d.ts +5 -0
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +2 -0
- package/dist/stores/ui-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -2
- package/src/components/graph/graph-canvas.tsx +450 -0
- package/src/components/graph/graph-controls.tsx +436 -0
- package/src/components/graph/graph-empty-state.tsx +45 -0
- package/src/components/graph/graph-page.tsx +1045 -0
- package/src/components/graph/lib/graph-helpers.ts +311 -0
- package/src/components/graph/node-popover.tsx +135 -0
- package/src/components/graph/use-graph-theme.ts +51 -0
- package/src/components/layout/mobile-tab-bar.tsx +26 -3
- package/src/components/layout/side-rail.tsx +28 -4
- package/src/index.ts +3 -1
- package/src/stores/graph-store.ts +345 -0
- package/src/stores/ui-store.ts +8 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Waypoints, RefreshCw, ServerCrash, TriangleAlert } from "lucide-react";
|
|
3
|
+
/**
|
|
4
|
+
* Full-canvas cards for the states where there is no scene to draw:
|
|
5
|
+
* server too old, repo indexed by a pre-graph CLI, graph not yet computed,
|
|
6
|
+
* plain fetch failures, and mode-specific "nothing here" messages.
|
|
7
|
+
*/
|
|
8
|
+
export function GraphEmptyState({ icon = "graph", title, children, }) {
|
|
9
|
+
const Icon = icon === "sync"
|
|
10
|
+
? RefreshCw
|
|
11
|
+
: icon === "server"
|
|
12
|
+
? ServerCrash
|
|
13
|
+
: icon === "warn"
|
|
14
|
+
? TriangleAlert
|
|
15
|
+
: Waypoints;
|
|
16
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center p-6", children: _jsxs("div", { className: "flex max-w-sm flex-col items-center gap-3 rounded-xl border border-border bg-surface px-8 py-10 text-center", children: [_jsx(Icon, { className: "h-8 w-8 text-muted-foreground" }), _jsx("h2", { className: "font-display text-lg text-foreground", children: title }), children && (_jsx("div", { className: "text-xs leading-relaxed text-muted-foreground", children: children }))] }) }));
|
|
17
|
+
}
|
|
18
|
+
export function Mono({ children }) {
|
|
19
|
+
return (_jsx("code", { className: "rounded bg-surface-raised px-1.5 py-0.5 font-mono text-[11px] text-foreground", children: children }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=graph-empty-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-empty-state.js","sourceRoot":"","sources":["../../../src/components/graph/graph-empty-state.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,IAAI,GAAG,OAAO,EACd,KAAK,EACL,QAAQ,GAKT;IACC,MAAM,IAAI,GACR,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,KAAK,QAAQ;YACjB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,KAAK,MAAM;gBACf,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,SAAS,CAAC;IACpB,OAAO,CACL,cAAK,SAAS,EAAC,6CAA6C,YAC1D,eAAK,SAAS,EAAC,6GAA6G,aAC1H,KAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,GAAG,EAClD,aAAI,SAAS,EAAC,sCAAsC,YAAE,KAAK,GAAM,EAChE,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,+CAA+C,YAAE,QAAQ,GAAO,CAChF,IACG,GACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAA2B;IACxD,OAAO,CACL,eAAM,SAAS,EAAC,+EAA+E,YAC5F,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full-screen knowledge-graph view — a sibling of ChatPage inside the
|
|
3
|
+
* AppShell. Mounts its own FilePanel/SettingsPanel copies because the chat
|
|
4
|
+
* page (which normally hosts them) is hidden while this view is active.
|
|
5
|
+
*/
|
|
6
|
+
export declare function GraphPage(): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=graph-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-page.d.ts","sourceRoot":"","sources":["../../../src/components/graph/graph-page.tsx"],"names":[],"mappings":"AA2DA;;;;GAIG;AACH,wBAAgB,SAAS,gCAsFxB"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense, lazy, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { ChevronDown, ChevronUp, List, Loader2, TriangleAlert, X, } from "lucide-react";
|
|
4
|
+
import { useGraphStore } from "../../stores/graph-store.js";
|
|
5
|
+
import { useUIStore } from "../../stores/ui-store.js";
|
|
6
|
+
import { useFileStore } from "../../stores/file-store.js";
|
|
7
|
+
import { API_BASE } from "../../lib/backend.js";
|
|
8
|
+
import { FilePanel } from "../files/file-panel.js";
|
|
9
|
+
import { SettingsPanel } from "../settings/settings-panel.js";
|
|
10
|
+
import { GraphControls } from "./graph-controls.js";
|
|
11
|
+
import { NodePopover } from "./node-popover.js";
|
|
12
|
+
import { GraphEmptyState, Mono } from "./graph-empty-state.js";
|
|
13
|
+
import { OTHER_COLOR, assignFolderColors, buildQuery, communityColor, distanceColor, groupCommunities, matchScene, topLevelDir, } from "./lib/graph-helpers.js";
|
|
14
|
+
import { useGraphTheme } from "./use-graph-theme.js";
|
|
15
|
+
import { cn } from "../../lib/utils.js";
|
|
16
|
+
// The one code-split boundary: sigma + graphology load only when a scene renders.
|
|
17
|
+
const GraphCanvas = lazy(() => import("./graph-canvas.js"));
|
|
18
|
+
/** Client force layout is a fallback for repos whose FA2 layout was skipped —
|
|
19
|
+
* beyond this it would freeze the tab, so we refuse and say why. */
|
|
20
|
+
const CLIENT_LAYOUT_NODE_CAP = 2000;
|
|
21
|
+
const MODES = [
|
|
22
|
+
{ value: "clusters", label: "Clusters" },
|
|
23
|
+
{ value: "discovery", label: "Discovery" },
|
|
24
|
+
{ value: "local", label: "Local" },
|
|
25
|
+
{ value: "maintenance", label: "Maintenance" },
|
|
26
|
+
];
|
|
27
|
+
/** Finding-type colors: dataviz status palette (warning/serious/critical) plus
|
|
28
|
+
* the light end of the distance ramp for "stale" — checked against #0c0e12. */
|
|
29
|
+
const FINDING_COLORS = {
|
|
30
|
+
orphan: "#fab219",
|
|
31
|
+
unreachable: "#ec835a",
|
|
32
|
+
broken: "#d03b3b",
|
|
33
|
+
stale: "#86b6ef",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Full-screen knowledge-graph view — a sibling of ChatPage inside the
|
|
37
|
+
* AppShell. Mounts its own FilePanel/SettingsPanel copies because the chat
|
|
38
|
+
* page (which normally hosts them) is hidden while this view is active.
|
|
39
|
+
*/
|
|
40
|
+
export function GraphPage() {
|
|
41
|
+
const mode = useGraphStore((s) => s.mode);
|
|
42
|
+
const setMode = useGraphStore((s) => s.setMode);
|
|
43
|
+
const metaState = useGraphStore((s) => s.metaState);
|
|
44
|
+
const fetchMeta = useGraphStore((s) => s.fetchMeta);
|
|
45
|
+
const fetchScene = useGraphStore((s) => s.fetchScene);
|
|
46
|
+
const subgraph = useGraphStore((s) => s.subgraph);
|
|
47
|
+
const dataState = useGraphStore((s) => s.dataState);
|
|
48
|
+
const stale = useGraphStore((s) => s.meta?.stale ?? false);
|
|
49
|
+
const filePanelOpen = useUIStore((s) => s.filePanelOpen);
|
|
50
|
+
const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
|
|
51
|
+
const settingsPanelOpen = useUIStore((s) => s.settingsPanelOpen);
|
|
52
|
+
const setSettingsPanelOpen = useUIStore((s) => s.setSettingsPanelOpen);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
// Always refetch meta on mount (the view unmounts when hidden, so this
|
|
55
|
+
// also covers "came back after a brain sync"): a changed computedAt is
|
|
56
|
+
// what invalidates every cached scene. Meta must land before the scene
|
|
57
|
+
// fetch so the cache is keyed by the fresh generation.
|
|
58
|
+
void (async () => {
|
|
59
|
+
await fetchMeta(true);
|
|
60
|
+
await fetchScene();
|
|
61
|
+
})();
|
|
62
|
+
}, [fetchMeta, fetchScene]);
|
|
63
|
+
return (_jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsx(FilePanel, { open: filePanelOpen, onClose: () => setFilePanelOpen(false) }), _jsx(SettingsPanel, { open: settingsPanelOpen, onClose: () => setSettingsPanelOpen(false) }), _jsxs("header", { className: "flex items-center gap-2 border-b border-border px-3 py-2 md:px-4", children: [_jsx("h1", { className: "hidden font-display text-base text-foreground md:block", children: "Graph" }), _jsx("nav", { "aria-label": "Graph modes", className: "flex flex-1 justify-center gap-1 md:justify-start md:pl-4", children: MODES.map((m) => (_jsx("button", { onClick: () => setMode(m.value), "aria-current": mode === m.value ? "page" : undefined, className: cn("min-h-9 rounded-lg px-3 py-1.5 text-xs font-medium transition-colors", mode === m.value
|
|
64
|
+
? "bg-surface-raised text-foreground"
|
|
65
|
+
: "text-muted-foreground hover:text-foreground"), children: m.label }, m.value))) }), subgraph?.truncated && (_jsxs("span", { className: "hidden shrink-0 items-center gap-1 rounded-full border border-border bg-surface-raised px-2 py-0.5 text-[10px] text-muted-foreground md:flex", title: "The server capped this scene; the lowest-ranked notes were dropped.", children: [_jsx(TriangleAlert, { className: "h-3 w-3" }), "truncated"] }))] }), stale && metaState === "done" && (_jsxs("div", { className: "flex items-center gap-2 border-b border-border bg-surface-raised/50 px-4 py-1.5 text-[11px] text-muted-foreground", children: [_jsx(TriangleAlert, { className: "h-3 w-3 shrink-0 text-primary" }), "Graph predates the latest index run \u2014 run ", _jsx(Mono, { children: "brain sync" }), " to refresh it."] })), _jsx("div", { className: "relative flex-1 overflow-hidden bg-background", children: _jsx(GraphBody, { modeState: { mode, metaState, dataState } }) })] }));
|
|
66
|
+
}
|
|
67
|
+
function GraphBody({ modeState, }) {
|
|
68
|
+
const { mode, metaState, dataState } = modeState;
|
|
69
|
+
const meta = useGraphStore((s) => s.meta);
|
|
70
|
+
const error = useGraphStore((s) => s.error);
|
|
71
|
+
const subgraph = useGraphStore((s) => s.subgraph);
|
|
72
|
+
const local = useGraphStore((s) => s.local);
|
|
73
|
+
const discovery = useGraphStore((s) => s.discovery);
|
|
74
|
+
// 404 on meta: the whole server predates the graph API.
|
|
75
|
+
if (metaState === "error" && error?.kind === "unsupported") {
|
|
76
|
+
return (_jsx(GraphEmptyState, { icon: "server", title: "Server too old", children: "This deployment does not serve the graph API yet \u2014 update brain-ui to a version with graph support." }));
|
|
77
|
+
}
|
|
78
|
+
if (metaState === "loading" || metaState === "idle") {
|
|
79
|
+
return _jsx(CenteredSpinner, {});
|
|
80
|
+
}
|
|
81
|
+
// Local mode works against any indexed repo; everything else needs the
|
|
82
|
+
// precomputed tables.
|
|
83
|
+
const gated = mode !== "local" &&
|
|
84
|
+
(meta?.available === false ||
|
|
85
|
+
(dataState === "error" && error?.kind === "unavailable"));
|
|
86
|
+
if (gated) {
|
|
87
|
+
const reason = meta?.reason ?? error?.reason;
|
|
88
|
+
return reason === "schema" ? (_jsxs(GraphEmptyState, { icon: "sync", title: "Brain CLI too old", children: ["This repo was indexed by a CLI without graph support. Update", " ", _jsx(Mono, { children: "@schlessera/brain" }), " and run ", _jsx(Mono, { children: "brain sync" }), " \u2014 the Local mode works in the meantime."] })) : (_jsxs(GraphEmptyState, { icon: "sync", title: "Graph not built yet", children: ["Run ", _jsx(Mono, { children: "brain sync" }), " (or ", _jsx(Mono, { children: "brain graph compute" }), ") to build the graph from your notes."] }));
|
|
89
|
+
}
|
|
90
|
+
if (mode === "maintenance") {
|
|
91
|
+
return _jsx(MaintenanceBody, {});
|
|
92
|
+
}
|
|
93
|
+
if (mode === "local" && !local.center) {
|
|
94
|
+
return (_jsxs(_Fragment, { children: [_jsx(GraphEmptyState, { title: "Pick a note to explore", children: "The local graph shows everything linked to one note. Choose a center in the options panel." }), _jsx(GraphControls, {})] }));
|
|
95
|
+
}
|
|
96
|
+
// Discovery with no root anywhere: the picker-first path (the default on
|
|
97
|
+
// repos without an entry file).
|
|
98
|
+
if (mode === "discovery" && !discovery.root && !meta?.defaultRoot) {
|
|
99
|
+
return _jsx(DiscoveryStart, {});
|
|
100
|
+
}
|
|
101
|
+
if (dataState === "error") {
|
|
102
|
+
return (_jsx(GraphEmptyState, { icon: "warn", title: "Could not load the graph", children: error?.message ?? "Request failed" }));
|
|
103
|
+
}
|
|
104
|
+
if (dataState === "loading" || !subgraph) {
|
|
105
|
+
return _jsx(CenteredSpinner, {});
|
|
106
|
+
}
|
|
107
|
+
if (subgraph.nodes.length === 0) {
|
|
108
|
+
return (_jsxs(_Fragment, { children: [_jsx(GraphEmptyState, { title: "Nothing to show", children: mode === "local"
|
|
109
|
+
? "This note has no links in or out at this depth."
|
|
110
|
+
: "No notes matched this scene." }), _jsx(GraphControls, {})] }));
|
|
111
|
+
}
|
|
112
|
+
return _jsx(SceneBody, {});
|
|
113
|
+
}
|
|
114
|
+
/** The canvas plus everything overlaid on it. Only mounts with data present. */
|
|
115
|
+
function SceneBody() {
|
|
116
|
+
const mode = useGraphStore((s) => s.mode);
|
|
117
|
+
const meta = useGraphStore((s) => s.meta);
|
|
118
|
+
const subgraph = useGraphStore((s) => s.subgraph);
|
|
119
|
+
const selectedId = useGraphStore((s) => s.selectedId);
|
|
120
|
+
const hoveredId = useGraphStore((s) => s.hoveredId);
|
|
121
|
+
const select = useGraphStore((s) => s.select);
|
|
122
|
+
const hover = useGraphStore((s) => s.hover);
|
|
123
|
+
const sceneQuery = useGraphStore((s) => s.sceneQuery);
|
|
124
|
+
const clustersSizeBy = useGraphStore((s) => s.clustersSizeBy);
|
|
125
|
+
const discoveryColorBy = useGraphStore((s) => s.discoveryColorBy);
|
|
126
|
+
const theme = useGraphTheme();
|
|
127
|
+
const [listOpen, setListOpen] = useState(false);
|
|
128
|
+
const matchIds = useMemo(() => matchScene(subgraph.nodes, sceneQuery), [subgraph.nodes, sceneQuery]);
|
|
129
|
+
const layout = mode === "clusters"
|
|
130
|
+
? subgraph.nodes.some((n) => n.x !== undefined)
|
|
131
|
+
? "fixed"
|
|
132
|
+
: "force"
|
|
133
|
+
: mode === "discovery"
|
|
134
|
+
? "radial"
|
|
135
|
+
: "force";
|
|
136
|
+
const maxDistance = useMemo(() => Math.max(1, ...subgraph.nodes.map((n) => n.distance ?? 0)), [subgraph.nodes]);
|
|
137
|
+
const folderColors = useMemo(() => mode === "discovery" && discoveryColorBy === "folder"
|
|
138
|
+
? assignFolderColors(subgraph.nodes.map((n) => n.path))
|
|
139
|
+
: null, [mode, discoveryColorBy, subgraph.nodes]);
|
|
140
|
+
const nodeColor = useMemo(() => {
|
|
141
|
+
if (mode === "discovery") {
|
|
142
|
+
if (folderColors) {
|
|
143
|
+
return (node) => node.virtual
|
|
144
|
+
? theme.nodeSelected
|
|
145
|
+
: (folderColors.get(topLevelDir(node.path)) ?? OTHER_COLOR);
|
|
146
|
+
}
|
|
147
|
+
return (node) => node.virtual ? theme.nodeSelected : distanceColor(node.distance ?? maxDistance);
|
|
148
|
+
}
|
|
149
|
+
return (node) => node.community !== undefined ? communityColor(node.community) : theme.node;
|
|
150
|
+
}, [mode, folderColors, maxDistance, theme]);
|
|
151
|
+
const centerId = useMemo(() => mode === "local"
|
|
152
|
+
? (subgraph.nodes.find((n) => n.distance === 0)?.id ?? null)
|
|
153
|
+
: null, [mode, subgraph.nodes]);
|
|
154
|
+
const edgeColor = useMemo(() => {
|
|
155
|
+
if (mode !== "local" || centerId === null)
|
|
156
|
+
return undefined;
|
|
157
|
+
// Backlinks into the center get the accent so in/out reads at a glance.
|
|
158
|
+
return (edge) => edge.target === centerId ? theme.edgeHighlight : undefined;
|
|
159
|
+
}, [mode, centerId, theme]);
|
|
160
|
+
const selectedNode = useMemo(() => selectedId === null
|
|
161
|
+
? null
|
|
162
|
+
: (subgraph.nodes.find((n) => n.id === selectedId) ?? null), [selectedId, subgraph.nodes]);
|
|
163
|
+
const communityLabel = selectedNode?.community !== undefined
|
|
164
|
+
? (meta?.communities.find((c) => c.community === selectedNode.community)
|
|
165
|
+
?.label ?? null)
|
|
166
|
+
: null;
|
|
167
|
+
// Clusters whose FA2 layout was skipped at index time: client force layout
|
|
168
|
+
// is a bounded courtesy. Over the cap, only the canvas is replaced — the
|
|
169
|
+
// legend and controls stay live so filtering to one topic (a subset under
|
|
170
|
+
// the cap) still works.
|
|
171
|
+
const layoutBlocked = mode === "clusters" &&
|
|
172
|
+
layout === "force" &&
|
|
173
|
+
subgraph.nodes.length > CLIENT_LAYOUT_NODE_CAP;
|
|
174
|
+
return (_jsxs(_Fragment, { children: [layoutBlocked ? (_jsxs(GraphEmptyState, { icon: "warn", title: "Too large to lay out here", children: ["The cluster layout was skipped at index time (corpus over the layout cap), and ", subgraph.nodes.length.toLocaleString(), " notes are too many to arrange in the browser. Pick a topic from the legend to view a subset."] })) : (_jsx(Suspense, { fallback: _jsx(CenteredSpinner, {}), children: _jsx(GraphCanvas, { data: subgraph, layout: layout, selectedId: selectedId, hoveredId: hoveredId, matchIds: matchIds, sizeBy: mode === "clusters" ? clustersSizeBy : "degree", rings: mode === "discovery" ? maxDistance : 0, nodeColor: nodeColor, edgeColor: edgeColor, onSelect: select, onHover: hover }) })), _jsx(GraphControls, {}), mode === "clusters" && _jsx(ClusterLegend, {}), mode === "discovery" && folderColors && (_jsx(FolderLegend, { colors: folderColors })), mode === "discovery" && (_jsx(UnreachableTray, { count: subgraph.unreachableCount })), _jsx("button", { onClick: () => setListOpen((v) => !v), className: "absolute bottom-3 right-3 z-10 flex h-11 w-11 items-center justify-center rounded-full border border-border bg-surface-overlay text-foreground shadow-lg", title: "Node list", "aria-expanded": listOpen, children: _jsx(List, { className: "h-4.5 w-4.5" }) }), listOpen && _jsx(NodeList, { onClose: () => setListOpen(false) }), selectedNode && (_jsx(NodePopover, { node: selectedNode, communityLabel: communityLabel }))] }));
|
|
175
|
+
}
|
|
176
|
+
/** Clusters mode: interactive community legend, top-left. */
|
|
177
|
+
function ClusterLegend() {
|
|
178
|
+
const meta = useGraphStore((s) => s.meta);
|
|
179
|
+
const clusters = useGraphStore((s) => s.clusters);
|
|
180
|
+
const setClustersParams = useGraphStore((s) => s.setClustersParams);
|
|
181
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
182
|
+
const groups = useMemo(() => groupCommunities(meta?.communities ?? []), [meta?.communities]);
|
|
183
|
+
if (groups.major.length === 0)
|
|
184
|
+
return null;
|
|
185
|
+
const shown = groups.major.slice(0, 8);
|
|
186
|
+
const foldedCount = groups.major.length - shown.length + groups.singletonCount;
|
|
187
|
+
return (_jsxs("div", { className: "absolute left-3 top-3 z-10 w-56 max-w-[calc(100vw-5rem)] rounded-xl border border-border bg-surface-overlay/95 shadow-xl backdrop-blur", children: [_jsxs("button", { onClick: () => setCollapsed((v) => !v), className: "flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-foreground", "aria-expanded": !collapsed, children: ["Topics", collapsed ? (_jsx(ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground" })) : (_jsx(ChevronUp, { className: "h-3.5 w-3.5 text-muted-foreground" }))] }), !collapsed && (_jsxs("div", { className: "max-h-64 overflow-y-auto px-1 pb-2", children: [shown.map((c) => {
|
|
188
|
+
const active = clusters.community === c.community;
|
|
189
|
+
return (_jsxs("button", { onClick: () => setClustersParams({ community: active ? null : c.community }), className: cn("flex min-h-9 w-full items-center gap-2 rounded-lg px-2 py-1 text-left transition-colors", active ? "bg-surface-raised" : "hover:bg-surface-raised/60"), title: active
|
|
190
|
+
? "Show all topics"
|
|
191
|
+
: `Show only this topic (${c.size} notes)`, children: [_jsx("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { backgroundColor: communityColor(c.community) } }), _jsx("span", { className: "min-w-0 flex-1 truncate text-xs text-foreground", children: c.label ?? `Topic ${c.community + 1}` }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: c.size })] }, c.community));
|
|
192
|
+
}), foldedCount > 0 && (_jsxs("div", { className: "flex items-center gap-2 px-2 py-1.5", children: [_jsx("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { backgroundColor: OTHER_COLOR } }), _jsxs("span", { className: "text-[11px] text-muted-foreground", children: [foldedCount, " smaller topic", foldedCount === 1 ? "" : "s"] })] })), clusters.community !== null && (_jsxs("button", { onClick: () => setClustersParams({ community: null }), className: "mx-2 mt-1 flex min-h-8 items-center gap-1 rounded-lg bg-surface-raised px-2 py-1 text-[11px] text-foreground hover:bg-surface", children: [_jsx(X, { className: "h-3 w-3" }), "Clear topic filter"] }))] }))] }));
|
|
193
|
+
}
|
|
194
|
+
/** Discovery + color-by-folder: which top-level dir wears which color. */
|
|
195
|
+
function FolderLegend({ colors }) {
|
|
196
|
+
const entries = [...colors.entries()].filter(([, c]) => c !== OTHER_COLOR);
|
|
197
|
+
const otherCount = colors.size - entries.length;
|
|
198
|
+
if (entries.length === 0)
|
|
199
|
+
return null;
|
|
200
|
+
return (_jsxs("div", { className: "absolute left-3 top-3 z-10 w-48 rounded-xl border border-border bg-surface-overlay/95 px-3 py-2 shadow-xl backdrop-blur", children: [_jsx("div", { className: "mb-1 text-xs font-medium text-foreground", children: "Folders" }), entries.map(([dir, color]) => (_jsxs("div", { className: "flex min-h-6 items-center gap-2", children: [_jsx("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { backgroundColor: color } }), _jsx("span", { className: "truncate font-mono text-[11px] text-muted-foreground", children: dir || "(root)" })] }, dir))), otherCount > 0 && (_jsxs("div", { className: "flex min-h-6 items-center gap-2", children: [_jsx("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { backgroundColor: OTHER_COLOR } }), _jsxs("span", { className: "text-[11px] text-muted-foreground", children: [otherCount, " more"] })] }))] }));
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Discovery: how much of the corpus this root does NOT reach. The count comes
|
|
204
|
+
* from the server (`unreachableCount`) — a scene-size subtraction would lie
|
|
205
|
+
* under depth limits, truncation, and the virtual root. An older server
|
|
206
|
+
* doesn't send it; then the tray only appears for the default root, where the
|
|
207
|
+
* maintenance findings still provide the exact list, and shows no number.
|
|
208
|
+
*/
|
|
209
|
+
function UnreachableTray({ count }) {
|
|
210
|
+
const discovery = useGraphStore((s) => s.discovery);
|
|
211
|
+
const staleDays = useGraphStore((s) => s.maintenance.staleDays);
|
|
212
|
+
const openFile = useFileStore((s) => s.openFile);
|
|
213
|
+
const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
|
|
214
|
+
const [open, setOpen] = useState(false);
|
|
215
|
+
const [nodes, setNodes] = useState(null);
|
|
216
|
+
const isDefaultRoot = !discovery.root;
|
|
217
|
+
// Older server, no count field: the maintenance list is the only honest
|
|
218
|
+
// source, so it must be fetched EAGERLY — the chip may only appear once
|
|
219
|
+
// the list proves there is something to warn about.
|
|
220
|
+
const needsFallbackProof = count === undefined && isDefaultRoot;
|
|
221
|
+
useEffect(() => {
|
|
222
|
+
const wanted = (open || needsFallbackProof) && isDefaultRoot;
|
|
223
|
+
if (!wanted || nodes !== null)
|
|
224
|
+
return;
|
|
225
|
+
let cancelled = false;
|
|
226
|
+
void (async () => {
|
|
227
|
+
try {
|
|
228
|
+
const res = await fetch(`${API_BASE}/graph/maintenance?${buildQuery({ staleDays })}`);
|
|
229
|
+
if (!res.ok)
|
|
230
|
+
return;
|
|
231
|
+
const data = (await res.json());
|
|
232
|
+
if (!cancelled)
|
|
233
|
+
setNodes(data.unreachable);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// The tray degrades to count-only (or stays hidden in fallback mode).
|
|
237
|
+
}
|
|
238
|
+
})();
|
|
239
|
+
return () => {
|
|
240
|
+
cancelled = true;
|
|
241
|
+
};
|
|
242
|
+
}, [open, needsFallbackProof, isDefaultRoot, nodes, staleDays]);
|
|
243
|
+
if (count === 0)
|
|
244
|
+
return null;
|
|
245
|
+
// No server count and no exact list available: nothing honest to show.
|
|
246
|
+
if (count === undefined && !isDefaultRoot)
|
|
247
|
+
return null;
|
|
248
|
+
// Fallback mode: silent until the maintenance list confirms unreachable
|
|
249
|
+
// notes exist — an unproven warning chip would cry wolf on clean repos.
|
|
250
|
+
if (needsFallbackProof && (nodes === null || nodes.length === 0))
|
|
251
|
+
return null;
|
|
252
|
+
return (_jsxs("div", { className: "absolute bottom-3 left-3 z-10 max-w-[calc(100vw-5rem)]", children: [open && (_jsxs("div", { className: "mb-2 flex max-h-56 w-64 flex-col overflow-hidden rounded-xl border border-border bg-surface-overlay/95 shadow-2xl backdrop-blur", children: [_jsx("div", { className: "border-b border-border px-3 py-2 text-[11px] text-muted-foreground", children: isDefaultRoot
|
|
253
|
+
? "Not reachable from the root:"
|
|
254
|
+
: "Count only — pick the default root for the full list." }), isDefaultRoot && (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [(nodes ?? []).map((node) => (_jsx("button", { onClick: () => {
|
|
255
|
+
setFilePanelOpen(true);
|
|
256
|
+
void openFile(node.path);
|
|
257
|
+
}, className: "flex min-h-9 w-full flex-col justify-center px-3 py-1 text-left hover:bg-surface-raised/60", children: _jsx("span", { className: "truncate text-xs text-foreground", children: node.title || node.path }) }, node.id))), nodes === null && (_jsx("div", { className: "flex justify-center py-3", children: _jsx(Loader2, { className: "h-4 w-4 animate-spin text-primary" }) }))] }))] })), _jsxs("button", { onClick: () => setOpen((v) => !v), "aria-expanded": open, className: "flex min-h-9 items-center gap-1.5 rounded-full border border-border bg-surface-overlay px-3 py-1.5 text-[11px] text-muted-foreground shadow-lg transition-colors hover:text-foreground", children: [_jsx(TriangleAlert, { className: "h-3 w-3" }), count !== undefined
|
|
258
|
+
? `${count} unreachable`
|
|
259
|
+
: `${nodes.length} unreachable`] })] }));
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Discovery with no root at all (no entry file in the repo): make picking one
|
|
263
|
+
* inviting — index notes are the natural candidates.
|
|
264
|
+
*/
|
|
265
|
+
function DiscoveryStart() {
|
|
266
|
+
const setDiscoveryParams = useGraphStore((s) => s.setDiscoveryParams);
|
|
267
|
+
const [candidates, setCandidates] = useState(null);
|
|
268
|
+
useEffect(() => {
|
|
269
|
+
let cancelled = false;
|
|
270
|
+
void (async () => {
|
|
271
|
+
try {
|
|
272
|
+
const res = await fetch(`${API_BASE}/brain/list?${buildQuery({ type: "index", limit: 6 })}`);
|
|
273
|
+
if (!res.ok)
|
|
274
|
+
return;
|
|
275
|
+
const data = (await res.json());
|
|
276
|
+
if (!cancelled)
|
|
277
|
+
setCandidates((data.results ?? []).map((r) => ({
|
|
278
|
+
path: r.path,
|
|
279
|
+
title: r.title ?? r.path,
|
|
280
|
+
})));
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
if (!cancelled)
|
|
284
|
+
setCandidates([]);
|
|
285
|
+
}
|
|
286
|
+
})();
|
|
287
|
+
return () => {
|
|
288
|
+
cancelled = true;
|
|
289
|
+
};
|
|
290
|
+
}, []);
|
|
291
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex h-full items-center justify-center p-6", children: _jsxs("div", { className: "flex w-full max-w-md flex-col gap-3 rounded-xl border border-border bg-surface px-8 py-10 text-center", children: [_jsx("h2", { className: "font-display text-lg text-foreground", children: "Where should discovery start?" }), _jsxs("p", { className: "text-xs leading-relaxed text-muted-foreground", children: ["Discovery lays your notes out by how many links they are away from a starting point. This repo has no ", _jsx(Mono, { children: "AGENTS.md" }), " entry file, so pick one \u2014 index notes work well:"] }), candidates === null ? (_jsx("div", { className: "flex justify-center py-2", children: _jsx(Loader2, { className: "h-4 w-4 animate-spin text-primary" }) })) : (_jsx("div", { className: "flex flex-col gap-1.5", children: candidates.map((c) => (_jsxs("button", { onClick: () => setDiscoveryParams({ root: c.path }), className: "flex min-h-10 flex-col justify-center rounded-lg border border-border bg-surface-raised px-3 py-1.5 text-left transition-colors hover:border-primary/40", children: [_jsx("span", { className: "truncate text-xs text-foreground", children: c.title }), _jsx("span", { className: "truncate font-mono text-[10px] text-muted-foreground/60", children: c.path })] }, c.path))) })), _jsx("p", { className: "text-[11px] text-muted-foreground", children: "\u2026or search any note in the options panel." })] }) }), _jsx(GraphControls, {})] }));
|
|
292
|
+
}
|
|
293
|
+
/** Focusable listing of the current scene, sorted by connectedness. */
|
|
294
|
+
function NodeList({ onClose }) {
|
|
295
|
+
const subgraph = useGraphStore((s) => s.subgraph);
|
|
296
|
+
const select = useGraphStore((s) => s.select);
|
|
297
|
+
const selectedId = useGraphStore((s) => s.selectedId);
|
|
298
|
+
const sorted = useMemo(() => [...subgraph.nodes].sort((a, b) => b.inDegree + b.outDegree - (a.inDegree + a.outDegree)), [subgraph.nodes]);
|
|
299
|
+
return (_jsxs("nav", { "aria-label": "Graph nodes", className: "absolute bottom-16 right-3 z-10 flex max-h-[55dvh] w-72 max-w-[calc(100vw-1.5rem)] flex-col overflow-hidden rounded-xl border border-border bg-surface-overlay/95 shadow-2xl backdrop-blur", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-border px-3 py-2", children: [_jsxs("span", { className: "text-xs font-medium text-foreground", children: [sorted.length, " note", sorted.length === 1 ? "" : "s"] }), _jsx("button", { onClick: onClose, className: "rounded p-1 text-muted-foreground hover:text-foreground", title: "Close list", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: sorted.map((node) => (_jsxs("button", { onClick: () => select(node.id), className: cn("flex min-h-11 w-full flex-col justify-center px-3 py-1.5 text-left transition-colors", node.id === selectedId
|
|
300
|
+
? "bg-surface-raised"
|
|
301
|
+
: "hover:bg-surface-raised/60"), children: [_jsx("span", { className: "truncate text-xs text-foreground", children: node.title || node.path }), _jsxs("span", { className: "truncate font-mono text-[10px] text-muted-foreground/60", children: [node.inDegree + node.outDegree, " link", node.inDegree + node.outDegree === 1 ? "" : "s", " \u00B7 ", node.path] })] }, node.id))) })] }));
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Maintenance: findings list ⇄ canvas, linked both ways. The canvas is a
|
|
305
|
+
* type-grouped radial scene (one ring per finding kind — these nodes have no
|
|
306
|
+
* edges between them by definition); broken links are list-only, since their
|
|
307
|
+
* defining feature is a target that does not exist.
|
|
308
|
+
*/
|
|
309
|
+
function MaintenanceBody() {
|
|
310
|
+
const findings = useGraphStore((s) => s.findings);
|
|
311
|
+
const dataState = useGraphStore((s) => s.dataState);
|
|
312
|
+
const error = useGraphStore((s) => s.error);
|
|
313
|
+
const filters = useGraphStore((s) => s.maintenanceFilters);
|
|
314
|
+
const selectedId = useGraphStore((s) => s.selectedId);
|
|
315
|
+
const select = useGraphStore((s) => s.select);
|
|
316
|
+
const hoveredId = useGraphStore((s) => s.hoveredId);
|
|
317
|
+
const hover = useGraphStore((s) => s.hover);
|
|
318
|
+
const sceneQuery = useGraphStore((s) => s.sceneQuery);
|
|
319
|
+
const openFile = useFileStore((s) => s.openFile);
|
|
320
|
+
const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
|
|
321
|
+
const listRef = useRef(null);
|
|
322
|
+
// One node per document, first matching section wins (a stale orphan is an
|
|
323
|
+
// orphan); ring index encodes the finding kind.
|
|
324
|
+
const scene = useMemo(() => {
|
|
325
|
+
if (!findings)
|
|
326
|
+
return null;
|
|
327
|
+
const seen = new Set();
|
|
328
|
+
const nodes = [];
|
|
329
|
+
const push = (list, finding, ring) => {
|
|
330
|
+
for (const node of list) {
|
|
331
|
+
if (seen.has(node.id))
|
|
332
|
+
continue;
|
|
333
|
+
seen.add(node.id);
|
|
334
|
+
nodes.push({ ...node, finding, distance: ring });
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
if (filters.orphans)
|
|
338
|
+
push(findings.orphans, "orphan", 1);
|
|
339
|
+
if (filters.unreachable)
|
|
340
|
+
push(findings.unreachable, "unreachable", 2);
|
|
341
|
+
if (filters.stale)
|
|
342
|
+
push(findings.stale, "stale", 3);
|
|
343
|
+
const subgraph = { nodes, edges: [], truncated: false };
|
|
344
|
+
return { subgraph, nodes };
|
|
345
|
+
}, [findings, filters]);
|
|
346
|
+
// Canvas → list: keep the selected row in view.
|
|
347
|
+
useEffect(() => {
|
|
348
|
+
if (selectedId === null)
|
|
349
|
+
return;
|
|
350
|
+
listRef.current
|
|
351
|
+
?.querySelector(`[data-node-id="${selectedId}"]`)
|
|
352
|
+
?.scrollIntoView({ block: "nearest" });
|
|
353
|
+
}, [selectedId]);
|
|
354
|
+
if (dataState === "error") {
|
|
355
|
+
return (_jsx(GraphEmptyState, { icon: "warn", title: "Could not load findings", children: error?.message ?? "Request failed" }));
|
|
356
|
+
}
|
|
357
|
+
if (dataState !== "done" || !findings || !scene)
|
|
358
|
+
return _jsx(CenteredSpinner, {});
|
|
359
|
+
const matchIds = matchScene(scene.nodes, sceneQuery);
|
|
360
|
+
const selectedNode = selectedId === null
|
|
361
|
+
? null
|
|
362
|
+
: (scene.nodes.find((n) => n.id === selectedId) ?? null);
|
|
363
|
+
function openNote(path) {
|
|
364
|
+
setFilePanelOpen(true);
|
|
365
|
+
void openFile(path);
|
|
366
|
+
}
|
|
367
|
+
const totalShown = scene.nodes.length + (filters.broken ? findings.brokenLinks.length : 0);
|
|
368
|
+
return (_jsxs("div", { className: "flex h-full flex-col md:flex-row", children: [_jsxs("div", { className: "relative h-56 shrink-0 border-b border-border md:h-auto md:flex-1 md:border-b-0 md:border-r", children: [scene.nodes.length === 0 ? (_jsx("div", { className: "flex h-full items-center justify-center px-6 text-center text-xs text-muted-foreground", children: totalShown === 0
|
|
369
|
+
? "Nothing to show — this brain is clean."
|
|
370
|
+
: "Only broken links match — they live in the list." })) : (_jsx(Suspense, { fallback: _jsx(CenteredSpinner, {}), children: _jsx(GraphCanvas, { data: scene.subgraph, layout: "radial", selectedId: selectedId, hoveredId: hoveredId, matchIds: matchIds, nodeColor: (node) => FINDING_COLORS[node.finding ?? "stale"], onSelect: select, onHover: hover }) })), _jsx(GraphControls, {}), selectedNode && _jsx(NodePopover, { node: selectedNode })] }), _jsx("div", { ref: listRef, className: "flex-1 overflow-y-auto px-4 py-4 md:w-96 md:flex-none md:px-5", children: _jsxs("div", { className: "flex flex-col gap-5 pb-16", children: [filters.orphans && (_jsx(FindingSection, { title: `Orphans (${findings.orphans.length})`, hint: "No links in or out.", color: FINDING_COLORS.orphan, nodes: findings.orphans, selectedId: selectedId, onSelect: select, onOpen: openNote })), filters.unreachable && (_jsx(FindingSection, { title: `Unreachable from root (${findings.unreachable.length})`, hint: "No link path from the graph root reaches these.", color: FINDING_COLORS.unreachable, nodes: findings.unreachable, selectedId: selectedId, onSelect: select, onOpen: openNote })), filters.broken && (_jsxs("section", { children: [_jsx(SectionHeading, { title: `Broken links (${findings.brokenLinks.length})`, hint: "Wiki links whose target resolves to nothing.", color: FINDING_COLORS.broken }), _jsx(FindingRows, { empty: findings.brokenLinks.length === 0, rows: findings.brokenLinks.map((b, i) => ({
|
|
371
|
+
key: `b${i}`,
|
|
372
|
+
title: `[[${b.target}]]`,
|
|
373
|
+
sub: `in ${b.sourcePath}`,
|
|
374
|
+
onClick: () => openNote(b.sourcePath),
|
|
375
|
+
})) })] })), filters.stale && (_jsx(FindingSection, { title: `Stale notes (${findings.stale.length})`, hint: `Untouched for over ${findings.staleDays} days.`, color: FINDING_COLORS.stale, nodes: findings.stale, subOf: (n) => `${n.updated} · ${n.path}`, selectedId: selectedId, onSelect: select, onOpen: openNote }))] }) })] }));
|
|
376
|
+
}
|
|
377
|
+
function SectionHeading({ title, hint, color, }) {
|
|
378
|
+
return (_jsxs(_Fragment, { children: [_jsxs("h2", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [_jsx("span", { className: "h-2.5 w-2.5 rounded-full", style: { backgroundColor: color } }), title] }), _jsx("p", { className: "mb-2 text-[11px] text-muted-foreground", children: hint })] }));
|
|
379
|
+
}
|
|
380
|
+
function FindingSection({ title, hint, color, nodes, subOf, selectedId, onSelect, onOpen, }) {
|
|
381
|
+
return (_jsxs("section", { children: [_jsx(SectionHeading, { title: title, hint: hint, color: color }), _jsx(FindingRows, { empty: nodes.length === 0, rows: nodes.map((node) => ({
|
|
382
|
+
key: String(node.id),
|
|
383
|
+
nodeId: node.id,
|
|
384
|
+
title: node.title || node.path,
|
|
385
|
+
sub: subOf ? subOf(node) : node.path,
|
|
386
|
+
active: node.id === selectedId,
|
|
387
|
+
onClick: () => onSelect(node.id),
|
|
388
|
+
onDoubleClick: () => onOpen(node.path),
|
|
389
|
+
})) })] }));
|
|
390
|
+
}
|
|
391
|
+
function FindingRows({ rows, empty, }) {
|
|
392
|
+
if (empty) {
|
|
393
|
+
return (_jsx("p", { className: "rounded-lg border border-border-subtle bg-surface px-3 py-2 text-xs text-muted-foreground", children: "Nothing found \u2014 clean." }));
|
|
394
|
+
}
|
|
395
|
+
return (_jsx("div", { className: "divide-y divide-border/40 overflow-hidden rounded-lg border border-border bg-surface", children: rows.map((row) => (_jsxs("button", { "data-node-id": row.nodeId, onClick: row.onClick, onDoubleClick: row.onDoubleClick, className: cn("flex min-h-11 w-full flex-col justify-center px-3 py-2 text-left transition-colors", row.active ? "bg-surface-raised" : "hover:bg-surface-raised/60"), children: [_jsx("span", { className: "truncate text-xs text-foreground", children: row.title }), _jsx("span", { className: "truncate font-mono text-[10px] text-muted-foreground/60", children: row.sub })] }, row.key))) }));
|
|
396
|
+
}
|
|
397
|
+
function CenteredSpinner() {
|
|
398
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-primary" }) }));
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=graph-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-page.js","sourceRoot":"","sources":["../../../src/components/graph/graph-page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for the graph view. No sigma, no DOM, no fetch — everything
|
|
3
|
+
* here is deterministic and unit-tested. The canvas and store consume these;
|
|
4
|
+
* keeping them pure is what makes the renderer swappable.
|
|
5
|
+
*/
|
|
6
|
+
import type { GraphNodePayload, GraphSubgraphResponse } from "@schlessera/brain-ui-sdk/protocol";
|
|
7
|
+
/**
|
|
8
|
+
* Build a query string from a param bag. null/undefined/empty-string values
|
|
9
|
+
* are dropped; everything else is encoded. Returns "" when nothing survives.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildQuery(params: Record<string, string | number | boolean | null | undefined>): string;
|
|
12
|
+
/**
|
|
13
|
+
* Merge an expansion fetch into the current scene. Nodes dedupe by id — the
|
|
14
|
+
* richer record wins (more analytical fields), which in practice means an
|
|
15
|
+
* existing node keeps its coordinates/metrics when the expansion returns a
|
|
16
|
+
* barer copy. Edges dedupe by (source, target).
|
|
17
|
+
*/
|
|
18
|
+
export declare function mergeSubgraphs(base: GraphSubgraphResponse, addition: GraphSubgraphResponse): GraphSubgraphResponse;
|
|
19
|
+
export interface RadialPoint {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Deterministic radial layout for discovery mode: radius = BFS distance,
|
|
25
|
+
* nodes ordered within their ring by id (stable across refetches), the root
|
|
26
|
+
* (distance 0) at the origin. Rings get a slight angular offset per ring so
|
|
27
|
+
* spokes don't visually align into artificial lines.
|
|
28
|
+
*/
|
|
29
|
+
export declare function radialLayout(nodes: Pick<GraphNodePayload, "id" | "distance">[], ringSpacing?: number): Map<number, RadialPoint>;
|
|
30
|
+
export type SizeBy = "degree" | "pagerank";
|
|
31
|
+
/**
|
|
32
|
+
* Node size in rendered pixels. Sqrt scale keeps hubs prominent without
|
|
33
|
+
* letting a 45-in-degree hub dwarf the scene.
|
|
34
|
+
*/
|
|
35
|
+
export declare function nodeSize(node: Pick<GraphNodePayload, "inDegree" | "outDegree" | "pagerank" | "virtual">, sizeBy?: SizeBy, min?: number, max?: number): number;
|
|
36
|
+
/** Fixed categorical slots (validated, dark). Community/folder identity. */
|
|
37
|
+
export declare const CATEGORICAL_SLOTS: readonly ["#3987e5", "#d95926", "#199e70", "#c98500", "#d55181", "#008300", "#9085e9", "#e66767"];
|
|
38
|
+
/** Recessive slot for everything past the eight distinguishable ones. */
|
|
39
|
+
export declare const OTHER_COLOR = "#565b66";
|
|
40
|
+
/** The root's own color in discovery mode (the app's amber primary). */
|
|
41
|
+
export declare const ROOT_COLOR = "#e09f3e";
|
|
42
|
+
/** Ordinal distance ramp, near → far (validated, 5 visible steps). */
|
|
43
|
+
export declare const DISTANCE_RAMP: readonly ["#b7d3f6", "#86b6ef", "#5598e7", "#2a78d6", "#184f95"];
|
|
44
|
+
/**
|
|
45
|
+
* Linear blend of two hex colors: t=0 → a, t=1 → b. Used for the gentle
|
|
46
|
+
* non-match fade during search highlight (half the strength of the hover
|
|
47
|
+
* fade, which jumps straight to the edge color). Falls back to `b` when a
|
|
48
|
+
* color is not parseable hex, so a bad token degrades to the strong fade
|
|
49
|
+
* rather than an invalid color string.
|
|
50
|
+
*/
|
|
51
|
+
export declare function mixColors(a: string, b: string, t: number): string;
|
|
52
|
+
/**
|
|
53
|
+
* Color for a community. Communities are numbered by size (0 = largest) at
|
|
54
|
+
* index time, so the first eight — the ones a legend can carry — get the
|
|
55
|
+
* distinguishable slots and the long tail shares one recessive color.
|
|
56
|
+
*/
|
|
57
|
+
export declare function communityColor(community: number): string;
|
|
58
|
+
/** Color for a BFS distance: amber root, then the blue ramp fading out. */
|
|
59
|
+
export declare function distanceColor(distance: number): string;
|
|
60
|
+
/** First path segment — "career/opportunities/x.md" → "career". */
|
|
61
|
+
export declare function topLevelDir(path: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* Assign categorical slots to top-level directories, biggest first — the
|
|
64
|
+
* same eight-then-other policy as communities. Returns dir → color.
|
|
65
|
+
*/
|
|
66
|
+
export declare function assignFolderColors(paths: string[]): Map<string, string>;
|
|
67
|
+
export interface LegendGroups<T extends {
|
|
68
|
+
community: number;
|
|
69
|
+
size: number;
|
|
70
|
+
}> {
|
|
71
|
+
/** Multi-note communities, size-descending — what the legend lists. */
|
|
72
|
+
major: T[];
|
|
73
|
+
/** Number of single-note communities folded out of the legend. */
|
|
74
|
+
singletonCount: number;
|
|
75
|
+
}
|
|
76
|
+
/** Split a community list into legend-worthy entries and the singleton tail. */
|
|
77
|
+
export declare function groupCommunities<T extends {
|
|
78
|
+
community: number;
|
|
79
|
+
size: number;
|
|
80
|
+
}>(communities: T[]): LegendGroups<T>;
|
|
81
|
+
export interface LabelPolicyInput {
|
|
82
|
+
nodes: Pick<GraphNodePayload, "id" | "inDegree" | "outDegree" | "pagerank" | "virtual">[];
|
|
83
|
+
selectedId: number | null;
|
|
84
|
+
hoveredId: number | null;
|
|
85
|
+
matchIds: ReadonlySet<number>;
|
|
86
|
+
/** Camera ratio — sigma's zoom, 1 = fit, smaller = zoomed in. */
|
|
87
|
+
cameraRatio: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Which nodes must always carry a label: selection, hover, search matches,
|
|
91
|
+
* the virtual root, plus the top-K nodes by rank where K grows as the user
|
|
92
|
+
* zooms in. Never "all labels" — the renderer's own density threshold handles
|
|
93
|
+
* the rest.
|
|
94
|
+
*/
|
|
95
|
+
export declare function labelSet(input: LabelPolicyInput): Set<number>;
|
|
96
|
+
/** Ids of nodes whose title or path matches the in-scene query. */
|
|
97
|
+
export declare function matchScene(nodes: Pick<GraphNodePayload, "id" | "title" | "path">[], query: string): Set<number>;
|
|
98
|
+
//# sourceMappingURL=graph-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-helpers.d.ts","sourceRoot":"","sources":["../../../../src/components/graph/lib/graph-helpers.ts"],"names":[],"mappings":"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"}
|