feat: dashboard v2.1 glassmorphism + graph decomposition + fix flaky macOS vector test

Dashboard v2.1 "Nuclear" upgrade:
- Dark glassmorphism UI system (4-tier glass utilities, ambient orbs, nav glow)
- Graph3D decomposed from 806-line monolith into 10 focused modules
- Custom GLSL shaders (nebula FBM background, chromatic aberration, film grain, vignette)
- Enhanced dream mode with smooth 2s lerped transitions and aurora cycling
- Cognitive pipeline visualizer (7-stage search cascade animation)
- Temporal playback slider (scrub through memory evolution over time)
- Bioluminescent color palette for node types and events

Fix flaky CI test on macOS:
- vector::tests::test_add_and_search used near-identical test vectors (additive phase shift)
- Changed to multiplicative frequency so each seed produces a distinct vector

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Sam Valladares 2026-03-01 21:24:10 -06:00
parent 2c1f499a8b
commit d98cf6136a
241 changed files with 6262 additions and 4884 deletions

View file

@ -0,0 +1,53 @@
import * as THREE from 'three';
import type { GraphEdge } from '$types';
export class EdgeManager {
group: THREE.Group;
constructor() {
this.group = new THREE.Group();
}
createEdges(edges: GraphEdge[], positions: Map<string, THREE.Vector3>) {
for (const edge of edges) {
const sourcePos = positions.get(edge.source);
const targetPos = positions.get(edge.target);
if (!sourcePos || !targetPos) continue;
const points = [sourcePos, targetPos];
const geometry = new THREE.BufferGeometry().setFromPoints(points);
const material = new THREE.LineBasicMaterial({
color: 0x4a4a7a,
transparent: true,
opacity: Math.min(0.1 + edge.weight * 0.5, 0.6),
blending: THREE.AdditiveBlending,
});
const line = new THREE.Line(geometry, material);
line.userData = { source: edge.source, target: edge.target };
this.group.add(line);
}
}
updatePositions(positions: Map<string, THREE.Vector3>) {
this.group.children.forEach((child) => {
const line = child as THREE.Line;
const sourcePos = positions.get(line.userData.source);
const targetPos = positions.get(line.userData.target);
if (sourcePos && targetPos) {
const attrs = line.geometry.attributes.position as THREE.BufferAttribute;
attrs.setXYZ(0, sourcePos.x, sourcePos.y, sourcePos.z);
attrs.setXYZ(1, targetPos.x, targetPos.y, targetPos.z);
attrs.needsUpdate = true;
}
});
}
dispose() {
this.group.children.forEach((child) => {
const line = child as THREE.Line;
line.geometry?.dispose();
(line.material as THREE.Material)?.dispose();
});
}
}