1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>newOS4 Memory Constellation — v4.5.86 → v4.5.90b</title>
<style>
html,body { margin:0; padding:0; background:#02030a; color:#cfe; font-family:ui-monospace,Menlo,monospace; overflow:hidden; }
#app { position:fixed; inset:0; }
#hud { position:fixed; top:12px; left:12px; padding:10px 14px; background:rgba(0,0,0,.55); border:1px solid #234; border-radius:6px; max-width:320px; font-size:12px; line-height:1.5; backdrop-filter:blur(6px); }
#hud h1 { margin:0 0 6px; font-size:14px; color:#9ef; letter-spacing:.5px; }
#hud .row { display:flex; justify-content:space-between; gap:12px; }
#hud .k { color:#678; } #hud .v { color:#bdf; }
#info { position:fixed; bottom:12px; left:12px; padding:10px 14px; background:rgba(0,0,0,.55); border:1px solid #234; border-radius:6px; max-width:420px; font-size:12px; line-height:1.55; backdrop-filter:blur(6px); display:none; }
#info .ver { color:#fff; font-weight:700; }
#info .phase { color:#9ef; font-size:10px; text-transform:uppercase; letter-spacing:1px; }
#info ul { margin:6px 0 0; padding-left:16px; color:#9ab; }
#controls { position:fixed; top:12px; right:12px; display:flex; flex-direction:column; gap:6px; }
#controls button { background:rgba(0,0,0,.6); color:#9ef; border:1px solid #234; padding:6px 10px; font-family:inherit; font-size:11px; border-radius:4px; cursor:pointer; }
#controls button:hover { background:rgba(40,80,120,.5); }
#legend { position:fixed; bottom:12px; right:12px; padding:8px 12px; background:rgba(0,0,0,.55); border:1px solid #234; border-radius:6px; font-size:11px; }
#legend .item { display:flex; align-items:center; gap:6px; margin:2px 0; color:#9ab; }
#legend .dot { width:8px; height:8px; border-radius:50%; }
#tip { position:fixed; bottom:6px; left:50%; transform:translateX(-50%); color:#456; font-size:10px; letter-spacing:1px; }
</style>
</head>
<body>
<div id="app"></div>
<div id="hud">
<h1>◉ newOS4 MEMORY CONSTELLATION</h1>
<div class="row"><span class="k">range</span><span class="v">v4.5.86 → v4.5.90b</span></div>
<div class="row"><span class="k">releases</span><span class="v">7</span></div>
<div class="row"><span class="k">modules</span><span class="v">43</span></div>
<div class="row"><span class="k">skills</span><span class="v">24</span></div>
<div class="row"><span class="k">review findings</span><span class="v">12 closed</span></div>
<div class="row"><span class="k">status</span><span class="v">✅ shipped clean</span></div>
</div>
<div id="info"></div>
<div id="controls">
<button id="b-rot">⏸ auto-rotate</button>
<button id="b-pulse">◌ trigger pulse</button>
<button id="b-reset">⌖ reset view</button>
</div>
<div id="legend">
<div class="item"><span class="dot" style="background:#4488ff"></span>v4.5.86 cold-start</div>
<div class="item"><span class="dot" style="background:#44ddff"></span>v4.5.87 purge</div>
<div class="item"><span class="dot" style="background:#44ffaa"></span>v4.5.88 schema</div>
<div class="item"><span class="dot" style="background:#88ff44"></span>v4.5.89 connectors</div>
<div class="item"><span class="dot" style="background:#ffee44"></span>v4.5.89b review</div>
<div class="item"><span class="dot" style="background:#ff9944"></span>v4.5.90 skills</div>
<div class="item"><span class="dot" style="background:#ff4488"></span>v4.5.90b skill-review</div>
</div>
<div id="tip">drag to rotate · scroll to zoom · click a node</div>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
// ─── SCENE SETUP ─────────────────────────────────────────────────────────
const app = document.getElementById('app');
const scene = new THREE.Scene();
scene.fog = new THREE.FogExp2(0x02030a, 0.012);
const camera = new THREE.PerspectiveCamera(55, innerWidth/innerHeight, 0.1, 200);
camera.position.set(12, 8, 16);
const renderer = new THREE.WebGLRenderer({ antialias:true, alpha:false });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
renderer.setSize(innerWidth, innerHeight);
renderer.setClearColor(0x02030a);
app.appendChild(renderer.domElement);
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.06;
controls.minDistance = 6;
controls.maxDistance = 40;
const initialCam = camera.position.clone();
// ─── LIGHTING ────────────────────────────────────────────────────────────
scene.add(new THREE.HemisphereLight(0x6688aa, 0x110022, 0.55));
const key = new THREE.DirectionalLight(0xffeebb, 1.1); key.position.set(8, 12, 6); scene.add(key);
const fill = new THREE.PointLight(0x4488ff, 1.4, 30); fill.position.set(-8, 4, -6); scene.add(fill);
const rim = new THREE.PointLight(0xff4488, 0.9, 24); rim.position.set(6, 8, -10); scene.add(rim);
// ─── RELEASE DATA (hand-calculated helix positions) ─────────────────────
// Helix: 7 points, R=4.2, y-step=1.4, angle = i * 2π/6
// x = R*cos(θ), z = R*sin(θ), y = i*1.4 - 4.2 (centered vertically)
const R = 4.2, STEP = 1.4, OFFSET_Y = -4.2;
const cos = (a)=>Math.cos(a), sin=(a)=>Math.sin(a);
const angle = (i)=>i * (Math.PI*2/6);
const yOf = (i)=>i * STEP + OFFSET_Y;
const releases = [
{ v:'v4.5.86', phase:'Cold-Start', color:0x4488ff, size:0.55, info:[
'Activated 3 dormant modules',
'Predictor, MemoryGraph, WorldModel',
'First runnable cognitive stack']},
{ v:'v4.5.87', phase:'Purge + Slim', color:0x44ddff, size:0.50, info:[
'-42% system prompt',
'Removed dead code',
'Smaller, faster, focused']},
{ v:'v4.5.88', phase:'Schema 2.0', color:0x44ffaa, size:0.55, info:[
'Namespace: global vs agent',
'source_session field',
'Dual-lookup (by id + by query)']},
{ v:'v4.5.89', phase:'Connectors', color:0x88ff44, size:0.62, info:[
'memgraph ↔ NVFS bridge',
'World-model TTL + refresh',
'Lazy decay, semantic sync']},
{ v:'v4.5.89b', phase:'Review Harden', color:0xffee44, size:0.58, info:[
'6 review findings fixed',
'Config persistence',
'Clean before R3']},
{ v:'v4.5.90', phase:'Agent Skills', color:0xff9944, size:0.78, info:[
'4 commands: learn, validate, audit, restore',
'8 methods exposed',
'Skills self-improve']},
{ v:'v4.5.90b', phase:'Skill Review', color:0xff4488, size:0.85, info:[
'6 more findings closed',
'Bayesian confidence (uses/(uses+5))',
'0 P0/P1 outstanding']},
];
// ─── GLOW TEXTURE (canvas-based radial gradient) ────────────────────────
function glowTexture(inner, outer){
const c = document.createElement('canvas'); c.width = c.height = 128;
const ctx = c.getContext('2d');
const g = ctx.createRadialGradient(64,64,0, 64,64,64);
g.addColorStop(0, inner); g.addColorStop(0.4, outer); g.addColorStop(1, 'rgba(0,0,0,0)');
ctx.fillStyle = g; ctx.fillRect(0,0,128,128);
return new THREE.CanvasTexture(c);
}
// ─── CENTRAL CORE ────────────────────────────────────────────────────────
const coreGeo = new THREE.IcosahedronGeometry(1.1, 1);
const coreMat = new THREE.MeshPhongMaterial({ color:0xffffff, emissive:0x4488ff, emissiveIntensity:0.6, shininess:80, flatShading:true });
const core = new THREE.Mesh(coreGeo, coreMat);
scene.add(core);
// core glow halo
const coreGlow = new THREE.Sprite(new THREE.SpriteMaterial({ map: glowTexture('rgba(120,180,255,0.9)','rgba(40,80,180,0.4)'), blending:THREE.AdditiveBlending, depthWrite:false }));
coreGlow.scale.set(5,5,5);
scene.add(coreGlow);
// ─── RELEASE NODES ───────────────────────────────────────────────────────
const releaseGroup = new THREE.Group();
scene.add(releaseGroup);
const releaseMeshes = [];
releases.forEach((r, i) => {
const a = angle(i);
const pos = new THREE.Vector3(R*cos(a), yOf(i), R*sin(a));
// sphere
const geo = new THREE.SphereGeometry(r.size, 32, 32);
const mat = new THREE.MeshPhongMaterial({ color: r.color, emissive: r.color, emissiveIntensity: 0.35, shininess:60 });
const mesh = new THREE.Mesh(geo, mat);
mesh.position.copy(pos);
mesh.userData = r;
releaseGroup.add(mesh);
releaseMeshes.push(mesh);
// glow sprite
const glow = new THREE.Sprite(new THREE.SpriteMaterial({ map: glowTexture('rgba(255,255,255,0.5)','rgba(0,0,0,0)'), color: r.color, blending:THREE.AdditiveBlending, depthWrite:false, transparent:true, opacity:0.7 }));
glow.scale.set(r.size*3.5, r.size*3.5, 1);
glow.position.copy(pos);
releaseGroup.add(glow);
// label sprite (canvas-baked text)
const lc = document.createElement('canvas'); lc.width=256; lc.height=64;
const lctx = lc.getContext('2d');
lctx.font='bold 28px ui-monospace,monospace';
lctx.textAlign='center'; lctx.textBaseline='middle';
lctx.fillStyle = '#' + r.color.toString(16).padStart(6,'0');
lctx.shadowColor='#000'; lctx.shadowBlur=6;
lctx.fillText(r.v, 128, 32);
const labelTex = new THREE.CanvasTexture(lc);
const label = new THREE.Sprite(new THREE.SpriteMaterial({ map: labelTex, depthWrite:false, transparent:true }));
label.scale.set(2.0, 0.5, 1);
label.position.set(pos.x, pos.y + r.size + 0.35, pos.z);
releaseGroup.add(label);
});
// ─── EDGES (curves between consecutive releases + radial to core) ────────
const edgeMat = new THREE.LineBasicMaterial({ color: 0x446688, transparent:true, opacity:0.55 });
for (let i=0; i<releaseMeshes.length-1; i++){
const a = releaseMeshes[i].position, b = releaseMeshes[i+1].position;
// quadratic curve via midpoint + slight outward bulge
const mid = a.clone().add(b).multiplyScalar(0.5);
mid.add(new THREE.Vector3(0, 0.6, 0));
const curve = new THREE.QuadraticBezierCurve3(a, mid, b);
const pts = curve.getPoints(40).map(p => new THREE.Vector3(p.x, p.y, p.z));
const geo = new THREE.BufferGeometry().setFromPoints(pts);
releaseGroup.add(new THREE.Line(geo, edgeMat));
}
// radial spokes from each release to core
for (const m of releaseMeshes){
const geo = new THREE.BufferGeometry().setFromPoints([m.position, new THREE.Vector3(0,0,0)]);
const line = new THREE.Line(geo, new THREE.LineDashedMaterial({ color:0x224466, dashSize:0.15, gapSize:0.1, transparent:true, opacity:0.4 }));
line.computeLineDistances();
releaseGroup.add(line);
}
// ─── SKILL ORBIT NODES (4 commands from v4.5.90) ────────────────────────
const skills = [
{ name:'skill-learn', color:0xffddaa },
{ name:'skill-validate', color:0xaaffdd },
{ name:'skill-audit', color:0xddaaff },
{ name:'skill-restore', color:0xaadfff },
];
const skillOrbit = new THREE.Group();
scene.add(skillOrbit);
const skillMeshes = [];
skills.forEach((s, i) => {
const a = i * (Math.PI*2/skills.length) + Math.PI/4;
const radius = 7.2;
const pos = new THREE.Vector3(radius*cos(a), yOf(5) + Math.sin(a)*1.5, radius*sin(a));
const geo = new THREE.OctahedronGeometry(0.35, 0);
const mat = new THREE.MeshPhongMaterial({ color: s.color, emissive:s.color, emissiveIntensity:0.4, flatShading:true });
const mesh = new THREE.Mesh(geo, mat);
mesh.position.copy(pos);
mesh.userData = { v:s.name, phase:'v4.5.90 command', color:s.color,
info:['Command shipped in v4.5.90','Part of Agent Skills bundle']};
skillOrbit.add(mesh);
skillMeshes.push(mesh);
const lc=document.createElement('canvas');lc.width=256;lc.height=48;
const lctx=lc.getContext('2d');
lctx.font='20px ui-monospace,monospace'; lctx.textAlign='center'; lctx.textBaseline='middle';
lctx.fillStyle='#cde'; lctx.shadowColor='#000'; lctx.shadowBlur=4;
lctx.fillText(s.name, 128, 24);
const label = new THREE.Sprite(new THREE.SpriteMaterial({ map: new THREE.CanvasTexture(lc), depthWrite:false, transparent:true }));
label.scale.set(1.6, 0.3, 1);
label.position.set(pos.x, pos.y+0.6, pos.z);
skillOrbit.add(label);
});
// ─── MEMORY PARTICLES (instanced points) ────────────────────────────────
const N = 400;
const partGeo = new THREE.BufferGeometry();
const positions = new Float32Array(N*3);
const phases = new Float32Array(N);
for (let i=0; i<N; i++){
// random points in a torus shell
const theta = Math.random()*Math.PI*2;
const r = 9 + Math.random()*4;
const y = (Math.random()-0.5) * 14;
positions[i*3] = r*cos(theta);
positions[i*3+1] = y;
positions[i*3+2] = r*sin(theta);
phases[i] = Math.random()*Math.PI*2;
}
partGeo.setAttribute('position', new THREE.BufferAttribute(positions, 3));
partGeo.setAttribute('phase', new THREE.BufferAttribute(phases, 1));
const partMat = new THREE.PointsMaterial({ color:0x88aaff, size:0.05, transparent:true, opacity:0.6, sizeAttenuation:true, depthWrite:false });
const particles = new THREE.Points(partGeo, partMat);
scene.add(particles);
// ─── PULSE RING (decay visualization) ────────────────────────────────────
const pulseGeo = new THREE.RingGeometry(0.5, 0.55, 64);
const pulseMat = new THREE.MeshBasicMaterial({ color:0x88ddff, side:THREE.DoubleSide, transparent:true, opacity:0.7, depthWrite:false, blending:THREE.AdditiveBlending });
const pulse = new THREE.Mesh(pulseGeo, pulseMat);
pulse.rotation.x = -Math.PI/2;
pulse.visible = false;
scene.add(pulse);
let pulseT = 0, pulsing = false;
// ─── STARFIELD ───────────────────────────────────────────────────────────
const starGeo = new THREE.BufferGeometry();
const starPos = new Float32Array(1500*3);
for (let i=0; i<1500; i++){
// sphere shell far out
const t = Math.random()*Math.PI*2;
const p = Math.acos(2*Math.random()-1);
const r = 60 + Math.random()*40;
starPos[i*3] = r*Math.sin(p)*cos(t);
starPos[i*3+1] = r*Math.cos(p);
starPos[i*3+2] = r*Math.sin(p)*sin(t);
}
starGeo.setAttribute('position', new THREE.BufferAttribute(starPos, 3));
scene.add(new THREE.Points(starGeo, new THREE.PointsMaterial({ color:0xffffff, size:0.15, sizeAttenuation:true, transparent:true, opacity:0.7 })));
// ─── RAYCASTER (click) ──────────────────────────────────────────────────
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
const pickables = [...releaseMeshes, ...skillMeshes, core];
const infoEl = document.getElementById('info');
function showInfo(d){
if (!d){ infoEl.style.display='none'; return; }
const c = '#' + (d.color||0x88aaff).toString(16).padStart(6,'0');
infoEl.style.borderColor = c + '66';
infoEl.innerHTML = `<div class="phase">${d.phase||''}</div>
<div class="ver" style="color:${c}">${d.v}</div>
<ul>${(d.info||[]).map(x=>`<li>${x}</li>`).join('')}</ul>`;
infoEl.style.display = 'block';
}
window.addEventListener('click', (e) => {
mouse.x = (e.clientX/innerWidth)*2 - 1;
mouse.y = -(e.clientY/innerHeight)*2 + 1;
raycaster.setFromCamera(mouse, camera);
const hits = raycaster.intersectObjects(pickables, false);
if (hits.length){ showInfo(hits[0].object.userData); }
else { showInfo(null); }
});
// ─── HOVER CURSOR ───────────────────────────────────────────────────────
window.addEventListener('mousemove', (e)=>{
mouse.x = (e.clientX/innerWidth)*2 - 1;
mouse.y = -(e.clientY/innerHeight)*2 + 1;
raycaster.setFromCamera(mouse, camera);
const hits = raycaster.intersectObjects(pickables, false);
renderer.domElement.style.cursor = hits.length ? 'pointer' : 'grab';
});
// ─── UI BUTTONS ──────────────────────────────────────────────────────────
let autoRotate = true;
document.getElementById('b-rot').onclick = () => {
autoRotate = !autoRotate;
document.getElementById('b-rot').textContent = autoRotate ? '⏸ auto-rotate' : '▶ auto-rotate';
};
document.getElementById('b-pulse').onclick = () => { pulsing = true; pulseT = 0; pulse.visible = true; };
document.getElementById('b-reset').onclick = () => {
camera.position.copy(initialCam);
controls.target.set(0,0,0);
controls.update();
};
// ─── RESIZE ──────────────────────────────────────────────────────────────
window.addEventListener('resize', () => {
camera.aspect = innerWidth/innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(innerWidth, innerHeight);
});
// ─── ANIMATION LOOP ──────────────────────────────────────────────────────
const clock = new THREE.Clock();
function tick(){
const dt = clock.getDelta();
const t = clock.elapsedTime;
if (autoRotate){
releaseGroup.rotation.y += dt * 0.08;
skillOrbit.rotation.y -= dt * 0.15;
}
core.rotation.y += dt * 0.4;
core.rotation.x += dt * 0.2;
coreGlow.material.opacity = 0.7 + 0.3*Math.sin(t*2);
// particle drift
const ppos = particles.geometry.attributes.position;
const ppha = particles.geometry.attributes.phase;
for (let i=0; i<N; i++){
const ph = ppha.array[i];
ppos.array[i*3+1] += Math.sin(t + ph) * 0.003;
}
ppos.needsUpdate = true;
// pulse animation
if (pulsing){
pulseT += dt;
const s = 0.5 + pulseT * 12;
pulse.scale.set(s, s, s);
pulseMat.opacity = Math.max(0, 0.8 - pulseT*0.6);
if (pulseT > 1.5){ pulsing = false; pulse.visible = false; }
}
controls.update();
renderer.render(scene, camera);
requestAnimationFrame(tick);
}
tick();
</script>
</body>
</html>
|