From 61ddb6584dc2405e02797a1d70d050a4ed44efb0 Mon Sep 17 00:00:00 2001 From: Nicole Rappe Date: Wed, 30 Apr 2025 19:36:55 -0600 Subject: [PATCH] Migrated from CRA to Vite for Building --- Data/Agent/borealis-agent.py | 33 +++-- Data/Server/WebUI/index.html | 22 +++ Data/Server/WebUI/package.json | 26 ++-- Data/Server/WebUI/public/index.html | 21 --- Data/Server/WebUI/src/App.jsx | 28 ++-- Data/Server/WebUI/src/{index.js => index.jsx} | 1 - Data/Server/WebUI/tsconfig.json | 25 ++++ Data/Server/WebUI/vite.config.ts | 17 +++ .../Examples/Logic-Comparison-Example.json | 131 ------------------ .../Flyff Universe/Flyff_OCR_Workflow.json | 126 ----------------- Launch-Borealis.ps1 | 48 +++---- 11 files changed, 139 insertions(+), 339 deletions(-) create mode 100644 Data/Server/WebUI/index.html delete mode 100644 Data/Server/WebUI/public/index.html rename Data/Server/WebUI/src/{index.js => index.jsx} (95%) create mode 100644 Data/Server/WebUI/tsconfig.json create mode 100644 Data/Server/WebUI/vite.config.ts delete mode 100644 Data/Server/Workflows/Examples/Logic-Comparison-Example.json delete mode 100644 Data/Server/Workflows/Flyff Universe/Flyff_OCR_Workflow.json diff --git a/Data/Agent/borealis-agent.py b/Data/Agent/borealis-agent.py index 215f257..0abbf83 100644 --- a/Data/Agent/borealis-agent.py +++ b/Data/Agent/borealis-agent.py @@ -126,6 +126,18 @@ class RegionLauncher(QtCore.QObject): overlay_widgets[self.node_id] = widget widget.show() +# ---------------- GUI Thread Helpers ---------------- +def gui_create_launcher(node_id, x, y, w, h): + launcher = RegionLauncher(node_id) + region_launchers[node_id] = launcher + launcher.handle(x, y, w, h) + +def gui_update_widget(node_id, x, y, w, h, visible): + widget = overlay_widgets.get(node_id) + if widget: + widget.setGeometry(x, y, w, h) + widget.setVisible(visible) + # ---------------- Role Management ---------------- def stop_all_roles(): for node_id, thread in running_threads.items(): @@ -134,7 +146,6 @@ def stop_all_roles(): running_roles.clear() running_threads.clear() - def start_role_thread(role_cfg): role = role_cfg.get("role") node_id = role_cfg.get("node_id") @@ -158,25 +169,21 @@ def run_screenshot_loop(node_id, cfg): interval = cfg.get("interval", 1000) visible = cfg.get("visible", True) x = cfg.get("x", 100) - y = cfg.get("y", 100) + y = cfg.get("y", 100) w = cfg.get("w", 300) h = cfg.get("h", 200) + # Schedule launcher creation in GUI thread if node_id not in region_launchers: - launcher = RegionLauncher(node_id) - region_launchers[node_id] = launcher - QtCore.QTimer.singleShot(0, lambda: launcher.trigger.emit(x, y, w, h)) - - widget = overlay_widgets.get(node_id) - if widget: - widget.setGeometry(x, y, w, h) - widget.setVisible(visible) + QtCore.QTimer.singleShot(0, lambda nid=node_id, xx=x, yy=y, ww=w, hh=h: gui_create_launcher(nid, xx, yy, ww, hh)) while True: try: + # Use current widget geometry if available (after user moves/resizes) if node_id in overlay_widgets: widget = overlay_widgets[node_id] x, y, w, h = widget.get_geometry() + print(f"[Capture] Screenshot task {node_id} at ({x},{y},{w},{h})") img = ImageGrab.grab(bbox=(x, y, x + w, y + h)) buffer = BytesIO() @@ -188,6 +195,12 @@ def run_screenshot_loop(node_id, cfg): "node_id": node_id, "image_base64": encoded }) + + # Schedule any visibility or geometry updates in GUI thread + QtCore.QTimer.singleShot( + 0, + lambda nid=node_id, xx=x, yy=y, ww=w, hh=h, vis=visible: gui_update_widget(nid, xx, yy, ww, hh, vis) + ) except Exception as e: print(f"[ERROR] Screenshot task {node_id} failed: {e}") diff --git a/Data/Server/WebUI/index.html b/Data/Server/WebUI/index.html new file mode 100644 index 0000000..89071f6 --- /dev/null +++ b/Data/Server/WebUI/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + Borealis + + + +
+ + + + + \ No newline at end of file diff --git a/Data/Server/WebUI/package.json b/Data/Server/WebUI/package.json index 8ace92a..068991b 100644 --- a/Data/Server/WebUI/package.json +++ b/Data/Server/WebUI/package.json @@ -3,21 +3,27 @@ "version": "1.0.0", "private": true, "scripts": { - "build": "react-scripts build", - "start": "react-scripts start" + "dev": "vite", + "build": "vite build", + "preview": "vite preview" }, "dependencies": { - "@mui/material": "7.0.2", - "@mui/icons-material": "7.0.2", "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", - "react-resizable": "3.0.5", - "react-color": "2.19.3", - "reactflow": "11.11.4", - "socket.io-client": "4.8.1", - "react-simple-keyboard": "3.8.62", + "@mui/icons-material": "7.0.2", + "@mui/material": "7.0.2", "normalize.css": "8.0.1", - "react-scripts": "5.0.1" + "react": "19.1.0", + "react-color": "2.19.3", + "react-dom": "19.1.0", + "react-resizable": "3.0.5", + "reactflow": "11.11.4", + "react-simple-keyboard": "3.8.62", + "socket.io-client": "4.8.1" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.0.0", + "vite": "^5.0.0" }, "browserslist": { "production": [ diff --git a/Data/Server/WebUI/public/index.html b/Data/Server/WebUI/public/index.html deleted file mode 100644 index 124e801..0000000 --- a/Data/Server/WebUI/public/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - Borealis - - - -
- - diff --git a/Data/Server/WebUI/src/App.jsx b/Data/Server/WebUI/src/App.jsx index 53e83dd..721256f 100644 --- a/Data/Server/WebUI/src/App.jsx +++ b/Data/Server/WebUI/src/App.jsx @@ -62,28 +62,28 @@ import React, { window.BorealisUpdateRate = 200; } - // Dynamically load all node components - const nodeContext = require.context("./nodes", true, /\.jsx$/); + // Dynamically load all node components via Vite + const modules = import.meta.glob('./nodes/**/*.jsx', { eager: true }); const nodeTypes = {}; const categorizedNodes = {}; - - nodeContext.keys().forEach((path) => { - const mod = nodeContext(path); - if (!mod.default) return; - const { type, label, component } = mod.default; + + Object.entries(modules).forEach(([path, mod]) => { + const comp = mod.default; + if (!comp) return; + const { type, component } = comp; if (!type || !component) return; - - const pathParts = path.replace("./", "").split("/"); - if (pathParts.length < 2) return; - const category = pathParts[0]; - + + // derive category folder name from path: "./nodes//File.jsx" + const parts = path.replace('./nodes/', '').split('/'); + const category = parts[0]; + if (!categorizedNodes[category]) { categorizedNodes[category] = []; } - categorizedNodes[category].push(mod.default); + categorizedNodes[category].push(comp); nodeTypes[type] = component; }); - + const darkTheme = createTheme({ palette: { mode: "dark", diff --git a/Data/Server/WebUI/src/index.js b/Data/Server/WebUI/src/index.jsx similarity index 95% rename from Data/Server/WebUI/src/index.js rename to Data/Server/WebUI/src/index.jsx index c975f08..fa54af8 100644 --- a/Data/Server/WebUI/src/index.js +++ b/Data/Server/WebUI/src/index.jsx @@ -4,7 +4,6 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; // Global Styles -import './index.css'; import "normalize.css/normalize.css"; import './Borealis.css'; // Global Theming for All of Borealis diff --git a/Data/Server/WebUI/tsconfig.json b/Data/Server/WebUI/tsconfig.json new file mode 100644 index 0000000..5e36961 --- /dev/null +++ b/Data/Server/WebUI/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src"], + "exclude": ["node_modules", "build", "dist"] + } + \ No newline at end of file diff --git a/Data/Server/WebUI/vite.config.ts b/Data/Server/WebUI/vite.config.ts new file mode 100644 index 0000000..9f46812 --- /dev/null +++ b/Data/Server/WebUI/vite.config.ts @@ -0,0 +1,17 @@ +////////// PROJECT FILE SEPARATION LINE ////////// CODE AFTER THIS LINE ARE FROM: /Data/Server/WebUI/vite.config.ts +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +export default defineConfig({ + plugins: [react()], + build: { + outDir: 'build', + emptyOutDir: true + }, + resolve: { + alias: { + '@': path.resolve(__dirname, 'src') + } + } +}); diff --git a/Data/Server/Workflows/Examples/Logic-Comparison-Example.json b/Data/Server/Workflows/Examples/Logic-Comparison-Example.json deleted file mode 100644 index c84c6b4..0000000 --- a/Data/Server/Workflows/Examples/Logic-Comparison-Example.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "nodes": [ - { - "id": "node-1744409843256", - "type": "DataNode", - "position": { - "x": 33.69999186197913, - "y": 182.66666666666666 - }, - "data": { - "label": "String / Number", - "content": "Store a String or Number", - "value": "7" - }, - "width": 160, - "height": 109, - "selected": false, - "positionAbsolute": { - "x": 33.69999186197913, - "y": 182.66666666666666 - }, - "dragging": false - }, - { - "id": "node-1744409846721", - "type": "ComparisonNode", - "position": { - "x": 280.36665852864587, - "y": 21.99999999999997 - }, - "data": { - "label": "Logic Comparison", - "content": "Compare A and B using Logic", - "value": "1", - "inputType": "Number", - "operator": "Equal (==)" - }, - "width": 260, - "height": 167, - "positionAbsolute": { - "x": 280.36665852864587, - "y": 21.99999999999997 - }, - "selected": false, - "dragging": false - }, - { - "id": "node-1744409848750", - "type": "AlertSoundNode", - "position": { - "x": 649.699991861979, - "y": -1.3333333333333925 - }, - "data": { - "label": "Alert Sound", - "content": "Sound alert when input value = 1", - "audio": "data:audio/wav;base64,UklGRt4lAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YbolAAAAAP8MAhv+KAI3/kQBUwBTAEUAN/8oAhv9DAP//vAA4wHV/8YBuf+qAa//vAHL/9gB5//0AgP+EAIf/iwCO/1IBFf8TgVB+zICJQAXAAkA+wDt/94C0f7CAbX/pgGzAcH9zgPd/eoD+f4GAhX9IgMx/j4BTf9YAUv/PAIv/iAAEwIF/PYF6fzaAs0Av/+wAan/tgDFAdP/4AHv//wBC/8YASf/NAFDAFH+VANH/TgCKwAd/g4CAf/yAOUA1wDJALsArQCtALsAyQHX/eQE8/wABA/9HAErADkAR/9UAlH9QgM1/SYDGf4KAP0B7//gAdP/xAG3/6gBsf++Ac3/2gHp//YABQIT/SADL/08A0v9WANN/T4CMf8iARX+BgL5/uoC3f7OAcEAs/+mArX+wgDRAd8A7QD7AAn/FgEl/zICQf5OAVcASf46Ay39HgMR/gIA9QDnAdn/ygK9/q4AqwG5AMcA1QDjAPH//gIN/hoCKf42AkX+UgFTAEX/NgIp/hoCDf7/AfIA5ADWAMgAugCsAK4AvADKANgA5gD0AAIAEAAeACwAOv9HAVYAUABCADT/JQEY/wkB/ADu/98C0v3DA7b9pwOy/r8Czv7bAur+9wEGABQAIgEw/j0CTP1ZA0z+PQEwACL/EwEGAPj/6QHcAM7/vwKy/qcBtgHE/tEC4P7tAvz+CQIY/yX/MwNC/E8EVv1HAToBLP8dABAAAgH0/uUC2P7JAbwArgCsALoAyADWAOQA8gAAAA4AHAAqADgARgBUAFIARAA2ACgAGgAMAP4A8ADiANQAxgC4AKoAsAC+/8sD2vznBPb8AwQS/B8ELvw7BEr9VwJO/j8BMgAkABb/BwL6/usB3gDQ/sEEtPylBLT8wQPQ/90A7AD6AAgAFgAkADIAQABOAFgBSv07BS77HwQS/QMB9gHo/9kBzP+9ALAAqgG4/8UB1ADi/+8C/v0LAxr9JwM2/kMAUgJU/UUDOP0pAhz/DQIA/fEC5ADW/scEuvurBK79uwPK/dcE5vvyBQH7DgUd/CoDOf5GAVUAUQBDADX/JgEZAAsA/QDv/+AB0wDF/7YBqf+wAr/+zAHb/+gB9/8EARMAIf8uAT0AS/9YAk3+PgExACMAFQAHAPkA6//cAc8AwQCz/6YCtf3CA9H+3gDtAvv9CAMX/iQBMwBB/k4DV/1IBDv9LAAfARH/AgL1/uYB2f/KAb0Ar/+qAbn/xgHVAOMA8f/+AQ3/GgIp/jYBRf9SAVP/RAE3/ygBG/8MAP8B8QDj/9QBx/+4AKsCr/y8Bcv72ATn/fQCAwAR/h4DLf06A0n+VgFP/0ABM/8kARcACf/6Ae3/3gHR/8IBtf+mAbMAwf/OAd3/6gL5/QYEFfwiAzH/Pv9MAln/SgA9AS/+IAIT/gQD9/3oAtv/zAC/ALEBqf62A8X90gLh/+4A/QEL/xgAJwE1/0IBUf9UAUf/OAEr/xwADwEB/vID5fzWBMn8ugSt/awCu//IANcA5QHz/gADD/0cAiv+OAJH/lQCUf5CAjX+JgEZ/wsC/v7vAuL90wPG/rcBqv+vAb7/ywLa/ecD9v0DAxL+HwEuATz+SQJY/k0BQAAyACQAFgAIAPr/6wLe/c8Ewv2zAaYBtP3BBND93QLs/vkCCP0VBCT8MQNA/U0EWPxJAzz9LQIgABIABAD2/ucD2v3LA77+rwCqAbj+xQPU/eED8P39Awz9GQIoADb+QwRS+1MFRvs3BSr7GwUO/P8D8v7jAdYAyAC6AKz/rQK8/skC2P3lA/T+AQEQAB7/KwE6/0cBVgBQAEIANP4lBBj7CQb8+u0F4PzRA8T9tQOo/bEDwP3NA9z96QL4/wUBFP8hATD/PQFM/1kBTP89ATAAIv8TAQYA+P7pA9z9zQPA/bEDqP21AsT/0QDgAe7/+wEK/xcAJgE0/0EBUP9VAEgCOv0rAx79DwMC/vMB5v/XAcoAvP+tAaz/uQHIANb/4wDyAQAADgAc/ykBOP9FAlT/UQBEADYAKAEa/wsB/v7vAuL/0wHG/7cAqgCwAL4BzP/ZAOcA9QADARH+HgIt/joCSf9W/04DQfwyBCX9FgEJAfv/7ADfANEAwwC1Aaf/sgDBAM8A3QDrAPkABwAVACMAMQA/AE0AWQFL/TwFL/ogBhP8BAL3/ugB2wDNAb//sAGp/rYCxf/SAOEC7/38Agv+GAMn/DQFQ/pQBVX+Rv84Ayv9HAIP/wAB8//kAdf/yAC7Aa3/rAC7Acn+1gLl//IAAQEP/hwCK/44Akf+VAJR/kIBNQAn/xgCC/78Ae//4AHTAMUAt/+oAbH/vgHNANv/6AH3/wQAEwEh/y4APQBLAFkATQA/ADEAIwAVAAcA+QDrAN0AzwHB/rIDp/20AcMB0f/eAO0B+/8I/xYDJf0yAkH/TgBXAEkBO/8sAR/+EAMD/PQF5/zYAssAvf+uAqv+uALH/tQB4wDxAP8ADQAb/ygCN/1EA1P+UgFFATf+KAIb/gwC///wAOMB1f3GBbn6qgWv/bwAywLZ/+b/9AID/RADH/8sADsASQBX/04CQf4yASUBGP4JAvz+7QHgANIAxAC2AKgAsgDAAM4A3ADqAfj+BQIU/iEDMP09A0z8WQRM/T0CMP8hABQBBv73Aur+2wHOAcD+sQKo/7X/wwPS/d8C7v/7AAoAGAIm/DMEQv1PAlb/RwA6ACwBHv4PAgL+8wLm/9f/yQK8/q0DrPy5BMj91QLk//H//wMO/RsCKv83/0UCVP9RAEQANgAoABoADAH+/e8F4vrTBsb6twWq/q//vQLM/tkB6AH2/QMEEvwfBC78OwNK/lcCTv0/BDL7IwUW/QcA+gLs/d0D0P7BAbT/pQG0/8EB0P/dAez/+QII/RUDJP4xAUABTv5XAkr+OwIu/h8CEv4DAvb+5wLa/ssCvv6vAqr+twLG/9MA4gDwAP4ADAAaASj9NQRE/FEEVPxFAzj+KQEcAQ79/wTy/OMD1v7HArr+qwGuALz/yQLY/+X/8wECABD/HQMs/DkDSP1VA1D+QQI0/iUBGP8JAvz+7QLg/tECxP+1AKgBsv2/BM792gLp/vYBBQATACEAL/88AUsAWQBNAD8AMf8iAxX8BgT5/eoC3f/OAMEBs/6mArX/wgDRAd/+7AH7AAkAFwEl/TIFQflOCFf5SAU7/SwCH/8QAAMA9QDnANkAywG9/q4BqwC5AMcA1QHj/fAE//0MARsBKf42AkX/UgBTAEUANwEp/xoADQD/APEA4wHV/cYEufyqA6/+vADLAdkA5//0AQP/EAAfAS3/OgFJ/1YBT/9AATP/JAEXAAn/+gLt/d4D0f7CAbUApwCz/8ABz//cAuv++AEHABX/IgIx/j4CTf5YAUsAPf8uAiH9EgMF/vYB6f/aAc0Av/+wAqn+tgHFANP/4ALv/vwCC/4YAScANf9CAlH+VAJH/jgCK/0cAw//AADzAeX+1gLJ/7oBrf+sALsCyf3WA+X98gIBAA/+HAIr/jgCR/9U/1ACQ/80/yYCGf0KBP387gTh+9IExf+2/qgDsf6+Ac3/2gHp//YCBf4SASH/LgI9/koCWf5MAT8BMf4jAhb+BwH6Aez+3QHQ/8ECtP6lArT9wQLQAN7/6wH6/wcBFv8jATL+PwNO/VcDSv07Ay79HwISAAT/9QLo/tkBzAC+/68Cqv63Asb+0wHiAPAA/gAM/xkCKP41AkT+UQJU/kUCOP4pAhz+DQIA/vEC5P7VAsj+uQKs/q0CvP7JAtj+5QL0/gEBEAEe/isCOv5HAVYAUABCADQAJgAYAAoA/ADuAOAB0v/DAbb+pwOy/b8Dzv3bAur/9wEG/xMAIgAwAT7/SwBaAEwAPgEw/yH/EwIG/vcC6v7bAc4AwACy/6cCtv7DAdIA4ADuAPwACv8XAib+MwNC/E8EVvxHBDr9KwIe/w8AAgH0/+UA2AHK/rsDrv2rArr/xwHW/+MB8v7/Aw79GwQq+zcERv1TAlIARP41Ayj9GQIM//0A8AHi/9MBxv+3AKoAsAG+/8sB2v/nAPYABAES/x8ALgA8AEoBWP5NAkD+MQIk/xUBCP75Auz/3QHQ/8EBtP+lALQCwv3OA93+6gD5Agf9FAMj/TADP/5MAVn/SgE9AC//IAET/wQB9wDp/toDzf2+A7H+qAC3AcX/0gHh/+4B/f8KARn/JgE1/0IBUf9UAEcBOf4qAx39DgEBAvP85AXX+8gDuwCt/6wCu/7IAdf/5AHzAAEBD/4cASsAOQBHAFX/UAFDADUAJwAZ/goD/f7uAeEA0/7EA7f+qACxAr/8zAXb/OgC9wAF/xIBIf8uAT0ASwBZ/0wBP/8wAiP+FAIH/fgD6/7cAc8AwQCzAKf/tAHDANH/3gLt/voBCQAXACUAMwBBAE8AVwBJATv+LAEfARH+AgL1/uYC2f7KAr3/rgCrAbn+xgPV/eIC8QD//gwDG/4oADcBRf9SAFMBRf82ACkBG/4MAv//8ADjAdX+xgK5/6oBr/+8AMsA2QHn/vQDA/wQBB/9LAI7/0gAVwFP/kACM/8kARf/CAH7/uwC3//QAcMAtf6mA7P9wALP/9wB6/74Awf8FAQj/DAFP/tMBFn9SgI+/y8BIv8TAQb/9wDqAdz/zQHA/7EAqAG2/8MB0v/fAO4B/P8JABgBJv4zA0L8TwRW/UcCOv8rAB4AEAEC/vMC5v/XAMoAvAGu/6sBuv/HANYB5P/xAQD/DQEc/ykAOAFG/1MBUv9DATb/JwEa/wsB/gDw/+EB1P/FAbgAqv+vAb7/ywLa/ucB9gAE/xECIP4tATwASgBYAE4AQAAyACQBFv4HAvr/6wDeAdD+wQK0/6UAtADCAdD+3QPs/fkCCP8VAST/MQFAAE7+VwRK/DsCLgAgABIABAD2/+cB2gHM/r0BsAGq/bcExvzTA+L/7wD+AAwAGv8nAjb+QwJS/1P/RQI4/SkEHP0NAgD/8f/jAtb+xwO6/KsFrvu7BMr91wLm//MBAv8PAR7/KwA6AUj/VQFQ/0EANAAmARj+CQP8/e0C4P/R/8MCtv+nALIBwP7NAtz+6QH4AQb+EwIi/y/+PQVM+1kETPw9AzD/IQAUAQb+9wHqAdz9zQTA/LEDqP61AsP+0ALf/uwB+wAJABcAJf8yAkH9TgRX/EgCOwAt/x4CEf4CAfX/5gHZ/8oBvf+uAasAuf/GAdUA4//wAv/+DAIb/igCN/1EA1P+UgFFADcAKf4aAw39/gPx/uIA1QHH/7gCq/6uAL0Cy/7YAuf+9AEDABEAHwAt/zoBSf9WAU//QAEz/yQBF/8IAPsB7f/eANECw/20A6f9sgPB/c4D3f3qA/n+BgEV/yIAMQE/AE3+WANL/TwCLwAh/hIDBf32Aun/2gDNAb//sACpAbf+xAPT/OAF7/v8BAv+GAAnATX/QgBRAVX/RgA5ACsBHf4OAgH/8gDlAdf+yAK7/6wArQG7/8gA1wHl/vIDAf0OAx38KgQ5/UYDVf5QAEMBNf8mARkAC//8Ae8A4f/SAcUAtwCp/7ABv//MAdsB6f32AwX+EgEhAC8APQBLAFkATQA/ADEAIwAV/wYD+fzqBN39zgHBALMApwC1AMMA0f/eAu39+gMJ/RYCJQAz/0ABT/9WAEoBPP8tASD/EQEE//UA6AHa/8sBvv+vAaoAuP/FAdT/4QHwAf79CwMa/icBNgFE/lECVP5FAjj+KQIc/g0CAP/xAOT/1QLI/rkCrP+t/7sDyvzXBOb98wECARD+HQIs/jkCSP1VBFD8QQM0/SUCGP8JAfz/7QDgAdL+wwO2/acDsv2/A8792wPq/vcCBv0TAyL+LwI+/ksCWv1LAz7/L/8hARQABv/3Aur+2wDOAsD+sQKo/rUCxP7RAeAA7gD8AAoAGP8lAjT+QQFQAFb/RwI6/isCHv4PAgL+8wLm/9cAygC8Aa7+qwK6/scC1v7jAvL+/wEOABwAKgA4AEb/UwJS/UMDNv4nABoBDP/9AfD/4QHU/sUDuP6pAbAAvv/LAdoA6P/1AgT+EQEgAC7/OwJK/lcCTv4/AjL9IwQW/AcE+vzrAt7/zwDCAbT/pQC0AcL+zwPe/esC+v8HARb/IwIy/T8DTv1XAkr/OwEu/x8BEv8DAPYB6P7ZA8z+vQCwAar+tgLFANP/4AHv//wBC/8YASf/NABDAVEAVf9GATn/KgEd/w4CAf7yAeUB1/3IBLv8rASt+7oGyfrWBeX88gMB/g4BHf8qATn/RgFV/1ABQ/80ASf/GAALAf3+7gPh/dICxf62Aqn+sAK//swC2/7oAvf+BAETACH/LgI9/koBWQBN/z4CMf0iAxX+BgL5/uoB3f/OAcEAs/+mArX9wgTR/N4C7f/6Agn+FgIl/TIDQf5OAVcASQA7AC0AH/8QAQP/9ALn/tgBy/+8Aa//qgK5/cYD1f3iA/H9/gMN/hoAKQE3AEX/UgFT/0QBNwEp/hoBDQD/APEB4/7UAsf/uAGr/64AvQDLAdn/5gD1AQP+EAIf/iwCO/9IAFcATwBBADMAJQAXAAkA+wDt/94C0f3CA7X+pgGz/8ABz/7cA+v9+AIH/xQAIwEx/j4DTf1YAksAPf4uAyH9EgMF/fYC6f/aAc3/vgGx/qgDt/3EA9P94ALv//wBC/8YASf/NABDAlH9VQNI/TkCLP8dAhD9AQL0AOb/1wHK/7sBrv+rArr9xwPW/uMB8v7/Aw79GwMq/jcARgFU/1EBRP81ASj/GQAMAv797wLiANT+xQO4/akDsP29A8z92QLoAPb/AwES/h8DLv07Akr/VwFO/z8BMv4jAhb/BwH6/+sB3v7PAsL/swGm/7MBwv/PAd4A7P/5AQj/FQEkADL/PwFO/lcDSv07Ay79HwIS/wMB9v/nAdr/ywC+AbD+qQO4/cUD1P3hAvD//QAMARr/JwE2/0MAUgBUAUb+NwMq/RsCDv7/AvL+4wPW/ccBugCsAK4BvP7JAtj+5QL0AAL+DwIe/ysAOgFI/lUCUP5BAjT+JQIY/wn/+wLu/t8C0v/DAbb+pwKy/78Bzv/bAer/9wEG/xMBIv8vAD4CTPxZBEz9PQIw/yEAFAEG/vcC6v7bAc4BwP2xBKj7tQXE/NED4P3tBPz8CQQY/CUENPxBBFD9VQJI/jkBLAAeABAAAgD0/+UB2ADKALz/rQKr/rgBxwDV/+IC8f7+Ag3+GgIp/jYCRf5SAlP+RAE3ACn/GgIN/f4D8f7iAdUAx/+4Aqv+rgK9/8r/2APn/PQDA/8Q/x4CLf06A0n9VgNP/UACMwAl/xYACQH7/uwD3/7QAMMBtf+mALMBwf7OAt0A6//4AQf/FAAjATH/PgBNAln9SgM9/S4CIf8SAAUB9//oAdv/zAC/ALEBqf+2AcX/0gHh/+4C/f0KAxn9JgM1/kIBUf9UAUf/OAEr/xwBDwAB//IB5f/WAcn/ugGt/qwDu/zIBdf65AXz/QABDwEd/ioBOQFH/VQEUf1CATUBJ/0YBAv8/ATv/OAE0/zEA7f+qAKx/r4DzfvaBun69gYF/BICIf8u/zwDS/1YA03+PgAxASP/FAEH//gA6wHd/84BwQCz/qYDtf3CA9H+3gHtAPv/CAEXACX/MgJB/k4BVwFJ/ToELfweAxH+AgL1/uYC2f7KAr3/rgGr/rgCx//UAeP/8AD//wwCG/8oADf/RAFSAFQARgA4/ykCHP4NAQAA8gDk/9UCyP65Aqz+rQK8/skB2ADmAPQAAgAQAB7/KwI6/UcDVv5PAUIANP8lABgBCv/7Ae4A4P7RA8T9tQOo/bEDwP7NAdz/6QD4AQYAFP8hATD/PQFMAFoATP89AjD+IQIU/gUB+AHq/tsDzvu/BbL9pwK2/sMC0v7fAu7++wIK/hcBJgA0AEIAUABWAEj/OQIs/h0CEP4BAfQA5gDYAMoAvP+tAqz+uQHIANYA5AHy/v8CDv4bAyr9NwNG/VMDUv5DATb/JwEa/wsC/v7vAOIB1P/FAbj/qQCwAb7/ywHa/ucD9v0DAxL8HwUu+zsESv1XAU4CQP0xAiT/FQAIAvr96wPe/c8Dwv2zAqb/swHC/s8D3v3rAvoACP4VAiQAMv4/A07+VwFK/zsBLv8fAhL+AwH2Aej+2QLM/r0CsP6pArj+xQLU/+H/7wL+/QsEGvwnBDb9QwFSAFT/RQI4/ykAHAEO/v8B8gHk/tUDyP25Aq3/rAG7/sgC1/7kA/P9AAIP/hwCK/84AEcBVf5QA0P9NAIn/hgDC/z8Be/74ATT/cQCt/+oALEBv/7MAtv/6AD3AAUAEwAhAS/+PAFLAVn+TAM//DAEI/0UAgf/+ADrAd3/zgHB/7IBp/+0AcMA0f/eAe3/+gIJ/hYCJf4yAUEAT/9WA0n8OgQt/B4DEf4CAvX+5gLZ/8oAvQGv/qoCuf/GANUB4//wAf/+DAIb/ygANwFF/lICU/5EAjf+KAIb/wwA/wHx/uID1f3GArn/qgGv/7wBy/7YAuf/9AADABEAH/8sAjv+SAFXAE//QAEzACX/FgEJAPsA7QDf/9ACw/20Baf7sgPB/s4C3f7qA/n8BgQV/CIEMf0+Ak3/WABLAD0BL/8gARP+BAL3/ugC2//MAL8AsQCp/7YCxf/SAOEA7wD9AAsBGf4mAjX+QgJR/lQCR/44ASsAHf8OAgH98gLlANf/yAG7/6wArQG7/8gB1wDl/vIDAf0OAx3+KgA5AUb/UwFS/0MANgAoAhr9CwP+/e8D4v7TAcYAuACqALD/vQHMANoA6AD2AAT/EQIg/i0BPAFK/VcFTvo/BTL9IwEWAQj/+QDsAN4A0ADCAbT+pQG0AcL9zwXe+usE+v4HARYAJAAy/z8BTv9XAUr/OwAuAiD8EQUE+vUG6PzZAsz+vQKw/6kBuP/F/9MC4v7vA/79CwEaACj/NQJE/1H/UwJG/TYEKfwaAw39/wPz/uQB1//IALsBrf+uAb3/ygHZ/+YA9QEB/w4BHQAr/jgDR/1UA0/9QAMz/SQCFwAJ//wB7/7gAtP+xAK3/6gAs//AAs/93ATr/PgEBfwSAyH+LgI9/koCWf1KAz3+LgEhABP/BAL5/eoD3f7OAcEAs/+oArf+xALT/eAD7/78Agn/Fv8kAjP9QANP/lQBRwA5/yoBHf8OAQH/9AHnANn/ygK9/K4Frfy6A8n+1gDlAfP//wEN/xoAKQE3/0QAUwFR/kIDNfwmBBn8CgX/+vAG4/rUBcj9uQKs/q8Cvv3LBNr85wT2/AEDEP0dAyz+OQJI/VUDTv0/AzL+IwEW/wcA/AHuAOAA0v/DAbb/pwK0/sEC0P7dAewA+gAGABT/IQEw/z0CTP5XAUr/OwIu/R8EEvsDBfj86QPc/s0BwP+xAqr9twPG/dMD4v/v/v0DCv0XAiYBNP1BAlAAVP5FAzj+KQEcAA7//wH0/+UC2P7JArz9rQOu/rsBygHY/eUD9P7/AQ4AHP8pATj/RQFU/08AQgE0/yUAGAAKAP4A8AHi/tMCxv63Aqr/sf+/As7+2wLq//cABAASACAALv87A0r8VwRM/D0DMP4hAhT9BQP6/usB3gDQ/8EBtACo/rUExPvRBeD87QL8AAj/FQEk/zEBQP9NAVb/RwE6ACz+HQMQ/QED9v7nANoBzP+9AbD/qwG6/8cB1gDk//ECAP0LAxr+JwI2/kMBUv9RAUQBNv0nAxr+CwAAA/L84wPW/scCuv6rArD+vQHMANr/5wH2/wECEP0dAiz/OABHAVX/TgBBADMBJf4WAgn+/ALv/uAB0wDF/7YCqf6yAcH/zgHdAOv/+AIF/RIEIfwuAz39SgJZAUv9PAMv/SACE/8EAfn/6gHdAM//wAGz/6gBtwDFANMA4QDv/vwDCf4WASUAM/9AAU//VAFH/zgBKwAd/w4BAQD1/+YC2f7KAb0ArwCtALsByf7WAuX+8gIA/wwAGwEp/jYCRf9SAFEBQ/80ACcBGf8KAf//8AHj/tQDx/24AqsAsf6+A8382gTp/fYCA/8QAB8BLf46Akn/Vv9MAz/8MAQj/BQEB/z6BO393gLR/sICtf6mA7X9wgLR/94A7QH7/gYDFf0iAzH9PgJN/1YBSf86AS3+HgIR/wIB9//oANsAzQG//7ABq/+4Acf/1AHj//AB//8KARn/JgE1/kIDUf1SA0X9NgEpARv/DAAAAfP+5ALX/sgCu/6sAq//vADLAdn+5gL1/wABDwAd/yoBOf9GAVUATwBBADP/JAEXAAkA/QDvAOH/0wLG/rcCqv6xAcAAzgDc/+kC+P0DAxL+HwAuAjz9SQNY/UsCPgAw/iEDFP0FAvr/6wDeANABwv6zAqj/tQDEANIA4ADuAPwBCP0VBST6MQZA+k0GVvpHBjr6KwUe/Q8BAgD2/+cB2gDMAL4AsACsALr/xwLW/eME8vz/Awz+GQEoADb/QwFS/1ECRP01BCj7GQUM/P8D8v7jAdYAyAC6/6sCsP69AcwA2v/nAfYBAv0PAx7+KwE6AEgAVv9NAkD+MQEkABYACAD8/+0C4P3RA8T/tf6nA7T+wQDQAt796wP6/QUDFP4hATAAPv9LAVgASv87AS7/HwES/wMB+P/pAdz/zQHA/7EBqv+3Acb/0wHi/+8B/v8JARj/JQE0AEIAUP9TAkb+NwIq/hsCDv3/BPT85QTY/MkCvACu/60CvP7JAdgA5gD0AAAADgEc/ikCOP5FAVQBUP5BAjT+JQAYAgr9/QTw/OED1P7FALgBqv+xAcAAzv7bA+r99wIE/xEAIAEt/joDSf1WA03+PgAxACMBFf8GAfv/7AHf/tACw/+0AKcBtf/CANEB3//sAfv/BgEV/yIBMf8+AU3/VgFJ/joDLfweBBH+AgD3Aen+2gLNAL//sACrALkBx//UAeP+8AL//goCGf4mAjX+QgJR/lIBRQA3/ygBGwAN//8C8/3kAtf/yAG7/6wBr/68A8v+2ADnAfX/AAAPAh39KgM5/kYAVQJP/UADM/0kAxf9CAP9/e4C4f/SAMUBt/+oAbP/wADPAN0B6//4AQX/Ev8gAy/9PANL/FgES/08Ay/+IAATAQX/+AHr/9wBz//AArP8qAW3+8QE0/7gAO8B/f8IARf+JAQz+0AET/5UAEcCOf4qAR3/DgIB/fQE5/vYBcv8vAOv/qwBu//IAtf+5ALz/v8BDQAbACkANwBFAFMAUQBDADUAJwAZAAsA/wHx/uIB1QDH/7gDq/ywA7/+zAHbAOkA9/8CAxH7HgYt+joESf5WAk3+PgIx/SIDFf0GBPv87ATg/NEDxP61AagAtADCANAA3gDs//kCBv4TAiL/L/89Akz+VwJK/jsCLv8f/xEDBPz3Ber72wTO/L8Esv2pArj/xQDUAeL+7wL+/wkAGAEm/zP/QQNQ/FMFRvo3Bir7GwQO/f8C9P7lA9j9yQK8AK7+rQS8+8kE2P7lAfQAAP8NARz/KQE4/0UBVP9PAkL9MwMm/hcBCgD+/+8C4v7TAcYAuP+pAbIAwADOANz/6QH4AAQAEgAg/y0BPABK/1cCTP49ATAAIv8TAgb++QLs/t0C0P7BArT9pwS2/MME0vzfA+79+wMI/hUBJAAy/z8BTgBW/kcEOvsrBh76DwUC/PUD6P7ZAcwAvv+vAawAuv/HAtb94wLyAAD/CwIa/icBNv9DAVL/UQJE/jUBKP8ZAQz//wHy/+MB1v7HA7r9qwKw/70AzAHa/+cB9v8BARD/HQEs/zkASAJW/U0DQP0xAyT9FQII//sB7gDg/tEDxPy1BKj+s//BBND63Qbs+/kEBv0TAiH/LgE9/0oAWQBLAT3+LgMh/RICBf/4AOsA3QHP/8AAswGp/rYDxfzSBOH97gH9AQn+FgElATP9QARP/VQBRwA5ACsAHQAPAAH/9APn/NgEy/y8A6/+rAK7/8j/1gLl/fIEAPwMBBv9KAI3/kQBUwFR/kIDNfwmAxn+CgH/APEA4wDV/8YBuf+qAbEBv/3MBNv86AP3/gIBEQAf/ywCO/1IA1f9TAM//jAAIwIV/AYF+/zsA9/+0AHD/7QBqP+0AsP90APf/uwB+wAH/xQBIwAx/z4CTf1VA0n+OgEt/x4BEf8CAfcA6f/aAc3/vgGxAKv/uAHH/9QB4wDxAP//CgEZACcANQFD/lABUwFF/jYDKfwaBA39/wPz/eQC1//IAbv+rAOv/bwCy//Y/+YC9f4AAg/9HAQr/DgDR/5TAU8BQf4yAiX+FgIJ/vwC7//gAdP/xAC3Aar+sgPB/c4D3f7qAPkBBf8SAiH+LgE9/0oCWP9KAT39LgQh/RICBQD5/usD3v3PAsL+swOp/bUDxP3RAuD/7QH8/gcDFv0jAjL/PwBOAFUBSP05BCz8HQQQ/AED9v7nAtr+ywK+/rACrf65AcgA1gDkAPIAAP4LBBr8JwQ2/EMDUf5QAkT/Nf8nAxr8CwQA/fEB5AHW/scCuv6sArH+vQLM/tkC6P71AQIAEAAeACwAOgBI/1QCTf4/AjL+IwIW/gcB/AHu/d8E0vzDA7b+qAG1AMIA0ADe/+sC+v4FAhT/If8vAj7+SgJX/kkCPP4tAiD+EQEEAfj+6QLc/s0BwACzAKsAuADGANT/4QLw/v0DCvsXBSb9MwFCAU/9UgNG/jcCKv4bAg7+/wH0Aeb+1wPK/bsBrwGv/7sAygHY/uUD9P3/Ag7/GwEq/zcBRv9SAU8AQv8zASYAGP8JAv797wPi/tMBxv+4Aav/sgHA/80A3ADqAfj/AwER/h0CKv40A0D9SQI+/zAAJQEa/g4CBP77AvP/6QHi/toB1QHQ/tgD4vzpBPH99wL+/gIBCAEM/g8CE/4VARcAEQANAAn/BAECAAD//gL+/v0B/v/+" - }, - "width": 231, - "height": 214, - "positionAbsolute": { - "x": 649.699991861979, - "y": -1.3333333333333925 - }, - "selected": false, - "dragging": false - }, - { - "id": "node-1744409908429", - "type": "DataNode", - "position": { - "x": 31.0333251953125, - "y": 18.66666666666667 - }, - "data": { - "label": "String / Number", - "content": "Store a String or Number", - "value": "7" - }, - "width": 160, - "height": 109, - "positionAbsolute": { - "x": 31.0333251953125, - "y": 18.66666666666667 - }, - "selected": true, - "dragging": false - } - ], - "edges": [ - { - "source": "node-1744409843256", - "sourceHandle": null, - "target": "node-1744409846721", - "targetHandle": "b", - "type": "smoothstep", - "animated": true, - "style": { - "strokeDasharray": "6 3", - "stroke": "#58a6ff" - }, - "id": "reactflow__edge-node-1744409843256-node-1744409846721b" - }, - { - "source": "node-1744409846721", - "sourceHandle": null, - "target": "node-1744409848750", - "targetHandle": null, - "type": "smoothstep", - "animated": true, - "style": { - "strokeDasharray": "6 3", - "stroke": "#58a6ff" - }, - "id": "reactflow__edge-node-1744409846721-node-1744409848750" - }, - { - "source": "node-1744409908429", - "sourceHandle": null, - "target": "node-1744409846721", - "targetHandle": "a", - "type": "smoothstep", - "animated": true, - "style": { - "strokeDasharray": "6 3", - "stroke": "#58a6ff" - }, - "id": "reactflow__edge-node-1744409908429-node-1744409846721a" - } - ] -} \ No newline at end of file diff --git a/Data/Server/Workflows/Flyff Universe/Flyff_OCR_Workflow.json b/Data/Server/Workflows/Flyff Universe/Flyff_OCR_Workflow.json deleted file mode 100644 index 0b56d33..0000000 --- a/Data/Server/Workflows/Flyff Universe/Flyff_OCR_Workflow.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "nodes": [ - { - "id": "node-1744529148941", - "type": "ImageUploadNode_RawBase64", - "position": { - "x": 30.511108398437557, - "y": 24 - }, - "data": { - "label": "Upload Image", - "content": "Upload an image, output only the raw base64 string.", - "value": "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" - }, - "width": 238, - "height": 123, - "selected": false, - "positionAbsolute": { - "x": 30.511108398437557, - "y": 24 - }, - "dragging": false - }, - { - "id": "node-1744529157067", - "type": "BWThresholdNode", - "position": { - "x": 355.1777750651042, - "y": 38.000000000000014 - }, - "data": { - "label": "BW Threshold", - "content": "Applies black & white threshold to base64 image input." - }, - "width": 160, - "height": 96, - "selected": false, - "positionAbsolute": { - "x": 355.1777750651042, - "y": 38.000000000000014 - }, - "dragging": false - }, - { - "id": "node-1744529163171", - "type": "Image_Viewer", - "position": { - "x": 193.84444173177076, - "y": 320.6666666666667 - }, - "data": { - "label": "Image Viewer", - "content": "Visual preview of base64 image with optional PNG export." - }, - "width": 260, - "height": 293, - "selected": false, - "positionAbsolute": { - "x": 193.84444173177076, - "y": 320.6666666666667 - }, - "dragging": false - }, - { - "id": "node-1744529192519", - "type": "OCR_Text_Extraction", - "position": { - "x": 619.1777750651041, - "y": 344.66666666666663 - }, - "data": { - "label": "OCR-Based Text Extraction", - "content": "Extract Multi-Line Text from Upstream Image Node" - }, - "width": 231, - "height": 245, - "selected": true, - "positionAbsolute": { - "x": 619.1777750651041, - "y": 344.66666666666663 - }, - "dragging": false - } - ], - "edges": [ - { - "source": "node-1744529148941", - "sourceHandle": null, - "target": "node-1744529157067", - "targetHandle": null, - "type": "smoothstep", - "animated": true, - "style": { - "strokeDasharray": "6 3", - "stroke": "#58a6ff" - }, - "id": "reactflow__edge-node-1744529148941-node-1744529157067" - }, - { - "source": "node-1744529157067", - "sourceHandle": null, - "target": "node-1744529163171", - "targetHandle": null, - "type": "smoothstep", - "animated": true, - "style": { - "strokeDasharray": "6 3", - "stroke": "#58a6ff" - }, - "id": "reactflow__edge-node-1744529157067-node-1744529163171" - }, - { - "source": "node-1744529163171", - "sourceHandle": null, - "target": "node-1744529192519", - "targetHandle": null, - "type": "smoothstep", - "animated": true, - "style": { - "strokeDasharray": "6 3", - "stroke": "#58a6ff" - }, - "id": "reactflow__edge-node-1744529163171-node-1744529192519" - } - ] -} \ No newline at end of file diff --git a/Launch-Borealis.ps1 b/Launch-Borealis.ps1 index 13e5826..15b6c48 100644 --- a/Launch-Borealis.ps1 +++ b/Launch-Borealis.ps1 @@ -18,9 +18,6 @@ # ---------------------- Common Initialization & Visuals ---------------------- Clear-Host -<# - Section: Progress Symbols & Helpers -#> $symbols = @{ Success = [char]0x2705 Running = [char]0x23F3 @@ -38,7 +35,7 @@ function Write-ProgressStep { function Run-Step { param ( - [string] $Message, + [string] $Message, [scriptblock]$Script ) Write-ProgressStep -Message $Message -Status "$($symbols.Running)" @@ -107,16 +104,8 @@ switch ($choice) { New-Item -Path $dataDestination -ItemType Directory -Force | Out-Null Copy-Item "$dataSource\Server\Python_API_Endpoints" $dataDestination -Recurse Copy-Item "$dataSource\Server\Sounds" $dataDestination -Recurse - Copy-Item "$dataSource\Server\Workflows" $dataDestination -Recurse Copy-Item "$dataSource\Server\server.py" $dataDestination } - if (-not (Test-Path $webUIDestination)) { - & $npxCmd --yes create-react-app $webUIDestination | Out-Null - } - if (Test-Path $customUIPath) { - Copy-Item "$customUIPath\*" $webUIDestination -Recurse -Force - } - Remove-Item "$webUIDestination\build" -Recurse -Force -ErrorAction SilentlyContinue . "$venvFolder\Scripts\Activate" } @@ -127,20 +116,27 @@ switch ($choice) { } } - # NPM Install for WebUI - Run-Step "ReactJS Web Frontend: Install NPM Packages" { - if (Test-Path "$webUIDestination\package.json") { - Push-Location $webUIDestination - $env:npm_config_loglevel = "silent" - & $npmCmd install --silent --no-fund --audit=false | Out-Null - Pop-Location + # Copy Vite WebUI assets (no CRA) + Run-Step "Setup Vite WebUI assets" { + if (Test-Path $webUIDestination) { + Remove-Item $webUIDestination -Recurse -Force -ErrorAction SilentlyContinue } + New-Item -Path $webUIDestination -ItemType Directory -Force | Out-Null + Copy-Item "$customUIPath\*" $webUIDestination -Recurse -Force } - # Build React App - Run-Step "ReactJS Web Frontend: Build" { + # NPM Install for WebUI + Run-Step "Vite Web Frontend: Install NPM Packages" { Push-Location $webUIDestination - & $npmCmd run build + $env:npm_config_loglevel = "silent" + & $npmCmd install --silent --no-fund --audit=false | Out-Null + Pop-Location + } + + # Build with Vite + Run-Step "Vite Web Frontend: Build" { + Push-Location $webUIDestination + & $npmCmd run build --silent Pop-Location } @@ -165,7 +161,7 @@ switch ($choice) { Clear-Host Write-Host "Deploying Borealis Agent..." -ForegroundColor Blue Write-Host "====================================================================================" - + $venvFolder = "Agent" $agentSourcePath = "Data\Agent\borealis-agent.py" $agentRequirements = "Data\Agent\agent-requirements.txt" @@ -201,7 +197,7 @@ switch ($choice) { Clear-Host Write-Host "Deploying Borealis Desktop App..." -ForegroundColor Cyan Write-Host "====================================================================================" - + $electronSource = "Data\Electron" $electronDestination = "ElectronApp" $scriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent @@ -224,10 +220,10 @@ switch ($choice) { Copy-Item "$electronSource\package.json" "$electronDestination" -Force Copy-Item "$electronSource\main.js" "$electronDestination" -Force - # Copy CRA build into renderer + # Copy built WebUI into renderer $staticBuild = Join-Path $scriptDir 'Server\web-interface\build' if (-not (Test-Path $staticBuild)) { - throw "React build not found - run choice 1 to build WebUI first." + throw "WebUI build not found - run choice 1 to build WebUI first." } Copy-Item "$staticBuild\*" "$electronDestination\renderer" -Recurse -Force }