Skip to content

Commit 4525867

Browse files
shanselmanCopilot
andcommitted
Merge master into Teams wizard timeout PR
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2 parents ed0e521 + d1b1363 commit 4525867

135 files changed

Lines changed: 11725 additions & 1961 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/autoreview/scripts/autoreview

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,18 @@ def resolve_command(name: str) -> str:
299299
raise SystemExit(f"review engine executable not found: {name}. Install it or pass the matching --*-bin option.")
300300

301301

302+
def command_exists(name: str) -> bool:
303+
return shutil.which(name) is not None
304+
305+
306+
def choose_default_engine(args: argparse.Namespace) -> str:
307+
if command_exists(args.codex_bin):
308+
return "codex"
309+
if command_exists(args.copilot_bin) and allow_unsandboxed_tools():
310+
return "copilot"
311+
return "codex"
312+
313+
302314
def bounded(text: str, limit: int = 180_000) -> str:
303315
if len(text) <= limit:
304316
return text
@@ -1102,7 +1114,7 @@ def parse_args() -> argparse.Namespace:
11021114
parser.add_argument("--mode", choices=["auto", "local", "uncommitted", "branch", "commit"], default="auto")
11031115
parser.add_argument("--base")
11041116
parser.add_argument("--commit", default="HEAD")
1105-
parser.add_argument("--engine", choices=ENGINES, default=os.environ.get("AUTOREVIEW_ENGINE", "codex"))
1117+
parser.add_argument("--engine", choices=ENGINES, default=os.environ.get("AUTOREVIEW_ENGINE"))
11061118
parser.add_argument("--reviewers", help="Comma-separated review panel, e.g. codex,claude or codex:gpt-5:high.")
11071119
parser.add_argument("--panel", action="store_true", help="Run a Codex/Claude review panel unless --engine changes the first reviewer.")
11081120
parser.add_argument("--model", action="append", help="Model for all reviewers or engine=model. Repeatable.")
@@ -1143,6 +1155,8 @@ def parse_args() -> argparse.Namespace:
11431155
parser.add_argument("--expect-findings", action="store_true", help="Treat findings as success; for harness acceptance tests.")
11441156
parser.add_argument("--dry-run", action="store_true")
11451157
args = parser.parse_args()
1158+
if args.engine is None:
1159+
args.engine = choose_default_engine(args)
11461160
if args.engine not in ENGINES:
11471161
raise SystemExit(f"invalid --engine/AUTOREVIEW_ENGINE: {args.engine}")
11481162
return args

.config/dotnet-tools.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
"isRoot": true,
44
"tools": {
55
"gitversion.tool": {
6-
"version": "6.4.0",
6+
"version": "6.7.0",
77
"commands": [
88
"dotnet-gitversion"
99
],
1010
"rollForward": false
1111
}
1212
}
13-
}
13+
}

.github/workflows/ci.yml

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -388,17 +388,20 @@ jobs:
388388
- name: Publish WinUI Tray App
389389
run: dotnet publish src/OpenClaw.Tray.WinUI -c Release -r ${{ matrix.rid }} --self-contained --no-restore -o publish
390390

391-
- name: Publish SetupEngine.UI
392-
run: |
393-
dotnet publish src/OpenClaw.SetupEngine.UI -c Release -r ${{ matrix.rid }} --self-contained -o publish-setup
394-
mkdir publish\SetupEngine
395-
copy publish-setup\* publish\SetupEngine\ -Recurse
396-
397391
- name: Verify x64 Native Runtime Payload
398392
if: matrix.rid == 'win-x64'
399393
shell: pwsh
400394
run: .\scripts\Test-ReleaseNativeDependencies.ps1 -PayloadPath publish -RequireAppLocalVCRuntime
401395

