9302a86ea8
New docs: - docs/em_spectrum_overlay.html: Full EM spectrum with Khra/Gixx lines, physics markers, cell-size slider - docs/2026-03-28_170500_cto-report_fractal-echo-analysis.txt: CTO fractal echo analysis report New scripts (Beast sweep infrastructure + analyzers): - scripts/nuclear_magic_analyzer.py: shell structure, peak clustering, mode counting, GUE tests - scripts/physics_domain_analysis.py: 4-domain physics (nuclear shells, Brillouin, band gaps, GUE) - scripts/direct_zmq_sweep.py: ZMQ direct sweep driver - scripts/sweep_real.py: real sweep execution - scripts/analyze_sweep.py, comprehensive_analysis.py: sweep analysis tools - scripts/execute_prime_mapping.py: prime lattice mapping - scripts/extrapolate_findings.py, check_extrapolation.py: extrapolation tools - scripts/eta_calc.py, time_estimate.py, updated_estimate.py, show_pattern.py: utilities Prime analysis (root): - navigator_prime_analysis.py, navigator_prime_analysis_v2.py Updated: - navigator/mock_lbm_daemon.py, navigator/telemetry_server.py
75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
# telemetry_server.py
|
|
# HTTP Telemetry Endpoint for Resonance Engine (no Flask)
|
|
|
|
import zmq
|
|
import json
|
|
import threading
|
|
import time
|
|
from http.server import HTTPServer, BaseHTTPRequestHandler
|
|
|
|
# ZMQ connection to Resonance Engine daemon
|
|
context = zmq.Context()
|
|
socket = context.socket(zmq.SUB)
|
|
socket.connect("tcp://localhost:5556")
|
|
socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
|
|
# Cache latest telemetry
|
|
latest_telemetry = {
|
|
"cycle": 0,
|
|
"coherence": 0.0,
|
|
"asymmetry": 0.0,
|
|
"torque": 0.0,
|
|
"gpu_temp_c": 0.0,
|
|
"gpu_power_w": 0.0,
|
|
"grid": 512,
|
|
"timestamp": None
|
|
}
|
|
|
|
def zmq_listener():
|
|
"""Background thread to listen for ZMQ messages"""
|
|
global latest_telemetry
|
|
print("[ZMQ Listener] Starting...")
|
|
while True:
|
|
try:
|
|
data = socket.recv_json(flags=zmq.NOBLOCK)
|
|
latest_telemetry.update(data)
|
|
latest_telemetry["timestamp"] = time.time()
|
|
except zmq.Again:
|
|
time.sleep(0.001)
|
|
except Exception as e:
|
|
print(f"[ZMQ Listener] Error: {e}")
|
|
time.sleep(0.1)
|
|
|
|
class TelemetryHandler(BaseHTTPRequestHandler):
|
|
def do_GET(self):
|
|
if self.path == '/telemetry':
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps(latest_telemetry).encode())
|
|
elif self.path == '/health':
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({
|
|
"status": "ok",
|
|
"source": "beast-resonance-engine",
|
|
"grid": latest_telemetry["grid"],
|
|
"cycle": latest_telemetry["cycle"]
|
|
}).encode())
|
|
else:
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
|
|
def log_message(self, format, *args):
|
|
pass # Suppress logs
|
|
|
|
if __name__ == '__main__':
|
|
# Start ZMQ listener in background
|
|
listener_thread = threading.Thread(target=zmq_listener, daemon=True)
|
|
listener_thread.start()
|
|
|
|
server = HTTPServer(('0.0.0.0', 28811), TelemetryHandler)
|
|
print("[HTTP Server] Starting on port 28811...")
|
|
server.serve_forever()
|