Files
agent-desktop/scripts/verify/launch_tauri_windows.ps1
T

149 lines
5.7 KiB
PowerShell

# Install Tauri via NSIS, launch the shell, and wait for the backend.
# Outputs BASE_URL to $env:GITHUB_ENV for subsequent steps.
$ErrorActionPreference = "Stop"
# 1. Run NSIS silent install (matches real user installer).
# /S = silent, run the installer to completion before continuing.
$installer = Get-ChildItem dist/QwenPaw-Tauri-*-Windows-setup.exe |
Select-Object -First 1
if (-not $installer) { throw "NSIS installer not found in dist/" }
Write-Host "Installing $($installer.Name) silently..."
$proc = Start-Process -FilePath $installer.FullName -ArgumentList "/S" `
-Wait -PassThru -NoNewWindow
Write-Host "Installer exited with code $($proc.ExitCode)"
if ($proc.ExitCode -ne 0) {
throw "NSIS installer failed (exit $($proc.ExitCode))"
}
# Tauri NSIS spawns elevated child + finishes immediately; allow time for
# files to settle.
Start-Sleep -Seconds 5
# 2. Locate the installed Tauri exe.
# Priority: registry InstallLocation (canonical) → known candidate dirs.
$tauriExe = $null
# Try registry first — Tauri NSIS always writes InstallLocation.
foreach ($hive in @("HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall")) {
$reg = Get-ChildItem $hive -ErrorAction SilentlyContinue |
Where-Object { (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).DisplayName -match "QwenPaw" } |
Select-Object -First 1
if ($reg) {
$loc = (Get-ItemProperty $reg.PSPath).InstallLocation
if ($loc -and (Test-Path $loc)) {
$found = Get-ChildItem -Path $loc -Filter "qwenpaw-desktop.exe" `
-Recurse -Depth 3 -ErrorAction SilentlyContinue |
Select-Object -First 1
if ($found) { $tauriExe = $found.FullName; break }
}
}
}
# Fallback: search known install candidate directories.
if (-not $tauriExe) {
$candidateRoots = @(
(Join-Path $env:LOCALAPPDATA "PineAgents"),
(Join-Path $env:LOCALAPPDATA "Programs\PineAgents"),
(Join-Path $env:ProgramFiles "PineAgents"),
(Join-Path ${env:ProgramFiles(x86)} "PineAgents")
)
foreach ($root in $candidateRoots) {
if (Test-Path $root) {
$found = Get-ChildItem -Path $root -Filter "qwenpaw-desktop.exe" `
-Recurse -Depth 3 -ErrorAction SilentlyContinue |
Select-Object -First 1
if ($found) { $tauriExe = $found.FullName; break }
}
}
}
if (-not $tauriExe) {
Write-Host "=== DEBUG: install location not found ==="
Write-Host "Registry entries matching QwenPaw:"
foreach ($hive in @("HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")) {
Get-ChildItem $hive -ErrorAction SilentlyContinue |
Where-Object { (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).DisplayName -match "QwenPaw" } |
ForEach-Object { Write-Host " $((Get-ItemProperty $_.PSPath).InstallLocation)" }
}
throw "Tauri exe not found after NSIS install"
}
Write-Host "Installed at: $tauriExe"
# 2b. Verify WebView2 bootstrapper is bundled in the install.
$installRoot = Split-Path $tauriExe -Parent
$wv2Files = Get-ChildItem -Path $installRoot -Filter "*WebView2*" `
-Recurse -Depth 3 -ErrorAction SilentlyContinue
if ($wv2Files) {
Write-Host "WebView2 bootstrapper present: $($wv2Files[0].Name)"
} else {
Write-Host "::warning::WebView2 bootstrapper not found in install dir"
}
# 3. Launch the full Tauri shell with CDP debugging enabled.
# This makes WebView2 expose a Chrome DevTools Protocol port so
# Playwright can connect_over_cdp() to the real embedded webview.
$cdpPort = 9222
$env:WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS = "--remote-debugging-port=$cdpPort"
Start-Process -FilePath $tauriExe
# 4. Wait for the sidecar to write the port file and respond.
# The sidecar writes desktop_port at WORKING_DIR root (~/.qwenpaw),
# not inside the workspace dir.
$portFile = Join-Path $env:USERPROFILE ".qwenpaw\desktop_port"
$port = $null
$deadline = (Get-Date).AddSeconds(120)
while ((Get-Date) -lt $deadline) {
if (Test-Path $portFile) {
$port = (Get-Content $portFile -ErrorAction SilentlyContinue).Trim()
if ($port) {
try {
$r = Invoke-WebRequest -Uri "http://127.0.0.1:$port/api/version" `
-UseBasicParsing -TimeoutSec 5 -ErrorAction Stop
if ($r.StatusCode -eq 200) {
Write-Host "Tauri app ready on port $port"
break
}
} catch {}
}
}
Start-Sleep -Seconds 2
}
if (-not $port) {
Write-Host "::error::Tauri app did not start within 120s"
exit 1
}
# 5. Auto-init creates BOOTSTRAP.md during startup. Remove it afterwards so
# the verifier can drive the agent in normal QA mode.
$bootstrapMd = Join-Path $env:USERPROFILE ".qwenpaw\workspaces\default\BOOTSTRAP.md"
if (Test-Path $bootstrapMd) { Remove-Item -Force $bootstrapMd }
# 6. Wait for CDP endpoint to become available.
$cdpUrl = "http://127.0.0.1:$cdpPort"
$cdpReady = $false
for ($i = 1; $i -le 30; $i++) {
try {
$r = Invoke-WebRequest -Uri "$cdpUrl/json/version" `
-UseBasicParsing -TimeoutSec 3 -ErrorAction Stop
if ($r.StatusCode -eq 200) {
Write-Host "CDP ready at $cdpUrl"
$cdpReady = $true
break
}
} catch { Start-Sleep -Seconds 2 }
}
if (-not $cdpReady) {
Write-Host "::warning::CDP not available, falling back to standalone browser"
$cdpUrl = ""
}
$baseUrl = "http://127.0.0.1:$port"
$env:BASE_URL = $baseUrl
$env:CDP_URL = $cdpUrl
"BASE_URL=$baseUrl" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"CDP_URL=$cdpUrl" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Write-Host "BASE_URL=$baseUrl"
Write-Host "CDP_URL=$cdpUrl"