Spaces:
Running
Running
deploy(hf): sync szl-holdings/a11oy@main derived COPY set
Browse filesReusable Dockerfile-COPY-derived deploy from szl-holdings/a11oy main.
Files: 825 Pruned: 0
Derived from Dockerfile COPY sources (NO hand-maintained allowlist).
Signed-off-by: SZL Holdings <noreply@szlholdings.ai>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- console/anatomy-map/app.js +199 -0
console/anatomy-map/app.js
CHANGED
|
@@ -472,6 +472,7 @@
|
|
| 472 |
let V7=null; // v5 quantum-bio layer (coherence + bioenergetic + Λ-v5 gate + compass; verified model, mirrors a11oy /qbio)
|
| 473 |
let V8=null; // v8 live agentic lens (read-only reflection of a11oy's real agent loop / gates / verified math)
|
| 474 |
let V9=null; // v9 fly-high: live receipt bloodstream + heartbeat loop + killinchu body + cinematic vital tour + agent trace + polish
|
|
|
|
| 475 |
function flyTo(targetVec, radius){
|
| 476 |
tween={fromT:cam.target.clone(),toT:targetVec.clone(),fromR:cam.r,toR:radius==null?cam.r:radius,t:0,dur:0.9};
|
| 477 |
}
|
|
@@ -653,6 +654,8 @@
|
|
| 653 |
if(V7 && V7.tick) V7.tick(dt,t);
|
| 654 |
// v9 fly-high: live receipt bloodstream particles + cinematic vital tour camera + heartbeat-loop heart breathing
|
| 655 |
if(V9 && V9.tick) V9.tick(dt,t,beat);
|
|
|
|
|
|
|
| 656 |
renderer.render(scene,camera);
|
| 657 |
if(!_loaderHidden){ _loaderHidden=true; var ld=$('loader'); if(ld) ld.classList.add('hidden'); }
|
| 658 |
}
|
|
@@ -2817,6 +2820,201 @@
|
|
| 2817 |
|
| 2818 |
/* ---- v9 bootstrap is internal to the IIFE above (wire + heartbeat + killinchu probe) ---- */
|
| 2819 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2820 |
/* ---------------- test hooks for headless QA ---------------- */
|
| 2821 |
window.__anatomy = {
|
| 2822 |
organs: organMeshes.length,
|
|
@@ -2834,6 +3032,7 @@
|
|
| 2834 |
v7: V7, // v5 quantum-bio layer (coherence + bioenergetic + Λ-v5 gate + compass; verified model, mirrors a11oy /qbio)
|
| 2835 |
v8: V8, // v8 live agentic lens (read-only reflection of a11oy's real agent loop; runDecisionFlow/pollVitals/onOrganOpen)
|
| 2836 |
v9: V9, // v9 fly-high (bloodstream particles, autonomous heartbeat loop, killinchu 2nd body, cinematic vital tour, agent trace, polish)
|
|
|
|
| 2837 |
formulas: Object.keys(D.FORMULAS).length,
|
| 2838 |
tierCounts: (V5&&V5.api)?V5.api.tierCounts():null,
|
| 2839 |
qbio: (V7&&V7.api)?V7.api():null
|
|
|
|
| 472 |
let V7=null; // v5 quantum-bio layer (coherence + bioenergetic + Λ-v5 gate + compass; verified model, mirrors a11oy /qbio)
|
| 473 |
let V8=null; // v8 live agentic lens (read-only reflection of a11oy's real agent loop / gates / verified math)
|
| 474 |
let V9=null; // v9 fly-high: live receipt bloodstream + heartbeat loop + killinchu body + cinematic vital tour + agent trace + polish
|
| 475 |
+
let V10=null; // v10 estate/ayllu: zoom-OUT to the whole SZL estate — live Ayllu council (roster) + declared hardware/stack shell + zoom presets
|
| 476 |
function flyTo(targetVec, radius){
|
| 477 |
tween={fromT:cam.target.clone(),toT:targetVec.clone(),fromR:cam.r,toR:radius==null?cam.r:radius,t:0,dur:0.9};
|
| 478 |
}
|
|
|
|
| 654 |
if(V7 && V7.tick) V7.tick(dt,t);
|
| 655 |
// v9 fly-high: live receipt bloodstream particles + cinematic vital tour camera + heartbeat-loop heart breathing
|
| 656 |
if(V9 && V9.tick) V9.tick(dt,t,beat);
|
| 657 |
+
// v10 estate/ayllu: rotate the council + estate shells and project their labels
|
| 658 |
+
if(V10 && V10.tick) V10.tick(dt,t,beat);
|
| 659 |
renderer.render(scene,camera);
|
| 660 |
if(!_loaderHidden){ _loaderHidden=true; var ld=$('loader'); if(ld) ld.classList.add('hidden'); }
|
| 661 |
}
|
|
|
|
| 2820 |
|
| 2821 |
/* ---- v9 bootstrap is internal to the IIFE above (wire + heartbeat + killinchu probe) ---- */
|
| 2822 |
|
| 2823 |
+
/* =====================================================================
|
| 2824 |
+
V10 — ESTATE / AYLLU (additive · honest · zoom-OUT)
|
| 2825 |
+
Evolves the living anatomy from a single organism into the whole SZL
|
| 2826 |
+
estate, in the same doctrine as every prior layer:
|
| 2827 |
+
· Ayllu COUNCIL — the deliberating minds, read LIVE from a11oy
|
| 2828 |
+
/api/a11oy/v1/ayllu/roster (CORS-allowed for this Space). If the
|
| 2829 |
+
roster is unreachable it falls back to the declared core personas
|
| 2830 |
+
and is labelled "offline · static snapshot" — never a fabricated
|
| 2831 |
+
roster, never a fabricated count.
|
| 2832 |
+
· ESTATE shell — Rosa's real hardware & stack rendered as DECLARED
|
| 2833 |
+
nodes (no per-node live probe) — labelled "declared", never faked.
|
| 2834 |
+
· PINN LAB — a MEASURED local snapshot (rosie · RTX 5050), explicitly
|
| 2835 |
+
labelled MEASURED / not-live.
|
| 2836 |
+
· Zoom presets — COUNCIL (in) · ORGANISM (home) · ESTATE (out) —
|
| 2837 |
+
reuse the existing custom-camera flyTo()/tween + render loop.
|
| 2838 |
+
Shares scene / camera / cam / HOME / flyTo / glowSprite / autoRotate by
|
| 2839 |
+
closure; adds nothing to the network path except the read-only roster.
|
| 2840 |
+
===================================================================== */
|
| 2841 |
+
V10 = (function(){
|
| 2842 |
+
if(typeof THREE==='undefined' || !scene) return null;
|
| 2843 |
+
function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,c=>({'&':'&','<':'<','>':'>','"':'"'}[c])); }
|
| 2844 |
+
|
| 2845 |
+
/* ---- honest data ---- */
|
| 2846 |
+
const COUNCIL_FALLBACK = ['Amaru','Ruwaq','Yupaq']; // declared core (roster-unreachable path)
|
| 2847 |
+
const COUNCIL_COL = 0xb98cff;
|
| 2848 |
+
const ESTATE = [
|
| 2849 |
+
{id:'rosie · RTX 5050', col:0x34f5b0, kind:'GPU · research'},
|
| 2850 |
+
{id:'betterwithage · RTX 5000', col:0x39d7ff, kind:'GPU · inference (MIND core)'},
|
| 2851 |
+
{id:'Hetzner · prod box', col:0xffd66e, kind:'compute · host'},
|
| 2852 |
+
{id:'Neon · Postgres 17', col:0x5ad6ff, kind:'data · database'},
|
| 2853 |
+
{id:'Hugging Face · Spaces', col:0xffcb57, kind:'edge · deploy'},
|
| 2854 |
+
{id:'Backblaze B2 · backups', col:0x9aa6bd, kind:'storage · DR'}
|
| 2855 |
+
];
|
| 2856 |
+
|
| 2857 |
+
/* ---- groups (share the existing scene) ---- */
|
| 2858 |
+
const councilGroup = new THREE.Group(); councilGroup.position.set(0,3.15,0); scene.add(councilGroup);
|
| 2859 |
+
const estateGroup = new THREE.Group(); scene.add(estateGroup);
|
| 2860 |
+
let councilNodes=[], estateNodes=[];
|
| 2861 |
+
const ORIG_FOG = (scene.fog && scene.fog.density!=null) ? scene.fog.density : 0.020;
|
| 2862 |
+
|
| 2863 |
+
function clearGroup(g){ while(g.children.length) g.remove(g.children[0]); }
|
| 2864 |
+
|
| 2865 |
+
function buildCouncil(names){
|
| 2866 |
+
clearGroup(councilGroup); councilNodes=[];
|
| 2867 |
+
const n=Math.max(names.length,1), R=3.1;
|
| 2868 |
+
names.forEach((nm,i)=>{
|
| 2869 |
+
const a=(i/n)*TAU, grp=new THREE.Group();
|
| 2870 |
+
grp.position.set(Math.cos(a)*R, Math.sin(i*1.7)*0.35, Math.sin(a)*R);
|
| 2871 |
+
grp.add(new THREE.Mesh(new THREE.TetrahedronGeometry(0.22,0),
|
| 2872 |
+
new THREE.MeshStandardMaterial({color:COUNCIL_COL,emissive:COUNCIL_COL,emissiveIntensity:0.75,roughness:0.3,metalness:0.22})));
|
| 2873 |
+
grp.add(glowSprite(COUNCIL_COL,1.35,0.5));
|
| 2874 |
+
grp.userData={label:esc(nm), sub:'Ayllu · council', spin:0.5+Math.random()*0.6};
|
| 2875 |
+
councilGroup.add(grp); councilNodes.push(grp);
|
| 2876 |
+
});
|
| 2877 |
+
makeLabels();
|
| 2878 |
+
}
|
| 2879 |
+
|
| 2880 |
+
function buildEstate(){
|
| 2881 |
+
clearGroup(estateGroup); estateNodes=[];
|
| 2882 |
+
const n=ESTATE.length, R=13;
|
| 2883 |
+
ESTATE.forEach((e,i)=>{
|
| 2884 |
+
const a=(i/n)*TAU, grp=new THREE.Group();
|
| 2885 |
+
grp.position.set(Math.cos(a)*R, (i%2?1:-1)*(1.4+(i%3)*0.9), Math.sin(a)*R);
|
| 2886 |
+
grp.add(new THREE.Mesh(new THREE.BoxGeometry(0.62,0.62,0.62),
|
| 2887 |
+
new THREE.MeshStandardMaterial({color:e.col,emissive:e.col,emissiveIntensity:0.6,roughness:0.4,metalness:0.3,transparent:true,opacity:0.94})));
|
| 2888 |
+
grp.add(glowSprite(e.col,2.1,0.34));
|
| 2889 |
+
grp.userData={label:esc(e.id), sub:esc(e.kind)+' · declared', spin:0.3+Math.random()*0.4};
|
| 2890 |
+
estateGroup.add(grp); estateNodes.push(grp);
|
| 2891 |
+
});
|
| 2892 |
+
makeLabels();
|
| 2893 |
+
}
|
| 2894 |
+
|
| 2895 |
+
/* ---- own label layer (revealed only by the matching preset) ---- */
|
| 2896 |
+
let labLayer=document.getElementById('v10-labels');
|
| 2897 |
+
if(!labLayer){ labLayer=document.createElement('div'); labLayer.id='v10-labels';
|
| 2898 |
+
labLayer.style.cssText='position:fixed;inset:0;pointer-events:none;z-index:40'; document.body.appendChild(labLayer); }
|
| 2899 |
+
let v10labels=[];
|
| 2900 |
+
function makeLabels(){
|
| 2901 |
+
labLayer.innerHTML=''; v10labels=[];
|
| 2902 |
+
const add=(grp,kind)=>{
|
| 2903 |
+
const d=document.createElement('div');
|
| 2904 |
+
d.style.cssText='position:absolute;transform:translate(-50%,-150%);font:600 10px/1.3 ui-monospace,Menlo,monospace;'+
|
| 2905 |
+
'letter-spacing:.04em;white-space:nowrap;padding:2px 7px;border-radius:7px;opacity:0;transition:opacity .25s;'+
|
| 2906 |
+
'background:rgba(6,10,18,.72);border:1px solid rgba(120,140,180,.28)';
|
| 2907 |
+
const col = kind==='council' ? '#c9adff' : '#ffd98a';
|
| 2908 |
+
d.innerHTML='<span style="color:'+col+'">'+grp.userData.label+'</span>'+
|
| 2909 |
+
'<span style="color:#8a97ad;margin-left:6px">'+grp.userData.sub+'</span>';
|
| 2910 |
+
labLayer.appendChild(d); v10labels.push({grp,div:d,kind});
|
| 2911 |
+
};
|
| 2912 |
+
councilNodes.forEach(g=>add(g,'council'));
|
| 2913 |
+
estateNodes.forEach(g=>add(g,'estate'));
|
| 2914 |
+
}
|
| 2915 |
+
const _wp=new THREE.Vector3();
|
| 2916 |
+
function projectLabels(){
|
| 2917 |
+
const w=innerWidth,h=innerHeight;
|
| 2918 |
+
v10labels.forEach(L=>{
|
| 2919 |
+
const show=(mode==='council'&&L.kind==='council')||(mode==='estate'&&L.kind==='estate');
|
| 2920 |
+
if(!show){ L.div.style.opacity='0'; return; }
|
| 2921 |
+
L.grp.getWorldPosition(_wp); _wp.project(camera);
|
| 2922 |
+
if(_wp.z>1){ L.div.style.opacity='0'; return; }
|
| 2923 |
+
const x=(_wp.x*0.5+0.5)*w, y=(-_wp.y*0.5+0.5)*h;
|
| 2924 |
+
if(x<0||x>w||y<44||y>h-84){ L.div.style.opacity='0'; return; }
|
| 2925 |
+
L.div.style.left=x+'px'; L.div.style.top=y+'px'; L.div.style.opacity='0.96';
|
| 2926 |
+
});
|
| 2927 |
+
}
|
| 2928 |
+
|
| 2929 |
+
/* ---- zoom presets (reuse the existing custom camera + flyTo tween) ---- */
|
| 2930 |
+
let mode='organism';
|
| 2931 |
+
function setFog(d){ if(scene.fog && scene.fog.density!=null) scene.fog.density=d; }
|
| 2932 |
+
function goCouncil(){ mode='council'; setFog(ORIG_FOG); flyTo(new THREE.Vector3(0,3.0,0), 7.5); setActive('council'); }
|
| 2933 |
+
function goOrganism(){ mode='organism'; setFog(ORIG_FOG); flyTo(HOME.target.clone(), HOME.r); setActive('organism'); }
|
| 2934 |
+
function goEstate(){ mode='estate'; setFog(0.009); flyTo(new THREE.Vector3(0,0.3,0), 30); autoRotate=true; setActive('estate'); }
|
| 2935 |
+
|
| 2936 |
+
/* ---- controls (injected into the existing #controls hud) ---- */
|
| 2937 |
+
const controls=document.getElementById('controls'); const btns={};
|
| 2938 |
+
function mkBtn(id,txt,title,fn){ const b=document.createElement('button'); b.className='btn'; b.id=id; b.textContent=txt; b.title=title; b.addEventListener('click',fn); if(controls)controls.appendChild(b); btns[id]=b; return b; }
|
| 2939 |
+
function setActive(m){ ['council','organism','estate'].forEach(k=>{ const b=btns['btn-v10-'+k]; if(b)b.classList.toggle('active',k===m); }); }
|
| 2940 |
+
mkBtn('btn-v10-council','◎ council','v10: zoom to the Ayllu council (live roster · /v1/ayllu/roster)',goCouncil);
|
| 2941 |
+
mkBtn('btn-v10-organism','◉ organism','v10: return to the organism (home view)',goOrganism);
|
| 2942 |
+
mkBtn('btn-v10-estate','⤢ estate','v10: zoom OUT to the whole estate — hardware & stack (declared)',goEstate);
|
| 2943 |
+
mkBtn('btn-v10-lens','▦ estate lens','v10: toggle the estate/council honesty panel',toggleLens);
|
| 2944 |
+
|
| 2945 |
+
/* ---- honest estate lens panel ---- */
|
| 2946 |
+
const panelEl=document.createElement('div'); panelEl.id='v10-panel';
|
| 2947 |
+
panelEl.style.cssText='position:fixed;left:18px;bottom:74px;width:min(92vw,300px);z-index:41;'+
|
| 2948 |
+
'background:rgba(6,10,18,.85);border:1px solid rgba(120,140,180,.26);border-radius:12px;'+
|
| 2949 |
+
'padding:12px 14px;font:12px/1.5 ui-monospace,Menlo,monospace;color:#cdd6e6;display:none';
|
| 2950 |
+
document.body.appendChild(panelEl);
|
| 2951 |
+
function toggleLens(){ const open=panelEl.style.display!=='none'; panelEl.style.display=open?'none':'block'; const b=btns['btn-v10-lens']; if(b)b.classList.toggle('active',!open); }
|
| 2952 |
+
function renderPanel(j, live){
|
| 2953 |
+
const count = live ? (j && j.count!=null ? j.count : '—') : '3 (core · declared)';
|
| 2954 |
+
const names = live ? ((j&&j.personas)||[]).map(p=>esc(p&&(p.name||p.id)||'')).filter(Boolean).join(' · ') : COUNCIL_FALLBACK.join(' · ');
|
| 2955 |
+
const chip = live ? '<span style="color:#34f5b0">● live · a11oy</span>' : '<span style="color:#9aa6bd">offline · static snapshot</span>';
|
| 2956 |
+
const estateRows = ESTATE.map(e=>'<div style="display:flex;justify-content:space-between;gap:10px;padding:2px 0;border-bottom:1px dashed rgba(120,140,180,.14)">'+
|
| 2957 |
+
'<span style="color:#aeb9cc">'+esc(e.id)+'</span><span style="color:#7f8aa0">'+esc(e.kind)+'</span></div>').join('');
|
| 2958 |
+
panelEl.innerHTML=
|
| 2959 |
+
'<div style="letter-spacing:.16em;color:#8a97ad;font-size:10.5px;margin-bottom:6px">ESTATE LENS · zoom-out</div>'+
|
| 2960 |
+
'<div style="font-size:11px;color:#c9adff;letter-spacing:.06em">COUNCIL — /v1/ayllu/roster</div>'+
|
| 2961 |
+
'<div style="display:flex;justify-content:space-between;padding:3px 0"><span style="color:#8a97ad">personas</span><span>'+esc(String(count))+'</span></div>'+
|
| 2962 |
+
'<div style="display:flex;justify-content:space-between;padding:3px 0"><span style="color:#8a97ad">source</span>'+chip+'</div>'+
|
| 2963 |
+
'<div style="color:#b7a3e6;font-size:10.5px;margin:4px 0 10px;line-height:1.5">'+(names||'—')+'</div>'+
|
| 2964 |
+
'<div style="font-size:11px;color:#ffd98a;letter-spacing:.06em">LAB — PhysicsNeMo PINN '+
|
| 2965 |
+
'<span style="margin-left:6px;padding:1px 6px;border:1px solid #123a2c;border-radius:6px;color:#34f5b0;font-size:9px">MEASURED</span></div>'+
|
| 2966 |
+
'<div style="color:#aeb9cc;font-size:10.5px;margin:4px 0 1px">rosie · RTX 5050 (Blackwell sm_120)</div>'+
|
| 2967 |
+
'<div style="color:#8a97ad;font-size:10px;margin-bottom:10px">PhysicsNeMo 2.1.1 · torch 2.12.1+cu130 · local snapshot (not live)</div>'+
|
| 2968 |
+
'<div style="font-size:11px;color:#ffd98a;letter-spacing:.06em">ESTATE — hardware & stack</div>'+
|
| 2969 |
+
estateRows+
|
| 2970 |
+
'<div style="color:#7f8aa0;font-size:9.5px;margin-top:6px">estate nodes are <b style="color:#aeb9cc">declared</b> (no live probe)</div>';
|
| 2971 |
+
}
|
| 2972 |
+
|
| 2973 |
+
/* ---- live roster (read-only, CORS-allowed; graceful offline) ---- */
|
| 2974 |
+
const BASE='https://szlholdings-a11oy.hf.space/api/a11oy';
|
| 2975 |
+
async function pull(url,ms){
|
| 2976 |
+
const ctl=(typeof AbortController!=='undefined')?new AbortController():null;
|
| 2977 |
+
const to=ctl?setTimeout(()=>{try{ctl.abort();}catch(e){}},ms||12000):null;
|
| 2978 |
+
try{ const r=await fetch(url,{method:'GET',mode:'cors',cache:'no-store',signal:ctl?ctl.signal:undefined});
|
| 2979 |
+
if(to)clearTimeout(to); if(!r||!r.ok)return null; return await r.json();
|
| 2980 |
+
}catch(e){ if(to)clearTimeout(to); return null; }
|
| 2981 |
+
}
|
| 2982 |
+
let _lastCouncilKey=null;
|
| 2983 |
+
function setCouncil(names){ // v10 polish: rebuild the ring ONLY when the roster actually changes (kills the 30s GPU/DOM churn)
|
| 2984 |
+
const key=names.join('\u241f');
|
| 2985 |
+
if(key===_lastCouncilKey) return;
|
| 2986 |
+
_lastCouncilKey=key;
|
| 2987 |
+
buildCouncil(names);
|
| 2988 |
+
}
|
| 2989 |
+
async function pollRoster(){
|
| 2990 |
+
const j=await pull(BASE+'/v1/ayllu/roster');
|
| 2991 |
+
if(!j){ setCouncil(COUNCIL_FALLBACK); renderPanel(null,false); return; }
|
| 2992 |
+
let people=j.personas||j.roster||[]; if(!Array.isArray(people))people=[];
|
| 2993 |
+
let names=people.map(p=>(p&&(p.name||p.persona||p.id))||String(p)).filter(Boolean);
|
| 2994 |
+
if(!names.length){ setCouncil(COUNCIL_FALLBACK); renderPanel(null,false); return; } // v10 polish/honesty: an EMPTY live roster is shown as declared snapshot, never fallback names under a "live" chip
|
| 2995 |
+
setCouncil(names); renderPanel(j,true);
|
| 2996 |
+
}
|
| 2997 |
+
|
| 2998 |
+
function tick(dt,t){
|
| 2999 |
+
councilGroup.rotation.y -= dt*0.12;
|
| 3000 |
+
councilNodes.forEach(g=>{ g.rotation.y += dt*g.userData.spin; g.rotation.x += dt*g.userData.spin*0.5; });
|
| 3001 |
+
estateGroup.rotation.y += dt*0.04;
|
| 3002 |
+
estateNodes.forEach(g=>{ g.rotation.y += dt*0.2; });
|
| 3003 |
+
projectLabels();
|
| 3004 |
+
}
|
| 3005 |
+
|
| 3006 |
+
/* ---- boot: honest declared state first, then upgrade live ---- */
|
| 3007 |
+
setCouncil(COUNCIL_FALLBACK);
|
| 3008 |
+
buildEstate();
|
| 3009 |
+
renderPanel(null,false);
|
| 3010 |
+
pollRoster();
|
| 3011 |
+
setInterval(pollRoster, 30000);
|
| 3012 |
+
|
| 3013 |
+
return { tick, api:{ mode:()=>mode, council:()=>councilNodes.length, estate:()=>estateNodes.length,
|
| 3014 |
+
goCouncil, goOrganism, goEstate } };
|
| 3015 |
+
})();
|
| 3016 |
+
/* ========================= /v10 estate/ayllu ===================== */
|
| 3017 |
+
|
| 3018 |
/* ---------------- test hooks for headless QA ---------------- */
|
| 3019 |
window.__anatomy = {
|
| 3020 |
organs: organMeshes.length,
|
|
|
|
| 3032 |
v7: V7, // v5 quantum-bio layer (coherence + bioenergetic + Λ-v5 gate + compass; verified model, mirrors a11oy /qbio)
|
| 3033 |
v8: V8, // v8 live agentic lens (read-only reflection of a11oy's real agent loop; runDecisionFlow/pollVitals/onOrganOpen)
|
| 3034 |
v9: V9, // v9 fly-high (bloodstream particles, autonomous heartbeat loop, killinchu 2nd body, cinematic vital tour, agent trace, polish)
|
| 3035 |
+
v10: V10, // v10 estate/ayllu (live Ayllu council roster + declared hardware/stack estate shell + zoom presets)
|
| 3036 |
formulas: Object.keys(D.FORMULAS).length,
|
| 3037 |
tierCounts: (V5&&V5.api)?V5.api.tierCounts():null,
|
| 3038 |
qbio: (V7&&V7.api)?V7.api():null
|