@omiron33/omi-neuron-web 0.1.0 → 0.1.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.
@@ -0,0 +1,545 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var THREE2 = require('three');
5
+ var OrbitControls_js = require('three/examples/jsm/controls/OrbitControls.js');
6
+ var CSS2DRenderer_js = require('three/examples/jsm/renderers/CSS2DRenderer.js');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var THREE2__namespace = /*#__PURE__*/_interopNamespace(THREE2);
28
+
29
+ // src/visualization/constants.ts
30
+ var DEFAULT_THEME = {
31
+ colors: {
32
+ background: "#020314",
33
+ domainColors: {},
34
+ defaultDomainColor: "#c0c5ff",
35
+ edgeDefault: "#4d4d55",
36
+ edgeActive: "#c6d4ff",
37
+ edgeSelected: "#ffffff",
38
+ labelText: "#ffffff",
39
+ labelBackground: "rgba(0, 0, 0, 0.8)"
40
+ },
41
+ typography: {
42
+ labelFontFamily: "system-ui, sans-serif",
43
+ labelFontSize: 12,
44
+ labelFontWeight: "500"
45
+ },
46
+ effects: {
47
+ starfieldEnabled: true,
48
+ starfieldColor: "#ffffff",
49
+ glowEnabled: true,
50
+ glowIntensity: 0.6
51
+ },
52
+ animation: {
53
+ focusDuration: 800,
54
+ transitionDuration: 650,
55
+ easing: "easeInOut"
56
+ }
57
+ };
58
+ var SceneManager = class {
59
+ constructor(container, config) {
60
+ this.container = container;
61
+ this.config = config;
62
+ this.scene = new THREE2__namespace.Scene();
63
+ this.camera = new THREE2__namespace.PerspectiveCamera(60, 1, 0.1, 2e3);
64
+ this.renderer = new THREE2__namespace.WebGLRenderer({ antialias: true });
65
+ this.labelRenderer = new CSS2DRenderer_js.CSS2DRenderer();
66
+ this.controls = new OrbitControls_js.OrbitControls(this.camera, this.renderer.domElement);
67
+ }
68
+ scene;
69
+ camera;
70
+ renderer;
71
+ labelRenderer;
72
+ controls;
73
+ animationId = null;
74
+ initialize() {
75
+ const { cameraPosition, cameraTarget, backgroundColor } = this.config;
76
+ this.scene.background = new THREE2__namespace.Color(backgroundColor);
77
+ this.camera.position.set(...cameraPosition);
78
+ this.controls.target.set(...cameraTarget);
79
+ this.controls.update();
80
+ this.renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, this.config.pixelRatioCap));
81
+ this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);
82
+ this.labelRenderer.setSize(this.container.clientWidth, this.container.clientHeight);
83
+ this.container.appendChild(this.renderer.domElement);
84
+ this.container.appendChild(this.labelRenderer.domElement);
85
+ window.addEventListener("resize", this.resize);
86
+ this.startAnimationLoop();
87
+ }
88
+ dispose() {
89
+ this.stopAnimationLoop();
90
+ window.removeEventListener("resize", this.resize);
91
+ this.renderer.dispose();
92
+ this.scene.clear();
93
+ this.container.innerHTML = "";
94
+ }
95
+ startAnimationLoop() {
96
+ const loop = () => {
97
+ this.render();
98
+ this.animationId = requestAnimationFrame(loop);
99
+ };
100
+ loop();
101
+ }
102
+ stopAnimationLoop() {
103
+ if (this.animationId) {
104
+ cancelAnimationFrame(this.animationId);
105
+ this.animationId = null;
106
+ }
107
+ }
108
+ render() {
109
+ this.renderer.render(this.scene, this.camera);
110
+ this.labelRenderer.render(this.scene, this.camera);
111
+ }
112
+ resize = () => {
113
+ const width = this.container.clientWidth;
114
+ const height = this.container.clientHeight;
115
+ this.camera.aspect = width / height;
116
+ this.camera.updateProjectionMatrix();
117
+ this.renderer.setSize(width, height);
118
+ this.labelRenderer.setSize(width, height);
119
+ };
120
+ updateBackground(color) {
121
+ this.scene.background = new THREE2__namespace.Color(color);
122
+ }
123
+ updateCamera(position) {
124
+ this.camera.position.set(...position);
125
+ }
126
+ getWorldPosition(screenX, screenY) {
127
+ return this.screenToWorld(screenX, screenY);
128
+ }
129
+ screenToWorld(x, y) {
130
+ const rect = this.container.getBoundingClientRect();
131
+ const ndc = new THREE2__namespace.Vector3(
132
+ (x - rect.left) / rect.width * 2 - 1,
133
+ -((y - rect.top) / rect.height) * 2 + 1,
134
+ 0.5
135
+ );
136
+ ndc.unproject(this.camera);
137
+ return ndc;
138
+ }
139
+ worldToScreen(position) {
140
+ const vector = position.clone().project(this.camera);
141
+ const rect = this.container.getBoundingClientRect();
142
+ return {
143
+ x: (vector.x * 0.5 + 0.5) * rect.width + rect.left,
144
+ y: (-vector.y * 0.5 + 0.5) * rect.height + rect.top
145
+ };
146
+ }
147
+ onContextLost = () => {
148
+ };
149
+ onContextRestored = () => {
150
+ };
151
+ };
152
+
153
+ // src/visualization/hooks/useSceneManager.ts
154
+ function useSceneManager(containerRef, config) {
155
+ const [manager, setManager] = react.useState(null);
156
+ react.useEffect(() => {
157
+ const container = containerRef.current;
158
+ if (!container) return;
159
+ const sceneManager = new SceneManager(container, config);
160
+ sceneManager.initialize();
161
+ setManager(sceneManager);
162
+ return () => {
163
+ sceneManager.dispose();
164
+ setManager(null);
165
+ };
166
+ }, [containerRef, config.backgroundColor]);
167
+ return manager;
168
+ }
169
+ var NodeRenderer = class {
170
+ constructor(scene, config) {
171
+ this.scene = scene;
172
+ this.config = config;
173
+ this.scene.add(this.group);
174
+ }
175
+ group = new THREE2__namespace.Group();
176
+ nodeObjects = /* @__PURE__ */ new Map();
177
+ renderNodes(nodes) {
178
+ this.clear();
179
+ nodes.forEach((node) => {
180
+ const color = this.config.domainColors[node.domain] ?? this.config.defaultColor;
181
+ const geometry = new THREE2__namespace.SphereGeometry(this.config.baseScale, 16, 16);
182
+ const material = new THREE2__namespace.MeshBasicMaterial({ color });
183
+ const mesh = new THREE2__namespace.Mesh(geometry, material);
184
+ if (node.position) {
185
+ mesh.position.set(...node.position);
186
+ }
187
+ mesh.userData = { nodeId: node.id };
188
+ this.group.add(mesh);
189
+ this.nodeObjects.set(node.id, mesh);
190
+ });
191
+ }
192
+ updateNode(nodeId, updates) {
193
+ const obj = this.nodeObjects.get(nodeId);
194
+ if (!obj) return;
195
+ if (updates.position) {
196
+ obj.position.set(...updates.position);
197
+ }
198
+ if (updates.domain) {
199
+ const color = this.config.domainColors[updates.domain] ?? this.config.defaultColor;
200
+ obj.material.color = new THREE2__namespace.Color(color);
201
+ }
202
+ }
203
+ removeNode(nodeId) {
204
+ const obj = this.nodeObjects.get(nodeId);
205
+ if (!obj) return;
206
+ this.group.remove(obj);
207
+ this.nodeObjects.delete(nodeId);
208
+ }
209
+ clear() {
210
+ this.group.clear();
211
+ this.nodeObjects.clear();
212
+ }
213
+ showNodes(nodeIds) {
214
+ nodeIds.forEach((id) => {
215
+ const obj = this.nodeObjects.get(id);
216
+ if (obj) obj.visible = true;
217
+ });
218
+ }
219
+ hideNodes(nodeIds) {
220
+ nodeIds.forEach((id) => {
221
+ const obj = this.nodeObjects.get(id);
222
+ if (obj) obj.visible = false;
223
+ });
224
+ }
225
+ setVisibleNodes(nodeIds) {
226
+ if (!nodeIds) {
227
+ this.nodeObjects.forEach((obj) => {
228
+ obj.visible = true;
229
+ });
230
+ return;
231
+ }
232
+ const visibleSet = new Set(nodeIds);
233
+ this.nodeObjects.forEach((obj, id) => {
234
+ obj.visible = visibleSet.has(id);
235
+ });
236
+ }
237
+ updateLabelVisibility() {
238
+ }
239
+ highlightNode(nodeId) {
240
+ const obj = this.nodeObjects.get(nodeId);
241
+ if (obj) {
242
+ obj.material.color = new THREE2__namespace.Color("#ffffff");
243
+ }
244
+ }
245
+ unhighlightNode(nodeId) {
246
+ const obj = this.nodeObjects.get(nodeId);
247
+ if (obj) {
248
+ const color = this.config.defaultColor;
249
+ obj.material.color = new THREE2__namespace.Color(color);
250
+ }
251
+ }
252
+ clearHighlights() {
253
+ this.nodeObjects.forEach((obj) => {
254
+ obj.material.color = new THREE2__namespace.Color(this.config.defaultColor);
255
+ });
256
+ }
257
+ getNodePosition(nodeId) {
258
+ const obj = this.nodeObjects.get(nodeId);
259
+ return obj ? obj.position.clone() : null;
260
+ }
261
+ getNodeObject(nodeId) {
262
+ return this.nodeObjects.get(nodeId) ?? null;
263
+ }
264
+ dispose() {
265
+ this.clear();
266
+ this.scene.remove(this.group);
267
+ }
268
+ };
269
+ var EdgeRenderer = class {
270
+ constructor(scene, config) {
271
+ this.scene = scene;
272
+ this.config = config;
273
+ this.scene.add(this.group);
274
+ }
275
+ group = new THREE2__namespace.Group();
276
+ edgeObjects = /* @__PURE__ */ new Map();
277
+ renderEdges(edges, nodePositions) {
278
+ this.clear();
279
+ edges.forEach((edge) => {
280
+ const from = nodePositions.get(edge.from);
281
+ const to = nodePositions.get(edge.to);
282
+ if (!from || !to) return;
283
+ const geometry = new THREE2__namespace.BufferGeometry().setFromPoints([from, to]);
284
+ const opacity = this.config.strengthOpacityScale ? edge.strength : this.config.baseOpacity;
285
+ const material = new THREE2__namespace.LineBasicMaterial({ color: this.config.defaultColor, transparent: true, opacity });
286
+ const line = new THREE2__namespace.Line(geometry, material);
287
+ line.userData = { edgeId: edge.id };
288
+ this.group.add(line);
289
+ this.edgeObjects.set(edge.id, line);
290
+ });
291
+ }
292
+ updateEdge(edgeId, updates) {
293
+ const line = this.edgeObjects.get(edgeId);
294
+ if (!line) return;
295
+ if (updates.strength !== void 0) {
296
+ const opacity = this.config.strengthOpacityScale ? updates.strength : this.config.baseOpacity;
297
+ line.material.opacity = opacity;
298
+ }
299
+ }
300
+ removeEdge(edgeId) {
301
+ const line = this.edgeObjects.get(edgeId);
302
+ if (!line) return;
303
+ this.group.remove(line);
304
+ this.edgeObjects.delete(edgeId);
305
+ }
306
+ clear() {
307
+ this.group.clear();
308
+ this.edgeObjects.clear();
309
+ }
310
+ filterByStrength(minStrength) {
311
+ this.edgeObjects.forEach((line) => {
312
+ line.visible = line.material.opacity >= minStrength;
313
+ });
314
+ }
315
+ filterByType() {
316
+ }
317
+ highlightEdge(edgeId) {
318
+ const line = this.edgeObjects.get(edgeId);
319
+ if (line) {
320
+ line.material.color = new THREE2__namespace.Color(this.config.activeColor);
321
+ }
322
+ }
323
+ highlightEdgesForNode() {
324
+ }
325
+ unhighlightEdge(edgeId) {
326
+ const line = this.edgeObjects.get(edgeId);
327
+ if (line) {
328
+ line.material.color = new THREE2__namespace.Color(this.config.defaultColor);
329
+ }
330
+ }
331
+ clearHighlights() {
332
+ this.edgeObjects.forEach((line) => {
333
+ line.material.color = new THREE2__namespace.Color(this.config.defaultColor);
334
+ });
335
+ }
336
+ showEdges(edgeIds) {
337
+ edgeIds.forEach((id) => {
338
+ const line = this.edgeObjects.get(id);
339
+ if (line) line.visible = true;
340
+ });
341
+ }
342
+ hideEdges(edgeIds) {
343
+ edgeIds.forEach((id) => {
344
+ const line = this.edgeObjects.get(id);
345
+ if (line) line.visible = false;
346
+ });
347
+ }
348
+ dispose() {
349
+ this.clear();
350
+ this.scene.remove(this.group);
351
+ }
352
+ };
353
+
354
+ // src/visualization/layouts/fuzzy-layout.ts
355
+ var GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
356
+ function hashString(input) {
357
+ let hash = 2166136261;
358
+ for (let i = 0; i < input.length; i += 1) {
359
+ hash ^= input.charCodeAt(i);
360
+ hash = Math.imul(hash, 16777619);
361
+ }
362
+ return hash >>> 0;
363
+ }
364
+ function mulberry32(seed) {
365
+ let t = seed;
366
+ return () => {
367
+ t += 1831565813;
368
+ let r = Math.imul(t ^ t >>> 15, t | 1);
369
+ r ^= r + Math.imul(r ^ r >>> 7, r | 61);
370
+ return ((r ^ r >>> 14) >>> 0) / 4294967296;
371
+ };
372
+ }
373
+ function buildSeed(baseSeed, nodeKey) {
374
+ return mulberry32(hashString(`${baseSeed}:${nodeKey}`));
375
+ }
376
+ function applyFuzzyLayout(nodes, options = {}) {
377
+ const mode = options.mode ?? "auto";
378
+ if (mode === "positioned") {
379
+ return nodes;
380
+ }
381
+ const needsLayout = mode === "fuzzy" || nodes.some((node) => !node.position);
382
+ if (!needsLayout) {
383
+ return nodes;
384
+ }
385
+ const baseSeed = options.seed ?? "omi-neuron-web";
386
+ const count = Math.max(nodes.length, 1);
387
+ const baseRadius = options.radius ?? Math.max(4, Math.sqrt(count) * 2.4);
388
+ const jitter = options.jitter ?? baseRadius * 0.15;
389
+ const zSpread = options.zSpread ?? baseRadius * 0.6;
390
+ return nodes.map((node, index) => {
391
+ const shouldApply = mode === "fuzzy" || !node.position;
392
+ if (!shouldApply) {
393
+ return node;
394
+ }
395
+ const nodeKey = node.slug || node.id || String(index);
396
+ const rand = buildSeed(baseSeed, nodeKey);
397
+ const angle = rand() * Math.PI * 2 + index * GOLDEN_ANGLE * 0.05;
398
+ const radius = baseRadius * Math.sqrt(rand());
399
+ const jitterOffset = (rand() - 0.5) * jitter;
400
+ const r = Math.max(0.6, radius + jitterOffset);
401
+ const x = Math.cos(angle) * r;
402
+ const y = Math.sin(angle) * r;
403
+ const z = (rand() - 0.5) * zSpread;
404
+ return { ...node, position: [x, y, z] };
405
+ });
406
+ }
407
+ function NeuronWeb({
408
+ graphData,
409
+ className,
410
+ style,
411
+ isLoading,
412
+ error,
413
+ renderEmptyState,
414
+ renderLoadingState,
415
+ ariaLabel,
416
+ theme,
417
+ layout
418
+ }) {
419
+ const containerRef = react.useRef(null);
420
+ const resolvedTheme = { ...DEFAULT_THEME, ...theme };
421
+ const sceneManager = useSceneManager(containerRef, {
422
+ backgroundColor: resolvedTheme.colors.background,
423
+ cameraPosition: [4, 8, 20],
424
+ cameraTarget: [0, 0, 0],
425
+ minZoom: 4,
426
+ maxZoom: 42,
427
+ enableStarfield: resolvedTheme.effects.starfieldEnabled,
428
+ starfieldCount: 1200,
429
+ pixelRatioCap: 2
430
+ });
431
+ const nodeRenderer = react.useMemo(() => {
432
+ if (!sceneManager) return null;
433
+ return new NodeRenderer(sceneManager.scene, {
434
+ domainColors: resolvedTheme.colors.domainColors,
435
+ defaultColor: resolvedTheme.colors.defaultDomainColor,
436
+ baseScale: 0.4,
437
+ tierScales: {
438
+ primary: 1.6,
439
+ secondary: 1.2,
440
+ tertiary: 1,
441
+ insight: 1
442
+ },
443
+ glowIntensity: resolvedTheme.effects.glowIntensity,
444
+ labelDistance: 20,
445
+ maxVisibleLabels: 50
446
+ });
447
+ }, [sceneManager]);
448
+ const edgeRenderer = react.useMemo(() => {
449
+ if (!sceneManager) return null;
450
+ return new EdgeRenderer(sceneManager.scene, {
451
+ defaultColor: resolvedTheme.colors.edgeDefault,
452
+ activeColor: resolvedTheme.colors.edgeActive,
453
+ selectedColor: resolvedTheme.colors.edgeSelected,
454
+ baseOpacity: 0.5,
455
+ strengthOpacityScale: true
456
+ });
457
+ }, [sceneManager]);
458
+ const resolvedNodes = react.useMemo(
459
+ () => applyFuzzyLayout(graphData.nodes, layout),
460
+ [graphData.nodes, layout]
461
+ );
462
+ react.useEffect(() => {
463
+ if (!sceneManager || !nodeRenderer || !edgeRenderer) return;
464
+ nodeRenderer.renderNodes(resolvedNodes);
465
+ const positions = /* @__PURE__ */ new Map();
466
+ resolvedNodes.forEach((node) => {
467
+ if (!node.position) return;
468
+ positions.set(node.slug, new THREE2__namespace.Vector3(...node.position));
469
+ });
470
+ edgeRenderer.renderEdges(graphData.edges, positions);
471
+ }, [resolvedNodes, graphData.edges, sceneManager, nodeRenderer, edgeRenderer]);
472
+ if (isLoading) {
473
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style, "aria-label": ariaLabel, children: renderLoadingState ? renderLoadingState() : /* @__PURE__ */ jsxRuntime.jsx("div", { children: "Loading\u2026" }) });
474
+ }
475
+ if (error) {
476
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style, "aria-label": ariaLabel, children: renderEmptyState ? renderEmptyState() : /* @__PURE__ */ jsxRuntime.jsx("div", { children: error }) });
477
+ }
478
+ if (!resolvedNodes.length) {
479
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className, style, "aria-label": ariaLabel, children: renderEmptyState ? renderEmptyState() : /* @__PURE__ */ jsxRuntime.jsx("div", { children: "No data" }) });
480
+ }
481
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className, style, "aria-label": ariaLabel });
482
+ }
483
+
484
+ // src/visualization/themes/theme-engine.ts
485
+ var ThemeEngine = class {
486
+ theme;
487
+ onThemeChange = () => {
488
+ };
489
+ constructor(initialTheme) {
490
+ this.theme = { ...DEFAULT_THEME, ...initialTheme };
491
+ }
492
+ getTheme() {
493
+ return this.theme;
494
+ }
495
+ setTheme(theme) {
496
+ this.theme = { ...this.theme, ...theme };
497
+ this.onThemeChange(this.theme);
498
+ }
499
+ resetTheme() {
500
+ this.theme = { ...DEFAULT_THEME };
501
+ this.onThemeChange(this.theme);
502
+ }
503
+ setDomainColor(domain, color) {
504
+ this.theme.colors.domainColors[domain] = color;
505
+ this.onThemeChange(this.theme);
506
+ }
507
+ setBackground(color) {
508
+ this.theme.colors.background = color;
509
+ this.onThemeChange(this.theme);
510
+ }
511
+ setLabelStyle(style) {
512
+ this.theme.typography = { ...this.theme.typography, ...style };
513
+ this.onThemeChange(this.theme);
514
+ }
515
+ applyPreset(preset) {
516
+ if (preset === "light") {
517
+ this.theme = {
518
+ ...DEFAULT_THEME,
519
+ colors: { ...DEFAULT_THEME.colors, background: "#f7f7fb", labelText: "#111" }
520
+ };
521
+ } else if (preset === "dark") {
522
+ this.theme = { ...DEFAULT_THEME };
523
+ }
524
+ this.onThemeChange(this.theme);
525
+ }
526
+ saveToStorage() {
527
+ if (typeof window === "undefined") return;
528
+ window.localStorage.setItem("omi-neuron-theme", JSON.stringify(this.theme));
529
+ }
530
+ loadFromStorage() {
531
+ if (typeof window === "undefined") return;
532
+ const stored = window.localStorage.getItem("omi-neuron-theme");
533
+ if (stored) {
534
+ this.theme = { ...this.theme, ...JSON.parse(stored) };
535
+ }
536
+ }
537
+ };
538
+
539
+ exports.DEFAULT_THEME = DEFAULT_THEME;
540
+ exports.NeuronWeb = NeuronWeb;
541
+ exports.SceneManager = SceneManager;
542
+ exports.ThemeEngine = ThemeEngine;
543
+ exports.applyFuzzyLayout = applyFuzzyLayout;
544
+ //# sourceMappingURL=chunk-2WP2AEZC.cjs.map
545
+ //# sourceMappingURL=chunk-2WP2AEZC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/visualization/constants.ts","../src/visualization/scene/scene-manager.ts","../src/visualization/hooks/useSceneManager.ts","../src/visualization/scene/node-renderer.ts","../src/visualization/scene/edge-renderer.ts","../src/visualization/layouts/fuzzy-layout.ts","../src/visualization/NeuronWeb.tsx","../src/visualization/themes/theme-engine.ts"],"names":["THREE","CSS2DRenderer","OrbitControls","useState","useEffect","THREE2","THREE3","useRef","useMemo","THREE4","jsx"],"mappings":"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","file":"chunk-2WP2AEZC.cjs","sourcesContent":["import type { NeuronWebTheme } from './types';\n\nexport const DEFAULT_THEME: NeuronWebTheme = {\n colors: {\n background: '#020314',\n domainColors: {},\n defaultDomainColor: '#c0c5ff',\n edgeDefault: '#4d4d55',\n edgeActive: '#c6d4ff',\n edgeSelected: '#ffffff',\n labelText: '#ffffff',\n labelBackground: 'rgba(0, 0, 0, 0.8)',\n },\n typography: {\n labelFontFamily: 'system-ui, sans-serif',\n labelFontSize: 12,\n labelFontWeight: '500',\n },\n effects: {\n starfieldEnabled: true,\n starfieldColor: '#ffffff',\n glowEnabled: true,\n glowIntensity: 0.6,\n },\n animation: {\n focusDuration: 800,\n transitionDuration: 650,\n easing: 'easeInOut',\n },\n};\n","import * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js';\n\nexport interface SceneConfig {\n backgroundColor: string;\n cameraPosition: [number, number, number];\n cameraTarget: [number, number, number];\n minZoom: number;\n maxZoom: number;\n enableStarfield: boolean;\n starfieldCount: number;\n pixelRatioCap: number;\n}\n\nexport class SceneManager {\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n renderer: THREE.WebGLRenderer;\n labelRenderer: CSS2DRenderer;\n controls: OrbitControls;\n private animationId: number | null = null;\n\n constructor(private container: HTMLElement, private config: SceneConfig) {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(60, 1, 0.1, 2000);\n this.renderer = new THREE.WebGLRenderer({ antialias: true });\n this.labelRenderer = new CSS2DRenderer();\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n }\n\n initialize(): void {\n const { cameraPosition, cameraTarget, backgroundColor } = this.config;\n this.scene.background = new THREE.Color(backgroundColor);\n this.camera.position.set(...cameraPosition);\n this.controls.target.set(...cameraTarget);\n this.controls.update();\n\n this.renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, this.config.pixelRatioCap));\n this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);\n this.labelRenderer.setSize(this.container.clientWidth, this.container.clientHeight);\n\n this.container.appendChild(this.renderer.domElement);\n this.container.appendChild(this.labelRenderer.domElement);\n\n window.addEventListener('resize', this.resize);\n this.startAnimationLoop();\n }\n\n dispose(): void {\n this.stopAnimationLoop();\n window.removeEventListener('resize', this.resize);\n this.renderer.dispose();\n this.scene.clear();\n this.container.innerHTML = '';\n }\n\n startAnimationLoop(): void {\n const loop = () => {\n this.render();\n this.animationId = requestAnimationFrame(loop);\n };\n loop();\n }\n\n stopAnimationLoop(): void {\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n this.animationId = null;\n }\n }\n\n render(): void {\n this.renderer.render(this.scene, this.camera);\n this.labelRenderer.render(this.scene, this.camera);\n }\n\n resize = (): void => {\n const width = this.container.clientWidth;\n const height = this.container.clientHeight;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height);\n this.labelRenderer.setSize(width, height);\n };\n\n updateBackground(color: string): void {\n this.scene.background = new THREE.Color(color);\n }\n\n updateCamera(position: [number, number, number]): void {\n this.camera.position.set(...position);\n }\n\n getWorldPosition(screenX: number, screenY: number): THREE.Vector3 {\n return this.screenToWorld(screenX, screenY);\n }\n\n screenToWorld(x: number, y: number): THREE.Vector3 {\n const rect = this.container.getBoundingClientRect();\n const ndc = new THREE.Vector3(\n ((x - rect.left) / rect.width) * 2 - 1,\n -((y - rect.top) / rect.height) * 2 + 1,\n 0.5\n );\n ndc.unproject(this.camera);\n return ndc;\n }\n\n worldToScreen(position: THREE.Vector3): { x: number; y: number } {\n const vector = position.clone().project(this.camera);\n const rect = this.container.getBoundingClientRect();\n return {\n x: (vector.x * 0.5 + 0.5) * rect.width + rect.left,\n y: (-vector.y * 0.5 + 0.5) * rect.height + rect.top,\n };\n }\n\n onContextLost = () => {};\n onContextRestored = () => {};\n}\n","import { useEffect, useState } from 'react';\nimport type { RefObject } from 'react';\nimport { SceneManager, type SceneConfig } from '../scene/scene-manager';\n\nexport function useSceneManager(\n containerRef: RefObject<HTMLElement | null>,\n config: SceneConfig\n): SceneManager | null {\n const [manager, setManager] = useState<SceneManager | null>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n const sceneManager = new SceneManager(container, config);\n sceneManager.initialize();\n setManager(sceneManager);\n return () => {\n sceneManager.dispose();\n setManager(null);\n };\n }, [containerRef, config.backgroundColor]);\n\n return manager;\n}\n","import * as THREE from 'three';\nimport type { NeuronVisualNode, NodeTier } from '../../core/types';\n\nexport interface NodeRenderConfig {\n domainColors: Record<string, string>;\n defaultColor: string;\n baseScale: number;\n tierScales: Record<NodeTier, number>;\n glowIntensity: number;\n labelDistance: number;\n maxVisibleLabels: number;\n}\n\nexport class NodeRenderer {\n private group = new THREE.Group();\n private nodeObjects = new Map<string, THREE.Mesh>();\n\n constructor(private scene: THREE.Scene, private config: NodeRenderConfig) {\n this.scene.add(this.group);\n }\n\n renderNodes(nodes: NeuronVisualNode[]): void {\n this.clear();\n nodes.forEach((node) => {\n const color = this.config.domainColors[node.domain] ?? this.config.defaultColor;\n const geometry = new THREE.SphereGeometry(this.config.baseScale, 16, 16);\n const material = new THREE.MeshBasicMaterial({ color });\n const mesh = new THREE.Mesh(geometry, material);\n if (node.position) {\n mesh.position.set(...node.position);\n }\n mesh.userData = { nodeId: node.id };\n this.group.add(mesh);\n this.nodeObjects.set(node.id, mesh);\n });\n }\n\n updateNode(nodeId: string, updates: Partial<NeuronVisualNode>): void {\n const obj = this.nodeObjects.get(nodeId) as THREE.Mesh | undefined;\n if (!obj) return;\n if (updates.position) {\n obj.position.set(...updates.position);\n }\n if (updates.domain) {\n const color = this.config.domainColors[updates.domain] ?? this.config.defaultColor;\n (obj.material as THREE.MeshBasicMaterial).color = new THREE.Color(color);\n }\n }\n\n removeNode(nodeId: string): void {\n const obj = this.nodeObjects.get(nodeId);\n if (!obj) return;\n this.group.remove(obj);\n this.nodeObjects.delete(nodeId);\n }\n\n clear(): void {\n this.group.clear();\n this.nodeObjects.clear();\n }\n\n showNodes(nodeIds: string[]): void {\n nodeIds.forEach((id) => {\n const obj = this.nodeObjects.get(id);\n if (obj) obj.visible = true;\n });\n }\n\n hideNodes(nodeIds: string[]): void {\n nodeIds.forEach((id) => {\n const obj = this.nodeObjects.get(id);\n if (obj) obj.visible = false;\n });\n }\n\n setVisibleNodes(nodeIds: string[] | null): void {\n if (!nodeIds) {\n this.nodeObjects.forEach((obj) => {\n obj.visible = true;\n });\n return;\n }\n const visibleSet = new Set(nodeIds);\n this.nodeObjects.forEach((obj, id) => {\n obj.visible = visibleSet.has(id);\n });\n }\n\n updateLabelVisibility(): void {\n // Labels not implemented in this stub.\n }\n\n highlightNode(nodeId: string): void {\n const obj = this.nodeObjects.get(nodeId) as THREE.Mesh | undefined;\n if (obj) {\n (obj.material as THREE.MeshBasicMaterial).color = new THREE.Color('#ffffff');\n }\n }\n\n unhighlightNode(nodeId: string): void {\n const obj = this.nodeObjects.get(nodeId) as THREE.Mesh | undefined;\n if (obj) {\n const color = this.config.defaultColor;\n (obj.material as THREE.MeshBasicMaterial).color = new THREE.Color(color);\n }\n }\n\n clearHighlights(): void {\n this.nodeObjects.forEach((obj) => {\n (obj.material as THREE.MeshBasicMaterial).color = new THREE.Color(this.config.defaultColor);\n });\n }\n\n getNodePosition(nodeId: string): THREE.Vector3 | null {\n const obj = this.nodeObjects.get(nodeId);\n return obj ? obj.position.clone() : null;\n }\n\n getNodeObject(nodeId: string): THREE.Object3D | null {\n return this.nodeObjects.get(nodeId) ?? null;\n }\n\n dispose(): void {\n this.clear();\n this.scene.remove(this.group);\n }\n}\n","import * as THREE from 'three';\nimport type { NeuronVisualEdge } from '../../core/types';\n\nexport interface EdgeRenderConfig {\n defaultColor: string;\n activeColor: string;\n selectedColor: string;\n baseOpacity: number;\n strengthOpacityScale: boolean;\n}\n\nexport class EdgeRenderer {\n private group = new THREE.Group();\n private edgeObjects = new Map<string, THREE.Line>();\n\n constructor(private scene: THREE.Scene, private config: EdgeRenderConfig) {\n this.scene.add(this.group);\n }\n\n renderEdges(edges: NeuronVisualEdge[], nodePositions: Map<string, THREE.Vector3>): void {\n this.clear();\n edges.forEach((edge) => {\n const from = nodePositions.get(edge.from);\n const to = nodePositions.get(edge.to);\n if (!from || !to) return;\n const geometry = new THREE.BufferGeometry().setFromPoints([from, to]);\n const opacity = this.config.strengthOpacityScale ? edge.strength : this.config.baseOpacity;\n const material = new THREE.LineBasicMaterial({ color: this.config.defaultColor, transparent: true, opacity });\n const line = new THREE.Line(geometry, material);\n line.userData = { edgeId: edge.id };\n this.group.add(line);\n this.edgeObjects.set(edge.id, line);\n });\n }\n\n updateEdge(edgeId: string, updates: Partial<NeuronVisualEdge>): void {\n const line = this.edgeObjects.get(edgeId);\n if (!line) return;\n if (updates.strength !== undefined) {\n const opacity = this.config.strengthOpacityScale ? updates.strength : this.config.baseOpacity;\n (line.material as THREE.LineBasicMaterial).opacity = opacity;\n }\n }\n\n removeEdge(edgeId: string): void {\n const line = this.edgeObjects.get(edgeId);\n if (!line) return;\n this.group.remove(line);\n this.edgeObjects.delete(edgeId);\n }\n\n clear(): void {\n this.group.clear();\n this.edgeObjects.clear();\n }\n\n filterByStrength(minStrength: number): void {\n this.edgeObjects.forEach((line) => {\n line.visible = (line.material as THREE.LineBasicMaterial).opacity >= minStrength;\n });\n }\n\n filterByType(): void {\n // Not implemented in stub.\n }\n\n highlightEdge(edgeId: string): void {\n const line = this.edgeObjects.get(edgeId);\n if (line) {\n (line.material as THREE.LineBasicMaterial).color = new THREE.Color(this.config.activeColor);\n }\n }\n\n highlightEdgesForNode(): void {\n // Not implemented in stub.\n }\n\n unhighlightEdge(edgeId: string): void {\n const line = this.edgeObjects.get(edgeId);\n if (line) {\n (line.material as THREE.LineBasicMaterial).color = new THREE.Color(this.config.defaultColor);\n }\n }\n\n clearHighlights(): void {\n this.edgeObjects.forEach((line) => {\n (line.material as THREE.LineBasicMaterial).color = new THREE.Color(this.config.defaultColor);\n });\n }\n\n showEdges(edgeIds: string[]): void {\n edgeIds.forEach((id) => {\n const line = this.edgeObjects.get(id);\n if (line) line.visible = true;\n });\n }\n\n hideEdges(edgeIds: string[]): void {\n edgeIds.forEach((id) => {\n const line = this.edgeObjects.get(id);\n if (line) line.visible = false;\n });\n }\n\n dispose(): void {\n this.clear();\n this.scene.remove(this.group);\n }\n}\n","import type { NeuronVisualNode } from '../../core/types';\nimport type { NeuronLayoutOptions } from '../types';\n\nconst GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));\n\nfunction hashString(input: string): number {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction mulberry32(seed: number): () => number {\n let t = seed;\n return () => {\n t += 0x6d2b79f5;\n let r = Math.imul(t ^ (t >>> 15), t | 1);\n r ^= r + Math.imul(r ^ (r >>> 7), r | 61);\n return ((r ^ (r >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction buildSeed(baseSeed: string, nodeKey: string): () => number {\n return mulberry32(hashString(`${baseSeed}:${nodeKey}`));\n}\n\nexport function applyFuzzyLayout(\n nodes: NeuronVisualNode[],\n options: NeuronLayoutOptions = {}\n): NeuronVisualNode[] {\n const mode = options.mode ?? 'auto';\n if (mode === 'positioned') {\n return nodes;\n }\n\n const needsLayout = mode === 'fuzzy' || nodes.some((node) => !node.position);\n if (!needsLayout) {\n return nodes;\n }\n\n const baseSeed = options.seed ?? 'omi-neuron-web';\n const count = Math.max(nodes.length, 1);\n const baseRadius = options.radius ?? Math.max(4, Math.sqrt(count) * 2.4);\n const jitter = options.jitter ?? baseRadius * 0.15;\n const zSpread = options.zSpread ?? baseRadius * 0.6;\n\n return nodes.map((node, index) => {\n const shouldApply = mode === 'fuzzy' || !node.position;\n if (!shouldApply) {\n return node;\n }\n\n const nodeKey = node.slug || node.id || String(index);\n const rand = buildSeed(baseSeed, nodeKey);\n const angle = rand() * Math.PI * 2 + index * GOLDEN_ANGLE * 0.05;\n const radius = baseRadius * Math.sqrt(rand());\n const jitterOffset = (rand() - 0.5) * jitter;\n const r = Math.max(0.6, radius + jitterOffset);\n const x = Math.cos(angle) * r;\n const y = Math.sin(angle) * r;\n const z = (rand() - 0.5) * zSpread;\n\n return { ...node, position: [x, y, z] };\n });\n}\n","'use client';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport type { NeuronWebProps } from './types';\nimport { DEFAULT_THEME } from './constants';\nimport { useSceneManager } from './hooks/useSceneManager';\nimport { NodeRenderer } from './scene/node-renderer';\nimport { EdgeRenderer } from './scene/edge-renderer';\nimport { applyFuzzyLayout } from './layouts/fuzzy-layout';\n\nexport function NeuronWeb({\n graphData,\n className,\n style,\n isLoading,\n error,\n renderEmptyState,\n renderLoadingState,\n ariaLabel,\n theme,\n layout,\n}: NeuronWebProps): React.ReactElement {\n const containerRef = useRef<HTMLDivElement>(null);\n const resolvedTheme = { ...DEFAULT_THEME, ...theme };\n\n const sceneManager = useSceneManager(containerRef, {\n backgroundColor: resolvedTheme.colors.background,\n cameraPosition: [4, 8, 20],\n cameraTarget: [0, 0, 0],\n minZoom: 4,\n maxZoom: 42,\n enableStarfield: resolvedTheme.effects.starfieldEnabled,\n starfieldCount: 1200,\n pixelRatioCap: 2,\n });\n\n const nodeRenderer = useMemo(() => {\n if (!sceneManager) return null;\n return new NodeRenderer(sceneManager.scene, {\n domainColors: resolvedTheme.colors.domainColors,\n defaultColor: resolvedTheme.colors.defaultDomainColor,\n baseScale: 0.4,\n tierScales: {\n primary: 1.6,\n secondary: 1.2,\n tertiary: 1,\n insight: 1,\n },\n glowIntensity: resolvedTheme.effects.glowIntensity,\n labelDistance: 20,\n maxVisibleLabels: 50,\n });\n }, [sceneManager]);\n\n const edgeRenderer = useMemo(() => {\n if (!sceneManager) return null;\n return new EdgeRenderer(sceneManager.scene, {\n defaultColor: resolvedTheme.colors.edgeDefault,\n activeColor: resolvedTheme.colors.edgeActive,\n selectedColor: resolvedTheme.colors.edgeSelected,\n baseOpacity: 0.5,\n strengthOpacityScale: true,\n });\n }, [sceneManager]);\n\n const resolvedNodes = useMemo(\n () => applyFuzzyLayout(graphData.nodes, layout),\n [graphData.nodes, layout]\n );\n\n useEffect(() => {\n if (!sceneManager || !nodeRenderer || !edgeRenderer) return;\n nodeRenderer.renderNodes(resolvedNodes);\n const positions = new Map<string, THREE.Vector3>();\n resolvedNodes.forEach((node) => {\n if (!node.position) return;\n positions.set(node.slug, new THREE.Vector3(...node.position));\n });\n edgeRenderer.renderEdges(graphData.edges, positions);\n }, [resolvedNodes, graphData.edges, sceneManager, nodeRenderer, edgeRenderer]);\n\n if (isLoading) {\n return (\n <div className={className} style={style} aria-label={ariaLabel}>\n {renderLoadingState ? renderLoadingState() : <div>Loading…</div>}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className} style={style} aria-label={ariaLabel}>\n {renderEmptyState ? renderEmptyState() : <div>{error}</div>}\n </div>\n );\n }\n\n if (!resolvedNodes.length) {\n return (\n <div className={className} style={style} aria-label={ariaLabel}>\n {renderEmptyState ? renderEmptyState() : <div>No data</div>}\n </div>\n );\n }\n\n return <div ref={containerRef} className={className} style={style} aria-label={ariaLabel} />;\n}\n","import { DEFAULT_THEME } from '../constants';\nimport type { NeuronWebTheme } from '../types';\n\nexport class ThemeEngine {\n private theme: NeuronWebTheme;\n onThemeChange: (theme: NeuronWebTheme) => void = () => {};\n\n constructor(initialTheme?: Partial<NeuronWebTheme>) {\n this.theme = { ...DEFAULT_THEME, ...initialTheme } as NeuronWebTheme;\n }\n\n getTheme(): NeuronWebTheme {\n return this.theme;\n }\n\n setTheme(theme: Partial<NeuronWebTheme>): void {\n this.theme = { ...this.theme, ...theme } as NeuronWebTheme;\n this.onThemeChange(this.theme);\n }\n\n resetTheme(): void {\n this.theme = { ...DEFAULT_THEME };\n this.onThemeChange(this.theme);\n }\n\n setDomainColor(domain: string, color: string): void {\n this.theme.colors.domainColors[domain] = color;\n this.onThemeChange(this.theme);\n }\n\n setBackground(color: string): void {\n this.theme.colors.background = color;\n this.onThemeChange(this.theme);\n }\n\n setLabelStyle(style: Partial<NeuronWebTheme['typography']>): void {\n this.theme.typography = { ...this.theme.typography, ...style };\n this.onThemeChange(this.theme);\n }\n\n applyPreset(preset: 'dark' | 'light' | 'custom'): void {\n if (preset === 'light') {\n this.theme = {\n ...DEFAULT_THEME,\n colors: { ...DEFAULT_THEME.colors, background: '#f7f7fb', labelText: '#111' },\n };\n } else if (preset === 'dark') {\n this.theme = { ...DEFAULT_THEME };\n }\n this.onThemeChange(this.theme);\n }\n\n saveToStorage(): void {\n if (typeof window === 'undefined') return;\n window.localStorage.setItem('omi-neuron-theme', JSON.stringify(this.theme));\n }\n\n loadFromStorage(): void {\n if (typeof window === 'undefined') return;\n const stored = window.localStorage.getItem('omi-neuron-theme');\n if (stored) {\n this.theme = { ...this.theme, ...(JSON.parse(stored) as NeuronWebTheme) };\n }\n }\n}\n"]}
@@ -543,5 +543,5 @@ var buildDelete = (table, where) => {
543
543
  };
