惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
DataBreaches.Net
S
Schneier on Security
Y
Y Combinator Blog
D
Docker
T
Threat Research - Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
www.infosecurity-magazine.com
www.infosecurity-magazine.com
N
Netflix TechBlog - Medium
E
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
Attack and Defense Labs
Attack and Defense Labs
博客园_首页
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
T
Tor Project blog
Martin Fowler
Martin Fowler
Jina AI
Jina AI
F
Fortinet All Blogs
V
V2EX - 技术
Hacker News - Newest:
Hacker News - Newest: "LLM"
Forbes - Security
Forbes - Security
B
Blog
T
The Exploit Database - CXSecurity.com
M
MIT News - Artificial intelligence
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
N
News and Events Feed by Topic
W
WeLiveSecurity
量子位
The Cloudflare Blog
K
Kaspersky official blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
Cybersecurity and Infrastructure Security Agency CISA

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4 test: trim doctor command hotspots · openclaw/openclaw@c66f16a test: isolate agent auth and spawn hotspots · openclaw/openclaw@9285935 test: stabilize MCP startup disposal race · openclaw/openclaw@dd9d2eb test: merge browser contract server suites · openclaw/openclaw@5817a76 test: narrow ollama provider discovery setup · openclaw/openclaw@a0d9598 build: declare qa-lab aimock runtime dependency · openclaw/openclaw@24431e5 test: speed up safe-bins exec harness · openclaw/openclaw@ee856ab test: preserve tool helpers in embedded runner mocks · openclaw/openclaw@acd86a0 refactor: move memory embeddings into provider plugins · openclaw/openclaw@77e6e4c test: reuse system-run temp fixtures · openclaw/openclaw@7e9ff0f test: trim hotspot wait overhead · openclaw/openclaw@12a59b0 Check: avoid duplicate boundary prep · openclaw/openclaw@baf11b8 test: reduce hotspot fixture overhead · openclaw/openclaw@3a59edd feat(ui): overhaul settings and slash command UX (#67819) thanks @Bun… · openclaw/openclaw@2cfb660 QA Matrix: exit cleanly on failure · openclaw/openclaw@42805d2 QA Matrix: isolate scenario coverage · openclaw/openclaw@7e659e1 Matrix: refresh crypto bootstrap state · openclaw/openclaw@94081d8 QA Lab: add provider registry · openclaw/openclaw@bb7e982 Matrix: add plugin changelog · openclaw/openclaw@4acab55 test: trim more hotspot overhead · openclaw/openclaw@f485311 test: trim remaining hotspot tests · openclaw/openclaw@6ba8626 test: narrow hotspot mocks · openclaw/openclaw@dbc8179 test: isolate gemini embedding request helpers · openclaw/openclaw@cd330f5 test: trim memory and mcp hotspots · openclaw/openclaw@fd48dfa test: slim provider registry mocks · openclaw/openclaw@2e08c77 test: harden Parallels update smoke · openclaw/openclaw@1a98090 feat: default Anthropic to Opus 4.7 · openclaw/openclaw@628b454 fix: harden node-host shell payload mutability checks · openclaw/openclaw@75c551e fix: land node-host approval binding for native binaries (#66731) (th… · openclaw/openclaw@29919bb CI: add daily schedule to CodeQL workflow (#67645) · openclaw/openclaw@69d25f5 fix(gateway): capture config hash after plugin auto-enable to prevent… · openclaw/openclaw@8c11210 fix: repair sanitized replay tool results before send (#67620) (thank… fix: restrict HTML timeout short-circuit to transient statuses fix: keep TUI watchdog bound to active run (#67401) (thanks @xantorres) · openclaw/openclaw@3525273 Gateway/skills: dedupe skills prefix-match + drop dead fallback on log Extensions/lmstudio: back off inference preload after consecutive fai… TUI/streaming: add watchdog that resets the activity indicator after … Agents/tool-loop: enable unknown-tool stream guard by default · openclaw/openclaw@36ed367 Gateway/skills: invalidate session skills snapshot on config write fix: classify HTML provider error pages correctly (#67642) (thanks @s… fix(skills): remove unused model-usage import (#67641) · openclaw/openclaw@55f05df docs(changelog): credit codex fix superseded PRs · openclaw/openclaw@e485f24 fix(openai-codex): normalize stale transport metadata in resolution a… · openclaw/openclaw@90801ba CI: pin Docker-related GitHub Actions (#67632) · openclaw/openclaw@f697b01 Android: modernize WebView and discovery API usage (#67627) · openclaw/openclaw@44a6e50 fix(deps): bump hono to 4.12.14 and @hono/node-server to 1.19.14 (GHS… fix(deps): bump dompurify to 3.4.0 (#67614) · openclaw/openclaw@2c2dc00 CI: add explicit permissions to all workflow jobs (fixes code-scannin… · openclaw/openclaw@01b7516 fix: register bundled TTS providers and route overrides correctly (#6… fix: align host tilde paths with OS home (#62804) (thanks @stainlu) fix: flush creds queue before reconnect socket open (#67464) (thanks … · openclaw/openclaw@405c63f fix: strip standalone <function> tool call tags from visible text (#6… · openclaw/openclaw@78df859 fix(agents): preserve cli session metadata before transcript persist … · openclaw/openclaw@898fd04 docs(changelog): move cli transcript entry · openclaw/openclaw@c1817c6 fix(agents): normalize cli transcript api field · openclaw/openclaw@3a3fae0 docs(changelog): note cli transcript persistence · openclaw/openclaw@6c343f1 fix(agents): persist cli transcript turns · openclaw/openclaw@b8ef507 fix(msteams): harden security-sensitive flows (#65841) · openclaw/openclaw@c56b56e [Dashboard] Fix exec approval modal overflow for long command content… · openclaw/openclaw@053c5b0 Docs: remove QA changelog entry · openclaw/openclaw@7fd5771 QA: fix private runtime source loading (#67428) · openclaw/openclaw@d5933af docs(gateway): correct protocol.md schema path, hello-ok example, aut… · openclaw/openclaw@489404d CI: pin Node 22 runners to 22.18.0 · openclaw/openclaw@4ffa621 models.authStatus: normalize provider ids + tighten env-backed escape… · openclaw/openclaw@f2fdb9d Update CHANGELOG.md · openclaw/openclaw@7694a92 test(parallels): clean up npm update guard jobs · openclaw/openclaw@045ea7b Plugins: prefer scanDir override paths · openclaw/openclaw@b2974da fix(dreaming): default storage.mode to "separate" so phase blocks sto… · openclaw/openclaw@8c392f0 fix(memory-core): skip dreaming transcript ingestion via session stor… · openclaw/openclaw@a1b01f0 fix: dedupe replayed exec.finished node events (#67281) · openclaw/openclaw@5dcf526
ci: gate stable releases on Windows companion assets (#92555) · openclaw/openclaw@8ae1adf
fuller-stack · 2026-06-14 · via Recent Commits to openclaw:main

@@ -8,9 +8,12 @@ on:

88

required: true

99

type: string

1010

windows_node_tag:

11-

description: openclaw-windows-node release tag to promote, or latest

11+

description: Exact openclaw-windows-node release tag to promote, for example v0.6.3

12+

required: true

13+

type: string

14+

expected_installer_digests:

15+

description: Compact JSON map of installer asset names to pinned source sha256 digests

1216

required: true

13-

default: latest

1417

type: string

15181619

permissions:

@@ -31,53 +34,139 @@ jobs:

3134

env:

3235

RELEASE_TAG: ${{ inputs.tag }}

3336

WINDOWS_NODE_TAG: ${{ inputs.windows_node_tag }}

37+

EXPECTED_INSTALLER_DIGESTS: ${{ inputs.expected_installer_digests }}

3438

GH_TOKEN: ${{ github.token }}

3539

run: |

3640

if ($env:RELEASE_TAG -notmatch '^v[0-9]{4}\.[1-9][0-9]*\.[1-9][0-9]*((-(alpha|beta)\.[1-9][0-9]*)|(-[1-9][0-9]*))?$') {

3741

throw "Invalid OpenClaw release tag: $env:RELEASE_TAG"

3842

}

39-

if ($env:WINDOWS_NODE_TAG -ne "latest" -and $env:WINDOWS_NODE_TAG -notmatch '^v[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z.-]+)?$') {

40-

throw "Invalid openclaw-windows-node release tag: $env:WINDOWS_NODE_TAG"

43+

$stableRelease = -not (

44+

$env:RELEASE_TAG.Contains("-alpha.") -or

45+

$env:RELEASE_TAG.Contains("-beta.")

46+

)

47+

if ($env:WINDOWS_NODE_TAG -notmatch '^v[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z]+([.-][0-9A-Za-z]+)*)?$') {

48+

throw "windows_node_tag must be an explicit openclaw-windows-node release tag, not latest: $env:WINDOWS_NODE_TAG"

49+

}

50+51+

try {

52+

$expectedDigests = $env:EXPECTED_INSTALLER_DIGESTS | ConvertFrom-Json -AsHashtable

53+

} catch {

54+

throw "expected_installer_digests must be a JSON object: $_"

55+

}

56+

# Add future signed installer names, such as MSIX x64/ARM64, here.

57+

$requiredInstallerNames = @(

58+

"OpenClawCompanion-Setup-x64.exe",

59+

"OpenClawCompanion-Setup-arm64.exe"

60+

)

61+

$allowedTargetCompanionAssetNames = @(

62+

$requiredInstallerNames

63+

"OpenClawCompanion-SHA256SUMS.txt"

64+

)

65+

if ($expectedDigests.Count -ne $requiredInstallerNames.Count) {

66+

throw "expected_installer_digests must contain exactly the current installer asset contract."

67+

}

68+

foreach ($name in $requiredInstallerNames) {

69+

$digest = [string]$expectedDigests[$name]

70+

if ($digest -notmatch '^sha256:[A-Fa-f0-9]{64}$') {

71+

throw "expected_installer_digests is missing a valid pinned digest for $name."

72+

}

73+

}

74+75+

$targetRelease = gh release view $env:RELEASE_TAG --repo $env:GITHUB_REPOSITORY --json tagName,isDraft,isPrerelease,assets,url | ConvertFrom-Json

76+

if ($targetRelease.tagName -ne $env:RELEASE_TAG) {

77+

throw "OpenClaw release tag mismatch: expected $env:RELEASE_TAG, got $($targetRelease.tagName)"

78+

}

79+

$unexpectedTargetCompanionAssets = @(

80+

$targetRelease.assets |

81+

Where-Object {

82+

$_.name.StartsWith("OpenClawCompanion-") -and

83+

$_.name -notin $allowedTargetCompanionAssetNames

84+

} |

85+

ForEach-Object name |

86+

Sort-Object

87+

)

88+

if ($unexpectedTargetCompanionAssets.Count -ne 0) {

89+

throw "Target OpenClaw release contains unexpected OpenClawCompanion assets before upload: $($unexpectedTargetCompanionAssets -join ', ')"

90+

}

91+92+

$sourceRelease = gh release view $env:WINDOWS_NODE_TAG --repo openclaw/openclaw-windows-node --json tagName,isDraft,isPrerelease,assets,url | ConvertFrom-Json

93+

if ($sourceRelease.tagName -ne $env:WINDOWS_NODE_TAG) {

94+

throw "Windows source release tag mismatch: expected $env:WINDOWS_NODE_TAG, got $($sourceRelease.tagName)"

95+

}

96+

if ($sourceRelease.isDraft) {

97+

throw "Windows source release must be published: $($sourceRelease.url)"

98+

}

99+

if ($stableRelease -and $sourceRelease.isPrerelease) {

100+

throw "Stable OpenClaw releases require a non-prerelease Windows source release: $($sourceRelease.url)"

101+

}

102+

foreach ($name in $requiredInstallerNames) {

103+

$sourceAssets = @($sourceRelease.assets | Where-Object name -eq $name)

104+

if ($sourceAssets.Count -ne 1) {

105+

throw "Windows source release must contain exactly one required asset $name; found $($sourceAssets.Count)."

106+

}

107+

if ([string]$sourceAssets[0].digest -ne [string]$expectedDigests[$name]) {

108+

throw "Windows source release asset digest does not match the pinned digest: $name"

109+

}

41110

}

42-

gh release view $env:RELEASE_TAG --repo $env:GITHUB_REPOSITORY | Out-Null

4311144112

- name: Download Windows Hub release installers

45113

shell: pwsh

46114

env:

47115

WINDOWS_NODE_TAG: ${{ inputs.windows_node_tag }}

116+

EXPECTED_INSTALLER_DIGESTS: ${{ inputs.expected_installer_digests }}

48117

GH_TOKEN: ${{ github.token }}

49118

run: |

50119

New-Item -ItemType Directory -Force -Path dist | Out-Null

51-

$tagArgs = @()

52-

if ($env:WINDOWS_NODE_TAG -ne "latest") {

53-

$tagArgs += $env:WINDOWS_NODE_TAG

54-

}

55-

gh release download @tagArgs `

56-

--repo openclaw/openclaw-windows-node `

57-

--pattern "OpenClawCompanion-Setup-*.exe" `

58-

--dir dist

59-60-

$expected = @(

61-

"dist/OpenClawCompanion-Setup-x64.exe",

62-

"dist/OpenClawCompanion-Setup-arm64.exe"

120+

# Add future signed installer patterns, such as MSIX x64/ARM64, here.

121+

# Every matched installer is signature-checked, checksummed, and promoted.

122+

$installerPatterns = @(

123+

"OpenClawCompanion-Setup-x64.exe",

124+

"OpenClawCompanion-Setup-arm64.exe"

63125

)

64-

foreach ($file in $expected) {

65-

if (-not (Test-Path -LiteralPath $file)) {

66-

throw "Missing expected Windows installer: $file"

126+

$downloadArgs = @(

127+

$env:WINDOWS_NODE_TAG,

128+

"--repo", "openclaw/openclaw-windows-node",

129+

"--dir", "dist"

130+

)

131+

foreach ($pattern in $installerPatterns) {

132+

$downloadArgs += @("--pattern", $pattern)

133+

}

134+

gh release download @downloadArgs

135+

if ($LASTEXITCODE -ne 0) {

136+

throw "Failed to download Windows release assets from $env:WINDOWS_NODE_TAG."

137+

}

138+139+

foreach ($pattern in $installerPatterns) {

140+

$patternMatches = @(Get-ChildItem -LiteralPath dist -File | Where-Object Name -Like $pattern)

141+

if ($patternMatches.Count -ne 1) {

142+

throw "Expected exactly one Windows installer matching '$pattern', found $($patternMatches.Count)."

143+

}

144+

}

145+146+

$expectedDigests = $env:EXPECTED_INSTALLER_DIGESTS | ConvertFrom-Json -AsHashtable

147+

foreach ($file in Get-ChildItem -LiteralPath dist -File) {

148+

$expectedHash = ([string]$expectedDigests[$file.Name]) -replace '^sha256:', ''

149+

$actualHash = (Get-FileHash -Algorithm SHA256 -LiteralPath $file.FullName).Hash

150+

if ($actualHash -ne $expectedHash) {

151+

throw "Downloaded Windows source asset does not match pinned digest: $($file.Name)"

67152

}

68153

}

6915470155

- name: Verify Authenticode signatures

71156

shell: pwsh

72157

run: |

73-

Get-ChildItem -LiteralPath dist -Filter "OpenClawCompanion-Setup-*.exe" | ForEach-Object {

158+

$expectedSignerSubject = "CN=OpenClaw Foundation, O=OpenClaw Foundation, L=Mill Valley, S=California, C=US"

159+

Get-ChildItem -LiteralPath dist -File | ForEach-Object {

74160

$signature = Get-AuthenticodeSignature -LiteralPath $_.FullName

75161

if ($signature.Status -ne "Valid") {

76162

throw "$($_.Name) Authenticode signature was $($signature.Status)."

77163

}

78164

if (-not $signature.SignerCertificate) {

79165

throw "$($_.Name) has no signer certificate."

80166

}

167+

if ($signature.SignerCertificate.Subject -ne $expectedSignerSubject) {

168+

throw "$($_.Name) has unexpected signer subject $($signature.SignerCertificate.Subject)."

169+

}

81170

[pscustomobject]@{

82171

File = $_.Name

83172

Signer = $signature.SignerCertificate.Subject

@@ -88,7 +177,7 @@ jobs:

88177

- name: Write SHA-256 manifest

89178

shell: pwsh

90179

run: |

91-

Get-ChildItem -LiteralPath dist -Filter "OpenClawCompanion-Setup-*.exe" |

180+

Get-ChildItem -LiteralPath dist -File |

92181

Sort-Object Name |

93182

ForEach-Object {

94183

$hash = Get-FileHash -Algorithm SHA256 -LiteralPath $_.FullName

@@ -101,12 +190,81 @@ jobs:

101190

RELEASE_TAG: ${{ inputs.tag }}

102191

GH_TOKEN: ${{ github.token }}

103192

run: |

104-

gh release upload $env:RELEASE_TAG `

105-

dist/OpenClawCompanion-Setup-x64.exe `

106-

dist/OpenClawCompanion-Setup-arm64.exe `

107-

dist/OpenClawCompanion-SHA256SUMS.txt `

108-

--repo $env:GITHUB_REPOSITORY `

109-

--clobber

193+

$releaseAssets = @(Get-ChildItem -LiteralPath dist -File | Sort-Object Name | ForEach-Object FullName)

194+

gh release upload $env:RELEASE_TAG @releaseAssets --repo $env:GITHUB_REPOSITORY --clobber

195+

if ($LASTEXITCODE -ne 0) {

196+

throw "Failed to upload Windows release assets to $env:RELEASE_TAG."

197+

}

198+199+

- name: Verify promoted release asset contract

200+

shell: pwsh

201+

env:

202+

RELEASE_TAG: ${{ inputs.tag }}

203+

GH_TOKEN: ${{ github.token }}

204+

run: |

205+

New-Item -ItemType Directory -Force -Path verified | Out-Null

206+

$expectedAssets = @(Get-ChildItem -LiteralPath dist -File | Sort-Object Name)

207+

$expectedCompanionAssetNames = @($expectedAssets | ForEach-Object Name | Sort-Object)

208+

$targetRelease = gh release view $env:RELEASE_TAG --repo $env:GITHUB_REPOSITORY --json assets | ConvertFrom-Json

209+

$actualCompanionAssetNames = @(

210+

$targetRelease.assets |

211+

Where-Object { $_.name.StartsWith("OpenClawCompanion-") } |

212+

ForEach-Object name |

213+

Sort-Object

214+

)

215+

$assetContractDiff = @(

216+

Compare-Object `

217+

-ReferenceObject $expectedCompanionAssetNames `

218+

-DifferenceObject $actualCompanionAssetNames

219+

)

220+

if (

221+

$actualCompanionAssetNames.Count -ne $expectedCompanionAssetNames.Count -or

222+

$assetContractDiff.Count -ne 0

223+

) {

224+

throw "Promoted OpenClawCompanion asset names do not exactly match the current contract."

225+

}

226+227+

foreach ($asset in $expectedAssets) {

228+

gh release download $env:RELEASE_TAG `

229+

--repo $env:GITHUB_REPOSITORY `

230+

--pattern $asset.Name `

231+

--dir verified

232+

if ($LASTEXITCODE -ne 0) {

233+

throw "Failed to download promoted Windows release asset $($asset.Name)."

234+

}

235+

}

236+237+

$manifestPath = "verified/OpenClawCompanion-SHA256SUMS.txt"

238+

$manifestEntries = @(Get-Content -LiteralPath $manifestPath | ForEach-Object {

239+

if ($_ -notmatch '^([A-Fa-f0-9]{64}) ([^\\/]+)$') {

240+

throw "Invalid Windows SHA-256 manifest entry: $_"

241+

}

242+

[PSCustomObject]@{

243+

Hash = $Matches[1]

244+

Name = $Matches[2]

245+

}

246+

})

247+

$expectedInstallerNames = @(

248+

$expectedAssets |

249+

Where-Object Name -ne "OpenClawCompanion-SHA256SUMS.txt" |

250+

ForEach-Object Name

251+

)

252+

$manifestInstallerNames = @($manifestEntries | ForEach-Object Name | Sort-Object)

253+

$contractDiff = @(

254+

Compare-Object `

255+

-ReferenceObject $expectedInstallerNames `

256+

-DifferenceObject $manifestInstallerNames

257+

)

258+

if ($contractDiff.Count -ne 0) {

259+

throw "Promoted Windows SHA-256 manifest does not match the installer asset contract."

260+

}

261+262+

foreach ($entry in $manifestEntries) {

263+

$hash = (Get-FileHash -Algorithm SHA256 -LiteralPath "verified/$($entry.Name)").Hash

264+

if ($hash -ne $entry.Hash) {

265+

throw "Promoted Windows release asset checksum mismatch: $($entry.Name)"

266+

}

267+

}

110268111269

- name: Summary

112270

shell: pwsh

@@ -119,8 +277,9 @@ jobs:

119277120278

OpenClaw release: $env:RELEASE_TAG

121279

Source release: openclaw/openclaw-windows-node@$env:WINDOWS_NODE_TAG

122-123-

- https://github.com/openclaw/openclaw/releases/download/$env:RELEASE_TAG/OpenClawCompanion-Setup-x64.exe

124-

- https://github.com/openclaw/openclaw/releases/download/$env:RELEASE_TAG/OpenClawCompanion-Setup-arm64.exe

125-

- https://github.com/openclaw/openclaw/releases/download/$env:RELEASE_TAG/OpenClawCompanion-SHA256SUMS.txt

126280

"@ >> $env:GITHUB_STEP_SUMMARY

281+

Get-ChildItem -LiteralPath dist -File |

282+

Sort-Object Name |

283+

ForEach-Object {

284+

"- https://github.com/openclaw/openclaw/releases/download/$env:RELEASE_TAG/$($_.Name)"

285+

} >> $env:GITHUB_STEP_SUMMARY