Paritosh Upadhyay commited on
Commit
63cfc4b
·
1 Parent(s): 0f9857d

Presence Unification: Real-time process heartbeat & Mobile Offline detection

Browse files
backend/app/scratch/subconscious_loop.py CHANGED
@@ -83,9 +83,21 @@ async def get_system_status():
83
  with database.SessionLocal() as db:
84
  sov_lock = db.query(KeyValueStore).filter_by(key="safety_lock").first()
85
  learn_lock = db.query(KeyValueStore).filter_by(key="learning_lock").first()
 
 
 
 
 
 
 
 
 
 
 
86
  return {
87
  "safety_lock": sov_lock.value if sov_lock else False,
88
- "learning_lock": learn_lock.value if learn_lock else False
 
89
  }
90
 
91
  @app.post("/system/safety-lock")
@@ -204,6 +216,22 @@ def subconscious_cycle():
204
 
205
  time.sleep(1.2) # High-speed pulse
206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  threading.Thread(target=state_poller, daemon=True).start()
208
 
209
  last_lock_log = 0
 
83
  with database.SessionLocal() as db:
84
  sov_lock = db.query(KeyValueStore).filter_by(key="safety_lock").first()
85
  learn_lock = db.query(KeyValueStore).filter_by(key="learning_lock").first()
86
+ heartbeat = db.query(KeyValueStore).filter_by(key="local_heartbeat").first()
87
+
88
+ # Determine if the local process is actually running (15s threshold)
89
+ is_alive = False
90
+ if heartbeat:
91
+ try:
92
+ last_seen = float(heartbeat.value)
93
+ if time.time() - last_seen < 15:
94
+ is_alive = True
95
+ except: pass
96
+
97
  return {
98
  "safety_lock": sov_lock.value if sov_lock else False,
99
+ "learning_lock": learn_lock.value if learn_lock else False,
100
+ "is_alive": is_alive
101
  }
102
 
103
  @app.post("/system/safety-lock")
 
216
 
217
  time.sleep(1.2) # High-speed pulse
218
 
219
+ # ── LOCAL LIFE SIGNAL SENTINEL ──
220
+ # This thread periodically whispers its presence to the DB
221
+ def life_signal():
222
+ logger.info("💓 [LIFE SIGNAL] Monitoring Presence. Cockpit Tether Online.")
223
+ while True:
224
+ try:
225
+ with database.SessionLocal() as db:
226
+ hb = db.query(KeyValueStore).filter_by(key="local_heartbeat").first()
227
+ if hb: hb.value = str(time.time())
228
+ else: db.add(KeyValueStore(key="local_heartbeat", value=str(time.time()), category="system"))
229
+ db.commit()
230
+ except Exception as e:
231
+ logger.error(f"[LIFE SIGNAL] Tether failure: {e}")
232
+ time.sleep(8)
233
+
234
+ threading.Thread(target=life_signal, daemon=True).start()
235
  threading.Thread(target=state_poller, daemon=True).start()
236
 
237
  last_lock_log = 0
static/sovereign.html CHANGED
@@ -164,6 +164,7 @@
164
  <script>
165
  let sovLocked = false;
166
  let learnLocked = false;
 
167
  const API_BASE = window.location.origin;
168
 
169
  async function sync() {
@@ -173,6 +174,7 @@
173
 
174
  sovLocked = data.safety_lock;
175
  learnLocked = data.learning_lock;
 
176
 
177
  render();
178
  } catch (e) {
@@ -188,7 +190,11 @@
188
  const learnText = document.getElementById('learnText');
189
 
190
  // Sovereign UI
191
- if (sovLocked) {
 
 
 
 
192
  sovBadge.innerText = 'CORE STANDBY';
193
  sovBadge.style.color = '#00f2ff';
194
  box.classList.add('locked');
 
164
  <script>
165
  let sovLocked = false;
166
  let learnLocked = false;
167
+ let isAlive = false;
168
  const API_BASE = window.location.origin;
169
 
170
  async function sync() {
 
174
 
175
  sovLocked = data.safety_lock;
176
  learnLocked = data.learning_lock;
177
+ isAlive = data.is_alive;
178
 
179
  render();
180
  } catch (e) {
 
190
  const learnText = document.getElementById('learnText');
191
 
192
  // Sovereign UI
193
+ if (!isAlive) {
194
+ sovBadge.innerText = 'CORE OFFLINE';
195
+ sovBadge.style.color = '#888888';
196
+ box.classList.add('locked');
197
+ } else if (sovLocked) {
198
  sovBadge.innerText = 'CORE STANDBY';
199
  sovBadge.style.color = '#00f2ff';
200
  box.classList.add('locked');