$ErrorActionPreference = "Stop" $projectRoot = $PSScriptRoot $venvPython = Join-Path $projectRoot ".venv\Scripts\python.exe" Set-Location -LiteralPath $projectRoot if (Get-Process -Name "MultiClawAgent" -ErrorAction SilentlyContinue) { throw "请先退出正在运行的 MultiClawAgent,再执行编译。" } # A local rebuild replaces the whole dist folder. Preserve the user's portable # settings so a developer build does not unexpectedly erase pairing or LLM # endpoint preferences. Secrets remain in Windows Credential Manager. $existingConfig = Join-Path $projectRoot "dist\MultiClawAgent\config\agent-config.json" $preservedConfig = $null if (Test-Path -LiteralPath $existingConfig) { $preservedConfig = Join-Path ([System.IO.Path]::GetTempPath()) ("MultiClawAgent-config-" + [guid]::NewGuid() + ".json") Copy-Item -LiteralPath $existingConfig -Destination $preservedConfig -Force } if (-not (Test-Path -LiteralPath $venvPython)) { python -m venv (Join-Path $projectRoot ".venv") } & $venvPython -m pip install --disable-pip-version-check -e ".[dev]" & $venvPython -m PyInstaller ` --noconfirm ` --clean ` --windowed ` --name "MultiClawAgent" ` --paths "src" ` --hidden-import "keyring.backends.Windows" ` --hidden-import "pystray._win32" ` --copy-metadata "keyring" ` --distpath "dist" ` --workpath "build" ` "app.py" $configTarget = Join-Path $projectRoot "dist\MultiClawAgent\config" Copy-Item -LiteralPath (Join-Path $projectRoot "config") -Destination $configTarget -Recurse -Force if ($preservedConfig -and (Test-Path -LiteralPath $preservedConfig)) { Copy-Item -LiteralPath $preservedConfig -Destination (Join-Path $configTarget "agent-config.json") -Force Remove-Item -LiteralPath $preservedConfig -Force } # Older preview builds exposed local LLM fields. The production design keeps # provider configuration under controller control, so remove those obsolete # portable settings while retaining the pairing and display-name preferences. $packagedConfig = Join-Path $configTarget "agent-config.json" $configObject = Get-Content -LiteralPath $packagedConfig -Raw | ConvertFrom-Json $configObject.PSObject.Properties.Remove("llm_base_url") $configObject.PSObject.Properties.Remove("llm_model") $configObject | ConvertTo-Json -Depth 4 | Set-Content -LiteralPath $packagedConfig -Encoding utf8 # PyInstaller's build folder is an intermediate cache, not a distributable # application. Remove it so users only see the complete package in dist. $buildTarget = Join-Path $projectRoot "build\MultiClawAgent" if (Test-Path -LiteralPath $buildTarget) { Remove-Item -LiteralPath $buildTarget -Recurse -Force } Write-Host "编译完成:$(Join-Path $projectRoot 'dist\MultiClawAgent\MultiClawAgent.exe')"