infinicode 2.8.106 → 2.8.107
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1278,6 +1278,10 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
1278
1278
|
else if(Number.isFinite(enrolled)) score+=enrolled;
|
|
1279
1279
|
return score;
|
|
1280
1280
|
}
|
|
1281
|
+
function schedulerHeartbeatFresh(device){
|
|
1282
|
+
var heartbeat=Date.parse(device&&device.last_heartbeat||'');
|
|
1283
|
+
return Number.isFinite(heartbeat)&&(Date.now()-heartbeat)<45000;
|
|
1284
|
+
}
|
|
1281
1285
|
var voiceStacks = []; // scheduler voice stacks (shared with setup forms + templates)
|
|
1282
1286
|
var FALLBACK_SLOTS = [
|
|
1283
1287
|
{label:'VOLT', id:'volt', keys:['volt'], nx:0.18, ny:0.26, img:'/static/robopark/volt.png'},
|
|
@@ -6829,7 +6833,8 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
6829
6833
|
}
|
|
6830
6834
|
$('pk-name').textContent=n.label||n.name;
|
|
6831
6835
|
$('pk-sub').textContent = n.connected ? (n.name+' · '+(n.platform||'?')+' · v'+n.version+(n.site?(' · '+n.site):'')) : 'pad reserved · not joined';
|
|
6832
|
-
var
|
|
6836
|
+
var initialDevice=schedulerDevice(n),initialHeartbeat=schedulerHeartbeatFresh(initialDevice);
|
|
6837
|
+
var st=$('pk-state'); st.textContent=initialHeartbeat?'live':(n.connected?'mesh only':'offline'); st.className='pk-pill '+(initialHeartbeat?'live':'idle');
|
|
6833
6838
|
buildDrawer(n);
|
|
6834
6839
|
pollRoboparkQuiet(); // fill session telemetry right away instead of waiting for the tick
|
|
6835
6840
|
if(drawerTimer) clearInterval(drawerTimer);
|
|
@@ -7834,7 +7839,8 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
7834
7839
|
set('pk-tv-lat', row.avg_latency_ms!=null?Math.round(row.avg_latency_ms)+'ms':'—');
|
|
7835
7840
|
var dEl=$('pk-tv-drop'); if(dEl){ var d=row.drop_rate!=null?Math.round(row.drop_rate*100):null; dEl.textContent=d!=null?d+'%':'—'; dEl.className='v '+(d>=20?'bad':d>=5?'warn':'ok'); }
|
|
7836
7841
|
var active=row.active_session||row.in_session||row.session_active||row.current_session_id||row.status==='connecting'||row.status==='running';
|
|
7837
|
-
var
|
|
7842
|
+
var heartbeatLive=schedulerHeartbeatFresh(schedulerDevice(n));
|
|
7843
|
+
var st=$('pk-state'); if(st){ st.textContent=active?'in session':(heartbeatLive?'live':(n.connected?'mesh only':'offline')); st.className='pk-pill '+(active||heartbeatLive?'live':'idle'); }
|
|
7838
7844
|
}
|
|
7839
7845
|
}
|
|
7840
7846
|
function set(id,v){ var e=$(id); if(e) e.textContent=v; }
|
package/package.json
CHANGED
|
@@ -634,10 +634,20 @@ class PreviewAgent:
|
|
|
634
634
|
# Consume it before generic mesh recovery so heartbeats cannot bind to
|
|
635
635
|
# a stale same-name identity.
|
|
636
636
|
if not self.device_token and enrollment_token:
|
|
637
|
-
|
|
638
|
-
self.
|
|
639
|
-
|
|
640
|
-
|
|
637
|
+
try:
|
|
638
|
+
self.device_id, self.device_token = await _enroll(
|
|
639
|
+
self.scheduler_url, enrollment_token, self.robot_id
|
|
640
|
+
)
|
|
641
|
+
self._mesh_bootstrap_ready = True
|
|
642
|
+
except Exception as exc:
|
|
643
|
+
if not _mesh_proxy_headers():
|
|
644
|
+
raise
|
|
645
|
+
# Enrollment tokens are intentionally one-time. A service
|
|
646
|
+
# reinstall can retain the original systemd argument after
|
|
647
|
+
# its credential file was removed; recover through the hub's
|
|
648
|
+
# authenticated mesh path rather than crash-loop forever.
|
|
649
|
+
logger.warning("device enrollment failed; recovering through mesh bootstrap: %s", exc)
|
|
650
|
+
await self._ensure_mesh_identity()
|
|
641
651
|
elif _mesh_proxy_headers():
|
|
642
652
|
await self._ensure_mesh_identity()
|
|
643
653
|
|