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 st=$('pk-state'); st.textContent=n.connected?'live':'offline'; st.className='pk-pill '+(n.connected?'live':'idle');
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 st=$('pk-state'); if(st){ st.textContent=active?'in session':(n.connected?'live':'idle'); st.className='pk-pill '+(active?'live':(n.connected?'live':'idle')); }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinicode",
3
- "version": "2.8.106",
3
+ "version": "2.8.107",
4
4
  "description": "OpenKernel — provider-agnostic AI execution kernel. Native coding agent + mission-driven execution runtime.",
5
5
  "type": "module",
6
6
  "main": "./dist/kernel/index.js",
@@ -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
- self.device_id, self.device_token = await _enroll(
638
- self.scheduler_url, enrollment_token, self.robot_id
639
- )
640
- self._mesh_bootstrap_ready = True
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