544
544
 
545
545
  export { DEFAULT_ANALYSIS_SETTINGS, DEFAULT_VISUALIZATION_SETTINGS, ScoringEngine, analysisOptionsSchema, analysisRequestSchema, analysisSettingsSchema, buildDelete, buildInsert, buildSelect, buildUpdate, buildWhereClause, createDatabase, createDatabaseFromEnv, databaseSettingsSchema, domainConfigSchema, edgeCreateSchema, edgeEvidenceSchema, edgeFilterSchema, edgeUpdateSchema, expandGraphRequestSchema, findPathRequestSchema, findSimilarRequestSchema, getDatabase, getGraphParamsSchema, listEdgesParamsSchema, listNodesParamsSchema, neuronConfigSchema, neuronSettingsSchema, neuronSettingsUpdateSchema, nodeBatchCreateSchema, nodeCreateSchema, nodeFilterSchema, nodeTierSchema, nodeTypeConfigSchema, nodeUpdateSchema, paginationSchema, relationshipTypeConfigSchema, resetDatabaseSingleton, semanticSearchRequestSchema, visualizationSettingsSchema };
546
- //# sourceMappingURL=chunk-XNR42GCJ.js.map
547
- //# sourceMappingURL=chunk-XNR42GCJ.js.map
546
+ //# sourceMappingURL=chunk-6LW4KNAU.js.map
547
+ //# sourceMappingURL=chunk-6LW4KNAU.js.map