import uvicorn, math, time
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(title="ONE SPIRIT ICE Engine")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

NODES = {
    "N1":(0,0,0),"N2":(10,0,0),"N3":(0,10,0),"N4":(10,10,0),
    "N5":(3,3,4),"N6":(7,3,4),"N7":(3,7,4),"N8":(7,7,4)
}

VECTORS = {
    "V1":{"from":"N1","to":"N2","role":"Base Screen Lower Horizon"},
    "V2":{"from":"N1","to":"N3","role":"Global Interface Left Axis"},
    "V3":{"from":"N2","to":"N4","role":"Global Interface Right Axis"},
    "V4":{"from":"N3","to":"N4","role":"Base Screen Upper Horizon"},
    "V5":{"from":"N5","to":"N6","role":"Core UI Header Layout Rule"},
    "V6":{"from":"N5","to":"N7","role":"Central Typing Box Left Bound"},
    "V7":{"from":"N6","to":"N8","role":"Central Typing Box Right Bound"},
    "V8":{"from":"N7","to":"N8","role":"Core UI Footer Intersect"},
    "V9":{"from":"N1","to":"N5","role":"Dimensional Depth Vector 1"},
    "V10":{"from":"N2","to":"N6","role":"Dimensional Depth Vector 2"},
    "V11":{"from":"N3","to":"N7","role":"Dimensional Depth Vector 3"},
    "V12":{"from":"N4","to":"N8","role":"Dimensional Depth Vector 4"},
    "V13":{"from":"N5","to":"N8","role":"Cross-Lattice Calibration Axis"},
}

def vlen(a,b):
    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))

def transform(x,y,z,sx=1.5,sy=1.2,sz=1.0,tx=10,ty=5,tz=0,deg=30):
    c=math.cos(math.radians(deg))
    s=math.sin(math.radians(deg))
    return (round(sx*c*x-sy*s*y+tx,3),round(sx*s*x+sy*c*y+ty,3),round(sz*z+tz,3))

@app.get("/")
def root():
    return {"system":"O.N.E. S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8,"pipeline":"3→1→2","
python3 /home/drrone/engine.py

cat > /home/drrone/engine.py << 'EOF'
import uvicorn, math, time
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(title="ONE SPIRIT ICE Engine")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

NODES = {
    "N1":(0,0,0),"N2":(10,0,0),"N3":(0,10,0),"N4":(10,10,0),
    "N5":(3,3,4),"N6":(7,3,4),"N7":(3,7,4),"N8":(7,7,4)
}

VECTORS = {
    "V1":{"from":"N1","to":"N2","role":"Base Screen Lower Horizon"},
    "V2":{"from":"N1","to":"N3","role":"Global Interface Left Axis"},
    "V3":{"from":"N2","to":"N4","role":"Global Interface Right Axis"},
    "V4":{"from":"N3","to":"N4","role":"Base Screen Upper Horizon"},
    "V5":{"from":"N5","to":"N6","role":"Core UI Header Layout Rule"},
    "V6":{"from":"N5","to":"N7","role":"Central Typing Box Left Bound"},
    "V7":{"from":"N6","to":"N8","role":"Central Typing Box Right Bound"},
    "V8":{"from":"N7","to":"N8","role":"Core UI Footer Intersect"},
    "V9":{"from":"N1","to":"N5","role":"Dimensional Depth Vector 1"},
    "V10":{"from":"N2","to":"N6","role":"Dimensional Depth Vector 2"},
    "V11":{"from":"N3","to":"N7","role":"Dimensional Depth Vector 3"},
    "V12":{"from":"N4","to":"N8","role":"Dimensional Depth Vector 4"},
    "V13":{"from":"N5","to":"N8","role":"Cross-Lattice Calibration Axis"},
}

def vlen(a,b):
    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))

def transform(x,y,z,sx=1.5,sy=1.2,sz=1.0,tx=10,ty=5,tz=0,deg=30):
    c=math.cos(math.radians(deg))
    s=math.sin(math.radians(deg))
    return (round(sx*c*x-sy*s*y+tx,3),round(sx*s*x+sy*c*y+ty,3),round(sz*z+tz,3))

@app.get("/")
def root():
    return {"system":"O.N.E. S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8,"pipeline":"3→1→2","python3 home/drrone/engine.py

grep "@app" /home/drrone/engine.py
rm /home/drrone/engine.py
ls home/drrone/
ls home/drrone
ls /home/drrone/
nano /home/drrone/engine.py
nano
rm /home/drrone/engine.py
cd ~
pwd
python3 -c "print('hello')"
cat > /home/drrone/engine.py << 'EOF'
import uvicorn, math, time
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(title="ONE SPIRIT ICE Engine")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

NODES = {
    "N1":(0,0,0),"N2":(10,0,0),"N3":(0,10,0),"N4":(10,10,0),
    "N5":(3,3,4),"N6":(7,3,4),"N7":(3,7,4),"N8":(7,7,4)
}

VECTORS = {
    "V1":{"from":"N1","to":"N2","role":"Base Screen Lower Horizon"},
    "V2":{"from":"N1","to":"N3","role":"Global Interface Left Axis"},
    "V3":{"from":"N2","to":"N4","role":"Global Interface Right Axis"},
    "V4":{"from":"N3","to":"N4","role":"Base Screen Upper Horizon"},
    "V5":{"from":"N5","to":"N6","role":"Core UI Header Layout Rule"},
    "V6":{"from":"N5","to":"N7","role":"Central Typing Box Left Bound"},
    "V7":{"from":"N6","to":"N8","role":"Central Typing Box Right Bound"},
    "V8":{"from":"N7","to":"N8","role":"Core UI Footer Intersect"},
    "V9":{"from":"N1","to":"N5","role":"Dimensional Depth Vector 1"},
    "V10":{"from":"N2","to":"N6","role":"Dimensional Depth Vector 2"},
    "V11":{"from":"N3","to":"N7","role":"Dimensional Depth Vector 3"},
    "V12":{"from":"N4","to":"N8","role":"Dimensional Depth Vector 4"},
    "V13":{"from":"N5","to":"N8","role":"Cross-Lattice Calibration Axis"},
}

def vlen(a,b):
    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))

def transform(x,y,z,sx=1.5,sy=1.2,sz=1.0,tx=10,ty=5,tz=0,deg=30):
    c=math.cos(math.radians(deg))
    s=math.sin(math.radians(deg))
    return (round(sx*c*x-sy*s*y+tx,3),round(sx*s*x+sy*c*y+ty,3),round(sz*z+tz,3))

@app.get("/")
def root():
    return {"system":"O.N.E. S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8,"pipeline":"3→1→2","flop_ceiling":1000000}

@app.get("/api/nodes")
def get_nodes():
    result={}
    for nid,(x,y,z) in NODES.items():
        c45=math.cos(math.radians(45))
        s45=math.sin(math.radians(45))
        result[nid]={"coords":(x,y,z),"projected":(round(x+z*c45,3),round(y+z*s45,3)),"transformed":transform(x,y,z)}
    return result

@app.get("/api/vectors")
def get_vectors():
    result={}
    for vid,vd in VECTORS.items():
        s=NODES[vd["from"]]; e=NODES[vd["to"]]
        dx,dy,dz=e[0]-s[0],e[1]-s[1],e[2]-s[2]
        result[vid]={"from":vd["from"],"to":vd["to"],"role":vd["role"],"start":s,"end":e,"delta":(dx,dy,dz),"length":round(vlen(s,e),4),"start_transformed":transform(*s),"end_transformed":transform(*e)}
    return result

@app.get("/api/coherence")
def get_coherence():
    v1=vlen(NODES["N1"],NODES["N2"])
    v13=vlen(NODES["N5"],NODES["N8"])
    C=abs((v13/v1)-math.sqrt(32)/10)
    return {"v1_length":round(v1,4),"v13_length":round(v13,4),"C":round(C,6),"threshold":0.05,"coherent":C<=0.05,"sqrt32_over_10":round(math.sqrt(32)/10,6),"status":"PASS — COHERENT" if C<=0.05 else "FAIL — RESET TRIGGERED","nmse_db":round(-22.4+(C*10),4),"coherence_pct":round(100*(1-C),4)}

@app.get("/api/pipeline")
def get_pipeline():
    return {"stage_3":"3 input streams — Position · Transform · Node States","stage_1":"Unified 4×4 affine matrix compression","stage_2":"2 output tracks — Wireframe Path · Interactive Bound","matrix":{"row0":[1.299,-0.600,0.0,10.0],"row1":[0.750,1.039,0.0,5.0],"row2":[0.0,0.0,1.0,0.0],"row3":[0.0,0.0,0.0,1.0]},"flop_estimate":15600,"flop_ceiling":1000000,"constraint_pass":True}

@app.get("/api/status")
def get_status():
    return {"engine":"O.N.E. S.P.I.R.I.T. v1.0.0","nodes_active":8,"vectors_active":13,"lambda_node":4,"state_space":729,"pipeline":"3→1→2 ACTIVE","coherent":True,"flops_used":15600,"flop_ceiling":1000000,"auto_calibrate":"ENABLED","user_dependent":False,"reset_boundary":5000,"uptime":time.strftime("%H:%M:%S")}

if __name__ == "__main__":
    print("="*50)
    print("  O.N.E. S.P.I.R.I.T. — I.C.E. Engine")
    print("  http://localhost:8000")
    print("  http://localhost:8000/docs")
    print("="*50
EOF

ls /home/drrone/
ls
python3 /home/drrone/engine.py
rm /home/drrone/engine.py
cat > /home/drrone/engine.py << 'EOF'
import uvicorn, math, time
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(title="ONE SPIRIT ICE Engine")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

NODES = {
    "N1":(0,0,0),"N2":(10,0,0),"N3":(0,10,0),"N4":(10,10,0),
    "N5":(3,3,4),"N6":(7,3,4),"N7":(3,7,4),"N8":(7,7,4)
}

VECTORS = {
    "V1":{"from":"N1","to":"N2","role":"Base Screen Lower Horizon"},
    "V2":{"from":"N1","to":"N3","role":"Global Interface Left Axis"},
    "V3":{"from":"N2","to":"N4","role":"Global Interface Right Axis"},
    "V4":{"from":"N3","to":"N4","role":"Base Screen Upper Horizon"},
    "V5":{"from":"N5","to":"N6","role":"Core UI Header Layout Rule"},
    "V6":{"from":"N5","to":"N7","role":"Central Typing Box Left Bound"},
    "V7":{"from":"N6","to":"N8","role":"Central Typing Box Right Bound"},
    "V8":{"from":"N7","to":"N8","role":"Core UI Footer Intersect"},
    "V9":{"from":"N1","to":"N5","role":"Dimensional Depth Vector 1"},
    "V10":{"from":"N2","to":"N6","role":"Dimensional Depth Vector 2"},
    "V11":{"from":"N3","to":"N7","role":"Dimensional Depth Vector 3"},
    "V12":{"from":"N4","to":"N8","role":"Dimensional Depth Vector 4"},
    "V13":{"from":"N5","to":"N8","role":"Cross-Lattice Calibration Axis"},
}

def vlen(a,b):
    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))

def transform(x,y,z,sx=1.5,sy=1.2,sz=1.0,tx=10,ty=5,tz=0,deg=30):
    c=math.cos(math.radians(deg))
    s=math.sin(math.radians(deg))
    return (round(sx*c*x-sy*s*y+tx,3),round(sx*s*x+sy*c*y+ty,3),round(sz*z+tz,3))

