fix: support anthropic parallels smoke lanes

This commit is contained in:
Peter Steinberger
2026-03-28 21:27:20 +00:00
parent 703e68a749
commit eec290e68d
4 changed files with 230 additions and 64 deletions

View File

@@ -5,7 +5,11 @@ VM_NAME="Ubuntu 24.04.3 ARM64"
VM_NAME_EXPLICIT=0
SNAPSHOT_HINT="fresh"
MODE="both"
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
PROVIDER="openai"
API_KEY_ENV=""
AUTH_CHOICE=""
AUTH_KEY_FLAG=""
MODEL_ID=""
INSTALL_URL="https://openclaw.ai/install.sh"
HOST_PORT="18427"
HOST_PORT_EXPLICIT=0
@@ -82,7 +86,11 @@ Options:
Falls back to the closest Ubuntu VM when omitted and unavailable.
--snapshot-hint <name> Snapshot name substring/fuzzy match. Default: "fresh"
--mode <fresh|upgrade|both>
--openai-api-key-env <var> Host env var name for OpenAI API key. Default: OPENAI_API_KEY
--provider <openai|anthropic>
Provider auth/model lane. Default: openai
--api-key-env <var> Host env var name for provider API key.
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
--install-url <url> Installer URL for latest release. Default: https://openclaw.ai/install.sh
--host-port <port> Host HTTP port for current-main tgz. Default: 18427
--host-ip <ip> Override Parallels host IP.
@@ -115,8 +123,12 @@ while [[ $# -gt 0 ]]; do
MODE="$2"
shift 2
;;
--openai-api-key-env)
OPENAI_API_KEY_ENV="$2"
--provider)
PROVIDER="$2"
shift 2
;;
--api-key-env|--openai-api-key-env)
API_KEY_ENV="$2"
shift 2
;;
--install-url)
@@ -169,8 +181,26 @@ case "$MODE" in
;;
esac
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
case "$PROVIDER" in
openai)
AUTH_CHOICE="openai-api-key"
AUTH_KEY_FLAG="openai-api-key"
MODEL_ID="openai/gpt-5.4"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
;;
anthropic)
AUTH_CHOICE="apiKey"
AUTH_KEY_FLAG="anthropic-api-key"
MODEL_ID="anthropic/claude-sonnet-4-6"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
;;
*)
die "invalid --provider: $PROVIDER"
;;
esac
API_KEY_VALUE="${!API_KEY_ENV:-}"
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
resolve_vm_name() {
local json requested explicit
@@ -526,10 +556,10 @@ verify_version_contains() {
}
run_ref_onboard() {
guest_exec /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" openclaw onboard \
guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw onboard \
--non-interactive \
--mode local \
--auth-choice openai-api-key \
--auth-choice "$AUTH_CHOICE" \
--secret-input-mode ref \
--gateway-port 18789 \
--gateway-bind loopback \
@@ -540,7 +570,8 @@ run_ref_onboard() {
}
verify_local_turn() {
guest_exec /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" openclaw agent \
guest_exec openclaw models set "$MODEL_ID"
guest_exec /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" openclaw agent \
--local \
--agent main \
--message ping \
@@ -630,6 +661,7 @@ summary = {
"snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"],
"snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"],
"mode": os.environ["SUMMARY_MODE"],
"provider": os.environ["SUMMARY_PROVIDER"],
"latestVersion": os.environ["SUMMARY_LATEST_VERSION"],
"installVersion": os.environ["SUMMARY_INSTALL_VERSION"],
"targetPackageSpec": os.environ["SUMMARY_TARGET_PACKAGE_SPEC"],
@@ -745,6 +777,7 @@ SUMMARY_JSON_PATH="$(
SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \
SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \
SUMMARY_MODE="$MODE" \
SUMMARY_PROVIDER="$PROVIDER" \
SUMMARY_LATEST_VERSION="$LATEST_VERSION" \
SUMMARY_INSTALL_VERSION="$INSTALL_VERSION" \
SUMMARY_TARGET_PACKAGE_SPEC="$TARGET_PACKAGE_SPEC" \

