From f163c8d0b619515f496fdf6d49b1ad21d7ced5a7 Mon Sep 17 00:00:00 2001 From: yu <1919727607@qq.com> Date: Tue, 3 Nov 2026 13:52:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=90=E8=A1=8C=E6=97=B6=E4=B8=BB?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E6=9C=80=E5=B0=8F=E5=8C=96+=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E8=BF=9B=E5=BA=A6=E7=AA=97(alwaysOnTop=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E6=8B=96=E5=8A=A8/resize,=E6=98=BE=E7=A4=BA=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4=E5=90=8D/=E8=BF=9B=E5=BA=A6/=E8=80=97=E6=97=B6/?= =?UTF-8?q?=E5=81=9C=E6=AD=A2=E6=8C=89=E9=92=AE,=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E5=90=8E=E8=87=AA=E5=8A=A8=E6=81=A2=E5=A4=8D=E4=B8=BB=E7=AA=97?= =?UTF-8?q?=E5=8F=A3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/index.ts | 5 +- src/main/overlay.ts | 144 ++++++++++++++++++++++++++++++++++++++++ src/main/run/manager.ts | 4 ++ src/shared/types.ts | 3 +- 4 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 src/main/overlay.ts diff --git a/src/main/index.ts b/src/main/index.ts index 6c3e9d9..719441a 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -12,7 +12,8 @@ import "./capabilities"; import { catalogPath, loadCatalog } from "./catalog"; import { createDemoFlow, createExampleFlows, createFlow, deleteFlow, getFlow, listFlows, saveFlow } from "./flows"; import { capabilityCount, capabilityIds } from "./engine/registry"; -import { closeBrowserSession, startRun, stopRun } from "./run/manager"; +import { closeBrowserSession, setMainWindowGetter, startRun, stopRun } from "./run/manager"; +import { registerOverlayIpc } from "./overlay"; import { fixtureUrl, startFixtureServer, stopFixtureServer } from "./fixture/server"; import { loadSettings, updateSettings } from "./settings"; import { closeLocalVisionWorkers, defaultUiModelPath } from "./local-vision/ui-detect-service"; @@ -101,6 +102,8 @@ function registerIpc(): void { ipcMain.handle("catalog:get", () => loadCatalog()); ipcMain.handle("run:start", (event, flow: FlowDefinition) => startRun(flow, event.sender)); + setMainWindowGetter(() => mainWindow); + registerOverlayIpc(() => mainWindow, () => { stopRun(); }); ipcMain.handle("run:stop", (_event, runId?: string) => stopRun(runId)); ipcMain.handle("run:capabilities", () => ({ count: capabilityCount(), ids: capabilityIds() })); ipcMain.handle("settings:get", () => loadSettings()); diff --git a/src/main/overlay.ts b/src/main/overlay.ts new file mode 100644 index 0000000..f021e24 --- /dev/null +++ b/src/main/overlay.ts @@ -0,0 +1,144 @@ +import { BrowserWindow, ipcMain } from "electron"; +import path from "node:path"; + +let overlayWindow: BrowserWindow | null = null; +let cachedProgress = { current: "", done: 0, total: 0 }; + +export function showRunOverlay(mainWindow: BrowserWindow | null): void { + if (mainWindow && !mainWindow.isDestroyed()) mainWindow.minimize(); + + if (overlayWindow && !overlayWindow.isDestroyed()) { + overlayWindow.show(); + return; + } + + const w = 320; + const h = 56; + const { + screen + } = require("electron") as typeof import("electron"); + const workArea = screen.getPrimaryDisplay().workArea; + const x = workArea.x + workArea.width - w - 16; + const y = workArea.y + workArea.height - h - 16; + + overlayWindow = new BrowserWindow({ + width: w, + height: h, + x, + y, + frame: false, + resizable: false, + movable: false, + minimizable: false, + maximizable: false, + closable: false, + skipTaskbar: true, + alwaysOnTop: true, + fullscreenable: false, + enableLargerThanScreen: false, + hasShadow: true, + transparent: false, + backgroundColor: "#1E2530", + webPreferences: { + preload: path.join(__dirname, "../preload/index.js"), + contextIsolation: true, + nodeIntegration: false, + sandbox: false + } + }); + overlayWindow.setAlwaysOnTop(true, "screen-saver"); + + const html = ` +
+ +