diff --git a/server/prompts/overseer_control_system.txt b/server/prompts/overseer_control_system.txt index 7e18441a..cbe44195 100644 --- a/server/prompts/overseer_control_system.txt +++ b/server/prompts/overseer_control_system.txt @@ -22,6 +22,7 @@ Actions: Chat output: - Always use English. +- Not everyone is always talking to you. Sometimes people talk to themselves or others. - If speaking, send one short in-character live-chat line. - Keep it concise and informal (roughly 3-14 words). - Chat output must be spoken text only. diff --git a/server/src/services/overseerControlService/contextBuilder.js b/server/src/services/overseerControlService/contextBuilder.js index bb96739d..a9e6e8a5 100644 --- a/server/src/services/overseerControlService/contextBuilder.js +++ b/server/src/services/overseerControlService/contextBuilder.js @@ -17,9 +17,10 @@ function toStateUpdate({ mode, homeAssistantState, neatoState, liftState, roster } const roverLines = (Array.isArray(roster) ? roster : []).slice(0, 6).map((rover) => { const roverId = rover?.id || 'unknown'; - const driver = rover?.driverNickname || 'none'; + const drivers = Array.isArray(rover?.drivers) ? rover.drivers.filter(Boolean) : []; + const driver = drivers.length ? drivers.join(',') : 'none'; const status = rover?.statusTag || 'unknown'; - return `- ${roverId} status=${status} driver=${driver}`; + return `- ${roverId} status=${status} drivers=${driver}`; }); if (roverLines.length) { lines.push('rovers:'); diff --git a/server/src/services/overseerControlService/index.js b/server/src/services/overseerControlService/index.js index 27e6df31..295ddeb6 100644 --- a/server/src/services/overseerControlService/index.js +++ b/server/src/services/overseerControlService/index.js @@ -126,11 +126,34 @@ function buildRosterSummary() { return roverManager .getRoster() .filter((rover) => roverManager.canReplayRoverId(rover?.id)) - .map((rover) => ({ - id: rover?.id || 'unknown', - statusTag: rover?.statusTag || 'unknown', - driverNickname: rover?.driverNickname || null, - })); + .map((rover) => { + const roverId = String(rover?.id || ''); + const record = roverManager.rovers.get(roverId); + const driverSocketIds = record?.drivers ? Array.from(record.drivers) : []; + const drivers = driverSocketIds + .map((socketId) => { + const socket = io.sockets.sockets.get(socketId); + const nickname = String(socket?.data?.nickname || socket?.data?.user?.username || '').trim(); + return nickname || socketId; + }) + .filter(Boolean); + const sensors = record?.lastSensor?.decoded || {}; + const docked = Boolean(record?.docked || sensors?.chargingSources?.homeBase); + const oiMode = String(sensors?.oiMode?.label || '').toLowerCase(); + let statusTag = 'docking'; + if (docked) { + statusTag = 'docked'; + } else if (oiMode === 'safe' || oiMode === 'full') { + statusTag = 'driving'; + } else if (oiMode === 'passive' || oiMode === 'off' || oiMode === 'unknown' || !oiMode) { + statusTag = 'docking'; + } + return { + id: roverId || 'unknown', + statusTag, + drivers, + }; + }); } function computeTriggerReason() {