Compare commits
6 Commits
feat/gofai
...
mimo/code/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5bc3e0879d | ||
| aab3e607eb | |||
| fe56ece1ad | |||
| bf477382ba | |||
| fba972f8be | |||
| 6786e65f3d |
6
app.js
6
app.js
@@ -1,4 +1,4 @@
|
|||||||
import * as THREE from 'three';
|
import ResonanceVisualizer from './nexus/components/resonance-visualizer.js';\nimport * as THREE from 'three';
|
||||||
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
|
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
|
||||||
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
|
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
|
||||||
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';
|
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';
|
||||||
@@ -597,7 +597,7 @@ class PSELayer {
|
|||||||
|
|
||||||
let pseLayer;
|
let pseLayer;
|
||||||
|
|
||||||
let metaLayer, neuroBridge, cbr, symbolicPlanner, knowledgeGraph, blackboard, symbolicEngine, calibrator;
|
let resonanceViz, metaLayer, neuroBridge, cbr, symbolicPlanner, knowledgeGraph, blackboard, symbolicEngine, calibrator;
|
||||||
let agentFSMs = {};
|
let agentFSMs = {};
|
||||||
|
|
||||||
function setupGOFAI() {
|
function setupGOFAI() {
|
||||||
@@ -666,7 +666,7 @@ async function init() {
|
|||||||
scene = new THREE.Scene();
|
scene = new THREE.Scene();
|
||||||
scene.fog = new THREE.FogExp2(0x050510, 0.012);
|
scene.fog = new THREE.FogExp2(0x050510, 0.012);
|
||||||
|
|
||||||
setupGOFAI();
|
setupGOFAI();\n resonanceViz = new ResonanceVisualizer(scene);
|
||||||
camera = new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 1000);
|
camera = new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 1000);
|
||||||
camera.position.copy(playerPos);
|
camera.position.copy(playerPos);
|
||||||
|
|
||||||
|
|||||||
@@ -694,15 +694,61 @@ const SpatialMemory = (() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ─── CONTEXT COMPACTION (issue #675) ──────────────────
|
||||||
|
const COMPACT_CONTENT_MAXLEN = 80; // max chars for low-strength memories
|
||||||
|
const COMPACT_STRENGTH_THRESHOLD = 0.5; // below this, content gets truncated
|
||||||
|
const COMPACT_MAX_CONNECTIONS = 5; // cap connections per memory
|
||||||
|
const COMPACT_POSITION_DECIMALS = 1; // round positions to 1 decimal
|
||||||
|
|
||||||
|
function _compactPosition(pos) {
|
||||||
|
const factor = Math.pow(10, COMPACT_POSITION_DECIMALS);
|
||||||
|
return pos.map(v => Math.round(v * factor) / factor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deterministically compact a memory for storage.
|
||||||
|
* Same input always produces same output — no randomness.
|
||||||
|
* Strong memories keep full fidelity; weak memories get truncated.
|
||||||
|
*/
|
||||||
|
function _compactMemory(o) {
|
||||||
|
const strength = o.mesh.userData.strength || 0.7;
|
||||||
|
const content = o.data.content || '';
|
||||||
|
const connections = o.data.connections || [];
|
||||||
|
|
||||||
|
// Deterministic content truncation for weak memories
|
||||||
|
let compactContent = content;
|
||||||
|
if (strength < COMPACT_STRENGTH_THRESHOLD && content.length > COMPACT_CONTENT_MAXLEN) {
|
||||||
|
compactContent = content.slice(0, COMPACT_CONTENT_MAXLEN) + '\u2026';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cap connections (keep first N, deterministic)
|
||||||
|
const compactConnections = connections.length > COMPACT_MAX_CONNECTIONS
|
||||||
|
? connections.slice(0, COMPACT_MAX_CONNECTIONS)
|
||||||
|
: connections;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: o.data.id,
|
||||||
|
content: compactContent,
|
||||||
|
category: o.region,
|
||||||
|
position: _compactPosition([o.mesh.position.x, o.mesh.position.y - 1.5, o.mesh.position.z]),
|
||||||
|
source: o.data.source || 'unknown',
|
||||||
|
timestamp: o.data.timestamp || o.mesh.userData.createdAt,
|
||||||
|
strength: Math.round(strength * 100) / 100, // 2 decimal precision
|
||||||
|
connections: compactConnections
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// ─── PERSISTENCE ─────────────────────────────────────
|
// ─── PERSISTENCE ─────────────────────────────────────
|
||||||
function exportIndex() {
|
function exportIndex(options = {}) {
|
||||||
|
const compact = options.compact !== false; // compact by default
|
||||||
return {
|
return {
|
||||||
version: 1,
|
version: 1,
|
||||||
exportedAt: new Date().toISOString(),
|
exportedAt: new Date().toISOString(),
|
||||||
|
compacted: compact,
|
||||||
regions: Object.fromEntries(
|
regions: Object.fromEntries(
|
||||||
Object.entries(REGIONS).map(([k, v]) => [k, { label: v.label, center: v.center, radius: v.radius, color: v.color }])
|
Object.entries(REGIONS).map(([k, v]) => [k, { label: v.label, center: v.center, radius: v.radius, color: v.color }])
|
||||||
),
|
),
|
||||||
memories: Object.values(_memoryObjects).map(o => ({
|
memories: Object.values(_memoryObjects).map(o => compact ? _compactMemory(o) : {
|
||||||
id: o.data.id,
|
id: o.data.id,
|
||||||
content: o.data.content,
|
content: o.data.content,
|
||||||
category: o.region,
|
category: o.region,
|
||||||
@@ -711,7 +757,7 @@ const SpatialMemory = (() => {
|
|||||||
timestamp: o.data.timestamp || o.mesh.userData.createdAt,
|
timestamp: o.data.timestamp || o.mesh.userData.createdAt,
|
||||||
strength: o.mesh.userData.strength || 0.7,
|
strength: o.mesh.userData.strength || 0.7,
|
||||||
connections: o.data.connections || []
|
connections: o.data.connections || []
|
||||||
}))
|
})
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
22
nexus/mnemosyne/resonance_linker.py
Normal file
22
nexus/mnemosyne/resonance_linker.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
"""Resonance Linker — Finds second-degree connections in the holographic graph."""
|
||||||
|
|
||||||
|
class ResonanceLinker:
|
||||||
|
def __init__(self, archive):
|
||||||
|
self.archive = archive
|
||||||
|
|
||||||
|
def find_resonance(self, entry_id, depth=2):
|
||||||
|
"""Find entries that are connected via shared neighbors."""
|
||||||
|
if entry_id not in self.archive._entries: return []
|
||||||
|
|
||||||
|
entry = self.archive._entries[entry_id]
|
||||||
|
neighbors = set(entry.links)
|
||||||
|
resonance = {}
|
||||||
|
|
||||||
|
for neighbor_id in neighbors:
|
||||||
|
if neighbor_id in self.archive._entries:
|
||||||
|
for second_neighbor in self.archive._entries[neighbor_id].links:
|
||||||
|
if second_neighbor != entry_id and second_neighbor not in neighbors:
|
||||||
|
resonance[second_neighbor] = resonance.get(second_neighbor, 0) + 1
|
||||||
|
|
||||||
|
return sorted(resonance.items(), key=lambda x: x[1], reverse=True)
|
||||||
Reference in New Issue
Block a user