infinicode 2.8.44 → 2.8.45

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.
@@ -2032,7 +2032,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
2032
2032
  var grid = $('rp-grid'), totals = $('rp-totals');
2033
2033
  // stash per-robot rows so the Park drawer can show live session stats
2034
2034
  roboparkByName = {};
2035
- robotsFrom(d).forEach(function(x){ roboparkByName[robotName(x)] = x; if(x.name) roboparkByName[x.name] = x; });
2035
+ robotsFrom(d).forEach(function(x){ roboparkByName[String(robotName(x)).toLowerCase()] = x; if(x.name) roboparkByName[String(x.name).toLowerCase()] = x; });
2036
2036
  // C4: also feed lastRobots for the Incidents sub-tab
2037
2037
  lastRobots = robotsFrom(d) || [];
2038
2038
  // push the same map into the Park so the canvas can color robots
@@ -3580,7 +3580,9 @@ button.act:disabled{opacity:0.5;cursor:default;}
3580
3580
  connected: match?!!match.connected:false,
3581
3581
  load: (match&&match.load!=null)?match.load:0,
3582
3582
  platform: match?(match.platform||''):'', version: match?(match.version||'?'):'—',
3583
- site: match?(match.site||''):'', caps: match?(match.capabilities||[]):[],
3583
+ site: match?(match.site||''):'', caps: match?(match.capabilities||[]):[],
3584
+ schedulerRobotId: match?(match.schedulerRobotId||match.schedulerDeviceId||''):'',
3585
+ schedulerDeviceId: match?(match.schedulerDeviceId||match.schedulerRobotId||''):'',
3584
3586
  telemKeys: [slot.label.toLowerCase()].concat(slot.keys||[]).concat(match?[(match.displayName||'').toLowerCase()]:[]),
3585
3587
  wx:wx, wy:wy, _hit:prevHit(id)
3586
3588
  };
@@ -5312,7 +5314,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
5312
5314
  // enrolled device's id is a generated dev_xxxx, distinct from its name).
5313
5315
  // Falls back to n.name if telemetry hasn't matched a row yet.