396+
- name: Verify ARM64 Native Runtime Payload
397+
if: matrix.rid == 'win-arm64'
398+
shell: pwsh
399+
# -SkipNativeLoadProbe: an ARM64 runner CAN LoadLibrary ARM64 DLLs, but
400+
# libsodium pulls in a long native dependency chain that may not all be
401+
# in the payload here (WindowsAppSDK pieces, etc.). The probe is for x64
402+
# parity; signature + presence is what we actually care about.
403+
run: .\scripts\Test-ReleaseNativeDependencies.ps1 -PayloadPath publish -RequireAppLocalVCRuntime -SkipNativeLoadProbe
404+
402405
- name: Verify GitVersion assembly metadata
403406
shell: pwsh
404407
run: |
@@ -559,16 +562,12 @@ jobs:
559562
run: |
560563
New-Item -ItemType Directory -Path signing-input-x64 -Force | Out-Null
561564
New-Item -ItemType HardLink -Path signing-input-x64\OpenClaw.Tray.WinUI.exe -Target artifacts\tray-win-x64\OpenClaw.Tray.WinUI.exe | Out-Null
562-
New-Item -ItemType HardLink -Path signing-input-x64\OpenClaw.SetupEngine.exe -Target artifacts\tray-win-x64\SetupEngine\OpenClaw.SetupEngine.exe | Out-Null
563-
New-Item -ItemType HardLink -Path signing-input-x64\OpenClaw.SetupEngine.UI.exe -Target artifacts\tray-win-x64\SetupEngine\OpenClaw.SetupEngine.UI.exe | Out-Null
564565
565566
- name: Stage ARM64 OpenClaw Executables for Signing
566567
shell: pwsh
567568
run: |
568569
New-Item -ItemType Directory -Path signing-input-arm64 -Force | Out-Null
569570
New-Item -ItemType HardLink -Path signing-input-arm64\OpenClaw.Tray.WinUI.exe -Target artifacts\tray-win-arm64\OpenClaw.Tray.WinUI.exe | Out-Null
570-
New-Item -ItemType HardLink -Path signing-input-arm64\OpenClaw.SetupEngine.exe -Target artifacts\tray-win-arm64\SetupEngine\OpenClaw.SetupEngine.exe | Out-Null
571-
New-Item -ItemType HardLink -Path signing-input-arm64\OpenClaw.SetupEngine.UI.exe -Target artifacts\tray-win-arm64\SetupEngine\OpenClaw.SetupEngine.UI.exe | Out-Null
572571
573572
- name: Sign x64 OpenClaw Executables
574573
uses: azure/artifact-signing-action@v2
@@ -608,6 +607,13 @@ jobs:
608607
shell: pwsh
609608
run: .\scripts\Test-ReleaseNativeDependencies.ps1 -PayloadPath artifacts/tray-win-x64 -RequireAppLocalVCRuntime
610609

