ui changes tweaks and flings. new quickstart overlay to replace help overlay.

This commit is contained in:
legop3
2026-05-10 19:41:24 -04:00
parent e58e5503e8
commit 7148e41828
11 changed files with 229 additions and 40 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -11,8 +11,8 @@
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
<title>Multi Roomba Rover</title>
<script type="module" crossorigin src="/assets/index-CNqNUzUB.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DC5igy66.css">
<script type="module" crossorigin src="/assets/index-BeyfNX1F.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-C8rSwF1O.css">
</head>
<body>
<div id="root"></div>
@@ -4,7 +4,7 @@ const io = require('../../globals/io');
const logger = require('../../globals/logger').child('overseerControl');
const { loadConfig } = require('../../helpers/configLoader');
const { getRole, roleEvents } = require('../roleService');
const { getMode } = require('../modeManager');
const { getMode, MODES, modeEvents } = require('../modeManager');
const homeAssistantService = require('../homeAssistantService');
const neatoService = require('../neatoService');
const liftService = require('../liftService');
@@ -370,8 +370,12 @@ async function tick() {
});
} finally {
runtime.inFlight = false;
updateStatus({ inFlight: false, currentRunId: null, phase: 'idle', nextRunAt: Date.now() + gateIntervalMs });
runtime.timer = setTimeout(tick, gateIntervalMs);
if (status.running) {
updateStatus({ inFlight: false, currentRunId: null, phase: 'idle', nextRunAt: Date.now() + gateIntervalMs });
runtime.timer = setTimeout(tick, gateIntervalMs);
} else {
updateStatus({ inFlight: false, currentRunId: null, nextRunAt: null });
}
}
}
@@ -389,6 +393,28 @@ function clearHistory() {
updateStatus({ lastReason: 'admin requested clear history', lastOutcome: 'cleared', lastLiveToolCalls: [] });
}
function stopScheduler(reason = 'paused') {
if (runtime.timer) {
clearTimeout(runtime.timer);
runtime.timer = null;
}
updateStatus({
running: false,
inFlight: false,
currentRunId: null,
nextRunAt: null,
phase: 'paused',
lastOutcome: 'paused',
lastReason: reason,
});
}
function startScheduler(reason = null) {
if (runtime.timer) return;
updateStatus({ running: true, phase: 'idle', lastReason: reason });
runtime.timer = setTimeout(tick, gateIntervalMs);
}
io.on('connection', (socket) => {
emitStateToSocket(socket);
socket.on('overseer:control', ({ controls } = {}, cb = () => {}) => {
@@ -407,14 +433,27 @@ homeAssistantEvents.on('update', () => updateStatus({ phase: status.phase }));
neatoEvents.on('update', () => updateStatus({ phase: status.phase }));
liftEvents.on('update', () => updateStatus({ phase: status.phase }));
roverManager.managerEvents.on('rover', () => updateStatus({ phase: status.phase }));
modeEvents.on('change', (mode) => {
if (!enabled) return;
if (mode === MODES.LOCKDOWN) {
stopScheduler('paused during lockdown');
logger.info('overseerControl paused due to lockdown mode');
return;
}
startScheduler(observeOnly ? 'observe-only mode' : null);
});
if (!enabled) {
logger.info('overseerControl disabled');
updateStatus({ running: false, lastReason: 'overseerControl.enabled is false' });
} else {
updateStatus({ running: true, lastReason: observeOnly ? 'observe-only mode' : null });
runtime.timer = setTimeout(tick, gateIntervalMs);
logger.info('overseerControl enabled', { model, ollamaUrl, gateIntervalMs, heartbeatMs, observeOnly });
if (getMode() === MODES.LOCKDOWN) {
stopScheduler('paused during lockdown');
logger.info('overseerControl paused on startup due to lockdown mode');
} else {
startScheduler(observeOnly ? 'observe-only mode' : null);
logger.info('overseerControl enabled', { model, ollamaUrl, gateIntervalMs, heartbeatMs, observeOnly });
}
}
module.exports = {};