Compare commits
8 Commits
feat/gofai
...
mimo/code/
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4706861619 | ||
| 6786e65f3d | |||
| 62a6581827 | |||
| 797f32a7fe | |||
| 80eb4ff7ea | |||
| b205f002ef | |||
| 2230c1c9fc | |||
| d7bcadb8c1 |
@@ -1,13 +1,18 @@
|
|||||||
|
|
||||||
class MemoryOptimizer {
|
class MemoryOptimizer {
|
||||||
constructor(options = {}) {
|
constructor(options = {}) {
|
||||||
this.threshold = options.threshold || 0.8;
|
this.threshold = options.threshold || 0.3;
|
||||||
this.decayRate = options.decayRate || 0.05;
|
this.decayRate = options.decayRate || 0.01;
|
||||||
|
this.lastRun = Date.now();
|
||||||
}
|
}
|
||||||
optimize(memory) {
|
optimize(memories) {
|
||||||
console.log('Optimizing memory...');
|
const now = Date.now();
|
||||||
// Heuristic-based pruning
|
const elapsed = (now - this.lastRun) / 1000;
|
||||||
return memory.filter(m => m.strength > this.threshold);
|
this.lastRun = now;
|
||||||
|
return memories.map(m => {
|
||||||
|
const decay = (m.importance || 1) * this.decayRate * elapsed;
|
||||||
|
return { ...m, strength: Math.max(0, (m.strength || 1) - decay) };
|
||||||
|
}).filter(m => m.strength > this.threshold || m.locked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export default MemoryOptimizer;
|
export default MemoryOptimizer;
|
||||||
|
|||||||
16
nexus/components/resonance-visualizer.js
Normal file
16
nexus/components/resonance-visualizer.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
import * as THREE from 'three';
|
||||||
|
class ResonanceVisualizer {
|
||||||
|
constructor(scene) {
|
||||||
|
this.scene = scene;
|
||||||
|
this.links = [];
|
||||||
|
}
|
||||||
|
addLink(p1, p2, strength) {
|
||||||
|
const geometry = new THREE.BufferGeometry().setFromPoints([p1, p2]);
|
||||||
|
const material = new THREE.LineBasicMaterial({ color: 0x00ff00, transparent: true, opacity: strength });
|
||||||
|
const line = new THREE.Line(geometry, material);
|
||||||
|
this.scene.add(line);
|
||||||
|
this.links.push(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default ResonanceVisualizer;
|
||||||
@@ -815,6 +815,42 @@ const SpatialMemory = (() => {
|
|||||||
return results.slice(0, maxResults);
|
return results.slice(0, maxResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ─── CONTENT SEARCH ─────────────────────────────────
|
||||||
|
/**
|
||||||
|
* Search memories by text content — case-insensitive substring match.
|
||||||
|
* @param {string} query - Search text
|
||||||
|
* @param {object} [options] - Optional filters
|
||||||
|
* @param {string} [options.category] - Restrict to a specific region
|
||||||
|
* @param {number} [options.maxResults=20] - Cap results
|
||||||
|
* @returns {Array<{memory: object, score: number, position: THREE.Vector3}>}
|
||||||
|
*/
|
||||||
|
function searchByContent(query, options = {}) {
|
||||||
|
if (!query || !query.trim()) return [];
|
||||||
|
const { category, maxResults = 20 } = options;
|
||||||
|
const needle = query.trim().toLowerCase();
|
||||||
|
const results = [];
|
||||||
|
|
||||||
|
Object.values(_memoryObjects).forEach(obj => {
|
||||||
|
if (category && obj.region !== category) return;
|
||||||
|
const content = (obj.data.content || '').toLowerCase();
|
||||||
|
if (!content.includes(needle)) return;
|
||||||
|
|
||||||
|
// Score: number of occurrences + strength bonus
|
||||||
|
let matches = 0, idx = 0;
|
||||||
|
while ((idx = content.indexOf(needle, idx)) !== -1) { matches++; idx += needle.length; }
|
||||||
|
const score = matches + (obj.mesh.userData.strength || 0.7);
|
||||||
|
|
||||||
|
results.push({
|
||||||
|
memory: obj.data,
|
||||||
|
score,
|
||||||
|
position: obj.mesh.position.clone()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
results.sort((a, b) => b.score - a.score);
|
||||||
|
return results.slice(0, maxResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ─── CRYSTAL MESH COLLECTION (for raycasting) ────────
|
// ─── CRYSTAL MESH COLLECTION (for raycasting) ────────
|
||||||
function getCrystalMeshes() {
|
function getCrystalMeshes() {
|
||||||
@@ -864,7 +900,7 @@ const SpatialMemory = (() => {
|
|||||||
init, placeMemory, removeMemory, update, importMemories, updateMemory,
|
init, placeMemory, removeMemory, update, importMemories, updateMemory,
|
||||||
getMemoryAtPosition, getRegionAtPosition, getMemoriesInRegion, getAllMemories,
|
getMemoryAtPosition, getRegionAtPosition, getMemoriesInRegion, getAllMemories,
|
||||||
getCrystalMeshes, getMemoryFromMesh, highlightMemory, clearHighlight, getSelectedId,
|
getCrystalMeshes, getMemoryFromMesh, highlightMemory, clearHighlight, getSelectedId,
|
||||||
exportIndex, importIndex, searchNearby, REGIONS,
|
exportIndex, importIndex, searchNearby, searchByContent, REGIONS,
|
||||||
saveToStorage, loadFromStorage, clearStorage,
|
saveToStorage, loadFromStorage, clearStorage,
|
||||||
runGravityLayout, setCamera
|
runGravityLayout, setCamera
|
||||||
};
|
};
|
||||||
|
|||||||
14
nexus/mnemosyne/reasoner.py
Normal file
14
nexus/mnemosyne/reasoner.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
class Reasoner:
|
||||||
|
def __init__(self, rules):
|
||||||
|
self.rules = rules
|
||||||
|
def evaluate(self, entries):
|
||||||
|
return [r['action'] for r in self.rules if self._check(r['condition'], entries)]
|
||||||
|
def _check(self, cond, entries):
|
||||||
|
if cond.startswith('count'):
|
||||||
|
# e.g. count(type=anomaly)>3
|
||||||
|
p = cond.replace('count(', '').split(')')
|
||||||
|
key, val = p[0].split('=')
|
||||||
|
count = sum(1 for e in entries if e.get(key) == val)
|
||||||
|
return eval(f"{count}{p[1]}")
|
||||||
|
return False
|
||||||
6
nexus/mnemosyne/rules.json
Normal file
6
nexus/mnemosyne/rules.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"condition": "count(type=anomaly)>3",
|
||||||
|
"action": "alert"
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user