diff --git a/Data/Agent/borealis-agent.py b/Data/Agent/borealis-agent.py index 0f251cd..f6674ec 100644 --- a/Data/Agent/borealis-agent.py +++ b/Data/Agent/borealis-agent.py @@ -209,11 +209,9 @@ class ScreenshotRegion(QtWidgets.QWidget): def mouseReleaseEvent(self, e): self.resizing = False self.drag_offset = None - # Persist geometry on release x, y, w, h = self.get_geometry() CONFIG.data['regions'][self.node_id] = {'x': x, 'y': y, 'w': w, 'h': h} CONFIG._write() - # Send geometry immediately upstream asyncio.create_task(sio.emit('agent_screenshot_task', { 'agent_id': AGENT_ID, 'node_id': self.node_id, diff --git a/Data/Server/WebUI/src/nodes/Agents/Node_Agent_Role_Screenshot.jsx b/Data/Server/WebUI/src/nodes/Agents/Node_Agent_Role_Screenshot.jsx index bb1033a..1fdd391 100644 --- a/Data/Server/WebUI/src/nodes/Agents/Node_Agent_Role_Screenshot.jsx +++ b/Data/Server/WebUI/src/nodes/Agents/Node_Agent_Role_Screenshot.jsx @@ -51,31 +51,34 @@ const ScreenshotInstructionNode = ({ id, data }) => { if (!socket) return; const handleScreenshot = (payload) => { - if (payload?.node_id !== id || !payload.image_base64) return; + if (payload?.node_id !== id) return; - base64Ref.current = payload.image_base64; - setImageBase64(payload.image_base64); - window.BorealisValueBus[id] = payload.image_base64; + // image update (optional) + if (payload.image_base64) { + base64Ref.current = payload.image_base64; + setImageBase64(payload.image_base64); + window.BorealisValueBus[id] = payload.image_base64; + } - // If geometry changed from agent side, sync into UI - const { x, y, w, h } = payload; - if (x !== undefined && y !== undefined && w !== undefined && h !== undefined) { + // geometry update + const { x, y, w, h } = payload; + if (x !== undefined && y !== undefined && w !== undefined && h !== undefined) { const newRegion = { x, y, w, h }; const prev = regionRef.current; const changed = Object.entries(newRegion).some(([k, v]) => prev[k] !== v); if (changed) { - regionRef.current = newRegion; - setRegion(newRegion); - setNodes(nds => + regionRef.current = newRegion; + setRegion(newRegion); + setNodes(nds => nds.map(n => - n.id === id ? { ...n, data: { ...n.data, ...newRegion } } : n + n.id === id ? { ...n, data: { ...n.data, ...newRegion } } : n ) - ); + ); + } } - } }; - + socket.on("agent_screenshot_task", handleScreenshot); return () => socket.off("agent_screenshot_task", handleScreenshot); }, [id, setNodes]); diff --git a/Data/Server/server.py b/Data/Server/server.py index b3ac2e4..b9226cf 100644 --- a/Data/Server/server.py +++ b/Data/Server/server.py @@ -154,22 +154,20 @@ def screenshot_node_viewer(agent_id, node_id): def receive_screenshot_task(data): agent_id = data.get("agent_id") node_id = data.get("node_id") - image = data.get("image_base64") - - if not agent_id or not node_id or not image: - print("[WS] Screenshot task missing fields.") + image = data.get("image_base64", "") + + if not agent_id or not node_id: + print("[WS] Screenshot task missing agent_id or node_id.") return - latest_images[f"{agent_id}:{node_id}"] = { - "image_base64": image, - "timestamp": time.time() - } + if image: + latest_images[f"{agent_id}:{node_id}"] = { + "image_base64": image, + "timestamp": time.time() + } - emit("agent_screenshot_task", { - "agent_id": agent_id, - "node_id": node_id, - "image_base64": image - }, broadcast=True) + # Emit the full payload, including geometry (even if image is empty) + emit("agent_screenshot_task", data, broadcast=True) @socketio.on("connect_agent") def connect_agent(data):