#////////// PROJECT FILE SEPARATION LINE ////////// CODE AFTER THIS LINE ARE FROM: /Launch-Borealis.ps1 <# Deploy-Borealis.ps1 ---------------------- This script deploys the Borealis Workflow Automation Tool with two modules: - Server (Web Dashboard) - Agent (Client / Data Collector) It begins by presenting a menu to the user. Based on the selection (1 or 2), the corresponding module is launched. Usage: Set-ExecutionPolicy Unrestricted -Scope Process; .\Launch-Borealis.ps1 #> # ---------------------- Common Initialization & Visuals ---------------------- Clear-Host <# Section: Progress Symbols & Helpers ------------------------------------ Define symbols for UI feedback and helper functions to run steps with consistent progress/status output and error handling. #> $symbols = @{ Success = [char]0x2705 Running = [char]0x23F3 Fail = [char]0x274C Info = [char]0x2139 } function Write-ProgressStep { param ( [string]$Message, [string]$Status = $symbols["Info"] ) Write-Host "`r$Status $Message... " -NoNewline } function Run-Step { param ( [string] $Message, [scriptblock]$Script ) Write-ProgressStep -Message $Message -Status "$($symbols.Running)" try { & $Script if ($LASTEXITCODE -eq 0 -or $?) { Write-Host "`r$($symbols.Success) $Message " } else { throw "Non-zero exit code" } } catch { Write-Host "`r$($symbols.Fail) $Message - Failed: $_ " -ForegroundColor Red exit 1 } } # ---------------------- Bundle Executables Setup ---------------------- <# Section: Locate Bundled Runtimes -------------------------------- Identify the directory of this script, then ensure our bundled Python and NodeJS executables are present. Add them to PATH for later use. #> $scriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent $depsRoot = Join-Path $scriptDir 'Dependencies' $pythonExe = Join-Path $depsRoot 'Python\python.exe' $nodeExe = Join-Path $depsRoot 'NodeJS\node.exe' $npmCmd = Join-Path (Split-Path $nodeExe) 'npm.cmd' $npxCmd = Join-Path (Split-Path $nodeExe) 'npx.cmd' foreach ($tool in @($pythonExe, $nodeExe, $npmCmd, $npxCmd)) { if (-not (Test-Path $tool)) { Write-Host "`r$($symbols.Fail) Bundled executable not found at '$tool'." -ForegroundColor Red exit 1 } } $env:PATH = '{0};{1};{2}' -f (Split-Path $pythonExe), (Split-Path $nodeExe), $env:PATH # ---------------------- Menu Prompt & User Input ---------------------- Write-Host "Deploying Borealis - Workflow Automation Tool..." -ForegroundColor Blue Write-Host "====================================================================================" Write-Host "Please choose which module you want to launch / (re)deploy:" Write-Host "- Server (Web Dashboard) [1]" Write-Host "- Agent (Local/Remote Client) [2]" $choice = Read-Host "Enter 1 or 2" switch ($choice) { "1" { # ---------------------- Server Deployment Setup ---------------------- Clear-Host Write-Host "Deploying Borealis - Workflow Automation Tool..." -ForegroundColor Blue Write-Host "====================================================================================" $venvFolder = "Server" $dataSource = "Data" $dataDestination = "$venvFolder\Borealis" $customUIPath = "$dataSource\Server\WebUI" $webUIDestination = "$venvFolder\web-interface" $venvPython = Join-Path $venvFolder 'Scripts\python.exe' <# Step: Create Virtual Environment & Copy Server Assets #> Run-Step "Create Borealis Virtual Python Environment" { if (-not (Test-Path "$venvFolder\Scripts\Activate")) { & $pythonExe -m venv $venvFolder | Out-Null } if (Test-Path $dataSource) { Remove-Item $dataDestination -Recurse -Force -ErrorAction SilentlyContinue 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" } <# Step: Install Python Dependencies #> Run-Step "Install Python Dependencies into Virtual Python Environment" { if (Test-Path "$dataSource\Server\server-requirements.txt") { & $venvPython -m pip install --disable-pip-version-check -q -r "$dataSource\Server\server-requirements.txt" | Out-Null } } <# Step: NPM Install #> Run-Step "ReactJS Web Frontend: Install Necessary 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 } } <# Step: Build React App #> Run-Step "ReactJS Web Frontend: " { Push-Location $webUIDestination & $npmCmd run build Pop-Location } <# Step: Launch Flask Server -------------------------- Change into the Server folder so server.py’s relative paths to web-interface/build resolve correctly, then invoke Python on the server script. #> Run-Step "Borealis: Launch Flask Server" { Push-Location (Join-Path $scriptDir 'Server') $py = Join-Path $scriptDir 'Server\Scripts\python.exe' $server_py = Join-Path $scriptDir 'Server\Borealis\server.py' Write-Host "`nLaunching Borealis..." -ForegroundColor Green Write-Host "====================================================================================" Write-Host "$($symbols.Running) Python Flask Server Started..." Write-Host "$($symbols.Running) Preloading OCR Engines... Please be patient..." & $py $server_py Pop-Location } } "2" { # ---------------------- Agent Deployment Setup ---------------------- 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" $agentDestinationFolder = "$venvFolder\Borealis" $agentDestinationFile = "$venvFolder\Borealis\borealis-agent.py" # build the absolute path to python.exe inside the venv $venvPython = Join-Path $scriptDir $venvFolder $venvPython = Join-Path $venvPython 'Scripts\python.exe' <# Step: Create Virtual Environment & Copy Agent Script #> Run-Step "Create Virtual Python Environment" { if (-not (Test-Path "$venvFolder\Scripts\Activate")) { & $pythonExe -m venv $venvFolder } if (Test-Path $agentSourcePath) { Remove-Item $agentDestinationFolder -Recurse -Force -ErrorAction SilentlyContinue New-Item -Path $agentDestinationFolder -ItemType Directory -Force | Out-Null Copy-Item $agentSourcePath $agentDestinationFile -Force } . "$venvFolder\Scripts\Activate" } <# Step: Install Agent Dependencies #> Run-Step "Install Python Dependencies" { if (Test-Path $agentRequirements) { & $venvPython -m pip install --disable-pip-version-check -q -r $agentRequirements | Out-Null } } Write-Host "`nLaunching Borealis Agent..." -ForegroundColor Blue Write-Host "====================================================================================" # call python with the absolute interpreter path and the absolute script path $agentScript = Join-Path $scriptDir $agentDestinationFile & $venvPython -W ignore::SyntaxWarning $agentScript } default { Write-Host "Invalid selection. Exiting..." -ForegroundColor Yellow exit 1 } }