610+
- name: Verify ARM64 Release Native Dependencies
611+
shell: pwsh
612+
# -SkipNativeLoadProbe: this release job runs on the x64 windows-latest
613+
# runner and cannot LoadLibrary an ARM64 DLL. The signature and presence
614+
# checks still run.
615+
run: .\scripts\Test-ReleaseNativeDependencies.ps1 -PayloadPath artifacts/tray-win-arm64 -RequireAppLocalVCRuntime -SkipNativeLoadProbe
616+
611617
- name: Download Visual C++ Runtime Redistributables
612618
shell: pwsh
613619
run: |
@@ -628,11 +634,19 @@ jobs:
628634
}
629635
}
630636
631-
# Create ZIP file for Updatum auto-update (needs "win-x64" in filename)
637+
# Create ZIP files for Updatum auto-update (asset name must contain the RID).
638+
# We ship both x64 and arm64 portables now that the build job produces a
639+
# libsodium-compatible app-local VC runtime for both architectures (the
640+
# arm64 leg sources its loose Microsoft.VC*.CRT DLLs from the VS install
641+
# on the windows-11-arm runner; see src/Directory.Build.targets).
632642
- name: Create x64 Release ZIP
633643
run: |
634644
Compress-Archive -Path artifacts/tray-win-x64/* -DestinationPath OpenClawTray-${{ needs.test.outputs.semVer }}-win-x64.zip
635645
646+
- name: Create arm64 Release ZIP
647+
run: |
648+
Compress-Archive -Path artifacts/tray-win-arm64/* -DestinationPath OpenClawTray-${{ needs.test.outputs.semVer }}-win-arm64.zip
649+
636650
# Inno Setup installer for x64
637651
- name: Install Inno Setup
638652
run: choco install innosetup -y
@@ -651,7 +665,10 @@ jobs:
651665
# Prepare arm64 files
652666
mkdir publish-arm64
653667
copy artifacts/tray-win-arm64/* publish-arm64/ -Recurse
654-
.\scripts\Test-ReleaseNativeDependencies.ps1 -PayloadPath publish-arm64 -RequireInstallerVCRedist -InstallerVCRedistPath vc_redist.arm64.exe -SkipNativeLoadProbe
668+
# -RequireAppLocalVCRuntime: arm64 payload now ships VC runtime DLLs from the build job.
669+
# -SkipNativeLoadProbe: this verifier runs on the x64 release runner and cannot
670+
# LoadLibrary an arm64 DLL.
671+
.\scripts\Test-ReleaseNativeDependencies.ps1 -PayloadPath publish-arm64 -RequireAppLocalVCRuntime -RequireInstallerVCRedist -InstallerVCRedistPath vc_redist.arm64.exe -SkipNativeLoadProbe
655672
# Build installer
656673
& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" /DMyAppVersion=${{ needs.test.outputs.majorMinorPatch }} /DMyAppArch=arm64 /Dpublish=publish-arm64 /DvcRedist=vc_redist.arm64.exe installer.iss
657674
@@ -675,6 +692,7 @@ jobs:
675692
Output/OpenClawCompanion-Setup-x64.exe
676693
Output/OpenClawCompanion-Setup-arm64.exe
677694
OpenClawTray-${{ needs.test.outputs.semVer }}-win-x64.zip
695+
OpenClawTray-${{ needs.test.outputs.semVer }}-win-arm64.zip
678696
prerelease: ${{ contains(github.ref_name, '-') }}
679697
make_latest: ${{ contains(github.ref_name, '-') && 'false' || 'true' }}
680698
body: |
@@ -684,6 +702,7 @@ jobs:
684702
- **Installer (x64)**: `OpenClawCompanion-Setup-x64.exe` - Intel/AMD 64-bit
685703
- **Installer (ARM64)**: `OpenClawCompanion-Setup-arm64.exe` - Windows on ARM (Surface, etc.)
686704
- **Portable x64**: `OpenClawTray-${{ needs.test.outputs.semVer }}-win-x64.zip`
705+
- **Portable ARM64**: `OpenClawTray-${{ needs.test.outputs.semVer }}-win-arm64.zip`
687706
688707
### Features
689708
- 🦞 System tray integration with gateway status

.github/workflows/copilot-setup-steps.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ jobs:
2121
- name: Checkout repository
2222
uses: actions/checkout@v6
2323
- name: Install gh-aw extension
24-
uses: github/gh-aw-actions/setup-cli@d3abfe96a194bce3a523ed2093ddedd5704cdf62 # v0.74.4
24+
uses: github/gh-aw-actions/setup-cli@3ea13c02d765410340d533515cb31a7eef2baaf0 # v0.77.5
2525
with:
2626
version: v0.72.1

.github/workflows/localization-audit.lock.yml

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.github/workflows/repo-assist.lock.yml

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![OpenClaw Windows Node banner](docs/assets/readme-banner.jpg)
44

5-
A Windows companion suite for [OpenClaw](https://openclaw.ai) - the AI-powered personal assistant.
5+
A native Windows companion suite for [OpenClaw](https://openclaw.ai) - the AI-powered personal assistant.
66

77
*Made with 🦞 love by Scott Hanselman and Molty*
88

@@ -26,10 +26,16 @@ This monorepo contains the Windows hub, shared client libraries, and CLI utiliti
2626

2727
## 🚀 Quick Start
2828

29-
> **End-user installer?** See [docs/SETUP.md](docs/SETUP.md) for a step-by-step installation guide (no build required).
29+
> **End-user installer?** Download the latest stable x64 or ARM64 installer from the [OpenClaw Windows docs](https://docs.openclaw.ai/platforms/windows), or see [docs/SETUP.md](docs/SETUP.md) for step-by-step installation (no build required).
3030
>
3131
> **Managed WSL gateway?** Local setup creates a locked-down app-owned `OpenClawGateway` distro. See [docs/WSL_GATEWAY_ADMIN.md](docs/WSL_GATEWAY_ADMIN.md) for editing `openclaw.json` as the `openclaw` user and using root for protected-file administration.
3232
33+
Direct downloads from the latest OpenClaw release:
34+
35+
- [OpenClawCompanion-Setup-x64.exe](https://github.com/openclaw/openclaw/releases/latest/download/OpenClawCompanion-Setup-x64.exe)
36+
- [OpenClawCompanion-Setup-arm64.exe](https://github.com/openclaw/openclaw/releases/latest/download/OpenClawCompanion-Setup-arm64.exe)
37+
- [OpenClawCompanion-SHA256SUMS.txt](https://github.com/openclaw/openclaw/releases/latest/download/OpenClawCompanion-SHA256SUMS.txt)
38+
3339
### Prerequisites
3440
- Windows 10 (20H2+) or Windows 11
3541
- .NET 10.0 SDK - https://dotnet.microsoft.com/download/dotnet/10.0

build.ps1

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ $projects = @{
349349
"WinNodeCli" = @{ Path = "src/OpenClaw.WinNode.Cli/OpenClaw.WinNode.Cli.csproj"; UseRid = $false }
350350
"Tray" = @{ Path = "src/OpenClaw.Tray.WinUI/OpenClaw.Tray.WinUI.csproj"; UseRid = $true }
351351
"WinUI" = @{ Path = "src/OpenClaw.Tray.WinUI/OpenClaw.Tray.WinUI.csproj"; UseRid = $true }
352-
"SetupEngine" = @{ Path = "src/OpenClaw.SetupEngine.UI/OpenClaw.SetupEngine.UI.csproj"; UseRid = $true }
352+
"SetupEngine" = @{ Path = "src/OpenClaw.SetupEngine/OpenClaw.SetupEngine.csproj"; UseRid = $false }
353353
}
354354

355355
$toBuild = if ($Project -eq "All") { @("Shared", "Cli", "WinNodeCli", "SetupEngine", "WinUI") } else { @($Project) }
@@ -371,26 +371,6 @@ for ($i = 0; $i -lt $toBuild.Count; $i++) {
371371
}
372372
}
373373

374-
# =============================================================================
375-
# POST-BUILD: Copy SetupEngine.UI into WinUI output so the tray can find it
376-
# =============================================================================
377-
if (($buildResults.ContainsKey("SetupEngine") -and $buildResults["SetupEngine"]) -and
378-
(($buildResults.ContainsKey("WinUI") -and $buildResults["WinUI"]) -or ($buildResults.ContainsKey("Tray") -and $buildResults["Tray"]))) {
379-
$setupTfm = Get-ProjectTargetFramework $projects["SetupEngine"].Path
380-
$winUITfm = Get-ProjectTargetFramework $projects["WinUI"].Path
381-
if ($setupTfm -and $winUITfm) {
382-
$setupOutDir = "src\OpenClaw.SetupEngine.UI\bin\$Configuration\$setupTfm\$rid"
383-
$winUIOutDir = "src\OpenClaw.Tray.WinUI\bin\$Configuration\$winUITfm\$rid"
384-
$destDir = Join-Path $winUIOutDir "SetupEngine"
385-
if (Test-Path $setupOutDir) {
386-
if (-not (Test-Path $destDir)) { New-Item -ItemType Directory -Path $destDir -Force | Out-Null }
387-
Copy-Item "$setupOutDir\*" $destDir -Recurse -Force
388-
Write-Info "Copied SetupEngine.UI output → $destDir"
389-
}
390-
}
391-
}
392-
# =============================================================================
393-
394374
Write-Header "Build Summary"
395375

396376
$successCount = ($buildResults.Values | Where-Object { $_ -eq $true }).Count

docs/CONNECTION_ARCHITECTURE.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ Setup codes (from QR scan or paste) decode to `{ url, bootstrapToken }` via `Set
172172

173173
`SshTunnelService` manages an SSH local port-forward process. `SshTunnelManager` wraps it behind `ISshTunnelManager` for the connection manager.
174174

175-
When a `GatewayRecord` has `SshTunnel` config, the connection manager starts the tunnel before connecting the WebSocket client to `ws://localhost:<localPort>`.
175+
When a `GatewayRecord` has `SshTunnel` config, the connection manager starts the tunnel before connecting the WebSocket client to `ws://localhost:<localPort>`. The config stores the SSH daemon port (`sshPort`, default `22`) separately from the remote gateway port forwarded by `-L`.
176176

177177
`SshTunnelSnapshot` provides a read-only point-in-time view of tunnel state for UI consumption (avoids coupling UI to the mutable service).
178178

@@ -232,3 +232,4 @@ Connection tests live in `tests/OpenClaw.Connection.Tests/`:
232232
- `ConnectionDiagnosticsTests` — ring buffer diagnostics
233233

234234
The heaviest remaining gap is Windows shell UI behavior (tray clicks, tooltip visibility, WinUI menu routing). Cover pure decision logic in unit tests; use manual or integration smoke tests for shell behavior.
235+

docs/ONBOARDING_WIZARD.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Renders server-defined setup steps via RPC (`wizard.start` / `wizard.next`). The
3636

3737
If the gateway doesn't support the wizard protocol or is unreachable, this screen shows an "offline" message and can be skipped.
3838

39-
If the gateway restarts or the wizard connection is lost while setup is running, the wizard presents recovery choices to start the wizard again or skip it for now so the user is not trapped retrying a broken session.
39+
The wizard keeps recovery choices visible while setup steps are running so users can start the wizard again or skip it for now if an auth flow stalls. If the gateway restarts or the wizard connection is lost while setup is running, the same recovery choices are presented in the error state so the user is not trapped retrying a broken session.
4040

4141
### Permissions
4242
Checks 5 Windows permissions using native APIs and registry:

0 commit comments

Comments
 (0)