infinicode 2.8.40 → 2.8.42
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.
|
@@ -1273,7 +1273,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
1273
1273
|
+ '</div>'
|
|
1274
1274
|
+ '<div class="rp-field"><label style="font-weight:400;color:var(--muted)">'
|
|
1275
1275
|
+ 'This name is sent to the scheduler as the <code>X-Operator</code> header on every action you take (End session, Restart, Set production mode, etc.) '
|
|
1276
|
-
+ 'and recorded in the audit log. Stored only in your browser
|
|
1276
|
+
+ 'and recorded in the audit log. Stored only in your browser\\'s localStorage — not on the server. '
|
|
1277
1277
|
+ 'Use a real name so postmortems can answer "who clicked that?".'
|
|
1278
1278
|
+ '</label></div>';
|
|
1279
1279
|
showModal('Operator identity', html);
|
|
@@ -5555,7 +5555,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
5555
5555
|
var now = Date.now();
|
|
5556
5556
|
var lineText = String(text == null ? '' : text);
|
|
5557
5557
|
// split on newlines so a multi-line result renders as separate rows
|
|
5558
|
-
var parts = lineText.split(
|
|
5558
|
+
var parts = lineText.split(/\\r?\\n/);
|
|
5559
5559
|
for(var i=0;i<parts.length;i++){
|
|
5560
5560
|
if(!parts[i] && i===parts.length-1) continue; // skip trailing empty
|
|
5561
5561
|
buf.lines.push({ t: now, kind: kind, text: parts[i] });
|
|
@@ -5667,7 +5667,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
5667
5667
|
var raw = (inp.value || '').trim();
|
|
5668
5668
|
if(!raw) return;
|
|
5669
5669
|
// parse "name param1=val1 param2=val2" into the params object
|
|
5670
|
-
var parts = raw.split(
|
|
5670
|
+
var parts = raw.split(/\\s+/);
|
|
5671
5671
|
var name = parts.shift();
|
|
5672
5672
|
var params = {};
|
|
5673
5673
|
for(var i=0;i<parts.length;i++){
|
|
@@ -6042,7 +6042,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
|
|
|
6042
6042
|
si[j].style.background = on
|
|
6043
6043
|
? (pass_===true ? 'var(--ok)'
|
|
6044
6044
|
: pass_===false ? 'var(--bad)'
|
|
6045
|
-
: (j<si.length*0.7?'var(--ok)':j<si.length*0.9?'var(--warn)':'var(--bad)'))
|
|
6045
|
+
: (j<si.length*0.7?'var(--ok)':j<si.length*0.9?'var(--warn)':'var(--bad)'))
|
|
6046
6046
|
: 'var(--glass-border)';
|
|
6047
6047
|
}
|
|
6048
6048
|
set('pk-spkval', liveRms>0 ? Math.round(liveRms*100)+'%' : '—');
|
|
@@ -262,13 +262,9 @@ export class MeshServer {
|
|
|
262
262
|
return;
|
|
263
263
|
}
|
|
264
264
|
const remote = req.socket.remoteAddress ?? 'unknown';
|
|
265
|
-
// The
|
|
266
|
-
//
|
|
265
|
+
// The mesh node serves the full Park-enabled RoboPark Control Center. Its
|
|
266
|
+
// product APIs remain proxied under /robopark/* to the scheduler.
|
|
267
267
|
if (req.method === 'GET' && (path === '/' || path === '/ui' || path === '/dashboard')) {
|
|
268
|
-
if (this.opts.schedulerUrl) {
|
|
269
|
-
this.proxySchedulerPath(req, res, '/');
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
268
|
if (!this.opts.dashboardHtml) {
|
|
273
269
|
res.writeHead(404).end('dashboard not enabled (start with --dashboard)');
|
|
274
270
|
return;
|
|
@@ -288,15 +284,16 @@ export class MeshServer {
|
|
|
288
284
|
res.writeHead(404).end('mesh dashboard not enabled (start with --dashboard)');
|
|
289
285
|
return;
|
|
290
286
|
}
|
|
291
|
-
res.writeHead(200, {
|
|
287
|
+
res.writeHead(200, {
|
|
288
|
+
'content-type': 'text/html; charset=utf-8',
|
|
289
|
+
'cache-control': 'no-store',
|
|
290
|
+
...(this.opts.token && this.presentedToken(req)
|
|
291
|
+
? { 'set-cookie': `robopark_auth=${encodeURIComponent(this.presentedToken(req))}; Path=/; SameSite=Lax` }
|
|
292
|
+
: {}),
|
|
293
|
+
});
|
|
292
294
|
res.end(this.opts.dashboardHtml);
|
|
293
295
|
return;
|
|
294
296
|
}
|
|
295
|
-
// Full scheduler dashboard requests are same-origin after the root proxy.
|
|
296
|
-
if (this.opts.schedulerUrl && (path.startsWith('/api/') || path.startsWith('/static/') || path.startsWith('/vendor/'))) {
|
|
297
|
-
this.proxySchedulerPath(req, res, path);
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
297
|
// Static assets bundled with the dashboard (robot concept avatars, etc.).
|
|
301
298
|
if (req.method === 'GET' && path.startsWith('/static/')) {
|
|
302
299
|
const asset = loadStaticAsset(path.slice(8));
|
package/package.json
CHANGED