@abstractframework/monitor-active-memory 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/README.md +76 -0
- package/dist/KgActiveMemoryExplorer.d.ts +33 -0
- package/dist/KgActiveMemoryExplorer.d.ts.map +1 -0
- package/dist/KgActiveMemoryExplorer.js +1398 -0
- package/dist/graph.d.ts +74 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +523 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +58 -0
- package/src/styles.css +378 -0
package/dist/graph.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Edge, Node } from 'reactflow';
|
|
2
|
+
import type { KgAssertion } from './types';
|
|
3
|
+
export type KgEntityKind = 'person' | 'org' | 'concept' | 'claim' | 'event' | 'doc' | 'thing' | 'vocab' | 'entity';
|
|
4
|
+
export interface KgGraphNodeData {
|
|
5
|
+
label: string;
|
|
6
|
+
kind: KgEntityKind;
|
|
7
|
+
}
|
|
8
|
+
export interface KgGraphEdgeData {
|
|
9
|
+
assertions: KgAssertion[];
|
|
10
|
+
predicateSummary: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BuildKgGraphOptions {
|
|
13
|
+
groupEdges?: boolean;
|
|
14
|
+
maxEdgeLabelPredicates?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface BuiltKgGraph {
|
|
17
|
+
nodes: Node<KgGraphNodeData>[];
|
|
18
|
+
edges: Edge<KgGraphEdgeData>[];
|
|
19
|
+
}
|
|
20
|
+
export type KgLayoutKind = 'grid' | 'circle' | 'radial' | 'force';
|
|
21
|
+
export interface XY {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
}
|
|
25
|
+
export type ViewportTransform = {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
zoom: number;
|
|
29
|
+
};
|
|
30
|
+
export declare function sanitizeViewport(viewport: unknown, opts?: {
|
|
31
|
+
minZoom?: number;
|
|
32
|
+
maxZoom?: number;
|
|
33
|
+
maxAbsTranslate?: number;
|
|
34
|
+
}): ViewportTransform | null;
|
|
35
|
+
export declare function hashStringToSeed(input: string): number;
|
|
36
|
+
export declare function buildKgLayout(graph: BuiltKgGraph, opts?: {
|
|
37
|
+
kind?: KgLayoutKind;
|
|
38
|
+
seed?: number;
|
|
39
|
+
}): Record<string, XY>;
|
|
40
|
+
export declare function buildKgGraph(items: KgAssertion[], opts?: BuildKgGraphOptions): BuiltKgGraph;
|
|
41
|
+
export interface ShortestPathResult {
|
|
42
|
+
nodeIds: string[];
|
|
43
|
+
edgeIds: string[];
|
|
44
|
+
}
|
|
45
|
+
export declare function shortestPath(graph: BuiltKgGraph, startId: string, endId: string, opts?: {
|
|
46
|
+
directed?: boolean;
|
|
47
|
+
}): ShortestPathResult | null;
|
|
48
|
+
export interface ForceSimulationOptions {
|
|
49
|
+
seed?: number;
|
|
50
|
+
dt?: number;
|
|
51
|
+
springLength?: number;
|
|
52
|
+
springStrength?: number;
|
|
53
|
+
repulsionStrength?: number;
|
|
54
|
+
centeringStrength?: number;
|
|
55
|
+
damping?: number;
|
|
56
|
+
maxSpeed?: number;
|
|
57
|
+
maxRepulsionNodes?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface ForceSimulationState {
|
|
60
|
+
nodeIds: string[];
|
|
61
|
+
pos: Float64Array;
|
|
62
|
+
vel: Float64Array;
|
|
63
|
+
acc: Float64Array;
|
|
64
|
+
edges: Uint32Array;
|
|
65
|
+
options: Required<ForceSimulationOptions>;
|
|
66
|
+
tick: number;
|
|
67
|
+
}
|
|
68
|
+
export declare function initForceSimulation(graph: BuiltKgGraph, opts?: ForceSimulationOptions & {
|
|
69
|
+
positions?: Record<string, XY>;
|
|
70
|
+
}): ForceSimulationState;
|
|
71
|
+
export declare function stepForceSimulation(state: ForceSimulationState, steps?: number): void;
|
|
72
|
+
export declare function forceSimulationEnergy(state: ForceSimulationState): number;
|
|
73
|
+
export declare function forceSimulationPositions(state: ForceSimulationState): Record<string, XY>;
|
|
74
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
|
package/dist/graph.js
ADDED
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
export function sanitizeViewport(viewport, opts = {}) {
|
|
2
|
+
const obj = viewport && typeof viewport === 'object' && !Array.isArray(viewport) ? viewport : null;
|
|
3
|
+
if (!obj)
|
|
4
|
+
return null;
|
|
5
|
+
const x = typeof obj.x === 'number' && Number.isFinite(obj.x) ? obj.x : null;
|
|
6
|
+
const y = typeof obj.y === 'number' && Number.isFinite(obj.y) ? obj.y : null;
|
|
7
|
+
const zoom = typeof obj.zoom === 'number' && Number.isFinite(obj.zoom) ? obj.zoom : null;
|
|
8
|
+
if (x === null || y === null || zoom === null)
|
|
9
|
+
return null;
|
|
10
|
+
const maxAbs = typeof opts.maxAbsTranslate === 'number' && Number.isFinite(opts.maxAbsTranslate) ? Math.abs(opts.maxAbsTranslate) : 1000000;
|
|
11
|
+
if (Math.abs(x) > maxAbs || Math.abs(y) > maxAbs)
|
|
12
|
+
return null;
|
|
13
|
+
const minZoomRaw = typeof opts.minZoom === 'number' && Number.isFinite(opts.minZoom) ? opts.minZoom : 0.025;
|
|
14
|
+
const maxZoomRaw = typeof opts.maxZoom === 'number' && Number.isFinite(opts.maxZoom) ? opts.maxZoom : 6;
|
|
15
|
+
const lo = Math.min(minZoomRaw, maxZoomRaw);
|
|
16
|
+
const hi = Math.max(minZoomRaw, maxZoomRaw);
|
|
17
|
+
return { x, y, zoom: Math.min(hi, Math.max(lo, zoom)) };
|
|
18
|
+
}
|
|
19
|
+
function shortLabel(term) {
|
|
20
|
+
const s = String(term || '').trim();
|
|
21
|
+
if (!s)
|
|
22
|
+
return '';
|
|
23
|
+
const idx = s.indexOf(':');
|
|
24
|
+
if (idx !== -1 && idx < s.length - 1)
|
|
25
|
+
return s.slice(idx + 1);
|
|
26
|
+
return s;
|
|
27
|
+
}
|
|
28
|
+
function classifyKind(term) {
|
|
29
|
+
const s = String(term || '').trim();
|
|
30
|
+
if (!s)
|
|
31
|
+
return 'entity';
|
|
32
|
+
const idx = s.indexOf(':');
|
|
33
|
+
if (idx <= 0 || idx >= s.length - 1)
|
|
34
|
+
return 'entity';
|
|
35
|
+
const ns = s.slice(0, idx).toLowerCase();
|
|
36
|
+
const local = s.slice(idx + 1).toLowerCase();
|
|
37
|
+
if (ns === 'ex') {
|
|
38
|
+
const dash = local.indexOf('-');
|
|
39
|
+
const prefix = dash > 0 ? local.slice(0, dash) : local;
|
|
40
|
+
if (prefix === 'person')
|
|
41
|
+
return 'person';
|
|
42
|
+
if (prefix === 'org')
|
|
43
|
+
return 'org';
|
|
44
|
+
if (prefix === 'concept')
|
|
45
|
+
return 'concept';
|
|
46
|
+
if (prefix === 'claim')
|
|
47
|
+
return 'claim';
|
|
48
|
+
if (prefix === 'event')
|
|
49
|
+
return 'event';
|
|
50
|
+
if (prefix === 'doc')
|
|
51
|
+
return 'doc';
|
|
52
|
+
if (prefix === 'thing')
|
|
53
|
+
return 'thing';
|
|
54
|
+
return 'entity';
|
|
55
|
+
}
|
|
56
|
+
if (ns === 'schema' || ns === 'skos' || ns === 'dcterms' || ns === 'rdf' || ns === 'cito')
|
|
57
|
+
return 'vocab';
|
|
58
|
+
return 'entity';
|
|
59
|
+
}
|
|
60
|
+
function displayLabel(term) {
|
|
61
|
+
const s = String(term || '').trim();
|
|
62
|
+
if (!s)
|
|
63
|
+
return '';
|
|
64
|
+
const idx = s.indexOf(':');
|
|
65
|
+
if (idx <= 0 || idx >= s.length - 1)
|
|
66
|
+
return shortLabel(s);
|
|
67
|
+
const ns = s.slice(0, idx).toLowerCase();
|
|
68
|
+
const local = s.slice(idx + 1);
|
|
69
|
+
if (ns === 'ex') {
|
|
70
|
+
const dash = local.indexOf('-');
|
|
71
|
+
if (dash > 0 && dash < local.length - 1)
|
|
72
|
+
return local.slice(dash + 1);
|
|
73
|
+
}
|
|
74
|
+
return shortLabel(s);
|
|
75
|
+
}
|
|
76
|
+
function stableGridLayout(ids) {
|
|
77
|
+
const spacingX = 240;
|
|
78
|
+
const spacingY = 120;
|
|
79
|
+
const cols = Math.max(1, Math.ceil(Math.sqrt(ids.length)));
|
|
80
|
+
const pos = {};
|
|
81
|
+
for (let i = 0; i < ids.length; i++) {
|
|
82
|
+
const row = Math.floor(i / cols);
|
|
83
|
+
const col = i % cols;
|
|
84
|
+
pos[ids[i]] = { x: col * spacingX, y: row * spacingY };
|
|
85
|
+
}
|
|
86
|
+
return pos;
|
|
87
|
+
}
|
|
88
|
+
export function hashStringToSeed(input) {
|
|
89
|
+
// FNV-1a (32-bit), returns an unsigned uint32.
|
|
90
|
+
const s = String(input ?? '');
|
|
91
|
+
let h = 2166136261;
|
|
92
|
+
for (let i = 0; i < s.length; i++) {
|
|
93
|
+
h ^= s.charCodeAt(i);
|
|
94
|
+
h = Math.imul(h, 16777619);
|
|
95
|
+
}
|
|
96
|
+
return h >>> 0;
|
|
97
|
+
}
|
|
98
|
+
function mulberry32(seed) {
|
|
99
|
+
let t = seed >>> 0;
|
|
100
|
+
return () => {
|
|
101
|
+
t += 0x6d2b79f5;
|
|
102
|
+
let r = Math.imul(t ^ (t >>> 15), 1 | t);
|
|
103
|
+
r ^= r + Math.imul(r ^ (r >>> 7), 61 | r);
|
|
104
|
+
return ((r ^ (r >>> 14)) >>> 0) / 4294967296;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function circleLayout(ids, seed) {
|
|
108
|
+
const out = {};
|
|
109
|
+
const n = ids.length;
|
|
110
|
+
if (!n)
|
|
111
|
+
return out;
|
|
112
|
+
const radius = Math.max(260, Math.sqrt(n) * 150);
|
|
113
|
+
const angle0 = ((seed % 360) * Math.PI) / 180;
|
|
114
|
+
for (let i = 0; i < n; i++) {
|
|
115
|
+
const a = angle0 + (2 * Math.PI * i) / n;
|
|
116
|
+
out[ids[i]] = { x: radius * Math.cos(a), y: radius * Math.sin(a) };
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
function radialLayout(ids, edges, seed) {
|
|
121
|
+
const out = {};
|
|
122
|
+
if (!ids.length)
|
|
123
|
+
return out;
|
|
124
|
+
const neighbors = new Map();
|
|
125
|
+
for (const id of ids)
|
|
126
|
+
neighbors.set(id, new Set());
|
|
127
|
+
for (const e of edges) {
|
|
128
|
+
const s = String(e?.source || '').trim();
|
|
129
|
+
const t = String(e?.target || '').trim();
|
|
130
|
+
if (!s || !t || s === t)
|
|
131
|
+
continue;
|
|
132
|
+
const ns = neighbors.get(s);
|
|
133
|
+
const nt = neighbors.get(t);
|
|
134
|
+
if (ns)
|
|
135
|
+
ns.add(t);
|
|
136
|
+
if (nt)
|
|
137
|
+
nt.add(s);
|
|
138
|
+
}
|
|
139
|
+
let root = ids[0];
|
|
140
|
+
let rootDeg = -1;
|
|
141
|
+
for (const id of ids) {
|
|
142
|
+
const deg = neighbors.get(id)?.size ?? 0;
|
|
143
|
+
if (deg > rootDeg || (deg === rootDeg && id.localeCompare(root) < 0)) {
|
|
144
|
+
root = id;
|
|
145
|
+
rootDeg = deg;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const level = new Map();
|
|
149
|
+
const q = [];
|
|
150
|
+
level.set(root, 0);
|
|
151
|
+
q.push(root);
|
|
152
|
+
while (q.length) {
|
|
153
|
+
const cur = q.shift();
|
|
154
|
+
const curLevel = level.get(cur) ?? 0;
|
|
155
|
+
const neigh = Array.from(neighbors.get(cur) ?? []);
|
|
156
|
+
neigh.sort((a, b) => a.localeCompare(b));
|
|
157
|
+
for (const n of neigh) {
|
|
158
|
+
if (level.has(n))
|
|
159
|
+
continue;
|
|
160
|
+
level.set(n, curLevel + 1);
|
|
161
|
+
q.push(n);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Keep disconnected nodes in an outer ring (still deterministic).
|
|
165
|
+
let maxLevel = 0;
|
|
166
|
+
for (const v of level.values())
|
|
167
|
+
maxLevel = Math.max(maxLevel, v);
|
|
168
|
+
for (const id of ids) {
|
|
169
|
+
if (!level.has(id))
|
|
170
|
+
level.set(id, maxLevel + 1);
|
|
171
|
+
}
|
|
172
|
+
const groups = new Map();
|
|
173
|
+
for (const id of ids) {
|
|
174
|
+
const l = level.get(id) ?? 0;
|
|
175
|
+
const cur = groups.get(l);
|
|
176
|
+
if (cur)
|
|
177
|
+
cur.push(id);
|
|
178
|
+
else
|
|
179
|
+
groups.set(l, [id]);
|
|
180
|
+
}
|
|
181
|
+
const levels = Array.from(groups.keys()).sort((a, b) => a - b);
|
|
182
|
+
const ringSpacing = 260;
|
|
183
|
+
const baseAngle = ((seed % 360) * Math.PI) / 180;
|
|
184
|
+
for (const l of levels) {
|
|
185
|
+
const idsInRing = groups.get(l) || [];
|
|
186
|
+
idsInRing.sort((a, b) => a.localeCompare(b));
|
|
187
|
+
if (l === 0) {
|
|
188
|
+
// If the ring has multiple ids (rare; root tie), spread them slightly.
|
|
189
|
+
if (idsInRing.length === 1) {
|
|
190
|
+
out[idsInRing[0]] = { x: 0, y: 0 };
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const r0 = 80;
|
|
194
|
+
for (let i = 0; i < idsInRing.length; i++) {
|
|
195
|
+
const a = baseAngle + (2 * Math.PI * i) / idsInRing.length;
|
|
196
|
+
out[idsInRing[i]] = { x: r0 * Math.cos(a), y: r0 * Math.sin(a) };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const r = ringSpacing * l;
|
|
202
|
+
const count = idsInRing.length;
|
|
203
|
+
if (count === 1) {
|
|
204
|
+
out[idsInRing[0]] = { x: r, y: 0 };
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
const angleOffset = baseAngle + l * 0.35;
|
|
208
|
+
for (let i = 0; i < count; i++) {
|
|
209
|
+
const a = angleOffset + (2 * Math.PI * i) / count;
|
|
210
|
+
out[idsInRing[i]] = { x: r * Math.cos(a), y: r * Math.sin(a) };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
export function buildKgLayout(graph, opts = {}) {
|
|
216
|
+
const kind = opts.kind ?? 'grid';
|
|
217
|
+
const seed = typeof opts.seed === 'number' && Number.isFinite(opts.seed) ? Math.trunc(opts.seed) : 0;
|
|
218
|
+
const ids = graph.nodes.map((n) => n.id);
|
|
219
|
+
if (kind === 'grid')
|
|
220
|
+
return stableGridLayout(ids);
|
|
221
|
+
if (kind === 'circle')
|
|
222
|
+
return circleLayout(ids, seed);
|
|
223
|
+
if (kind === 'radial')
|
|
224
|
+
return radialLayout(ids, graph.edges, seed);
|
|
225
|
+
if (kind === 'force') {
|
|
226
|
+
const base = radialLayout(ids, graph.edges, seed);
|
|
227
|
+
const rng = mulberry32(seed || 1);
|
|
228
|
+
const jitter = Math.max(10, Math.min(42, Math.sqrt(ids.length) * 2.75));
|
|
229
|
+
const out = {};
|
|
230
|
+
for (const id of ids) {
|
|
231
|
+
const p = base[id] || { x: 0, y: 0 };
|
|
232
|
+
out[id] = { x: p.x + (rng() - 0.5) * jitter, y: p.y + (rng() - 0.5) * jitter };
|
|
233
|
+
}
|
|
234
|
+
return out;
|
|
235
|
+
}
|
|
236
|
+
return stableGridLayout(ids);
|
|
237
|
+
}
|
|
238
|
+
function safeAssertions(items) {
|
|
239
|
+
return Array.isArray(items)
|
|
240
|
+
? items.filter((a) => a && typeof a === 'object' && typeof a.subject === 'string' && typeof a.predicate === 'string' && typeof a.object === 'string')
|
|
241
|
+
: [];
|
|
242
|
+
}
|
|
243
|
+
export function buildKgGraph(items, opts = {}) {
|
|
244
|
+
const groupEdges = Boolean(opts.groupEdges ?? true);
|
|
245
|
+
const maxPreds = Math.max(1, opts.maxEdgeLabelPredicates ?? 3);
|
|
246
|
+
const assertions = safeAssertions(items);
|
|
247
|
+
const idsSet = new Set();
|
|
248
|
+
for (const a of assertions) {
|
|
249
|
+
const s = String(a.subject || '').trim();
|
|
250
|
+
const o = String(a.object || '').trim();
|
|
251
|
+
if (s)
|
|
252
|
+
idsSet.add(s);
|
|
253
|
+
if (o)
|
|
254
|
+
idsSet.add(o);
|
|
255
|
+
}
|
|
256
|
+
const ids = Array.from(idsSet);
|
|
257
|
+
ids.sort((a, b) => a.localeCompare(b));
|
|
258
|
+
const positions = stableGridLayout(ids);
|
|
259
|
+
const nodes = ids.map((id) => ({
|
|
260
|
+
id,
|
|
261
|
+
type: 'default',
|
|
262
|
+
data: { label: displayLabel(id), kind: classifyKind(id) },
|
|
263
|
+
position: positions[id] || { x: 0, y: 0 },
|
|
264
|
+
}));
|
|
265
|
+
const edgeGroups = new Map();
|
|
266
|
+
const edgeKey = (a, idx) => {
|
|
267
|
+
const s = String(a.subject || '').trim();
|
|
268
|
+
const o = String(a.object || '').trim();
|
|
269
|
+
const p = String(a.predicate || '').trim();
|
|
270
|
+
if (!groupEdges)
|
|
271
|
+
return `edge:${idx}:${s}:${p}:${o}`;
|
|
272
|
+
return `edge:${s}:${o}`;
|
|
273
|
+
};
|
|
274
|
+
for (let i = 0; i < assertions.length; i++) {
|
|
275
|
+
const a = assertions[i];
|
|
276
|
+
const key = edgeKey(a, i);
|
|
277
|
+
const cur = edgeGroups.get(key);
|
|
278
|
+
if (cur)
|
|
279
|
+
cur.push(a);
|
|
280
|
+
else
|
|
281
|
+
edgeGroups.set(key, [a]);
|
|
282
|
+
}
|
|
283
|
+
const edges = [];
|
|
284
|
+
for (const [key, group] of edgeGroups.entries()) {
|
|
285
|
+
const a0 = group[0];
|
|
286
|
+
const source = String(a0.subject || '').trim();
|
|
287
|
+
const target = String(a0.object || '').trim();
|
|
288
|
+
if (!source || !target)
|
|
289
|
+
continue;
|
|
290
|
+
const predCounts = new Map();
|
|
291
|
+
for (const a of group) {
|
|
292
|
+
const p = String(a.predicate || '').trim();
|
|
293
|
+
if (!p)
|
|
294
|
+
continue;
|
|
295
|
+
predCounts.set(p, (predCounts.get(p) || 0) + 1);
|
|
296
|
+
}
|
|
297
|
+
const preds = Array.from(predCounts.entries());
|
|
298
|
+
preds.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
|
|
299
|
+
const top = preds.slice(0, maxPreds);
|
|
300
|
+
const label = top
|
|
301
|
+
.map(([p, c]) => (c > 1 ? `${shortLabel(p)}×${c}` : shortLabel(p)))
|
|
302
|
+
.join(' | ');
|
|
303
|
+
const more = preds.length > maxPreds ? ` +${preds.length - maxPreds}` : '';
|
|
304
|
+
const predicateSummary = `${label}${more}`.trim();
|
|
305
|
+
edges.push({
|
|
306
|
+
id: key,
|
|
307
|
+
source,
|
|
308
|
+
target,
|
|
309
|
+
label: predicateSummary,
|
|
310
|
+
animated: false,
|
|
311
|
+
data: { assertions: group, predicateSummary },
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return { nodes, edges };
|
|
315
|
+
}
|
|
316
|
+
export function shortestPath(graph, startId, endId, opts = {}) {
|
|
317
|
+
const directed = opts.directed !== false;
|
|
318
|
+
const start = String(startId || '').trim();
|
|
319
|
+
const end = String(endId || '').trim();
|
|
320
|
+
if (!start || !end)
|
|
321
|
+
return null;
|
|
322
|
+
if (start === end)
|
|
323
|
+
return { nodeIds: [start], edgeIds: [] };
|
|
324
|
+
const adj = new Map();
|
|
325
|
+
const add = (from, to, edgeId) => {
|
|
326
|
+
const cur = adj.get(from);
|
|
327
|
+
if (cur)
|
|
328
|
+
cur.push({ to, edgeId });
|
|
329
|
+
else
|
|
330
|
+
adj.set(from, [{ to, edgeId }]);
|
|
331
|
+
};
|
|
332
|
+
for (const e of graph.edges) {
|
|
333
|
+
add(e.source, e.target, e.id);
|
|
334
|
+
if (!directed)
|
|
335
|
+
add(e.target, e.source, e.id);
|
|
336
|
+
}
|
|
337
|
+
const q = [start];
|
|
338
|
+
const prevNode = new Map();
|
|
339
|
+
const prevEdge = new Map();
|
|
340
|
+
prevNode.set(start, null);
|
|
341
|
+
prevEdge.set(start, null);
|
|
342
|
+
while (q.length) {
|
|
343
|
+
const cur = q.shift();
|
|
344
|
+
const neighbors = adj.get(cur) || [];
|
|
345
|
+
for (const n of neighbors) {
|
|
346
|
+
if (prevNode.has(n.to))
|
|
347
|
+
continue;
|
|
348
|
+
prevNode.set(n.to, cur);
|
|
349
|
+
prevEdge.set(n.to, n.edgeId);
|
|
350
|
+
if (n.to === end) {
|
|
351
|
+
q.length = 0;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
q.push(n.to);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (!prevNode.has(end))
|
|
358
|
+
return null;
|
|
359
|
+
const nodeIds = [];
|
|
360
|
+
const edgeIds = [];
|
|
361
|
+
let cur = end;
|
|
362
|
+
while (cur) {
|
|
363
|
+
nodeIds.push(cur);
|
|
364
|
+
const e = prevEdge.get(cur);
|
|
365
|
+
if (e)
|
|
366
|
+
edgeIds.push(e);
|
|
367
|
+
cur = prevNode.get(cur) || null;
|
|
368
|
+
}
|
|
369
|
+
nodeIds.reverse();
|
|
370
|
+
edgeIds.reverse();
|
|
371
|
+
return { nodeIds, edgeIds };
|
|
372
|
+
}
|
|
373
|
+
const DEFAULT_FORCE_OPTS = {
|
|
374
|
+
seed: 1,
|
|
375
|
+
dt: 1,
|
|
376
|
+
springLength: 240,
|
|
377
|
+
springStrength: 0.03,
|
|
378
|
+
repulsionStrength: 9000,
|
|
379
|
+
centeringStrength: 0.003,
|
|
380
|
+
damping: 0.85,
|
|
381
|
+
maxSpeed: 90,
|
|
382
|
+
maxRepulsionNodes: 320,
|
|
383
|
+
};
|
|
384
|
+
export function initForceSimulation(graph, opts = {}) {
|
|
385
|
+
const merged = {
|
|
386
|
+
...DEFAULT_FORCE_OPTS,
|
|
387
|
+
...opts,
|
|
388
|
+
seed: typeof opts.seed === 'number' && Number.isFinite(opts.seed) ? Math.trunc(opts.seed) : DEFAULT_FORCE_OPTS.seed,
|
|
389
|
+
};
|
|
390
|
+
const nodeIds = graph.nodes.map((n) => n.id);
|
|
391
|
+
const n = nodeIds.length;
|
|
392
|
+
const pos = new Float64Array(2 * n);
|
|
393
|
+
const vel = new Float64Array(2 * n);
|
|
394
|
+
const acc = new Float64Array(2 * n);
|
|
395
|
+
const idxById = new Map();
|
|
396
|
+
for (let i = 0; i < n; i++)
|
|
397
|
+
idxById.set(nodeIds[i], i);
|
|
398
|
+
const basePos = opts.positions ?? buildKgLayout(graph, { kind: 'force', seed: merged.seed });
|
|
399
|
+
const rng = mulberry32(merged.seed || 1);
|
|
400
|
+
const jitter = Math.max(8, Math.min(38, Math.sqrt(n) * 2.25));
|
|
401
|
+
for (let i = 0; i < n; i++) {
|
|
402
|
+
const id = nodeIds[i];
|
|
403
|
+
const p = basePos[id];
|
|
404
|
+
const x = typeof p?.x === 'number' && Number.isFinite(p.x) ? p.x : (rng() - 0.5) * 500;
|
|
405
|
+
const y = typeof p?.y === 'number' && Number.isFinite(p.y) ? p.y : (rng() - 0.5) * 500;
|
|
406
|
+
pos[2 * i] = x + (rng() - 0.5) * jitter;
|
|
407
|
+
pos[2 * i + 1] = y + (rng() - 0.5) * jitter;
|
|
408
|
+
vel[2 * i] = 0;
|
|
409
|
+
vel[2 * i + 1] = 0;
|
|
410
|
+
}
|
|
411
|
+
const pairs = [];
|
|
412
|
+
for (const e of graph.edges) {
|
|
413
|
+
const s = idxById.get(String(e?.source || '').trim());
|
|
414
|
+
const t = idxById.get(String(e?.target || '').trim());
|
|
415
|
+
if (typeof s !== 'number' || typeof t !== 'number' || s === t)
|
|
416
|
+
continue;
|
|
417
|
+
pairs.push(s, t);
|
|
418
|
+
}
|
|
419
|
+
return {
|
|
420
|
+
nodeIds,
|
|
421
|
+
pos,
|
|
422
|
+
vel,
|
|
423
|
+
acc,
|
|
424
|
+
edges: new Uint32Array(pairs),
|
|
425
|
+
options: merged,
|
|
426
|
+
tick: 0,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
export function stepForceSimulation(state, steps = 1) {
|
|
430
|
+
const n = state.nodeIds.length;
|
|
431
|
+
if (!n)
|
|
432
|
+
return;
|
|
433
|
+
const opts = state.options;
|
|
434
|
+
const dt = opts.dt;
|
|
435
|
+
for (let step = 0; step < Math.max(1, Math.trunc(steps)); step++) {
|
|
436
|
+
state.acc.fill(0);
|
|
437
|
+
const doRepulse = n <= opts.maxRepulsionNodes;
|
|
438
|
+
if (doRepulse) {
|
|
439
|
+
const repulse = opts.repulsionStrength;
|
|
440
|
+
for (let i = 0; i < n; i++) {
|
|
441
|
+
const xi = state.pos[2 * i];
|
|
442
|
+
const yi = state.pos[2 * i + 1];
|
|
443
|
+
for (let j = i + 1; j < n; j++) {
|
|
444
|
+
const dx = state.pos[2 * j] - xi;
|
|
445
|
+
const dy = state.pos[2 * j + 1] - yi;
|
|
446
|
+
const dist2 = dx * dx + dy * dy + 1e-6;
|
|
447
|
+
const invDist = 1 / Math.sqrt(dist2);
|
|
448
|
+
const f = repulse / dist2;
|
|
449
|
+
const fx = f * dx * invDist;
|
|
450
|
+
const fy = f * dy * invDist;
|
|
451
|
+
state.acc[2 * i] -= fx;
|
|
452
|
+
state.acc[2 * i + 1] -= fy;
|
|
453
|
+
state.acc[2 * j] += fx;
|
|
454
|
+
state.acc[2 * j + 1] += fy;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
const springLen = opts.springLength;
|
|
459
|
+
const springK = opts.springStrength;
|
|
460
|
+
const edges = state.edges;
|
|
461
|
+
for (let k = 0; k < edges.length; k += 2) {
|
|
462
|
+
const a = edges[k];
|
|
463
|
+
const b = edges[k + 1];
|
|
464
|
+
const ax = state.pos[2 * a];
|
|
465
|
+
const ay = state.pos[2 * a + 1];
|
|
466
|
+
const bx = state.pos[2 * b];
|
|
467
|
+
const by = state.pos[2 * b + 1];
|
|
468
|
+
const dx = bx - ax;
|
|
469
|
+
const dy = by - ay;
|
|
470
|
+
const dist2 = dx * dx + dy * dy + 1e-6;
|
|
471
|
+
const dist = Math.sqrt(dist2);
|
|
472
|
+
const f = springK * (dist - springLen);
|
|
473
|
+
const fx = (f * dx) / dist;
|
|
474
|
+
const fy = (f * dy) / dist;
|
|
475
|
+
state.acc[2 * a] += fx;
|
|
476
|
+
state.acc[2 * a + 1] += fy;
|
|
477
|
+
state.acc[2 * b] -= fx;
|
|
478
|
+
state.acc[2 * b + 1] -= fy;
|
|
479
|
+
}
|
|
480
|
+
const centerK = opts.centeringStrength;
|
|
481
|
+
for (let i = 0; i < n; i++) {
|
|
482
|
+
state.acc[2 * i] += -centerK * state.pos[2 * i];
|
|
483
|
+
state.acc[2 * i + 1] += -centerK * state.pos[2 * i + 1];
|
|
484
|
+
}
|
|
485
|
+
const damp = opts.damping;
|
|
486
|
+
const maxSpeed = opts.maxSpeed;
|
|
487
|
+
for (let i = 0; i < n; i++) {
|
|
488
|
+
let vx = (state.vel[2 * i] + state.acc[2 * i] * dt) * damp;
|
|
489
|
+
let vy = (state.vel[2 * i + 1] + state.acc[2 * i + 1] * dt) * damp;
|
|
490
|
+
const speed = Math.sqrt(vx * vx + vy * vy);
|
|
491
|
+
if (speed > maxSpeed) {
|
|
492
|
+
const s = maxSpeed / speed;
|
|
493
|
+
vx *= s;
|
|
494
|
+
vy *= s;
|
|
495
|
+
}
|
|
496
|
+
state.vel[2 * i] = vx;
|
|
497
|
+
state.vel[2 * i + 1] = vy;
|
|
498
|
+
state.pos[2 * i] += vx * dt;
|
|
499
|
+
state.pos[2 * i + 1] += vy * dt;
|
|
500
|
+
}
|
|
501
|
+
state.tick += 1;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
export function forceSimulationEnergy(state) {
|
|
505
|
+
const n = state.nodeIds.length;
|
|
506
|
+
if (!n)
|
|
507
|
+
return 0;
|
|
508
|
+
let sum = 0;
|
|
509
|
+
for (let i = 0; i < n; i++) {
|
|
510
|
+
const vx = state.vel[2 * i];
|
|
511
|
+
const vy = state.vel[2 * i + 1];
|
|
512
|
+
sum += Math.sqrt(vx * vx + vy * vy);
|
|
513
|
+
}
|
|
514
|
+
return sum / n;
|
|
515
|
+
}
|
|
516
|
+
export function forceSimulationPositions(state) {
|
|
517
|
+
const out = {};
|
|
518
|
+
const n = state.nodeIds.length;
|
|
519
|
+
for (let i = 0; i < n; i++) {
|
|
520
|
+
out[state.nodeIds[i]] = { x: state.pos[2 * i], y: state.pos[2 * i + 1] };
|
|
521
|
+
}
|
|
522
|
+
return out;
|
|
523
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { KgActiveMemoryExplorer, type KgActiveMemoryExplorerProps } from './KgActiveMemoryExplorer';
|
|
2
|
+
export { buildKgGraph, shortestPath, buildKgLayout, hashStringToSeed, sanitizeViewport, initForceSimulation, stepForceSimulation, forceSimulationEnergy, forceSimulationPositions, } from './graph';
|
|
3
|
+
export type { ForceSimulationOptions, ForceSimulationState, KgLayoutKind, ViewportTransform, XY } from './graph';
|
|
4
|
+
export type { JsonValue, KgAssertion, KgQueryParams, KgQueryResult, MemoryScope, RecallLevel } from './types';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACpG,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AACjH,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type JsonValue = null | string | number | boolean | JsonValue[] | {
|
|
2
|
+
[key: string]: JsonValue;
|
|
3
|
+
};
|
|
4
|
+
export type MemoryScope = 'run' | 'session' | 'global' | 'all';
|
|
5
|
+
export type RecallLevel = 'urgent' | 'standard' | 'deep';
|
|
6
|
+
export interface KgAssertion {
|
|
7
|
+
subject: string;
|
|
8
|
+
predicate: string;
|
|
9
|
+
object: string;
|
|
10
|
+
scope?: string;
|
|
11
|
+
owner_id?: string;
|
|
12
|
+
observed_at?: string;
|
|
13
|
+
valid_from?: string | null;
|
|
14
|
+
valid_until?: string | null;
|
|
15
|
+
confidence?: number | null;
|
|
16
|
+
provenance?: Record<string, JsonValue> | null;
|
|
17
|
+
attributes?: Record<string, JsonValue> | null;
|
|
18
|
+
}
|
|
19
|
+
export interface KgQueryParams {
|
|
20
|
+
run_id?: string;
|
|
21
|
+
scope: MemoryScope;
|
|
22
|
+
owner_id?: string;
|
|
23
|
+
recall_level?: RecallLevel;
|
|
24
|
+
query_text?: string;
|
|
25
|
+
subject?: string;
|
|
26
|
+
predicate?: string;
|
|
27
|
+
object?: string;
|
|
28
|
+
since?: string;
|
|
29
|
+
until?: string;
|
|
30
|
+
active_at?: string;
|
|
31
|
+
min_score?: number;
|
|
32
|
+
limit?: number;
|
|
33
|
+
max_input_tokens?: number;
|
|
34
|
+
model?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface KgQueryResult {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
count?: number;
|
|
39
|
+
items?: KgAssertion[];
|
|
40
|
+
effort?: JsonValue;
|
|
41
|
+
warnings?: JsonValue;
|
|
42
|
+
packets?: JsonValue[];
|
|
43
|
+
packets_version?: number;
|
|
44
|
+
packed_count?: number;
|
|
45
|
+
active_memory_text?: string;
|
|
46
|
+
dropped?: number;
|
|
47
|
+
estimated_tokens?: number;
|
|
48
|
+
raw?: JsonValue;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;AAC/D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|