@app.get("/")
def root():
    return {"system":"O.N.E. S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8,"pipeline":"3→1→2","

"
"

printf 'import uvicorn, math, time\nfrom fastapi import FastAPI\nfrom fastapi.middleware.cors import CORSMiddleware\napp = FastAPI()\napp.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])\nNODES = {"N1":(0,0,0),"N2":(10,0,0),"N3":(0,10,0),"N4":(10,10,0),"N5":(3,3,4),"N6":(7,3,4),"N7":(3,7,4),"N8":(7,7,4)}\ndef vlen(a,b):\n    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))\n@app.get("/")\ndef root():\n    return {"system":"ONE SPIRIT","status":"COHERENT","vectors":13,"nodes":8}\n@app.get("/api/status")\ndef status():\n    return {"engine":"ONE SPIRIT v1.0","nodes":8,"vectors":13,"coherent":True,"uptime":time.strftime("%H:%M:%S")}\n@app.get("/api/coherence")\ndef coherence():\n    v1=vlen(NODES["N1"],NODES["N2"])\n    v13=vlen(NODES["N5"],NODES["N8"])\n    C=abs((v13/v1)-math.sqrt(32)/10)\n    return {"C":round(C,6),"coherent":C<=0.05,"coherence_pct":round(100*(1-C),4)}\n@app.get("/api/nodes")\ndef nodes():\n    return NODES\n@app.get("/api/vectors")\ndef vectors():\n    return {"V1":"Base Lower Horizon","V2":"Left Axis","V3":"Right Axis","V4":"Upper Horizon","V5":"Header","V6":"Left Bound","V7":"Right Bound","V8":"Footer","V9":"Depth 1","V10":"Depth 2","V11":"Depth 3","V12":"Depth 4","V13":"Calibration"}\n@app.get("/api/pipeline")\ndef pipeline():\n    return {"stage_3":"3 input streams","stage_1":"unified matrix","stage_2":"2 output tracks","flops":15600,"ceiling":1000000}\nif __name__ == "__main__":\n    print("ONE SPIRIT running at http://localhost:8000")\n    uvicorn.run(app, host="0.0.0.0", port=8000)\n' > /home/drrone/engine.py && echo "DONE"
ls /home/drrone/
printf 'import uvicorn, math, time\nfrom fastapi import FastAPI\nfrom fastapi.middleware.cors import CORSMiddleware\napp = FastAPI()\napp.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])\nNODES = {"N1":(0,0,0),"N2":(10,0,0),"N3":(0,10,0),"N4":(10,10,0),"N5":(3,3,4),"N6":(7,3,4),"N7":(3,7,4),"N8":(7,7,4)}\ndef vlen(a,b):\n    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))\n@app.get("/")\ndef root():\n    return {"system":"ONE SPIRIT","status":"COHERENT","vectors":13,"nodes":8}\n@app.get("/api/status")\ndef status():\n    return {"engine":"ONE SPIRIT v1.0","nodes":8,"vectors":13,"coherent":True,"uptime":time.strftime("%H:%M:%S")}\n@app.get("/api/coherence")\ndef coherence():\n    v1=vlen(NODES["N1"],NODES["N2"])\n    v13=vlen(NODES["N5"],NODES["N8"])\n    C=abs((v13/v1)-math.sqrt(32)/10)\n    return {"C":round(C,6),"coherent":C<=0.05,"coherence_pct":round(100*(1-C),4)}\n@app.get("/api/nodes")\ndef nodes():\n    return NODES\n@app.get("/api/vectors")\ndef vectors():\n    return {"V1":"Base Lower Horizon","V2":"Left Axis","V3":"Right Axis","V4":"Upper Horizon","V5":"Header","V6":"Left Bound","V7":"Right Bound","V8":"Footer","V9":"Depth 1","V10":"Depth 2","V11":"Depth 3","V12":"Depth 4","V13":"Calibration"}\n@app.get("/api/pipeline")\ndef pipeline():\n    return {"stage_3":"3 input streams","stage_1":"unified matrix","stage_2":"2 output tracks","flops":15600,"ceiling":1000000}\nif __name__ == "__main__":\n    print("ONE SPIRIT running at http://localhost:8000")\n    uvicorn.run(app, host="0.0.0.0", port=8000)\n' > /home/drrone/engine.py && echo "DONE"
ls /home/drrone/one_spirit_engine_server.py
python3 /home/drrone/one_spirit_engine_server.py
pip install fastapi uvicorn numpy --break-system-packages
python3 /home/drrone/one_spirit_engine_server.py
file /home/drrone/one_spirit_engine_server.py
[200~ls /home/drrone/one_spirit_engine_server.py/~
ls /home/drrone/one_spirit_engine_server.py/~
ls /home/drrone/one_spirit_engine_server.py
ls /home/drrone/one_spirit_engine_server.py/
rm -rf /home/drrone/one_spirit_engine_server.py
cat > /home/drrone/server.py << 'DONE'
from fastapi import FastAPI
import uvicorn
app = FastAPI()

@app.get("/")
def root():
    return {"system":"O.N.E. S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)
DONE

python3 /home/drrone/server.py
rm -rf /home/drrone/one_spirit_engine_server.py
python3 /home/drrone/engine.py
rm -rf /home/drrone/one_spirit_engine_server.py
if __name__ == "__main__":
python3 /home/drrone/server.py
sed -i 's/math.sqrt(32)\/10/math.sqrt(114)\/10/' /home/drrone/server.py
python3 /home/drrone/server.py
python3 -m http.server 8081 --directory /home/drrone
python3 -m http.server 8000 --directory /home/drrone
sed -i 's/O.N.E. S.P.I.R.I.T. - I.C.E. ENGINE TERMINAL/D.R. ONE - Powered by S.P.I.R.I.T./g' /home/drrone/ui.html
sed -i 's/<title>O.N.E. S.P.I.R.I.T.<\/title>/<title>D.R. ONE<\/title>/g' /home/drrone/ui.html
python3 -m http.server 8081 --directory /home/drrone
python3 -m http.server 8000 --directory /home/drrone
python3 /home/drrone/server.py
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello world"}'
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d "{\"prompt\":\"hello world\"}"
grep -n "ollama" /home/drrone/server.py
cat > /home/drrone/server.py << 'DONE'
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn, math, subprocess

app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

NODES = {
    "N1":[0,0,0],"N2":[10,0,0],"N3":[0,10,0],"N4":[10,10,0],
    "N5":[3,3,4],"N6":[7,3,4],"N7":[3,7,4],"N8":[7,7,4]
}

VECTORS = [
    ("V1","N1","N2"),("V2","N3","N4"),("V3","N1","N3"),("V4","N2","N4"),
    ("V5","N5","N6"),("V6","N7","N8"),("V7","N5","N7"),("V8","N6","N8"),
    ("V9","N1","N5"),("V10","N2","N6"),("V11","N3","N7"),("V12","N4","N8"),
    ("V13","N1","N8")
]

def vlen(a,b):
    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))

def ice_route(text):
    vals = [float(ord(c)) for c in text[:3].ljust(3)]
    omegas = []
    lam = 4
    for v in vals:
        tau = int(abs(v)) % 9
        tau = 1 if tau == 0 else tau
        if tau % 3 == 0: omega = (3*tau + lam) % 9
        elif tau % 3 == 1: omega = tau % 9
        else: omega = (2*tau - lam) % 9
        omegas.append(omega)
    s_n = omegas[0]*81 + omegas[1]*9 + omegas[2]
    return s_n, omegas

@app.get("/")
def root():
    return {"system":"D.R. ONE","engine":"S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8}

@app.get("/api/nodes")
def nodes():
    return NODES

@app.get("/api/vectors")
def vectors():
    result=[]
    for v,a,b in VECTORS:
        na

llama
ollama
python3 -c "
f=open('/home/drrone/ui.html','r').read()
f=f.replace('[ O.N.E. S.P.I.R.I.T. - I.C.E. ENGINE TERMINAL ]','[ D.R. ONE - Powered by S.P.I.R.I.T. ]')
f=f.replace('<title>O.N.E. S.P.I.R.I.T.</title>','<title>D.R. ONE</title>')
open('/home/drrone/ui.html','w').write(f)
print('DONE')
"
grep -n "D.R. ONE\|O.N.E.\|TERMINAL\|title" /home/drrone/ui.html | head -20
python3 -c "
f=open('/home/drrone/ui.html','r').read()
print(repr(f[f.find('<h1>')+4:f.find('</h1>')])[:100])
"
python3 -c "
f=open('/home/drrone/ui.html','r').read()
f=f.replace('O.N.E. S.P.I.R.I.T. \u2013 I.C.E. ENGINE TERMINAL','D.R. ONE - Powered by S.P.I.R.I.T.')
open('/home/drrone/ui.html','w').write(f)
print('DONE')
"
python3 /home/drrone/one_spirit_engine_server.py
python3 /home/drrone/engine.py
python3 -m http.server 8081 --directory /home/drrone
cat > /home/drrone/server.py << 'DONE'
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn, math, subprocess

app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])

NODES = {
    "N1":[0,0,0],"N2":[10,0,0],"N3":[0,10,0],"N4":[10,10,0],
    "N5":[3,3,4],"N6":[7,3,4],"N7":[3,7,4],"N8":[7,7,4]
}

VECTORS = [
    ("V1","N1","N2"),("V2","N3","N4"),("V3","N1","N3"),("V4","N2","N4"),
    ("V5","N5","N6"),("V6","N7","N8"),("V7","N5","N7"),("V8","N6","N8"),
    ("V9","N1","N5"),("V10","N2","N6"),("V11","N3","N7"),("V12","N4","N8"),
    ("V13","N1","N8")
]

def vlen(a,b):
    return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))

def ice_route(text):
    vals = [float(ord(c)) for c in text[:3].ljust(3)]
    omegas = []
    lam = 4
    for v in vals:
        tau = int(abs(v)) % 9
        tau = 1 if tau == 0 else tau
        if tau % 3 == 0: omega = (3*tau + lam) % 9
        elif tau % 3 == 1: omega = tau % 9
        else: omega = (2*tau - lam) % 9
        omegas.append(omega)
    s_n = omegas[0]*81 + omegas[1]*9 + omegas[2]
    return s_n, omegas