View File

@@ -6,7 +6,11 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
VM_NAME="macOS Tahoe"
SNAPSHOT_HINT="macOS 26.3.1 latest"
MODE="both"
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
PROVIDER="openai"
API_KEY_ENV=""
AUTH_CHOICE=""
AUTH_KEY_FLAG=""
MODEL_ID=""
INSTALL_URL="https://openclaw.ai/install.sh"
HOST_PORT="18425"
HOST_PORT_EXPLICIT=0
@@ -111,8 +115,11 @@ Options:
fresh = fresh snapshot -> target package/current main tgz -> onboard smoke
upgrade = fresh snapshot -> latest release -> target package/current main tgz -> onboard smoke
both = run both lanes
--openai-api-key-env <var> Host env var name for OpenAI API key.
Default: OPENAI_API_KEY
--provider <openai|anthropic>
Provider auth/model lane. Default: openai
--api-key-env <var> Host env var name for provider API key.
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
--install-url <url> Installer URL for latest release. Default: https://openclaw.ai/install.sh
--host-port <port> Host HTTP port for current-main tgz. Default: 18425
--host-ip <ip> Override Parallels host IP.
@@ -148,8 +155,12 @@ while [[ $# -gt 0 ]]; do
MODE="$2"
shift 2
;;
--openai-api-key-env)
OPENAI_API_KEY_ENV="$2"
--provider)
PROVIDER="$2"
shift 2
;;
--api-key-env|--openai-api-key-env)
API_KEY_ENV="$2"
shift 2
;;
--install-url)
@@ -218,8 +229,26 @@ case "$MODE" in
;;
esac
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
case "$PROVIDER" in
openai)
AUTH_CHOICE="openai-api-key"
AUTH_KEY_FLAG="openai-api-key"
MODEL_ID="openai/gpt-5.4"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
;;
anthropic)
AUTH_CHOICE="apiKey"
AUTH_KEY_FLAG="anthropic-api-key"
MODEL_ID="anthropic/claude-sonnet-4-6"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
;;
*)
die "invalid --provider: $PROVIDER"
;;
esac
API_KEY_VALUE="${!API_KEY_ENV:-}"
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
if [[ -n "$DISCORD_TOKEN_ENV" || -n "$DISCORD_GUILD_ID" || -n "$DISCORD_CHANNEL_ID" ]]; then
[[ -n "$DISCORD_TOKEN_ENV" ]] || die "--discord-token-env is required when Discord smoke args are set"
@@ -712,11 +741,11 @@ EOF
run_ref_onboard() {
guest_current_user_cli \
/usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" \
/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" \
"$GUEST_OPENCLAW_BIN" onboard \
--non-interactive \
--mode local \
--auth-choice openai-api-key \
--auth-choice "$AUTH_CHOICE" \
--secret-input-mode ref \
--gateway-port 18789 \
--gateway-bind loopback \
@@ -739,8 +768,9 @@ show_gateway_status_compat() {
}
verify_turn() {
guest_current_user_cli "$GUEST_OPENCLAW_BIN" models set "$MODEL_ID"
guest_current_user_cli \
/usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" \
/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" \
"$GUEST_OPENCLAW_BIN" agent \
--agent main \
--message "Reply with exact ASCII text OK only." \
@@ -1082,6 +1112,7 @@ import sys
summary = {
"vm": os.environ["SUMMARY_VM"],
"provider": os.environ["SUMMARY_PROVIDER"],
"snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"],
"snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"],
"mode": os.environ["SUMMARY_MODE"],
@@ -1246,6 +1277,7 @@ fi
SUMMARY_JSON_PATH="$(
SUMMARY_VM="$VM_NAME" \
SUMMARY_PROVIDER="$PROVIDER" \
SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \
SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \
SUMMARY_MODE="$MODE" \

View File

@@ -6,7 +6,11 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MACOS_VM="macOS Tahoe"
WINDOWS_VM="Windows 11"
LINUX_VM="Ubuntu 24.04.3 ARM64"
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
PROVIDER="openai"
API_KEY_ENV=""
AUTH_CHOICE=""
AUTH_KEY_FLAG=""
MODEL_ID=""
PACKAGE_SPEC=""
JSON_OUTPUT=0
RUN_DIR="$(mktemp -d /tmp/openclaw-parallels-npm-update.XXXXXX)"
@@ -19,7 +23,7 @@ HOST_PORT=""
LATEST_VERSION=""
CURRENT_HEAD=""
CURRENT_HEAD_SHORT=""
OPENAI_API_KEY_VALUE=""
API_KEY_VALUE=""
MACOS_FRESH_STATUS="skip"
WINDOWS_FRESH_STATUS="skip"
@@ -59,7 +63,11 @@ Usage: bash scripts/e2e/parallels-npm-update-smoke.sh [options]
Options:
--package-spec <npm-spec> Baseline npm package spec. Default: openclaw@latest
--openai-api-key-env <var> Host env var name for OpenAI API key. Default: OPENAI_API_KEY
--provider <openai|anthropic>
Provider auth/model lane. Default: openai
--api-key-env <var> Host env var name for provider API key.
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
--json Print machine-readable JSON summary.
-h, --help Show help.
EOF
@@ -74,8 +82,12 @@ while [[ $# -gt 0 ]]; do
PACKAGE_SPEC="$2"
shift 2
;;
--openai-api-key-env)
OPENAI_API_KEY_ENV="$2"
--provider)
PROVIDER="$2"
shift 2
;;
--api-key-env|--openai-api-key-env)
API_KEY_ENV="$2"
shift 2
;;
--json)
@@ -92,8 +104,26 @@ while [[ $# -gt 0 ]]; do
esac
done
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
case "$PROVIDER" in
openai)
AUTH_CHOICE="openai-api-key"
AUTH_KEY_FLAG="openai-api-key"
MODEL_ID="openai/gpt-5.4"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
;;
anthropic)
AUTH_CHOICE="apiKey"
AUTH_KEY_FLAG="anthropic-api-key"
MODEL_ID="anthropic/claude-sonnet-4-6"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
;;
*)
die "invalid --provider: $PROVIDER"
;;
esac
API_KEY_VALUE="${!API_KEY_ENV:-}"
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
resolve_linux_vm_name() {
local json requested
@@ -173,6 +203,9 @@ param(
[Parameter(Mandatory = $true)][string]$TgzUrl,
[Parameter(Mandatory = $true)][string]$HeadShort,
[Parameter(Mandatory = $true)][string]$SessionId,
[Parameter(Mandatory = $true)][string]$ModelId,
[Parameter(Mandatory = $true)][string]$ProviderKeyEnv,
[Parameter(Mandatory = $true)][string]$ProviderKey,
[Parameter(Mandatory = $true)][string]$LogPath,
[Parameter(Mandatory = $true)][string]$DonePath
)
@@ -243,6 +276,7 @@ try {
$env:PATH = "$env:LOCALAPPDATA\OpenClaw\deps\portable-git\cmd;$env:LOCALAPPDATA\OpenClaw\deps\portable-git\mingw64\bin;$env:LOCALAPPDATA\OpenClaw\deps\portable-git\usr\bin;$env:PATH"
$tgz = Join-Path $env:TEMP 'openclaw-main-update.tgz'
Remove-Item $tgz, $LogPath, $DonePath -Force -ErrorAction SilentlyContinue
Set-Item -Path ('Env:' + $ProviderKeyEnv) -Value $ProviderKey
Invoke-Logged 'download current tgz' { curl.exe -fsSL $TgzUrl -o $tgz }
Invoke-Logged 'npm install current tgz' { npm.cmd install -g $tgz --no-fund --no-audit }
$openclaw = Join-Path $env:APPDATA 'npm\openclaw.cmd'
@@ -250,7 +284,7 @@ try {
if ($version -notmatch [regex]::Escape($HeadShort)) {
throw "version mismatch: expected substring $HeadShort"
}
Invoke-Logged 'openclaw models set' { & $openclaw models set openai/gpt-5.4 }
Invoke-Logged 'openclaw models set' { & $openclaw models set $ModelId }
# Windows can keep the old hashed dist modules alive across in-place global npm upgrades.
# Restart the gateway/service before verifying status or the next agent turn.
Invoke-Logged 'openclaw gateway restart' { & $openclaw gateway restart }
@@ -379,6 +413,9 @@ run_windows_script_via_log() {
local tgz_url="$2"
local head_short="$3"
local session_id="$4"
local model_id="$5"
local provider_key_env="$6"
local provider_key="$7"
local runner_name log_name done_name done_status launcher_state
local start_seconds poll_deadline startup_checked poll_rc state_rc log_rc
runner_name="openclaw-update-$RANDOM-$RANDOM.ps1"
@@ -401,6 +438,9 @@ Start-Process powershell.exe -ArgumentList @(
'-TgzUrl', '$tgz_url',
'-HeadShort', '$head_short',
'-SessionId', '$session_id',
'-ModelId', '$model_id',
'-ProviderKeyEnv', '$provider_key_env',
'-ProviderKey', '$provider_key',
'-LogPath', \$log,
'-DonePath', \$done
) -WindowStyle Hidden | Out-Null
@@ -483,9 +523,9 @@ case "\$version" in
exit 1
;;
esac
/opt/homebrew/bin/openclaw models set openai/gpt-5.4
/opt/homebrew/bin/openclaw models set "$MODEL_ID"
/opt/homebrew/bin/openclaw gateway status --deep --require-rpc
/opt/homebrew/bin/openclaw agent --agent main --session-id parallels-npm-update-macos-$head_short --message "Reply with exact ASCII text OK only." --json
/usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" /opt/homebrew/bin/openclaw agent --agent main --session-id parallels-npm-update-macos-$head_short --message "Reply with exact ASCII text OK only." --json
EOF
prlctl exec "$MACOS_VM" --current-user /bin/bash /tmp/openclaw-main-update.sh
}
@@ -494,7 +534,14 @@ run_windows_update() {
local tgz_url="$1"
local head_short="$2"
local script_url="$3"
run_windows_script_via_log "$script_url" "$tgz_url" "$head_short" "parallels-npm-update-windows-$head_short"
run_windows_script_via_log \
"$script_url" \
"$tgz_url" \
"$head_short" \
"parallels-npm-update-windows-$head_short" \
"$MODEL_ID" \
"$API_KEY_ENV" \
"$API_KEY_VALUE"
}
run_linux_update() {
@@ -515,10 +562,10 @@ case "\$version" in
exit 1
;;
esac
openclaw models set openai/gpt-5.4
openclaw models set "$MODEL_ID"
openclaw agent --local --agent main --session-id parallels-npm-update-linux-$head_short --message "Reply with exact ASCII text OK only." --json
EOF
prlctl exec "$LINUX_VM" /usr/bin/env "OPENAI_API_KEY=$OPENAI_API_KEY_VALUE" /bin/bash /tmp/openclaw-main-update.sh
prlctl exec "$LINUX_VM" /usr/bin/env "$API_KEY_ENV=$API_KEY_VALUE" /bin/bash /tmp/openclaw-main-update.sh
}
write_summary_json() {
@@ -530,6 +577,7 @@ import sys
summary = {
"packageSpec": os.environ["SUMMARY_PACKAGE_SPEC"],
"provider": os.environ["SUMMARY_PROVIDER"],
"latestVersion": os.environ["SUMMARY_LATEST_VERSION"],
"currentHead": os.environ["SUMMARY_CURRENT_HEAD"],
"runDir": os.environ["SUMMARY_RUN_DIR"],
@@ -550,7 +598,7 @@ summary = {
"linux": {
"status": os.environ["SUMMARY_LINUX_UPDATE_STATUS"],
"version": os.environ["SUMMARY_LINUX_UPDATE_VERSION"],
"mode": "local-with-openai-env",
"mode": "local-with-provider-env",
},
},
}
@@ -574,18 +622,24 @@ fi
say "Run fresh npm baseline: $PACKAGE_SPEC"
bash "$ROOT_DIR/scripts/e2e/parallels-macos-smoke.sh" \
--mode fresh \
--provider "$PROVIDER" \
--api-key-env "$API_KEY_ENV" \
--target-package-spec "$PACKAGE_SPEC" \
--json >"$RUN_DIR/macos-fresh.log" 2>&1 &
macos_fresh_pid=$!
bash "$ROOT_DIR/scripts/e2e/parallels-windows-smoke.sh" \
--mode fresh \
--provider "$PROVIDER" \
--api-key-env "$API_KEY_ENV" \
--target-package-spec "$PACKAGE_SPEC" \
--json >"$RUN_DIR/windows-fresh.log" 2>&1 &
windows_fresh_pid=$!
bash "$ROOT_DIR/scripts/e2e/parallels-linux-smoke.sh" \
--mode fresh \
--provider "$PROVIDER" \
--api-key-env "$API_KEY_ENV" \
--target-package-spec "$PACKAGE_SPEC" \
--json >"$RUN_DIR/linux-fresh.log" 2>&1 &
linux_fresh_pid=$!
@@ -626,6 +680,7 @@ WINDOWS_UPDATE_VERSION="$(extract_last_version "$RUN_DIR/windows-update.log")"
LINUX_UPDATE_VERSION="$(extract_last_version "$RUN_DIR/linux-update.log")"
SUMMARY_PACKAGE_SPEC="$PACKAGE_SPEC" \
SUMMARY_PROVIDER="$PROVIDER" \
SUMMARY_LATEST_VERSION="$LATEST_VERSION" \
SUMMARY_CURRENT_HEAD="$CURRENT_HEAD_SHORT" \
SUMMARY_RUN_DIR="$RUN_DIR" \

View File

@@ -4,7 +4,11 @@ set -euo pipefail
VM_NAME="Windows 11"
SNAPSHOT_HINT="pre-openclaw-native-e2e-2026-03-12"
MODE="both"
OPENAI_API_KEY_ENV="OPENAI_API_KEY"
PROVIDER="openai"
API_KEY_ENV=""
AUTH_CHOICE=""
AUTH_KEY_FLAG=""
MODEL_ID=""
INSTALL_URL="https://openclaw.ai/install.ps1"
HOST_PORT="18426"
HOST_PORT_EXPLICIT=0
@@ -23,6 +27,7 @@ MAIN_TGZ_DIR="$(mktemp -d)"
MAIN_TGZ_PATH=""
MINGIT_ZIP_PATH=""
MINGIT_ZIP_NAME=""
WINDOWS_ONBOARD_SCRIPT_PATH=""
SERVER_PID=""
RUN_DIR="$(mktemp -d /tmp/openclaw-parallels-windows.XXXXXX)"
BUILD_LOCK_DIR="${TMPDIR:-/tmp}/openclaw-parallels-build.lock"
@@ -84,8 +89,11 @@ Options:
--snapshot-hint <name> Snapshot name substring/fuzzy match.
Default: "pre-openclaw-native-e2e-2026-03-12"
--mode <fresh|upgrade|both>
--openai-api-key-env <var> Host env var name for OpenAI API key.
Default: OPENAI_API_KEY
--provider <openai|anthropic>
Provider auth/model lane. Default: openai
--api-key-env <var> Host env var name for provider API key.
Default: OPENAI_API_KEY for openai, ANTHROPIC_API_KEY for anthropic
--openai-api-key-env <var> Alias for --api-key-env (backward compatible)
--install-url <url> Installer URL for latest release. Default: https://openclaw.ai/install.ps1
--host-port <port> Host HTTP port for current-main tgz. Default: 18426
--host-ip <ip> Override Parallels host IP.
@@ -118,8 +126,12 @@ while [[ $# -gt 0 ]]; do
MODE="$2"
shift 2
;;
--openai-api-key-env)
OPENAI_API_KEY_ENV="$2"
--provider)
PROVIDER="$2"
shift 2
;;
--api-key-env|--openai-api-key-env)
API_KEY_ENV="$2"
shift 2
;;
--install-url)
@@ -176,8 +188,26 @@ case "$MODE" in
;;
esac
OPENAI_API_KEY_VALUE="${!OPENAI_API_KEY_ENV:-}"
[[ -n "$OPENAI_API_KEY_VALUE" ]] || die "$OPENAI_API_KEY_ENV is required"
case "$PROVIDER" in
openai)
AUTH_CHOICE="openai-api-key"
AUTH_KEY_FLAG="openai-api-key"
MODEL_ID="openai/gpt-5.4"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="OPENAI_API_KEY"
;;
anthropic)
AUTH_CHOICE="apiKey"
AUTH_KEY_FLAG="anthropic-api-key"
MODEL_ID="anthropic/claude-sonnet-4-6"
[[ -n "$API_KEY_ENV" ]] || API_KEY_ENV="ANTHROPIC_API_KEY"
;;
*)
die "invalid --provider: $PROVIDER"
;;
esac
API_KEY_VALUE="${!API_KEY_ENV:-}"
[[ -n "$API_KEY_VALUE" ]] || die "$API_KEY_ENV is required"
ps_single_quote() {
printf "%s" "$1" | sed "s/'/''/g"
@@ -553,6 +583,7 @@ summary = {
"snapshotHint": os.environ["SUMMARY_SNAPSHOT_HINT"],
"snapshotId": os.environ["SUMMARY_SNAPSHOT_ID"],
"mode": os.environ["SUMMARY_MODE"],
"provider": os.environ["SUMMARY_PROVIDER"],
"latestVersion": os.environ["SUMMARY_LATEST_VERSION"],
"installVersion": os.environ["SUMMARY_INSTALL_VERSION"],
"targetPackageSpec": os.environ["SUMMARY_TARGET_PACKAGE_SPEC"],
@@ -824,10 +855,41 @@ verify_version_contains() {
esac
}
write_onboard_runner_script() {
WINDOWS_ONBOARD_SCRIPT_PATH="$MAIN_TGZ_DIR/openclaw-onboard-$PROVIDER.ps1"
cat >"$WINDOWS_ONBOARD_SCRIPT_PATH" <<EOF
param(
[Parameter(Mandatory = \$true)][string]\$LogPath,
[Parameter(Mandatory = \$true)][string]\$DonePath
)
\$ErrorActionPreference = 'Stop'
\$PSNativeCommandUseErrorActionPreference = \$false
try {
\$openclaw = Join-Path \$env:APPDATA 'npm\openclaw.cmd'
\$cmdLine = ('"{0}" onboard --non-interactive --mode local --auth-choice ${AUTH_CHOICE} --secret-input-mode ref --gateway-port 18789 --gateway-bind loopback --install-daemon --skip-skills --accept-risk --json > "{1}" 2>&1' -f \$openclaw, \$LogPath)
& cmd.exe /d /s /c \$cmdLine
Set-Content -Path \$DonePath -Value ([string]\$LASTEXITCODE)
} catch {
if (Test-Path \$LogPath) {
Add-Content -Path \$LogPath -Value (\$_ | Out-String)
} else {
(\$_ | Out-String) | Set-Content -Path \$LogPath
}
Set-Content -Path \$DonePath -Value '1'
}
EOF
}
run_ref_onboard() {
local openai_key_q runner_name log_name done_name done_status launcher_state
local api_key_env_q api_key_value_q script_url
local runner_name log_name done_name done_status launcher_state
local poll_rc state_rc log_rc start_seconds poll_deadline startup_checked
openai_key_q="$(ps_single_quote "$OPENAI_API_KEY_VALUE")"
api_key_env_q="$(ps_single_quote "$API_KEY_ENV")"
api_key_value_q="$(ps_single_quote "$API_KEY_VALUE")"
write_onboard_runner_script
script_url="http://$HOST_IP:$HOST_PORT/$(basename "$WINDOWS_ONBOARD_SCRIPT_PATH")"
runner_name="openclaw-onboard-$RANDOM-$RANDOM.ps1"
log_name="openclaw-onboard-$RANDOM-$RANDOM.log"
done_name="openclaw-onboard-$RANDOM-$RANDOM.done"
@@ -840,27 +902,9 @@ run_ref_onboard() {
\$log = Join-Path \$env:TEMP '$log_name'
\$done = Join-Path \$env:TEMP '$done_name'
Remove-Item \$runner, \$log, \$done -Force -ErrorAction SilentlyContinue
@'
\$ErrorActionPreference = 'Stop'
\$PSNativeCommandUseErrorActionPreference = \$false
\$log = Join-Path \$env:TEMP '$log_name'
\$done = Join-Path \$env:TEMP '$done_name'
\$env:OPENAI_API_KEY = '$openai_key_q'
try {
\$openclaw = Join-Path \$env:APPDATA 'npm\openclaw.cmd'
\$cmdLine = ('"{0}" onboard --non-interactive --mode local --auth-choice openai-api-key --secret-input-mode ref --gateway-port 18789 --gateway-bind loopback --install-daemon --skip-skills --accept-risk --json > "{1}" 2>&1' -f \$openclaw, \$log)
& cmd.exe /d /s /c \$cmdLine
Set-Content -Path \$done -Value ([string]\$LASTEXITCODE)
} catch {
if (Test-Path \$log) {
Add-Content -Path \$log -Value (\$_ | Out-String)
} else {
(\$_ | Out-String) | Set-Content -Path \$log
}
Set-Content -Path \$done -Value '1'
}
'@ | Set-Content -Path \$runner
Start-Process powershell.exe -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', \$runner) -WindowStyle Hidden | Out-Null
Set-Item -Path ('Env:' + '${api_key_env_q}') -Value '${api_key_value_q}'
curl.exe -fsSL '$script_url' -o \$runner
Start-Process powershell.exe -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', \$runner, '-LogPath', \$log, '-DonePath', \$done) -WindowStyle Hidden | Out-Null
EOF
)"
@@ -1028,7 +1072,8 @@ show_gateway_status_compat() {
}
verify_turn() {
guest_run_openclaw "OPENAI_API_KEY" "$OPENAI_API_KEY_VALUE" \
guest_run_openclaw "" "" models set "$MODEL_ID"
guest_run_openclaw "$API_KEY_ENV" "$API_KEY_VALUE" \
agent --agent main --message "Reply with exact ASCII text OK only." --json
}
@@ -1144,6 +1189,7 @@ SUMMARY_JSON_PATH="$(
SUMMARY_SNAPSHOT_HINT="$SNAPSHOT_HINT" \
SUMMARY_SNAPSHOT_ID="$SNAPSHOT_ID" \
SUMMARY_MODE="$MODE" \
SUMMARY_PROVIDER="$PROVIDER" \
SUMMARY_LATEST_VERSION="$LATEST_VERSION" \
SUMMARY_INSTALL_VERSION="$INSTALL_VERSION" \
SUMMARY_TARGET_PACKAGE_SPEC="$TARGET_PACKAGE_SPEC" \