5314
5316
  function schedRow(n){
5315
- var row=roboparkByName[n.name], exact=row, keys=(n.telemKeys||[]).concat([String(n.name||'').toLowerCase()]);
5317
+ var row=roboparkByName[String(n.name||'').toLowerCase()] || roboparkByName[n.name], exact=row, keys=(n.telemKeys||[]).concat([String(n.name||'').toLowerCase()]);
5316
5318
  var seen={}, candidates=[];
5317
5319
  for(var rk in roboparkByName){
5318
5320
  var candidate=roboparkByName[rk], cid=candidate&&(candidate.robot_id||candidate.id);
@@ -5336,7 +5338,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
5336
5338
  function schedId(n){
5337
5339
  var row=schedRow(n); if(row&&(row.id||row.robot_id)) return row.id||row.robot_id;
5338
5340
  if(n.schedulerRobotId) return n.schedulerRobotId;
5339
- var byName=schedulerDevicesByName[n.name]; if(byName&&byName.id) return byName.id;
5341
+ var byName=schedulerDevicesByName[String(n.name||'').toLowerCase()]; if(byName&&byName.id) return byName.id;
5340
5342
  return n.name;
5341
5343
  }
5342
5344
  function closeDrawer(){
@@ -5466,13 +5468,13 @@ button.act:disabled{opacity:0.5;cursor:default;}
5466
5468
  function pollRoboparkQuiet(){
5467
5469
  fetch('/robopark/api/telemetry'+QS,{cache:'no-store'}).then(function(r){return r.json();}).then(function(d){
5468
5470
  var list=(Array.isArray(d)?d:(d&&d.robots)||[]); roboparkByName={};
5469
- list.forEach(function(x){ roboparkByName[x.robot_id||x.id||x.name||'robot']=x; if(x.name) roboparkByName[x.name]=x; });
5471
+ list.forEach(function(x){ roboparkByName[String(x.robot_id||x.id||x.name||'robot').toLowerCase()]=x; if(x.name) roboparkByName[String(x.name).toLowerCase()]=x; });
5470
5472
  refreshDrawer();
5471
5473
  }).catch(function(){});
5472
5474
  }
5473
5475
  function schedulerDevice(n){
5474
5476
  var row=schedRow(n), id=row&&(row.robot_id||row.id);
5475
- return (id&&schedulerDevicesById[id]) || schedulerDevicesById[n.schedulerRobotId] || schedulerDevicesByName[n.name] || schedulerDevicesById[n.name] || null;
5477
+ return (id&&schedulerDevicesById[id]) || schedulerDevicesById[n.schedulerDeviceId] || schedulerDevicesById[n.schedulerRobotId] || schedulerDevicesByName[String(n.name||'').toLowerCase()] || schedulerDevicesById[n.name] || null;
5476
5478
  }
5477
5479
  function deviceList(inv, key, fallback){
5478
5480
  var list=inv&&Array.isArray(inv[key])?inv[key]:[];
@@ -5619,7 +5621,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
5619
5621
  // available services from the supervisor_status report (if any),
5620
5622
  // otherwise shows a placeholder.
5621
5623
  function buildShellSection(robotId){
5622
- var device = robotId ? schedulerDeviceByName[robotName({name:robotId, id:robotId})] || null : null;
5624
+ var device = robotId ? schedulerDevicesByName[String(robotName({name:robotId, id:robotId})||'').toLowerCase()] || null : null;
5623
5625
  // Try to read the device row by id directly
5624
5626
  try{
5625
5627
  for(var k in schedulerDevicesById){
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinicode",
3
- "version": "2.8.44",
3
+ "version": "2.8.45",
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",
@@ -4166,6 +4166,8 @@ async def dashboard():
4166
4166
  const showDevices = ref(true);
4167
4167
  const showCommands = ref(false);
4168
4168
  const commandNetwork = ref('lan');
4169
+ const commandHubLan = ref('http://192.168.1.12:47913');
4170
+ const commandHubTailscale = ref('http://100.84.147.24:47913');
4169
4171
  const commandRobotId = ref('');
4170
4172
  const newDevice = ref({ name: '', tailscale_ip: '', lan_ip: '', motor_server_url: '', character_id: '', livekit_url: '', video_device: 'auto', audio_device: 'default', notes: '' });
4171
4173
  const rotatedToken = ref(null);
@@ -4527,11 +4529,9 @@ async def dashboard():
4527
4529
  const dismissRotatedToken = () => { rotatedToken.value = null; };
4528
4530
  const enrollmentCommand = (token) => {
4529
4531
  if (!token) return '';
4530
- const schedulerPort = window.location.port || '8080';
4531
4532
  const networkFlag = enrollmentNetwork.value === 'tailscale' ? '--tailscale' : '--lan';
4532
- const hubProtocol = window.location.protocol === 'https:' ? 'https://' : 'http://';
4533
- const hubUrl = `${hubProtocol}${window.location.hostname}:47913`;
4534
- return `robopark setup --robot --name "${token.name || token.device_id}" --hub-url ${hubUrl} --scheduler-port ${schedulerPort} ${networkFlag} --enrollment-token ${token.token} --start --auto-start`;
4533
+ const hubUrl = enrollmentNetwork.value === 'tailscale' ? commandHubTailscale.value : commandHubLan.value;
4534
+ return `robopark setup --robot --name "${token.name || token.device_id}" --hub-url ${hubUrl} --scheduler-port 8080 ${networkFlag} --enrollment-token ${token.token} --start --auto-start`;
4535
4535
  };
4536
4536
 
4537
4537
  const joinConversation = async (device) => {
@@ -4732,7 +4732,10 @@ async def dashboard():
4732
4732
  const stackName = (id) => voiceStacks.value.find(s => s.id === id)?.name || '—';
4733
4733
  const characterName = (id) => characterPresets.value.find(c => c.id === id)?.name || '—';
4734
4734
 
4735
- const schedulerBase = () => window.location.origin;
4735
+ const schedulerBase = () => {
4736
+ const hub = commandNetwork.value === 'tailscale' ? commandHubTailscale.value : commandHubLan.value;
4737
+ return hub.replace(/:\\d+\\/?$/, ':8080').replace(/\\/$/, '');
4738
+ };
4736
4739
  const selectedCommandRobot = computed(() => devices.value.find(d => d.id === commandRobotId.value) || devices.value[0] || null);
4737
4740
  const commandRows = computed(() => {
4738
4741
  const base = schedulerBase();
@@ -4741,10 +4744,11 @@ async def dashboard():
4741
4744
  const robotName = robot?.name || '<ROBOT_NAME>';
4742
4745
  const networkFlag = commandNetwork.value === 'tailscale' ? '--tailscale' : '--lan';
4743
4746
  const tokenPlaceholder = '<ENROLLMENT_TOKEN_FROM_ADD_DEVICE>';
4747
+ const hub = commandNetwork.value === 'tailscale' ? commandHubTailscale.value : commandHubLan.value;
4744
4748
  return [
4745
4749
  { group: 'Scheduler', name: 'Health check', description: 'Confirm the control center API is reachable.', command: `curl -s ${base}/api/settings` },
4746
4750
  { group: 'Scheduler', name: 'Start scheduler', description: 'Start the RoboPark scheduler and dashboard on port 8080.', command: 'robopark serve --port 8080' },
4747
- { group: 'Robot', name: 'Enroll robot', description: `Generated for ${robotName} over ${commandNetwork.value}. Paste the one-time token from the Add Device dialog.`, command: `robopark setup --robot --name "${robotName}" --hub-url ${base.replace(/:\\d+$/, '')}:47913 --scheduler-port ${window.location.port || '8080'} ${networkFlag} --enrollment-token ${tokenPlaceholder} --start --auto-start` },
4751
+ { group: 'Robot', name: 'Enroll robot', description: `Generated for ${robotName} over ${commandNetwork.value}. Paste the one-time token from the Add Device dialog.`, command: `robopark setup --robot --name "${robotName}" --hub-url ${hub} --scheduler-port 8080 ${networkFlag} --enrollment-token ${tokenPlaceholder} --start --auto-start` },
4748
4752
  { group: 'Robot', name: 'Simulate motion', description: 'Queue a full production trigger for the selected robot.', command: `curl -s -X POST ${base}/api/robots/${robotId}/simulate-trigger` },
4749
4753
  { group: 'Robot', name: 'Stop conversation', description: 'Stop the active conversation and clear queued trigger state.', command: `curl -s -X POST ${base}/api/robots/${robotId}/simulate-stop` },
4750
4754
  { group: 'Robot', name: 'Recover stale state', description: 'Release a robot stuck in connecting/running after a failed teardown.', command: `curl -s -X POST ${base}/api/robots/${robotId}/recover` },
@@ -4761,7 +4765,7 @@ async def dashboard():
4761
4765
 
4762
4766
  return {
4763
4767
  robots, servers, sessions, stats, connected, serverMetrics,
4764
- devices, settings, livekit, showAddDevice, showDevices, showCommands, commandNetwork, commandRobotId, selectedCommandRobot, commandRows, copyCommand, newDevice, rotatedToken, enrollmentNetwork, enrollmentCommand, simulation,
4768
+ devices, settings, livekit, showAddDevice, showDevices, showCommands, commandNetwork, commandHubLan, commandHubTailscale, commandRobotId, selectedCommandRobot, commandRows, copyCommand, newDevice, rotatedToken, enrollmentNetwork, enrollmentCommand, simulation,
4765
4769
  showLiveKitConfig, livekitForm, preview, deviceInventory,
4766
4770
  voiceStacks, characterPresets, showVoiceStackForm, showCharacterForm,
4767
4771
  editingVoiceStack, editingCharacter, voiceStackForm, characterForm,
@@ -4830,6 +4834,14 @@ async def dashboard():
4830
4834
  <button @click="commandNetwork = 'tailscale'" :class="commandNetwork === 'tailscale' ? 'bg-cyan-600' : 'bg-gray-700'" class="px-3 py-2 rounded text-sm">Tailscale</button>
4831
4835
  </div>
4832
4836
  </div>
4837
+ <div class="grid md:grid-cols-2 gap-3 mb-4">
4838
+ <label class="text-xs text-gray-400">LAN hub URL
4839
+ <input v-model="commandHubLan" class="block w-full mt-1 bg-gray-700 rounded px-3 py-2 text-sm text-white" placeholder="http://192.168.x.x:47913">
4840
+ </label>
4841
+ <label class="text-xs text-gray-400">Tailscale hub URL
4842
+ <input v-model="commandHubTailscale" class="block w-full mt-1 bg-gray-700 rounded px-3 py-2 text-sm text-white" placeholder="http://100.x.x.x:47913">
4843
+ </label>
4844
+ </div>
4833
4845
  <div class="grid md:grid-cols-2 gap-3">
4834
4846
  <div v-for="cmd in commandRows" :key="cmd.group + cmd.name" class="bg-gray-900 rounded p-3">
4835
4847
  <div class="flex items-start justify-between gap-2">