@app.get("/")
def root():
    return {"system":"D.R. ONE","engine":"S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8}

@app.get("/api/nodes")
def nodes():
    return NODES

@app.get("/api/vectors")
def vectors():
    result=[]
    for v,a,b in VECTORS:
        na
python3 /home/drrone/server.py

python3 /home/drrone/server.py
python3 -m http.server 8081 --directory /home/drrone
cat > /home/drrone/ui.html << 'DONE'
<!DOCTYPE html>
<html><head><title>O.N.E. S.P.I.R.I.T.</title>
<style>
*{box-sizing:border-box}
body{background:#000;color:#00ffff;font-family:monospace;margin:0;padding:20px}
h1{color:#00ffff;text-align:center;border:1px solid #00ffff;padding:10px;margin-bottom:20px}
.row{display:flex;gap:20px;flex-wrap:wrap}
.panel{border:1px solid #00ffff;padding:15px;flex:1;min-width:280px;position:relative}
.panel h2{margin-top:0;font-size:14px;color:#00ffff}
button{background:#000;color:#00ffff;border:1px solid #00ffff;padding:8px 20px;cursor:pointer;font-family:monospace;margin:4px}
button:hover{background:#00ffff;color:#000}
.pass{color:#00ff00;font-size:20px;font-weight:bold}
.reset{color:#ff0000;font-size:20px;font-weight:bold}
table{width:100%;border-collapse:collapse;font-size:12px}
td,th{border:1px solid #003333;padding:4px 8px;text-align:left}
th{color:#00ffff;background:#001a1a}
.corner{position:absolute;width:10px;height:10px;border-color:#00ffff;border-style:solid}
.tl{top:4px;left:4px;border-width:2px 0 0 2px}
.tr{top:4px;right:4px;border-width:2px 2px 0 0}
.bl{bottom:4px;left:4px;border-width:0 0 2px 2px}
.br{bottom:4px;right:4px;border-width:0 2px 2px 0}
</style></head>
<body>
<h1>[ O.N.E. S.P.I.R.I.T. — I.C.E. ENGINE TERMINAL ]</h1>
<div class="row">
<div class="panel">
<div class="corner tl"></div><div class="corner tr"></div>
<div class="corner bl"></div><div class="corner br"></div>
<h2>COHERENCE METRIC</h2>
<button onclick="checkCoherence()">RUN COHERENCE CHECK</button>
<div id="coh" style="margin-top:10px"></div>
</div>
<div class="panel">
<div class="corner tl"></div><div class="corner tr"></div>
<div class="corner bl"></div><div class="corner br"></div>
<h2>SYSTEM STATUS</h2>
<button onclick="checkRoot()">PING ENGINE</button>
<div id="root" style="margin-top:10px"></div>
</div>
</div>
<div class="row" style="margin-top:20px">
<div class="panel">
<div class="corner tl"></div><div class="corner tr"></div>
<div class="corner bl"></div><div class="corner br"></div>
<h2>13 VECTORS</h2>
<button onclick="loadVectors()">LOAD VECTORS</button>
<div id="vecs" style="margin-top:10px"></div>
</div>
<div class="panel">
<div class="corner tl"></div><div class="corner tr"></div>
<div class="corner bl"></div><div class="corner br"></div>
<h2>8 NODES</h2>
<button onclick="loadNodes()">LOAD NODES</button>
<div id="nodes" style="margin-top:10px"></div>
</div>
</div>
<script>
const API='http://localhost:8000';
function checkCoherence(){
  fetch(API+'/api/coherence/metric').then(r=>r.json()).then(d=>{
    const cls=d.status==='PASS'?'pass':'reset';
    document.getElementById('coh').innerHTML=
      `<div class="${cls}">● ${d.status}</div>
       <div>C = ${d.C}</div>
       <div>V1 = ${d.v1} | V13 = ${d.v13}</div>`;
  }).catch(e=>document.getElementById('coh').innerText='ERROR: '+e);
}
function checkRoot(){
  fetch(API+'/').then(r=>r.json()).then(d=>{
    document.getElementById('root').innerHTML=
      `<div class="pass">● ${d.status}</div>
       <div>Vectors: ${d.vectors} | Nodes: ${d.nodes}</div>`;
  }).catch(e=>document.getElementById('root').innerText='ERROR: '+e);
}
function loadVectors(){
  fetch(API+'/api/vectors').then(r=>r.json()).then(data=>{
    let t='<table><tr><th>ID</th><th>From</th><th>To</th><th>Length</th></tr>';
    data.forEach(v=>t+=`<tr><td>${v.id}</td><td>${v.from}</td><td>${v.to}</td><td>${v.length}</td></tr>`);
    document.getElementById('vecs').innerHTML=t+'</table>';
  }).catch(e=>document.getElementById('vecs').innerText='ERROR: '+e);
}
function loadNodes(){
  fetch(API+'/api/nodes').then(r=>r.json()).then(d=>{
    let t='<table><tr><th>Node</th><th>X</th><th>Y</th><th>Z</th></tr>';
    Object.entries(d).forEach(([k,v])=>t+=`<tr><td>${k}</td><td>${v[0]}</td><td>${v[1]}</td><td>${v[2]}</td></tr>`);
    document.getElementById('nodes').innerHTML=t+'</table>';
  }).catch(e=>document.getElementById('nodes').innerText='ERROR: '+e);
}
</script>
</body></html>
DONE

python3 -m http.server 8081 --directory /home/drrone
python3 /home/drrone/server.py
python3 -c "
f=open('/home/drrone/ui.html','r').read()
i=f.find('<h1>')
print(repr(f[i:i+100]))
"
python3 -c "
f=open('/home/drrone/ui.html','r').read()
import re
f=re.sub(r'<h1>[^<]*</h1>','<h1>[ D.R. ONE - Powered by S.P.I.R.I.T. ]</h1>',f)
open('/home/drrone/ui.html','w').write(f)
print('DONE')
"
sed -i 's/●/*/g' /home/drrone/ui.html
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello world"}'
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello"}'
grep -n "ollama" /home/drrone/server.py
python3 << 'EOF'
code = open('/home/drrone/server.py','r').read()
new_route = '''
@app.post("/api/ollama")
def ollama(data:dict):
    prompt=data.get("prompt","hello")
    s_n,omegas=ice_route(prompt)
    try:
        r=subprocess.run(["ollama","run","llama3.2"],
            input=f"[ICE STATE {s_n}]: {prompt}",
            capture_output=True,text=True,timeout=60)
        response=r.stdout.strip()
    except Exception as e:
        response=f"Ollama not available: {str(e)}"
    return {"state":s_n,"omegas":omegas,"response":response}
'''
code = code.replace('if __name__=="__main__":', new_route + '\nif __name__=="__main__":')
open('/home/drrone/server.py','w').write(code)
print('DONE')
EOF

python3 /home/drrone/server.py
kill $(lsof -t -i:8000)
python3 /home/drrone/server.py
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello"}'
ollama which
which ollama
ollama list
ollama pull llama3.2
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello"}'
hello
python3 /home/drrone/engine.py
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello"}'
grep -n "ollama" /home/drrone/server.py
curl -o /home/drrone/server.py https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/index.html
cat /home/drrone/server.py | wc -l
python3 /home/claude/server.py
cp /home/claude/server.py /home/drrone/server.py 2>/dev/null || echo "need manual copy"
wc -l /home/drrone/server.py
cat > /home/drrone/server.py << 'EOF'
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn, math, subprocess
app = FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
NODES = {"N1":[0,0,0],"N2":[10,0,0],"N3":[0,10,0],"N4":[10,10,0],"N5":[3,3,4],"N6":[7,3,4],"N7":[3,7,4],"N8":[7,7,4]}
VECTORS = [("V1","N1","N2"),("V2","N3","N4"),("V3","N1","N3"),("V4","N2","N4"),("V5","N5","N6"),("V6","N7","N8"),("V7","N5","N7"),("V8","N6","N8"),("V9","N1","N5"),("V10","N2","N6"),("V11","N3","N7"),("V12","N4","N8"),("V13","N1","N8")]
def vlen(a,b): return math.sqrt(sum((b[i]-a[i])**2 for i in range(3)))
def ice_route(text):
    vals=[float(ord(c)) for c in text[:3].ljust(3)]
    omegas=[]
    lam=4
    for v in vals:
        tau=int(abs(v))%9
        tau=1 if tau==0 else tau
        if tau%3==0: omega=(3*tau+lam)%9
        elif tau%3==1: omega=tau%9
        else: omega=(2*tau-lam)%9
        omegas.append(omega)
    s_n=omegas[0]*81+omegas[1]*9+omegas[2]
    return s_n,omegas
@app.get("/")
def root(): return {"system":"D.R. ONE","engine":"S.P.I.R.I.T.","status":"COHERENT","vectors":13,"nodes":8}
@app.get("/api/nodes")
def nodes(): return NODES
@app.get("/api/vectors")
def vectors():
    result=[]
    for v,a,b in VECTORS:
        na,nb=NODES[a],NODES[b]
        result.append({"id":v,"from":a,"to":b,"length":round(vlen(na,nb),4)})
    return result
@app.get("/api/coherence/metric")
def coherence():
    v1=vlen(NODES["N1"],NODES["N2"])
    v13=vlen(NODES["N1"],NODES["N8"])
    C=abs(v13/v1-math.sqrt(114)/10)
    return {"C":round(C,6),"status":"PASS" if C<=0.05 else "RESET","v1":v1,"v13":round(v13,4)}
@app.post("/api/ollama")
def ollama(data:dict):
    prompt=data.get("prompt","hello")
    s_n,omegas=ice_route(prompt)
    try:
        r=subprocess.run(["ollama","run","llama3.2"],input=f"[ICE STATE {s_n}]: {prompt}",capture_output=True,text=True,timeout=60)
        response=r.stdout.strip() or r.stderr.strip()
    except FileNotFoundError: response="Ollama not found"
    except Exception as e: response=f"Error: {str(e)}"
    return {"state":s_n,"omegas":omegas,"response":response}
if __name__=="__main__": uvicorn.run(app,host="0.0.0.0",port=8000)
EOF

wc -l /home/drrone/server.py
python3 /home/drrone/server.py
curl -X POST http://localhost:8000/api/ollama -H "Content-Type: application/json" -d '{"prompt":"hello"}'
pkill ollama
killall ollama
python3 -m http.server 8081 --directory /home/drrone
curl http://localhost:8000/api/coherence/metric
I ollama serve &
metric
{"C":0.0,"status":"PASS","v1":10.0,"v13":10.6771}drrone@penguin:~$ I ollama serve &
1
exit 1
curl http://localhost:8000/api/coherence/metric
python3 /home/drrone/server.py
./launch.sh
cd /home/drrone/prime43 && ./launch.sh
cd /home/drrone
ollama
cd ~/claude/projects/
cd ~/.claude/projects/
ls
git status
pwd
cd
git status
cd ~/.claude/projects/
ls
prime43
/prime43
/server.py
engine.py
ls -la
cat main.py
cat prime43.py
cat ollama3.py
cd
cat ain.py
cat main.py
cat server.py
cat engine.py
cat validator.py
ollama?
./launch.sh
cd /home/drrone
cd /home/drrone/prime43 && ./launch.sh
cat ollama.py
xdg-open ~/pulse_ui.html
llama
ollama
ollma
ollama
hostname -I
ip addr show | grep "inet " | grep -v "127.0.0.1"
sudo ufw allow 8082
ip addr show | grep "inet " | grep -v "127.0.0.1"
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
fuser -k 8082/tcp
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
python3 -m http.server 8082 --directory /home/drrone
sudo iptables -A INPUT -p tcp --dport 8082 -j ACCEPT
http://192.168.0.142:8082/LYT_App.html
python3 -m http.server 8082 --directory /home/drrone
http://192.168.0.1
http:192.168.0.142:8082
http://192.168.0.142:8082
http://192.168.0.142
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
ollama
sudo ufw allow 8082
cd /home/drrone/prime43 && ./launch.sh
python3 -m http.server 8082 --directory /home/drrone
sudo tailscale funnel 8082
python3 -c "
f=open('/home/drrone/lyt_app.html','r').read()
f=f.replace(\"const ENGINE = 'http://localhost:8000'\",\"const ENGINE = 'https://penguin.tailee38d8.ts.net:8000'\")
open('/home/drrone/lyt_app.html','w').write(f)
print('DONE')
"
sudo tailscale funnel 8000
https://penguin.tailee38d8.ts.net:8000
sudo tailscale serve status
sudo tailscale serve --bg http://localhost:8000
sudo tailscale funnel --bg 443
grep "const ENGINE" /home/drrone/lyt_app.html
grep -o "const ENGINE = .*'" /home/drrone/lyt_app.html
grep -n "ENGINE\|localhost\|8000" /home/drrone/lyt_app.html | head -10
sed -n '632p' /home/drrone/lyt_app.html
grep -n "localhost\|8000\|ENGINE\s*=" /home/drrone/lyt_app.html | head -10
sed -n '177,190p' /home/drrone/lyt_app.html
:~$ sed -n '177,190p' /home/drrone/lyt_app.html
const ENGINE={
drrone@penguin:~$ cat > /home/drrone/lyt_app.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>L.Y.T. — Luv You Tru</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
:root{--bg:#000;--cyan:#00ffff;--purple:#9B59B6;--gold:#FFD700;--green:#00ff00;--red:#ff0000;--panel:#0f0f2a;--border:#1a1a3a}
body{background:var(--bg);color:var(--cyan);font-family:monospace;padding-bottom:70px;min-height:100vh}
.screen{display:none;padding:15px}
.screen.active{display:block}
.header{text-align:center;padding:15px 0;border-bottom:1px solid var(--border);margin-bottom:15px}
.header h1{font-size:24px;letter-spacing:4px}
.header p{font-size:10px;color:#444;margin-top:4px}
.panel{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:15px;margin-bottom:15px;position:relative}
.panel-title{font-size:10px;color:#444;letter-spacing:2px;margin-bottom:10px}
.corner{position:absolute;width:8px;height:8px;border-color:var(--cyan);border-style:solid}
.tl{top:4px;left:4px;border-width:1px 0 0 1px}.tr{top:4px;right:4px;border-width:1px 1px 0 0}
.bl{bottom:4px;left:4px;border-width:0 0 1px 1px}.br{bottom:4px;right:4px;border-width:0 1px 1px 0}
.btn{width:100%;padding:12px;border:1px solid var(--cyan);background:none;color:var(--cyan);font-family:monospace;font-size:13px;border-radius:4px;cursor:pointer;margin-bottom:8px;letter-spacing:1px}
.btn:active{background:var(--cyan);color:#000}
.btn-gold{border-color:var(--gold);color:var(--gold)}.btn-gold:active{background:var(--gold);color:#000}
.btn-purple{border-color:var(--purple);color:var(--purple)}.btn-purple:active{background:var(--purple);color:#fff}
.btn-red{border-color:var(--red);color:var(--red)}
.score{font-size:56px;text-align:center;color:var(--gold);text-shadow:0 0 20px var(--gold);line-height:1;margin:10px 0}
.level{display:block;text-align:center;background:var(--purple);color:#fff;padding:4px 12px;border-radius:20px;font-size:11px;width:fit-content;margin:8px auto}
.progress-wrap{background:#111;border-radius:4px;height:6px;margin:8px 0}
.progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,var(--purple),var(--cyan));transition:width 1s}
.chakras{display:flex;justify-content:center;gap:8px;margin:10px 0}
.chakra{width:30px;height:30px;border-radius:50%;border:2px solid #222;display:flex;align-items:center;justify-content:center;font-size:10px;transition:all 0.5s;opacity:0.2}
.chakra.on{opacity:1;box-shadow:0 0 12px currentColor}
.stats{display:flex;gap:8px;margin-bottom:15px}
.stat{flex:1;background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;text-align:center}
.stat-n{font-size:24px;color:var(--cyan)}.stat-l{font-size:9px;color:#444;margin-top:2px}
.toggle-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--border)}
.toggle{position:relative;width:44px;height:24px}
.toggle input{opacity:0;width:0;height:0}
.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background:#222;border-radius:24px;transition:.3s}
.slider:before{content:"";position:absolute;width:18px;height:18px;left:3px;bottom:3px;background:#444;border-radius:50%;transition:.3s}
input:checked+.slider{background:var(--cyan)}
input:checked+.slider:before{background:#000;transform:translateX(20px)}
#chat-msgs{height:calc(100vh - 340px);overflow-y:auto;padding:10px;margin-bottom:10px}
.msg{margin-bottom:12px;max-width:85%}
.msg.user{margin-left:auto;text-align:right}
.msg-bubble{padding:10px 14px;border-radius:12px;font-size:13px;line-height:1.5}
.msg.user .msg-bubble{background:var(--purple);color:#fff}
.msg.ai .msg-bubble{background:var(--panel);border:1px solid var(--border)}
.msg-meta{font-size:9px;color:#444;margin-top:3px}
.chat-row{display:flex;gap:8px;align-items:center}
#chat-in{flex:1;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:10px;border-radius:4px;font-family:monospace;font-size:13px}
.mic{width:44px;height:44px;border:1px solid var(--cyan);background:none;border-radius:50%;cursor:pointer;color:var(--cyan);font-size:18px;flex-shrink:0}
.mic.on{border-color:var(--red);color:var(--red);animation:pulse 1s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(255,0,0,0.4)}50%{box-shadow:0 0 0 8px rgba(255,0,0,0)}}
#sandbox-warn{display:none;background:#1a0000;border:1px solid var(--red);border-radius:8px;padding:12px;margin-bottom:10px;font-size:12px;color:var(--red)}
.vent{background:#

That's a completely different app — this `lyt_app.html` is not the one I built for you. Someone else's code is in there.
Let me overwrite it with the correct L.Y.T. app. First:
```bash
cp /home/drrone/lyt_app.html /home/drrone/lyt_app_old.html
```
pip install uvicorn[standard] --break-system-packages
tailscale cert 100.113.81.31
tailscale funnel 8082
cd
pwd
tailscale funnel 8082
python3 -c "
from pyngrok import ngrok
url = ngrok.connect(8082)
print('YOUR HTTPS URL:', url)
"
sudo tailscale funnel 8082
python3 /home/drrone/server.py
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
cat > /home/drrone/lyt_app.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>L.Y.T. — Luv You Tru</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
:root{--bg:#000;--cyan:#00ffff;--purple:#9B59B6;--gold:#FFD700;--green:#00ff00;--red:#ff0000;--panel:#0f0f2a;--border:#1a1a3a}
body{background:var(--bg);color:var(--cyan);font-family:monospace;padding-bottom:70px;min-height:100vh}
.screen{display:none;padding:15px}
.screen.active{display:block}
.header{text-align:center;padding:15px 0;border-bottom:1px solid var(--border);margin-bottom:15px}
.header h1{font-size:24px;letter-spacing:4px}
.header p{font-size:10px;color:#444;margin-top:4px}
.panel{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:15px;margin-bottom:15px;position:relative}
.panel-title{font-size:10px;color:#444;letter-spacing:2px;margin-bottom:10px}
.corner{position:absolute;width:8px;height:8px;border-color:var(--cyan);border-style:solid}
.tl{top:4px;left:4px;border-width:1px 0 0 1px}.tr{top:4px;right:4px;border-width:1px 1px 0 0}
.bl{bottom:4px;left:4px;border-width:0 0 1px 1px}.br{bottom:4px;right:4px;border-width:0 1px 1px 0}
.btn{width:100%;padding:12px;border:1px solid var(--cyan);background:none;color:var(--cyan);font-family:monospace;font-size:13px;border-radius:4px;cursor:pointer;margin-bottom:8px;letter-spacing:1px}
.btn:active{background:var(--cyan);color:#000}
.btn-gold{border-color:var(--gold);color:var(--gold)}.btn-gold:active{background:var(--gold);color:#000}
.btn-purple{border-color:var(--purple);color:var(--purple)}.btn-purple:active{background:var(--purple);color:#fff}
.btn-red{border-color:var(--red);color:var(--red)}
.score{font-size:56px;text-align:center;color:var(--gold);text-shadow:0 0 20px var(--gold);line-height:1;margin:10px 0}
.level{display:block;text-align:center;background:var(--purple);color:#fff;padding:4px 12px;border-radius:20px;font-size:11px;width:fit-content;margin:8px auto}
.progress-wrap{background:#111;border-radius:4px;height:6px;margin:8px 0}
.progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,var(--purple),var(--cyan));transition:width 1s}
.chakras{display:flex;justify-content:center;gap:8px;margin:10px 0}
.chakra{width:30px;height:30px;border-radius:50%;border:2px solid #222;display:flex;align-items:center;justify-content:center;font-size:10px;transition:all 0.5s;opacity:0.2}
.chakra.on{opacity:1;box-shadow:0 0 12px currentColor}
.stats{display:flex;gap:8px;margin-bottom:15px}
.stat{flex:1;background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;text-align:center}
.stat-n{font-size:24px;color:var(--cyan)}.stat-l{font-size:9px;color:#444;margin-top:2px}
.toggle-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--border)}
.toggle{position:relative;width:44px;height:24px}
.toggle input{opacity:0;width:0;height:0}
.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background:#222;border-radius:24px;transition:.3s}
.slider:before{content:"";position:absolute;width:18px;height:18px;left:3px;bottom:3px;background:#444;border-radius:50%;transition:.3s}
input:checked+.slider{background:var(--cyan)}
input:checked+.slider:before{background:#000;transform:translateX(20px)}
#chat-msgs{height:calc(100vh - 340px);overflow-y:auto;padding:10px;margin-bottom:10px}
.msg{margin-bottom:12px;max-width:85%}
.msg.user{margin-left:auto;text-align:right}
.msg-bubble{padding:10px 14px;border-radius:12px;font-size:13px;line-height:1.5}
.msg.user .msg-bubble{background:var(--purple);color:#fff}
.msg.ai .msg-bubble{background:var(--panel);border:1px solid var(--border)}
.msg-meta{font-size:9px;color:#444;margin-top:3px}
.chat-row{display:flex;gap:8px;align-items:center}
#chat-in{flex:1;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:10px;border-radius:4px;font-family:monospace;font-size:13px}
.mic{width:44px;height:44px;border:1px solid var(--cyan);background:none;border-radius:50%;cursor:pointer;color:var(--cyan);font-size:18px;flex-shrink:0}
.mic.on{border-color:var(--red);color:var(--red);animation:pulse 1s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(255,0,0,0.4)}50%{box-shadow:0 0 0 8px rgba(255,0,0,0)}}
#sandbox-warn{display:none;background:#1a0000;border:1px solid var(--red);border-radius:8px;padding:12px;margin-bottom:10px;font-size:12px;color:var(--red)}
.vent{background:#1a0a00;border:1px solid #ff7f00;border-radius:4px;padding:8px;margin-bottom:10px;font-size:11px;color:#ff7f00;text-align:center}
#journal-text{width:100%;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:12px;border-radius:4px;font-family:monospace;font-size:13px;min-height:150px;resize:none}
.j-entry{background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;margin-bottom:8px;font-size:12px}
.j-date{font-size:10px;color:#444;margin-bottom:5px}
.freq-btn{background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:12px;border-radius:8px;margin-bottom:8px;cursor:pointer;width:100%;text-align:left;font-family:monospace;font-size:12px;display:flex;align-items:center;justify-content:space-between}
.freq-btn.on{border-color:var(--cyan);background:rgba(0,255,255,0.1)}
.freq-hz{color:var(--gold);font-size:11px}
.task-item{background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;margin-bottom:8px;display:flex;align-items:center;gap:10px;font-size:13px}
.task-check{width:22px;height:22px;border:1px solid var(--cyan);border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.task-check.done{background:rgba(0,255,0,0.1);color:var(--green);border-color:var(--green)}
#task-in{width:100%;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:10px;border-radius:4px;font-family:monospace;font-size:13px;margin-bottom:8px}
#cy-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:#000;z-index:200;align-items:center;justify-content:center;flex-direction:column}
#cy-overlay.on{display:flex}
#cy-canvas{border:1px solid var(--border)}
.cy-hud{position:absolute;top:10px;left:10px;font-size:10px}
.cy-close{position:absolute;top:10px;right:10px;background:none;border:1px solid var(--red);color:var(--red);padding:6px 12px;font-family:monospace;cursor:pointer;border-radius:4px}
#nav{position:fixed;bottom:0;left:0;right:0;background:#000;border-top:1px solid var(--border);display:flex;z-index:100}
.nb{flex:1;padding:10px 5px;text-align:center;cursor:pointer;font-size:10px;color:#444;border:none;background:none;display:flex;flex-direction:column;align-items:center;gap:3px}
.nb.on{color:var(--cyan)}
.nb svg{width:22px;height:22px}
</style>
</head>
<body>

<!-- CYMATICS -->
<div id="cy-overlay">
  <canvas id="cy-canvas"></canvas>
  <div class="cy-hud">
    <div>[ L.Y.T. CYMATICS ]</div>
    <div id="cy-state">STATE: --</div>
    <div id="cy-omega">OMEGA: --</div>
    <div id="cy-bpm">BPM: --</div>
  </div>
  <button class="cy-close" onclick="closeCy()">✕ CLOSE</button>
</div>

<!-- HOME -->
<div class="screen active" id="s-home">
  <div class="header"><h1>L.Y.T.</h1><p>LUV YOU TRU — O.N.E. S.P.I.R.I.T.</p></div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">COHERENCE SCORE</div>
    <div class="score" id="h-score">0</div>
    <span class="level" id="h-level">LEVEL 1 — AWAKENING</span>
    <div class="progress-wrap"><div class="progress-fill" id="h-prog" style="width:0%"></div></div>
    <div style="font-size:10px;color:#444;text-align:center;margin-top:5px" id="h-next">14 points to Level 2</div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">CHAKRA ACTIVATION</div>
    <div class="chakras">
      <div class="chakra" style="color:#FF0000;border-color:#FF0000" id="ck1">1</div>
      <div class="chakra" style="color:#FF7F00;border-color:#FF7F00" id="ck2">2</div>
      <div class="chakra" style="color:#FFFF00;border-color:#FFFF00" id="ck3">3</div>
      <div class="chakra" style="color:#00FF00;border-color:#00FF00" id="ck4">4</div>
      <div class="chakra" style="color:#0088FF;border-color:#0088FF" id="ck5">5</div>
      <div class="chakra" style="color:#4B0082;border-color:#4B0082" id="ck6">6</div>
      <div class="chakra" style="color:#9B59B6;border-color:#9B59B6" id="ck7">7</div>
    </div>
    <canvas id="dna-c" width="280" height="180" style="display:block;margin:10px auto"></canvas>
  </div>
  <div class="stats">
    <div class="stat"><div class="stat-n" id="st-j">0</div><div class="stat-l">JOURNAL</div></div>
    <div class="stat"><div class="stat-n" id="st-c">0</div><div class="stat-l">CHATS</div></div>
    <div class="stat"><div class="stat-n" id="st-t">0</div><div class="stat-l">TASKS</div></div>
    <div class="stat"><div class="stat-n" id="st-o">0</div><div class="stat-l">OMEGA</div></div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">I.C.E. ENGINE</div>
    <div style="font-size:11px;color:#444;line-height:2.2">
      STATUS: <span id="eng-st" style="color:var(--green)">CHECKING...</span><br>
      METRIC C: <span id="eng-c" style="color:var(--gold)">--</span><br>
      V1: <span id="eng-v1">--</span> | V13: <span id="eng-v13">--</span>
    </div>
    <button class="btn" style="margin-top:10px" onclick="pingEngine()">PING I.C.E. ENGINE</button>
  </div>
</div>

<!-- CHAT -->
<div class="screen" id="s-chat">
  <div class="header"><h1>CHAT</h1><p>YOUR PERSONAL AI</p></div>
  <div class="panel" style="padding:10px">
    <div class="toggle-row">
      <span style="font-size:12px">AI GRADING</span>
      <label class="toggle"><input type="checkbox" id="grade-tog" onchange="toggleGrade()"><span class="slider"></span></label>
    </div>
  </div>
  <div class="vent" id="vent-msg">🌬 VENTING MODE — Not affecting coherence</div>
  <div id="sandbox-warn">⚠ I can only help you reflect on yourself. Tell me about YOU.</div>
  <div id="chat-msgs">
    <div class="msg ai">
      <div class="msg-bubble">Hey. I'm here for YOU — only you. What's on your mind?</div>
      <div class="msg-meta">ω=4 | L.Y.T. READY</div>
    </div>
  </div>
  <div class="chat-row">
    <input type="text" id="chat-in" placeholder="Talk to me..." onkeydown="if(event.key==='Enter')sendMsg()">
    <button class="mic" id="mic-b" onclick="toggleMic()">🎤</button>
    <button class="btn" style="width:auto;padding:10px 16px;margin:0" onclick="sendMsg()">SEND</button>
  </div>
</div>

<!-- JOURNAL -->
<div class="screen" id="s-journal">
  <div class="header"><h1>JOURNAL</h1><p>YOUR PRIVATE SPACE</p></div>
  <div class="panel" style="padding:10px">
    <div class="toggle-row">
      <span style="font-size:12px">AI REFLECTION (affects coherence)</span>
      <label class="toggle"><input type="checkbox" id="refl-tog"><span class="slider"></span></label>
    </div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">NEW ENTRY</div>
    <textarea id="journal-text" placeholder="Write freely. This is your space..."></textarea>
    <button class="btn" style="margin-top:8px" onclick="saveJournal()">SAVE ENTRY</button>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">PAST ENTRIES</div>
    <div id="j-list"><div style="color:#444;font-size:12px;text-align:center;padding:20px">Your entries appear here</div></div>
  </div>
</div>

<!-- FREQUENCY -->
<div class="screen" id="s-freq">
  <div class="header"><h1>FREQUENCY</h1><p>SOUND HEALING — GEOMETRIC RESONANCE</p></div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">BINAURAL BEATS</div>
    <div class="freq-btn" onclick="playFreq(40,'Gamma — Focus',this)"><span>GAMMA — Focus & Clarity</span><span class="freq-hz">40 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(10,'Alpha — Calm',this)"><span>ALPHA — Calm & Creative</span><span class="freq-hz">10 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(4,'Theta — Meditation',this)"><span>THETA — Deep Meditation</span><span class="freq-hz">4 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(1,'Delta — Sleep',this)"><span>DELTA — Deep Sleep</span><span class="freq-hz">1 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(528,'Solfeggio — Healing',this)"><span>SOLFEGGIO — DNA Healing</span><span class="freq-hz">528 Hz</span></div>
    <button class="btn btn-red" onclick="stopFreq()" style="margin-top:5px">■ STOP</button>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">CYMATICS</div>
    <button class="btn" onclick="openCy()">🎵 OPEN CYMATICS VISUALIZER</button>
    <p style="font-size:10px;color:#444;margin-top:5px">Shapes dance to your voice or music via I.C.E. omega states</p>
  </div>
</div>

<!-- TASKS -->
<div class="screen" id="s-tasks">
  <div class="header"><h1>TASKS</h1><p>EXECUTE YOUR INTENTIONS</p></div>
  <div class="panel" style="padding:10px">
    <div class="toggle-row">
      <span style="font-size:12px">BATCH MODE</span>
      <label class="toggle"><input type="checkbox" id="batch-tog"><span class="slider"></span></label>
    </div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">ADD TASK</div>
    <input type="text" id="task-in" placeholder="Add a task..." onkeydown="if(event.key==='Enter')addTask()">
    <button class="btn" onclick="addTask()">ADD TASK</button>
    <button class="btn btn-gold" onclick="execBatch()">▶ EXECUTE ALL</button>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">TASK QUEUE</div>
    <div id="t-list"><div style="color:#444;font-size:12px;text-align:center;padding:20px">No tasks yet</div></div>
  </div>
</div>

<!-- NAV -->
<div id="nav">
  <button class="nb on" onclick="goTo('home',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>HOME
  </button>
  <button class="nb" onclick="goTo('chat',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>CHAT
  </button>
  <button class="nb" onclick="goTo('journal',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M2 3h6a4 4 0 014 4v14a3 3 0 00-3-3H2z"/><path d="M22 3h-6a4 4 0 00-4 4v14a3 3 0 013-3h7z"/></svg>JOURNAL
  </button>
  <button class="nb" onclick="goTo('freq',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>FREQ
  </button>
  <button class="nb" onclick="goTo('tasks',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 11 12 14 22 4"/><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg>TASKS
  </button>
</div>

<script>
const API='https://penguin.tailee38d8.ts.net:8000';

// ICE ENGINE
function ice(v){
  const tau=Math.floor(Math.abs(v))%9||1;
  let lam=4,omega;
  if(tau%3===0) omega=(3*tau+lam)%9;
  else if(tau%3===1) omega=tau%9;
  else omega=Math.abs(2*tau-lam)%9;
  lam=1+(omega%8);
  return {tau,omega,lam,sn:omega*81+omega*9+omega};
}

function sandbox(txt){
  const bad=['he ','she ','they ','his ','her ','their ','my friend','my partner','my boss','someone else'];
  return !bad.some(b=>txt.toLowerCase().includes(b));
}

// STATE
let S={score:0,level:1,chakra:0,journals:[],chats:0,tasksDone:0,tasks:[],omega:0,grading:false,freqs:[]};

function load(){
  try{const d=localStorage.getItem('lyt');if(d)S=JSON.parse(d);}catch(e){}
  render();
}

function save(){localStorage.setItem('lyt',JSON.stringify(S));}

function calcScore(){
  return Math.min(Math.round(
    Math.min(S.journals.length*2,30)+
    Math.min(S.chats*1.5,30)+
    Math.min(S.tasksDone*2,20)+
    Math.min(S.freqs.length,20)
  ),100);
}

function getLevel(s){
  if(s>=85)return{n:5,name:'FULL COHERENCE'};
  if(s>=71)return{n:4,name:'INTEGRATION'};
  if(s>=42)return{n:3,name:'RESONANCE'};
  if(s>=14)return{n:2,name:'ALIGNMENT'};
  return{n:1,name:'AWAKENING'};
}

function getChakra(s){
  if(s>=100)return 7;if(s>=85)return 6;if(s>=71)return 5;
  if(s>=57)return 4;if(s>=42)return 3;if(s>=28)return 2;
  if(s>=14)return 1;return 0;
}

function render(){
  S.score=calcScore();
  const lv=getLevel(S.score);
  S.level=lv.n;S.chakra=getChakra(S.score);
  document.getElementById('h-score').textContent=S.score;
  document.getElementById('h-level').textContent=`LEVEL ${lv.n} — ${lv.name}`;
  document.getElementById('h-prog').style.width=S.score+'%';
  const th=[0,14,42,71,85,100];
  const diff=Math.max(0,(th[lv.n]||100)-S.score);
  document.getElementById('h-next').textContent=diff>0?`${diff} points to Level ${lv.n+1}`:'MAX COHERENCE';
  for(let i=1;i<=7;i++){
    const el=document.getElementById('ck'+i);
    i<=S.chakra?el.classList.add('on'):el.classList.remove('on');
  }
  document.getElementById('st-j').textContent=S.journals.length;
  document.getElementById('st-c').textContent=S.chats;
  document.getElementById('st-t').textContent=S.tasksDone;
  document.getElementById('st-o').textContent=S.omega;
  drawDNA();
}

function drawDNA(){
  const c=document.getElementById('dna-c');
  const ctx=c.getContext('2d');
  ctx.clearRect(0,0,c.width,c.height);
  const cx=c.width/2,H=c.height,amp=35,steps=20;
  const cc=['#FF0000','#FF7F00','#FFFF00','#00FF00','#0088FF','#4B0082','#9B59B6'];
  const cp=[0,3,6,9,12,15,18];
  for(let s=0;s<2;s++){
    const off=s===0?0:Math.PI;
    ctx.beginPath();
    for(let i=0;i<=steps;i++){
      const y=(H-20)*(i/steps)+10;
      const x=cx+amp*Math.sin((i/steps)*Math.PI*3+off);
      i===0?ctx.moveTo(x,y):ctx.lineTo(x,y);
    }
    ctx.strokeStyle=S.level>=5?'#FFD700':'#00ffff';
    ctx.lineWidth=2;ctx.globalAlpha=0.7;ctx.stroke();
  }
  for(let i=0;i<7;i++){
    const st=cp[i];
    const y=(H-20)*(st/steps)+10;
    const x1=cx+amp*Math.sin((st/steps)*Math.PI*3);
    const x2=cx+amp*Math.sin((st/steps)*Math.PI*3+Math.PI);
    ctx.globalAlpha=i<S.chakra?1:0.15;
    ctx.strokeStyle=cc[i];ctx.lineWidth=2;
    ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.stroke();
    ctx.fillStyle=cc[i];ctx.beginPath();
    ctx.arc((x1+x2)/2,y,i<S.chakra?5:3,0,Math.PI*2);ctx.fill();
  }
  ctx.globalAlpha=1;
}

async function pingEngine(){
  try{
    const r=await fetch(API+'/api/coherence/metric');
    const d=await r.json();
    document.getElementById('eng-st').textContent=d.status;
    document.getElementById('eng-st').style.color=d.status==='PASS'?'var(--green)':'var(--red)';
    document.getElementById('eng-c').textContent=d.C;
    document.getElementById('eng-v1').textContent=d.v1;
    document.getElementById('eng-v13').textContent=d.v13;
  }catch(e){
    document.getElementById('eng-st').textContent='OFFLINE — Engine not reachable';
    document.getElementById('eng-st').style.color='var(--red)';
  }
}

// CHAT
function toggleGrade(){
  S.grading=document.getElementById('grade-tog').checked;
  document.getElementById('vent-msg').style.display=S.grading?'none':'block';
  save();
}

async function sendMsg(){
  const inp=document.getElementById('chat-in');
  const msg=inp.value.trim();if(!msg)return;
  if(!sandbox(msg)){
    const w=document.getElementById('sandbox-warn');
    w.style.display='block';setTimeout(()=>w.style.display='none',4000);return;
  }
  addMsg('user',msg,null);inp.value='';
  const r=ice(msg.charCodeAt(0));S.omega=r.omega;
  let resp='';
  try{
    const res=await fetch(API+'/api/ollama',{method:'POST',
      headers:{'Content-Type':'application/json'},
      body:JSON.stringify({prompt:msg})});
    const d=await res.json();
    resp=d.response||localResp(msg,r);
    addMsg('ai',resp,{omega:d.omegas?d.omegas[0]:r.omega,sn:d.state||r.sn});
  }catch(e){
    resp=localResp(msg,r);
    addMsg('ai',resp,r);
  }
  if(S.grading){S.chats++;render();save();}
}

function localResp(msg,r){
  const rs=[
    `Through state ${r.sn}, I feel what you're carrying. Tell me more.`,
    `ω=${r.omega} — your energy is real. What does that feel like inside?`,
    `I'm with you. τ=${r.tau}, ω=${r.omega}. Your coherence is growing. Keep going.`,
    `Luv you tru. What you just shared matters. What's underneath that?`,
    `State ${r.sn} activated. I'm here. What do YOU need right now?`
  ];
  return rs[r.omega%rs.length];
}

function addMsg(role,text,r){
  const div=document.createElement('div');
  div.className='msg '+role;
  div.innerHTML=`<div class="msg-bubble">${text}</div>${r?`<div class="msg-meta">ω=${r.omega} | s_n=${r.sn||r.stateIndex||'--'}</div>`:''}`;
  const msgs=document.getElementById('chat-msgs');
  msgs.appendChild(div);msgs.scrollTop=msgs.scrollHeight;
}

// JOURNAL
function saveJournal(){
  const txt=document.getElementById('journal-text').value.trim();
  if(!txt)return;
  const ai=document.getElementById('refl-tog').checked;
  const r=ice(txt.length);
  S.journals.unshift({txt,ai,omega:r.omega,date:new Date().toLocaleDateString()});
  document.getElementById('journal-text').value='';
  renderJ();render();save();
}

function renderJ(){
  const el=document.getElementById('j-list');
  if(!S.journals.length){el.innerHTML='<div style="color:#444;font-size:12px;text-align:center;padding:20px">Your entries appear here</div>';return;}
  el.innerHTML=S.journals.slice(0,5).map(e=>`
    <div class="j-entry">
      <div class="j-date">${e.date} | ω=${e.omega} | ${e.ai?'AI ON':'PRIVATE'}</div>
      <div>${e.txt.substring(0,120)}${e.txt.length>120?'...':''}</div>
    </div>`).join('');
}

// TASKS
function addTask(){
  const inp=document.getElementById('task-in');
  const t=inp.value.trim();if(!t)return;
  S.tasks.push({t,done:false,id:Date.now()});
  inp.value='';renderT();save();
}

function toggleTask(id){
  const task=S.tasks.find(x=>x.id===id);if(!task)return;
  task.done=!task.done;
  S.tasksDone=S.tasks.filter(x=>x.done).length;
  renderT();render();save();
}

function renderT(){
  const el=document.getElementById('t-list');
  if(!S.tasks.length){el.innerHTML='<div style="color:#444;font-size:12px;text-align:center;padding:20px">No tasks yet</div>';return;}
  el.innerHTML=S.tasks.map(t=>`
    <div class="task-item">
      <div class="task-check ${t.done?'done':''}" onclick="toggleTask(${t.id})">${t.done?'✓':''}</div>
      <span style="${t.done?'text-decoration:line-through;color:#444':''}">${t.t}</span>
    </div>`).join('');
}

async function execBatch(){
  const pending=S.tasks.filter(t=>!t.done);
  for(const t of pending){await new Promise(r=>setTimeout(r,600));toggleTask(t.id);}
}

// FREQUENCY
let fCtx=null;
function playFreq(hz,name,btn){
  stopFreq();
  fCtx=new AudioContext();
  const oL=fCtx.createOscillator(),gL=fCtx.createGain(),m=fCtx.createChannelMerger(2);
  oL.frequency.value=200;gL.gain.value=0.3;
  oL.connect(gL);gL.connect(m,0,0);
  const oR=fCtx.createOscillator(),gR=fCtx.createGain();
  oR.frequency.value=200+hz;gR.gain.value=0.3;
  oR.connect(gR);gR.connect(m,0,1);
  m.connect(fCtx.destination);
  oL.start();oR.start();
  document.querySelectorAll('.freq-btn').forEach(b=>b.classList.remove('on'));
  btn.classList.add('on');
  S.freqs.push({name,hz});render();save();
  setTimeout(stopFreq,300000);
}

function stopFreq(){
  if(fCtx){fCtx.close();fCtx=null;}
  document.querySelectorAll('.freq-btn').forEach(b=>b.classList.remove('on'));
}

// CYMATICS
let cACtx,cAn,cMic,cRun=false,cRot=0,cPulse=1,cPVel=0,cBH=[],cBT=[],cLB=0;

function openCy(){
  const ov=document.getElementById('cy-overlay');
  ov.classList.add('on');
  const cv=document.getElementById('cy-canvas');
  const sz=Math.min(window.innerWidth,window.innerHeight)-40;
  cv.width=sz;cv.height=sz;
  startCy();
}

function closeCy(){
  document.getElementById('cy-overlay').classList.remove('on');
  stopCy();
}

async function startCy(){
  try{
    cACtx=new AudioContext();cAn=cACtx.createAnalyser();
    cAn.fftSize=4096;cAn.smoothingTimeConstant=0.75;
    cMic=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:false,noiseSuppression:false,autoGainControl:false}});
    cACtx.createMediaStreamSource(cMic).connect(cAn);
    cRun=true;drawCy();
  }catch(e){alert('Allow microphone for cymatics');}
}

function stopCy(){
  cRun=false;
  if(cMic)cMic.getTracks().forEach(t=>t.stop());
  if(cACtx)cACtx.close();
}

function drawCy(){
  if(!cRun)return;
  const cv=document.getElementById('cy-canvas');
  const ctx=cv.getContext('2d');
  const fr=new Uint8Array(cAn.frequencyBinCount);
  cAn.getByteFrequencyData(fr);
  const be=Math.floor(fr.length*0.1);
  let bass=0,mid=0;
  for(let i=0;i<be;i++)bass+=fr[i];
  for(let i=be;i<fr.length*0.5;i++)mid+=fr[i];
  bass/=be;mid/=(fr.length*0.4);
  cBH.push(bass);if(cBH.length>43)cBH.shift();
  const avg=cBH.reduce((a,b)=>a+b,0)/cBH.length;
  const beat=bass>avg*1.5&&bass>100&&(Date.now()-cLB)>300;
  if(beat){cLB=Date.now();cBT.push(cLB);if(cBT.length>8)cBT.shift();cPVel=0.4;}
  const r=ice(bass/10);S.omega=r.omega;
  cPVel*=0.85;cPulse+=cPVel;cPulse+=(1-cPulse)*0.1;
  cRot+=0.003+(mid/255)*0.01+(beat?0.05:0);
  ctx.fillStyle='rgba(0,0,0,0.08)';ctx.fillRect(0,0,cv.width,cv.height);
  const cx=cv.width/2,cy=cv.height/2;
  const sides=3+r.omega;
  const rad=(Math.min(cx,cy)*0.6)*cPulse+(bass/255)*60;
  const hue=180+r.omega*15;
  const c1=`hsl(${hue},100%,60%)`,c2=`hsl(${hue+30},100%,40%)`;
  for(let layer=0;layer<4;layer++){
    const lr=rad*(1-layer*0.2),ls=sides+layer,lrot=cRot*(1+layer*0.3);
    const pts=[];
    for(let i=0;i<ls;i++){
      const ang=(2*Math.PI*i/ls)+lrot;
      const fi=Math.floor(i*fr.length/ls);
      const mod=(fr[fi]/255)*35;
      pts.push({x:cx+(lr+mod)*Math.cos(ang),y:cy+(lr+mod)*Math.sin(ang)});
    }
    ctx.strokeStyle=layer===0?c1:c2;ctx.lineWidth=Math.max(0.5,2.5-layer);ctx.globalAlpha=1-layer*0.2;
    ctx.beginPath();ctx.moveTo(pts[0].x,pts[0].y);pts.forEach(p=>ctx.lineTo(p.x,p.y));ctx.closePath();ctx.stroke();
    if(beat&&layer===0){
      ctx.strokeStyle='rgba(0,255,255,0.2)';ctx.lineWidth=0.5;
      for(let i=0;i<pts.length;i++)for(let j=i+2;j<pts.length;j++){
        ctx.beginPath();ctx.moveTo(pts[i].x,pts[i].y);ctx.lineTo(pts[j].x,pts[j].y);ctx.stroke();
      }
    }
    for(let ring=1;ring<=3;ring++){
      ctx.strokeStyle=c1;ctx.lineWidth=0.5;ctx.globalAlpha=0.15;
      ctx.beginPath();pts.forEach((p,i)=>{const ip={x:cx+(p.x-cx)*(ring/4),y:cy+(p.y-cy)*(ring/4)};i===0?ctx.moveTo(ip.x,ip.y):ctx.lineTo(ip.x,ip.y);});
      ctx.closePath();ctx.stroke();
    }
  }
  ctx.globalAlpha=1;
  if(beat){const g=ctx.createRadialGradient(cx,cy,0,cx,cy,80);g.addColorStop(0,'rgba(0,255,255,0.5)');g.addColorStop(1,'rgba(0,0,0,0)');ctx.fillStyle=g;ctx.beginPath();ctx.arc(cx,cy,80,0,Math.PI*2);ctx.fill();}
  const mpts=[];
  for(let i=0;i<sides;i++){const ang=(2*Math.PI*i/sides)+cRot;const fi=Math.floor(i*fr.length/sides);mpts.push({x:cx+(rad+(fr[fi]/255)*35)*Math.cos(ang),y:cy+(rad+(fr[fi]/255)*35)*Math.sin(ang)});}
  ctx.fillStyle=c1;mpts.forEach(p=>{ctx.beginPath();ctx.arc(p.x,p.y,beat?5:3,0,Math.PI*2);ctx.fill();});
  let bpm=0;
  if(cBT.length>1){const g=[];for(let i=1;i<cBT.length;i++)g.push(cBT[i]-cBT[i-1]);bpm=Math.round(60000/(g.reduce((a,b)=>a+b,0)/g.length));}
  document.getElementById('cy-state').textContent=`s_n=${r.sn}`;
  document.getElementById('cy-omega').textContent=`τ=${r.tau} ω=${r.omega} λ=${r.lam}`;
  document.getElementById('cy-bpm').textContent=`BPM:${bpm||'--'} BASS:${Math.round(bass)}`;
  requestAnimationFrame(drawCy);
}

// MIC CHAT
let micOn=false;
function toggleMic(){
  micOn=!micOn;
  document.getElementById('mic-b').classList.toggle('on',micOn);
  micOn?openCy():closeCy();
}

// NAV
function goTo(name,btn){
  document.querySelectorAll('.screen').forEach(s=>s.classList.remove('active'));
  document.querySelectorAll('.nb').forEach(b=>b.classList.remove('on'));
  document.getElementById('s-'+name).classList.add('active');
  btn.classList.add('on');
  if(name==='journal')renderJ();
  if(name==='tasks')renderT();
}

// INIT
load();
pingEngine();
setInterval(pingEngine,30000);
setInterval(()=>{render();save();},10000);
</script>
</body>
</html>
EOF

cat > /home/drrone/lyt_app.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>L.Y.T. — Luv You Tru</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
:root{--bg:#000;--cyan:#00ffff;--purple:#9B59B6;--gold:#FFD700;--green:#00ff00;--red:#ff0000;--panel:#0f0f2a;--border:#1a1a3a}
body{background:var(--bg);color:var(--cyan);font-family:monospace;padding-bottom:70px;min-height:100vh}
.screen{display:none;padding:15px}
.screen.active{display:block}
.header{text-align:center;padding:15px 0;border-bottom:1px solid var(--border);margin-bottom:15px}
.header h1{font-size:24px;letter-spacing:4px}
.header p{font-size:10px;color:#444;margin-top:4px}
.panel{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:15px;margin-bottom:15px;position:relative}
.panel-title{font-size:10px;color:#444;letter-spacing:2px;margin-bottom:10px}
.corner{position:absolute;width:8px;height:8px;border-color:var(--cyan);border-style:solid}
.tl{top:4px;left:4px;border-width:1px 0 0 1px}.tr{top:4px;right:4px;border-width:1px 1px 0 0}
.bl{bottom:4px;left:4px;border-width:0 0 1px 1px}.br{bottom:4px;right:4px;border-width:0 1px 1px 0}
.btn{width:100%;padding:12px;border:1px solid var(--cyan);background:none;color:var(--cyan);font-family:monospace;font-size:13px;border-radius:4px;cursor:pointer;margin-bottom:8px;letter-spacing:1px}
.btn:active{background:var(--cyan);color:#000}
.btn-gold{border-color:var(--gold);color:var(--gold)}.btn-gold:active{background:var(--gold);color:#000}
.btn-purple{border-color:var(--purple);color:var(--purple)}.btn-purple:active{background:var(--purple);color:#fff}
.btn-red{border-color:var(--red);color:var(--red)}
.score{font-size:56px;text-align:center;color:var(--gold);text-shadow:0 0 20px var(--gold);line-height:1;margin:10px 0}
.level{display:block;text-align:center;background:var(--purple);color:#fff;padding:4px 12px;border-radius:20px;font-size:11px;width:fit-content;margin:8px auto}
.progress-wrap{background:#111;border-radius:4px;height:6px;margin:8px 0}
.progress-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,var(--purple),var(--cyan));transition:width 1s}
.chakras{display:flex;justify-content:center;gap:8px;margin:10px 0}
.chakra{width:30px;height:30px;border-radius:50%;border:2px solid #222;display:flex;align-items:center;justify-content:center;font-size:10px;transition:all 0.5s;opacity:0.2}
.chakra.on{opacity:1;box-shadow:0 0 12px currentColor}
.stats{display:flex;gap:8px;margin-bottom:15px}
.stat{flex:1;background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;text-align:center}
.stat-n{font-size:24px;color:var(--cyan)}.stat-l{font-size:9px;color:#444;margin-top:2px}
.toggle-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--border)}
.toggle{position:relative;width:44px;height:24px}
.toggle input{opacity:0;width:0;height:0}
.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background:#222;border-radius:24px;transition:.3s}
.slider:before{content:"";position:absolute;width:18px;height:18px;left:3px;bottom:3px;background:#444;border-radius:50%;transition:.3s}
input:checked+.slider{background:var(--cyan)}
input:checked+.slider:before{background:#000;transform:translateX(20px)}
#chat-msgs{height:calc(100vh - 340px);overflow-y:auto;padding:10px;margin-bottom:10px}
.msg{margin-bottom:12px;max-width:85%}
.msg.user{margin-left:auto;text-align:right}
.msg-bubble{padding:10px 14px;border-radius:12px;font-size:13px;line-height:1.5}
.msg.user .msg-bubble{background:var(--purple);color:#fff}
.msg.ai .msg-bubble{background:var(--panel);border:1px solid var(--border)}
.msg-meta{font-size:9px;color:#444;margin-top:3px}
.chat-row{display:flex;gap:8px;align-items:center}
#chat-in{flex:1;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:10px;border-radius:4px;font-family:monospace;font-size:13px}
.mic{width:44px;height:44px;border:1px solid var(--cyan);background:none;border-radius:50%;cursor:pointer;color:var(--cyan);font-size:18px;flex-shrink:0}
.mic.on{border-color:var(--red);color:var(--red);animation:pulse 1s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(255,0,0,0.4)}50%{box-shadow:0 0 0 8px rgba(255,0,0,0)}}
#sandbox-warn{display:none;background:#1a0000;border:1px solid var(--red);border-radius:8px;padding:12px;margin-bottom:10px;font-size:12px;color:var(--red)}
.vent{background:#1a0a00;border:1px solid #ff7f00;border-radius:4px;padding:8px;margin-bottom:10px;font-size:11px;color:#ff7f00;text-align:center}
#journal-text{width:100%;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:12px;border-radius:4px;font-family:monospace;font-size:13px;min-height:150px;resize:none}
.j-entry{background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;margin-bottom:8px;font-size:12px}
.j-date{font-size:10px;color:#444;margin-bottom:5px}
.freq-btn{background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:12px;border-radius:8px;margin-bottom:8px;cursor:pointer;width:100%;text-align:left;font-family:monospace;font-size:12px;display:flex;align-items:center;justify-content:space-between}
.freq-btn.on{border-color:var(--cyan);background:rgba(0,255,255,0.1)}
.freq-hz{color:var(--gold);font-size:11px}
.task-item{background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:10px;margin-bottom:8px;display:flex;align-items:center;gap:10px;font-size:13px}
.task-check{width:22px;height:22px;border:1px solid var(--cyan);border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.task-check.done{background:rgba(0,255,0,0.1);color:var(--green);border-color:var(--green)}
#task-in{width:100%;background:var(--panel);border:1px solid var(--border);color:var(--cyan);padding:10px;border-radius:4px;font-family:monospace;font-size:13px;margin-bottom:8px}
#cy-overlay{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:#000;z-index:200;align-items:center;justify-content:center;flex-direction:column}
#cy-overlay.on{display:flex}
#cy-canvas{border:1px solid var(--border)}
.cy-hud{position:absolute;top:10px;left:10px;font-size:10px}
.cy-close{position:absolute;top:10px;right:10px;background:none;border:1px solid var(--red);color:var(--red);padding:6px 12px;font-family:monospace;cursor:pointer;border-radius:4px}
#nav{position:fixed;bottom:0;left:0;right:0;background:#000;border-top:1px solid var(--border);display:flex;z-index:100}
.nb{flex:1;padding:10px 5px;text-align:center;cursor:pointer;font-size:10px;color:#444;border:none;background:none;display:flex;flex-direction:column;align-items:center;gap:3px}
.nb.on{color:var(--cyan)}
.nb svg{width:22px;height:22px}
</style>
</head>
<body>

<!-- CYMATICS -->
<div id="cy-overlay">
  <canvas id="cy-canvas"></canvas>
  <div class="cy-hud">
    <div>[ L.Y.T. CYMATICS ]</div>
    <div id="cy-state">STATE: --</div>
    <div id="cy-omega">OMEGA: --</div>
    <div id="cy-bpm">BPM: --</div>
  </div>
  <button class="cy-close" onclick="closeCy()">✕ CLOSE</button>
</div>

<!-- HOME -->
<div class="screen active" id="s-home">
  <div class="header"><h1>L.Y.T.</h1><p>LUV YOU TRU — O.N.E. S.P.I.R.I.T.</p></div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">COHERENCE SCORE</div>
    <div class="score" id="h-score">0</div>
    <span class="level" id="h-level">LEVEL 1 — AWAKENING</span>
    <div class="progress-wrap"><div class="progress-fill" id="h-prog" style="width:0%"></div></div>
    <div style="font-size:10px;color:#444;text-align:center;margin-top:5px" id="h-next">14 points to Level 2</div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">CHAKRA ACTIVATION</div>
    <div class="chakras">
      <div class="chakra" style="color:#FF0000;border-color:#FF0000" id="ck1">1</div>
      <div class="chakra" style="color:#FF7F00;border-color:#FF7F00" id="ck2">2</div>
      <div class="chakra" style="color:#FFFF00;border-color:#FFFF00" id="ck3">3</div>
      <div class="chakra" style="color:#00FF00;border-color:#00FF00" id="ck4">4</div>
      <div class="chakra" style="color:#0088FF;border-color:#0088FF" id="ck5">5</div>
      <div class="chakra" style="color:#4B0082;border-color:#4B0082" id="ck6">6</div>
      <div class="chakra" style="color:#9B59B6;border-color:#9B59B6" id="ck7">7</div>
    </div>
    <canvas id="dna-c" width="280" height="180" style="display:block;margin:10px auto"></canvas>
  </div>
  <div class="stats">
    <div class="stat"><div class="stat-n" id="st-j">0</div><div class="stat-l">JOURNAL</div></div>
    <div class="stat"><div class="stat-n" id="st-c">0</div><div class="stat-l">CHATS</div></div>
    <div class="stat"><div class="stat-n" id="st-t">0</div><div class="stat-l">TASKS</div></div>
    <div class="stat"><div class="stat-n" id="st-o">0</div><div class="stat-l">OMEGA</div></div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">I.C.E. ENGINE</div>
    <div style="font-size:11px;color:#444;line-height:2.2">
      STATUS: <span id="eng-st" style="color:var(--green)">CHECKING...</span><br>
      METRIC C: <span id="eng-c" style="color:var(--gold)">--</span><br>
      V1: <span id="eng-v1">--</span> | V13: <span id="eng-v13">--</span>
    </div>
    <button class="btn" style="margin-top:10px" onclick="pingEngine()">PING I.C.E. ENGINE</button>
  </div>
</div>

<!-- CHAT -->
<div class="screen" id="s-chat">
  <div class="header"><h1>CHAT</h1><p>YOUR PERSONAL AI</p></div>
  <div class="panel" style="padding:10px">
    <div class="toggle-row">
      <span style="font-size:12px">AI GRADING</span>
      <label class="toggle"><input type="checkbox" id="grade-tog" onchange="toggleGrade()"><span class="slider"></span></label>
    </div>
  </div>
  <div class="vent" id="vent-msg">🌬 VENTING MODE — Not affecting coherence</div>
  <div id="sandbox-warn">⚠ I can only help you reflect on yourself. Tell me about YOU.</div>
  <div id="chat-msgs">
    <div class="msg ai">
      <div class="msg-bubble">Hey. I'm here for YOU — only you. What's on your mind?</div>
      <div class="msg-meta">ω=4 | L.Y.T. READY</div>
    </div>
  </div>
  <div class="chat-row">
    <input type="text" id="chat-in" placeholder="Talk to me..." onkeydown="if(event.key==='Enter')sendMsg()">
    <button class="mic" id="mic-b" onclick="toggleMic()">🎤</button>
    <button class="btn" style="width:auto;padding:10px 16px;margin:0" onclick="sendMsg()">SEND</button>
  </div>
</div>

<!-- JOURNAL -->
<div class="screen" id="s-journal">
  <div class="header"><h1>JOURNAL</h1><p>YOUR PRIVATE SPACE</p></div>
  <div class="panel" style="padding:10px">
    <div class="toggle-row">
      <span style="font-size:12px">AI REFLECTION (affects coherence)</span>
      <label class="toggle"><input type="checkbox" id="refl-tog"><span class="slider"></span></label>
    </div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">NEW ENTRY</div>
    <textarea id="journal-text" placeholder="Write freely. This is your space..."></textarea>
    <button class="btn" style="margin-top:8px" onclick="saveJournal()">SAVE ENTRY</button>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">PAST ENTRIES</div>
    <div id="j-list"><div style="color:#444;font-size:12px;text-align:center;padding:20px">Your entries appear here</div></div>
  </div>
</div>

<!-- FREQUENCY -->
<div class="screen" id="s-freq">
  <div class="header"><h1>FREQUENCY</h1><p>SOUND HEALING — GEOMETRIC RESONANCE</p></div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">BINAURAL BEATS</div>
    <div class="freq-btn" onclick="playFreq(40,'Gamma — Focus',this)"><span>GAMMA — Focus & Clarity</span><span class="freq-hz">40 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(10,'Alpha — Calm',this)"><span>ALPHA — Calm & Creative</span><span class="freq-hz">10 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(4,'Theta — Meditation',this)"><span>THETA — Deep Meditation</span><span class="freq-hz">4 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(1,'Delta — Sleep',this)"><span>DELTA — Deep Sleep</span><span class="freq-hz">1 Hz</span></div>
    <div class="freq-btn" onclick="playFreq(528,'Solfeggio — Healing',this)"><span>SOLFEGGIO — DNA Healing</span><span class="freq-hz">528 Hz</span></div>
    <button class="btn btn-red" onclick="stopFreq()" style="margin-top:5px">■ STOP</button>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">CYMATICS</div>
    <button class="btn" onclick="openCy()">🎵 OPEN CYMATICS VISUALIZER</button>
    <p style="font-size:10px;color:#444;margin-top:5px">Shapes dance to your voice or music via I.C.E. omega states</p>
  </div>
</div>

<!-- TASKS -->
<div class="screen" id="s-tasks">
  <div class="header"><h1>TASKS</h1><p>EXECUTE YOUR INTENTIONS</p></div>
  <div class="panel" style="padding:10px">
    <div class="toggle-row">
      <span style="font-size:12px">BATCH MODE</span>
      <label class="toggle"><input type="checkbox" id="batch-tog"><span class="slider"></span></label>
    </div>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">ADD TASK</div>
    <input type="text" id="task-in" placeholder="Add a task..." onkeydown="if(event.key==='Enter')addTask()">
    <button class="btn" onclick="addTask()">ADD TASK</button>
    <button class="btn btn-gold" onclick="execBatch()">▶ EXECUTE ALL</button>
  </div>
  <div class="panel">
    <div class="corner tl"></div><div class="corner tr"></div><div class="corner bl"></div><div class="corner br"></div>
    <div class="panel-title">TASK QUEUE</div>
    <div id="t-list"><div style="color:#444;font-size:12px;text-align:center;padding:20px">No tasks yet</div></div>
  </div>
</div>

<!-- NAV -->
<div id="nav">
  <button class="nb on" onclick="goTo('home',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>HOME
  </button>
  <button class="nb" onclick="goTo('chat',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>CHAT
  </button>
  <button class="nb" onclick="goTo('journal',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M2 3h6a4 4 0 014 4v14a3 3 0 00-3-3H2z"/><path d="M22 3h-6a4 4 0 00-4 4v14a3 3 0 013-3h7z"/></svg>JOURNAL
  </button>
  <button class="nb" onclick="goTo('freq',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>FREQ
  </button>
  <button class="nb" onclick="goTo('tasks',this)">
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 11 12 14 22 4"/><path d="M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg>TASKS
  </button>
</div>

<script>
const API='https://penguin.tailee38d8.ts.net:8000';

// ICE ENGINE
function ice(v){
  const tau=Math.floor(Math.abs(v))%9||1;
  let lam=4,omega;
  if(tau%3===0) omega=(3*tau+lam)%9;
  else if(tau%3===1) omega=tau%9;
  else omega=Math.abs(2*tau-lam)%9;
  lam=1+(omega%8);
  return {tau,omega,lam,sn:omega*81+omega*9+omega};
}

function sandbox(txt){
  const bad=['he ','she ','they ','his ','her ','their ','my friend','my partner','my boss','someone else'];
  return !bad.some(b=>txt.toLowerCase().includes(b));
}

// STATE
let S={score:0,level:1,chakra:0,journals:[],chats:0,tasksDone:0,tasks:[],omega:0,grading:false,freqs:[]};

function load(){
  try{const d=localStorage.getItem('lyt');if(d)S=JSON.parse(d);}catch(e){}
  render();
}

function save(){localStorage.setItem('lyt',JSON.stringify(S));}

function calcScore(){
  return Math.min(Math.round(
    Math.min(S.journals.length*2,30)+
    Math.min(S.chats*1.5,30)+
    Math.min(S.tasksDone*2,20)+
    Math.min(S.freqs.length,20)
  ),100);
}

function getLevel(s){
  if(s>=85)return{n:5,name:'FULL COHERENCE'};
  if(s>=71)return{n:4,name:'INTEGRATION'};
  if(s>=42)return{n:3,name:'RESONANCE'};
  if(s>=14)return{n:2,name:'ALIGNMENT'};
  return{n:1,name:'AWAKENING'};
}

function getChakra(s){
  if(s>=100)return 7;if(s>=85)return 6;if(s>=71)return 5;
  if(s>=57)return 4;if(s>=42)return 3;if(s>=28)return 2;
  if(s>=14)return 1;return 0;
}

function render(){
  S.score=calcScore();
  const lv=getLevel(S.score);
  S.level=lv.n;S.chakra=getChakra(S.score);
  document.getElementById('h-score').textContent=S.score;
  document.getElementById('h-level').textContent=`LEVEL ${lv.n} — ${lv.name}`;
  document.getElementById('h-prog').style.width=S.score+'%';
  const th=[0,14,42,71,85,100];
  const diff=Math.max(0,(th[lv.n]||100)-S.score);
  document.getElementById('h-next').textContent=diff>0?`${diff} points to Level ${lv.n+1}`:'MAX COHERENCE';
  for(let i=1;i<=7;i++){
    const el=document.getElementById('ck'+i);
    i<=S.chakra?el.classList.add('on'):el.classList.remove('on');
  }
  document.getElementById('st-j').textContent=S.journals.length;
  document.getElementById('st-c').textContent=S.chats;
  document.getElementById('st-t').textContent=S.tasksDone;
  document.getElementById('st-o').textContent=S.omega;
  drawDNA();
}

function drawDNA(){
  const c=document.getElementById('dna-c');
  const ctx=c.getContext('2d');
  ctx.clearRect(0,0,c.width,c.height);
  const cx=c.width/2,H=c.height,amp=35,steps=20;
  const cc=['#FF0000','#FF7F00','#FFFF00','#00FF00','#0088FF','#4B0082','#9B59B6'];
  const cp=[0,3,6,9,12,15,18];
  for(let s=0;s<2;s++){
    const off=s===0?0:Math.PI;
    ctx.beginPath();
    for(let i=0;i<=steps;i++){
      const y=(H-20)*(i/steps)+10;
      const x=cx+amp*Math.sin((i/steps)*Math.PI*3+off);
      i===0?ctx.moveTo(x,y):ctx.lineTo(x,y);
    }
    ctx.strokeStyle=S.level>=5?'#FFD700':'#00ffff';
    ctx.lineWidth=2;ctx.globalAlpha=0.7;ctx.stroke();
  }
  for(let i=0;i<7;i++){
    const st=cp[i];
    const y=(H-20)*(st/steps)+10;
    const x1=cx+amp*Math.sin((st/steps)*Math.PI*3);
    const x2=cx+amp*Math.sin((st/steps)*Math.PI*3+Math.PI);
    ctx.globalAlpha=i<S.chakra?1:0.15;
    ctx.strokeStyle=cc[i];ctx.lineWidth=2;
    ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.stroke();
    ctx.fillStyle=cc[i];ctx.beginPath();
    ctx.arc((x1+x2)/2,y,i<S.chakra?5:3,0,Math.PI*2);ctx.fill();
  }
  ctx.globalAlpha=1;
}

async function pingEngine(){
  try{
    const r=await fetch(API+'/api/coherence/metric');
    const d=await r.json();
    document.getElementById('eng-st').textContent=d.status;
    document.getElementById('eng-st').style.color=d.status==='PASS'?'var(--green)':'var(--red)';
    document.getElementById('eng-c').textContent=d.C;
    document.getElementById('eng-v1').textContent=d.v1;
    document.getElementById('eng-v13').textContent=d.v13;
  }catch(e){
    document.getElementById('eng-st').textContent='OFFLINE — Engine not reachable';
    document.getElementById('eng-st').style.color='var(--red)';
  }
}

// CHAT
function toggleGrade(){
  S.grading=document.getElementById('grade-tog').checked;
  document.getElementById('vent-msg').style.display=S.grading?'none':'block';
  save();
}

async function sendMsg(){
  const inp=document.getElementById('chat-in');
  const msg=inp.value.trim();if(!msg)return;
  if(!sandbox(msg)){
    const w=document.getElementById('sandbox-warn');
    w.style.display='block';setTimeout(()=>w.style.display='none',4000);return;
  }
  addMsg('user',msg,null);inp.value='';
  const r=ice(msg.charCodeAt(0));S.omega=r.omega;
  let resp='';
  try{
    const res=await fetch(API+'/api/ollama',{method:'POST',
      headers:{'Content-Type':'application/json'},
      body:JSON.stringify({prompt:msg})});
    const d=await res.json();
    resp=d.response||localResp(msg,r);
    addMsg('ai',resp,{omega:d.omegas?d.omegas[0]:r.omega,sn:d.state||r.sn});
  }catch(e){
    resp=localResp(msg,r);
    addMsg('ai',resp,r);
  }
  if(S.grading){S.chats++;render();save();}
}

function localResp(msg,r){
  const rs=[
    `Through state ${r.sn}, I feel what you're carrying. Tell me more.`,
    `ω=${r.omega} — your energy is real. What does that feel like inside?`,
    `I'm with you. τ=${r.tau}, ω=${r.omega}. Your coherence is growing. Keep going.`,
    `Luv you tru. What you just shared matters. What's underneath that?`,
    `State ${r.sn} activated. I'm here. What do YOU need right now?`
  ];
  return rs[r.omega%rs.length];
}

function addMsg(role,text,r){
  const div=document.createElement('div');
  div.className='msg '+role;
  div.innerHTML=`<div class="msg-bubble">${text}</div>${r?`<div class="msg-meta">ω=${r.omega} | s_n=${r.sn||r.stateIndex||'--'}</div>`:''}`;
  const msgs=document.getElementById('chat-msgs');
  msgs.appendChild(div);msgs.scrollTop=msgs.scrollHeight;
}

// JOURNAL
function saveJournal(){
  const txt=document.getElementById('journal-text').value.trim();
  if(!txt)return;
  const ai=document.getElementById('refl-tog').checked;
  const r=ice(txt.length);
  S.journals.unshift({txt,ai,omega:r.omega,date:new Date().toLocaleDateString()});
  document.getElementById('journal-text').value='';
  renderJ();render();save();
}

function renderJ(){
  const el=document.getElementById('j-list');
  if(!S.journals.length){el.innerHTML='<div style="color:#444;font-size:12px;text-align:center;padding:20px">Your entries appear here</div>';return;}
  el.innerHTML=S.journals.slice(0,5).map(e=>`
    <div class="j-entry">
      <div class="j-date">${e.date} | ω=${e.omega} | ${e.ai?'AI ON':'PRIVATE'}</div>
      <div>${e.txt.substring(0,120)}${e.txt.length>120?'...':''}</div>
    </div>`).join('');
}

// TASKS
function addTask(){
  const inp=document.getElementById('task-in');
  const t=inp.value.trim();if(!t)return;
  S.tasks.push({t,done:false,id:Date.now()});
  inp.value='';renderT();save();
}

function toggleTask(id){
  const task=S.tasks.find(x=>x.id===id);if(!task)return;
  task.done=!task.done;
  S.tasksDone=S.tasks.filter(x=>x.done).length;
  renderT();render();save();
}

function renderT(){
  const el=document.getElementById('t-list');
  if(!S.tasks.length){el.innerHTML='<div style="color:#444;font-size:12px;text-align:center;padding:20px">No tasks yet</div>';return;}
  el.innerHTML=S.tasks.map(t=>`
    <div class="task-item">
      <div class="task-check ${t.done?'done':''}" onclick="toggleTask(${t.id})">${t.done?'✓':''}</div>
      <span style="${t.done?'text-decoration:line-through;color:#444':''}">${t.t}</span>
    </div>`).join('');
}

async function execBatch(){
  const pending=S.tasks.filter(t=>!t.done);
  for(const t of pending){await new Promise(r=>setTimeout(r,600));toggleTask(t.id);}
}

// FREQUENCY
let fCtx=null;
function playFreq(hz,name,btn){
  stopFreq();
  fCtx=new AudioContext();
  const oL=fCtx.createOscillator(),gL=fCtx.createGain(),m=fCtx.createChannelMerger(2);
  oL.frequency.value=200;gL.gain.value=0.3;
  oL.connect(gL);gL.connect(m,0,0);
  const oR=fCtx.createOscillator(),gR=fCtx.createGain();
  oR.frequency.value=200+hz;gR.gain.value=0.3;
  oR.connect(gR);gR.connect(m,0,1);
  m.connect(fCtx.destination);
  oL.start();oR.start();
  document.querySelectorAll('.freq-btn').forEach(b=>b.classList.remove('on'));
  btn.classList.add('on');
  S.freqs.push({name,hz});render();save();
  setTimeout(stopFreq,300000);
}

function stopFreq(){
  if(fCtx){fCtx.close();fCtx=null;}
  document.querySelectorAll('.freq-btn').forEach(b=>b.classList.remove('on'));
}

// CYMATICS
let cACtx,cAn,cMic,cRun=false,cRot=0,cPulse=1,cPVel=0,cBH=[],cBT=[],cLB=0;

function openCy(){
  const ov=document.getElementById('cy-overlay');
  ov.classList.add('on');
  const cv=document.getElementById('cy-canvas');
  const sz=Math.min(window.innerWidth,window.innerHeight)-40;
  cv.width=sz;cv.height=sz;
  startCy();
}

function closeCy(){
  document.getElementById('cy-overlay').classList.remove('on');
  stopCy();
}

async function startCy(){
  try{
    cACtx=new AudioContext();cAn=cACtx.createAnalyser();
    cAn.fftSize=4096;cAn.smoothingTimeConstant=0.75;
    cMic=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:false,noiseSuppression:false,autoGainControl:false}});
    cACtx.createMediaStreamSource(cMic).connect(cAn);
    cRun=true;drawCy();
  }catch(e){alert('Allow microphone for cymatics');}
}

function stopCy(){
  cRun=false;
  if(cMic)cMic.getTracks().forEach(t=>t.stop());
  if(cACtx)cACtx.close();
}

function drawCy(){
  if(!cRun)return;
  const cv=document.getElementById('cy-canvas');
  const ctx=cv.getContext('2d');
  const fr=new Uint8Array(cAn.frequencyBinCount);
  cAn.getByteFrequencyData(fr);
  const be=Math.floor(fr.length*0.1);
  let bass=0,mid=0;
  for(let i=0;i<be;i++)bass+=fr[i];
  for(let i=be;i<fr.length*0.5;i++)mid+=fr[i];
  bass/=be;mid/=(fr.length*0.4);
  cBH.push(bass);if(cBH.length>43)cBH.shift();
  const avg=cBH.reduce((a,b)=>a+b,0)/cBH.length;
  const beat=bass>avg*1.5&&bass>100&&(Date.now()-cLB)>300;
  if(beat){cLB=Date.now();cBT.push(cLB);if(cBT.length>8)cBT.shift();cPVel=0.4;}
  const r=ice(bass/10);S.omega=r.omega;
  cPVel*=0.85;cPulse+=cPVel;cPulse+=(1-cPulse)*0.1;
  cRot+=0.003+(mid/255)*0.01+(beat?0.05:0);
  ctx.fillStyle='rgba(0,0,0,0.08)';ctx.fillRect(0,0,cv.width,cv.height);
  const cx=cv.width/2,cy=cv.height/2;
  const sides=3+r.omega;
  const rad=(Math.min(cx,cy)*0.6)*cPulse+(bass/255)*60;
  const hue=180+r.omega*15;
  const c1=`hsl(${hue},100%,60%)`,c2=`hsl(${hue+30},100%,40%)`;
  for(let layer=0;layer<4;layer++){
    const lr=rad*(1-layer*0.2),ls=sides+layer,lrot=cRot*(1+layer*0.3);
    const pts=[];
    for(let i=0;i<ls;i++){
      const ang=(2*Math.PI*i/ls)+lrot;
      const fi=Math.floor(i*fr.length/ls);
      const mod=(fr[fi]/255)*35;
      pts.push({x:cx+(lr+mod)*Math.cos(ang),y:cy+(lr+mod)*Math.sin(ang)});
    }
    ctx.strokeStyle=layer===0?c1:c2;ctx.lineWidth=Math.max(0.5,2.5-layer);ctx.globalAlpha=1-layer*0.2;
    ctx.beginPath();ctx.moveTo(pts[0].x,pts[0].y);pts.forEach(p=>ctx.lineTo(p.x,p.y));ctx.closePath();ctx.stroke();
    if(beat&&layer===0){
      ctx.strokeStyle='rgba(0,255,255,0.2)';ctx.lineWidth=0.5;
      for(let i=0;i<pts.length;i++)for(let j=i+2;j<pts.length;j++){
        ctx.beginPath();ctx.moveTo(pts[i].x,pts[i].y);ctx.lineTo(pts[j].x,pts[j].y);ctx.stroke();
      }
    }
    for(let ring=1;ring<=3;ring++){
      ctx.strokeStyle=c1;ctx.lineWidth=0.5;ctx.globalAlpha=0.15;
      ctx.beginPath();pts.forEach((p,i)=>{const ip={x:cx+(p.x-cx)*(ring/4),y:cy+(p.y-cy)*(ring/4)};i===0?ctx.moveTo(ip.x,ip.y):ctx.lineTo(ip.x,ip.y);});
      ctx.closePath();ctx.stroke();
    }
  }
  ctx.globalAlpha=1;
  if(beat){const g=ctx.createRadialGradient(cx,cy,0,cx,cy,80);g.addColorStop(0,'rgba(0,255,255,0.5)');g.addColorStop(1,'rgba(0,0,0,0)');ctx.fillStyle=g;ctx.beginPath();ctx.arc(cx,cy,80,0,Math.PI*2);ctx.fill();}
  const mpts=[];
  for(let i=0;i<sides;i++){const ang=(2*Math.PI*i/sides)+cRot;const fi=Math.floor(i*fr.length/sides);mpts.push({x:cx+(rad+(fr[fi]/255)*35)*Math.cos(ang),y:cy+(rad+(fr[fi]/255)*35)*Math.sin(ang)});}
  ctx.fillStyle=c1;mpts.forEach(p=>{ctx.beginPath();ctx.arc(p.x,p.y,beat?5:3,0,Math.PI*2);ctx.fill();});
  let bpm=0;
  if(cBT.length>1){const g=[];for(let i=1;i<cBT.length;i++)g.push(cBT[i]-cBT[i-1]);bpm=Math.round(60000/(g.reduce((a,b)=>a+b,0)/g.length));}
  document.getElementById('cy-state').textContent=`s_n=${r.sn}`;
  document.getElementById('cy-omega').textContent=`τ=${r.tau} ω=${r.omega} λ=${r.lam}`;
  document.getElementById('cy-bpm').textContent=`BPM:${bpm||'--'} BASS:${Math.round(bass)}`;
  requestAnimationFrame(drawCy);
}

// MIC CHAT
let micOn=false;
function toggleMic(){
  micOn=!micOn;
  document.getElementById('mic-b').classList.toggle('on',micOn);
  micOn?openCy():closeCy();
}

// NAV
function goTo(name,btn){
  document.querySelectorAll('.screen').forEach(s=>s.classList.remove('active'));
  document.querySelectorAll('.nb').forEach(b=>b.classList.remove('on'));
  document.getElementById('s-'+name).classList.add('active');
  btn.classList.add('on');
  if(name==='journal')renderJ();
  if(name==='tasks')renderT();
}

// INIT
load();
pingEngine();
setInterval(pingEngine,30000);
setInterval(()=>{render();save();},10000);
</script>
</body>
</html>
EOF

cp /mnt/user-data/outputs/LYT_App.html /home/drrone/lyt_app.html 2>/dev/null && echo "COPIED" || echo "FAILED"
rm /home/drrone/lyt_app.html
ls /home/drrone/lyt_app.html
mv /home/drrone/LYT_App_v2.html /home/drrone/lyt_app.html && echo "DONE"
lyt_app.html
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
self.socket.bind(self.server_address
head -5 /home/drrone/lyt_app.html
ls /home/drrone
rm /home/drrone/engine_43.py /home/drrone/engine.py /home/drrone/engine.py.bak /home/drrone/launch_prime43.bat /home/drrone/launch_prime43.sh /home/drrone/validator_43.py /home/drrone/wget-log /home/drrone/server_43.py /home/drrone/server.py.bak /home/drrone/prime43 /home/drrone/ollama.py /home/drrone/pulse_ui.html
rm -rf /home/drrone/prime43 /home/drrone/__pycache__ /home/drrone/lyt_assets /home/drrone/ONE_SPIRIT
cd
ls /home/drrone
python3 /home/drrone/server.py
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
python3 /home/drrone/server.py
python3 -m http.server 8082 --bind 0.0.0.0 --directory /home/drrone
sudo tailscale serve --bg --https=8000 http://localhost:8000
