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 ?
|
|
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
|
@@ -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
|
|
4533
|
-
|
|
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 = () =>
|
|
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 ${
|
|
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">
|