Skip to content

Commit 77df063

Browse files
committed
Auto-merge upstream openclaw/openclaw
2 parents b64b821 + 5436bb4 commit 77df063

199 files changed

Lines changed: 8849 additions & 10808 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.

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ Docs: https://docs.openclaw.ai
44

55
## Unreleased
66

7+
### Changes
8+
9+
- iOS: pin release versioning to an explicit CalVer in `apps/ios/version.json`, keep TestFlight iteration on the same short version until maintainers intentionally promote the next gateway version, and add the documented `pnpm ios:version:pin -- --from-gateway` workflow for release trains. (#63001) Thanks @ngutman.
10+
711
### Fixes
812

913
- Slack/media: preserve bearer auth across same-origin `files.slack.com` redirects while still stripping it on cross-origin Slack CDN hops, so `url_private_download` image attachments load again. (#62960) Thanks @vincentkoc.
14+
- Control UI: guard stale session-history reloads during fast session switches so the selected session and rendered transcript stay in sync. (#62975) Thanks @scoootscooob.
1015

1116
## 2026.4.8
1217

@@ -121,6 +126,7 @@ Docs: https://docs.openclaw.ai
121126
- Agents/model resolution: let explicit `openai-codex/gpt-5.4` selection prefer provider runtime metadata when it reports a larger context window, keeping configured Codex runs aligned with the live provider limits. (#62694) Thanks @ruclaw7.
122127
- Agents/model resolution: keep explicit-model runtime comparisons on the configured workspace plugin registry, so workspace-installed providers do not silently fall back to stale explicit metadata during runtime model lookup.
123128
- Providers/Z.AI: default onboarding and endpoint detection to GLM-5.1 instead of GLM-5. (#61998) Thanks @serg0x.
129+
- Reply execution: prefer the active runtime snapshot over stale queued reply config during embedded reply and follow-up execution so SecretRef-backed reply turns stop crashing after secrets have already resolved. (#62693) Thanks @mbelinky.
124130

125131
## 2026.4.5
126132

apps/ios/CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# OpenClaw iOS Changelog
2+
3+
## Unreleased
4+
5+
### Added
6+
7+
### Changed
8+
9+
### Fixed
10+
11+
## 2026.4.6 - 2026-04-06
12+
13+
First App Store release of OpenClaw for iPhone. Pair with your OpenClaw Gateway to use chat, voice, sharing, and device actions from iOS.

apps/ios/Config/Version.xcconfig

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Shared iOS version defaults.
2-
// Generated overrides live in build/Version.xcconfig (git-ignored).
2+
// Source of truth: apps/ios/version.json
3+
// Generated by scripts/ios-sync-versioning.ts.
34

4-
OPENCLAW_GATEWAY_VERSION = 2026.4.9
5-
OPENCLAW_MARKETING_VERSION = 2026.4.9
6-
OPENCLAW_BUILD_VERSION = 2026040901
5+
OPENCLAW_IOS_VERSION = 2026.4.6
6+
OPENCLAW_MARKETING_VERSION = 2026.4.6
7+
OPENCLAW_BUILD_VERSION = 1
78

89
#include? "../build/Version.xcconfig"

apps/ios/README.md

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,14 @@ Release behavior:
6464
- Beta release uses canonical `ai.openclaw.client*` bundle IDs through a temporary generated xcconfig in `apps/ios/build/BetaRelease.xcconfig`.
6565
- Beta release also switches the app to `OpenClawPushTransport=relay`, `OpenClawPushDistribution=official`, and `OpenClawPushAPNsEnvironment=production`.
6666
- The beta flow does not modify `apps/ios/.local-signing.xcconfig` or `apps/ios/LocalSigning.xcconfig`.
67-
- Root `package.json.version` is the only version source for iOS.
68-
- A root version like `2026.4.1-beta.1` becomes:
69-
- `CFBundleShortVersionString = 2026.4.1`
70-
- `CFBundleVersion = next TestFlight build number for 2026.4.1`
67+
- `apps/ios/version.json` is the pinned iOS release version source.
68+
- `apps/ios/CHANGELOG.md` is the iOS-only changelog and release-note source.
69+
- The pinned iOS version must use CalVer like `2026.4.10`.
70+
- That pinned value becomes:
71+
- `CFBundleShortVersionString = 2026.4.10`
72+
- `CFBundleVersion = next TestFlight build number for 2026.4.10`
73+
- Changing the root gateway version does not change the iOS app version until you explicitly pin from the gateway.
74+
- See `apps/ios/VERSIONING.md` for the full workflow.
7175

7276
Required env for beta builds:
7377

@@ -120,25 +124,74 @@ This should create `apps/ios/fastlane/.env` with the non-secret ASC variables wh
120124
export OPENCLAW_PUSH_RELAY_BASE_URL=https://relay.example.com
121125
```
122126

123-
4. Upload the beta:
127+
4. If you are starting a brand-new production release train, pin iOS to the current gateway version first:
128+
129+
```bash
130+
pnpm ios:version:pin -- --from-gateway
131+
```
132+
133+
5. Upload the beta:
124134

125135
```bash
126136
pnpm ios:beta
127137
```
128138

129-
5. Expected behavior:
130-
- Fastlane reads `package.json.version`
139+
6. Expected behavior:
140+
- Fastlane reads `apps/ios/version.json`
141+
- verifies synced iOS versioning artifacts
131142
- resolves the next TestFlight build number for that short version
132143
- generates `apps/ios/build/BetaRelease.xcconfig`
133144
- archives `OpenClaw`
134145
- uploads the IPA to TestFlight
135146

136-
6. Expected outputs after a successful run:
147+
7. Expected outputs after a successful run:
137148
- `apps/ios/build/beta/OpenClaw-<version>.ipa`
138149
- `apps/ios/build/beta/OpenClaw-<version>.app.dSYM.zip`
139150
- Fastlane log line like `Uploaded iOS beta: version=<version> short=<short> build=<build>`
140151

141-
7. If this is a fresh clone on a maintainer machine that already works elsewhere, it is OK to copy the non-secret `apps/ios/fastlane/.env` from another trusted local clone on the same Mac. The Keychain-backed private key remains machine-local and is not stored in the repo.
152+
8. If this is a fresh clone on a maintainer machine that already works elsewhere, it is OK to copy the non-secret `apps/ios/fastlane/.env` from another trusted local clone on the same Mac. The Keychain-backed private key remains machine-local and is not stored in the repo.
153+
154+
## iOS Versioning Workflow
155+
156+
- Pinned iOS release version: `apps/ios/version.json`
157+
- iOS-only changelog: `apps/ios/CHANGELOG.md`
158+
- Generated checked-in artifacts:
159+
- `apps/ios/Config/Version.xcconfig`
160+
- `apps/ios/fastlane/metadata/en-US/release_notes.txt`
161+
- Useful commands:
162+
163+
```bash
164+
pnpm ios:version
165+
pnpm ios:version:check
166+
pnpm ios:version:sync
167+
pnpm ios:version:pin -- --from-gateway
168+
pnpm ios:version:pin -- --version 2026.4.10
169+
```
170+
171+
Recommended flow:
172+
173+
### TestFlight iteration on an existing train
174+
175+
1. Keep `apps/ios/version.json` pinned to the current train version.
176+
2. Update `apps/ios/CHANGELOG.md`, usually under `## Unreleased` while iterating.
177+
3. Run `pnpm ios:version:sync` after changelog changes.
178+
4. Upload more TestFlight builds with `pnpm ios:beta`.
179+
5. Let Fastlane bump only the numeric build number.
180+
181+
### Starting the next production release train
182+
183+
1. Pin iOS to the current gateway version:
184+
185+
```bash
186+
pnpm ios:version:pin -- --from-gateway
187+
```
188+
189+
2. Update `apps/ios/CHANGELOG.md` for the new release as needed.
190+
3. Run `pnpm ios:version:sync`.
191+
4. Submit the first TestFlight build for that newly pinned version.
192+
5. Keep iterating on that same version until the release candidate is ready.
193+
194+
See `apps/ios/VERSIONING.md` for the detailed spec.
142195

143196
## APNs Expectations For Local/Manual Builds
144197

apps/ios/Sources/Device/DeviceInfoHelper.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ enum DeviceInfoHelper {
5050
return trimmed.isEmpty ? "unknown" : trimmed
5151
}
5252

53-
/// App marketing version only, e.g. "2026.2.0" or "dev".
53+
/// Canonical app version when present, otherwise the Apple marketing version.
5454
static func appVersion() -> String {
55-
Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "dev"
55+
(Bundle.main.infoDictionary?["OpenClawCanonicalVersion"] as? String)
56+
?? (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String)
57+
?? "dev"
5658
}
5759

5860
/// App build string, e.g. "123" or "".

apps/ios/Sources/Info.plist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<string>APPL</string>
2525
<key>CFBundleShortVersionString</key>
2626
<string>$(OPENCLAW_MARKETING_VERSION)</string>
27+
<key>OpenClawCanonicalVersion</key>
28+
<string>$(OPENCLAW_IOS_VERSION)</string>
2729
<key>CFBundleURLTypes</key>
2830
<array>
2931
<dict>

apps/ios/VERSIONING.md

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# OpenClaw iOS Versioning
2+
3+
OpenClaw iOS uses a **pinned CalVer release version** instead of reading the current gateway version automatically on every build.
4+
5+
## Goals
6+
7+
- keep TestFlight submissions on one stable app version while iterating
8+
- change only `CFBundleVersion` during normal TestFlight iteration
9+
- promote the iOS release version to the current gateway version only when a maintainer chooses to do that
10+
- keep Apple bundle fields valid for App Store Connect
11+
- generate App Store release notes from an iOS-owned changelog
12+
13+
## Version model
14+
15+
The pinned iOS release version lives in `apps/ios/version.json`.
16+
17+
Supported pinned format:
18+
19+
- `YYYY.M.D`
20+
21+
Examples:
22+
23+
- `2026.4.6`
24+
- `2026.4.10`
25+
26+
The root gateway version in `package.json` may still be one of:
27+
28+
- `YYYY.M.D`
29+
- `YYYY.M.D-beta.N`
30+
- `YYYY.M.D-N`
31+
32+
When you pin iOS from the gateway version, the iOS tooling strips the gateway suffix and keeps only the base CalVer.
33+
34+
Examples:
35+
36+
- gateway `2026.4.10` -> iOS `2026.4.10`
37+
- gateway `2026.4.10-beta.3` -> iOS `2026.4.10`
38+
- gateway `2026.4.10-2` -> iOS `2026.4.10`
39+
40+
## Apple bundle mapping
41+
42+
Pinned iOS version `2026.4.10` maps to:
43+
44+
- `CFBundleShortVersionString = 2026.4.10`
45+
- `CFBundleVersion = numeric build number only`
46+
47+
`CFBundleShortVersionString` stays fixed for a TestFlight train until you intentionally pin a newer iOS release version.
48+
49+
## Source of truth and generated files
50+
51+
### Source files
52+
53+
- `apps/ios/version.json`
54+
- pinned iOS release version
55+
- `apps/ios/CHANGELOG.md`
56+
- iOS-only changelog and release-note source
57+
- `apps/ios/VERSIONING.md`
58+
- workflow and constraints
59+
60+
### Generated or derived files
61+
62+
- `apps/ios/Config/Version.xcconfig`
63+
- checked-in defaults derived from `apps/ios/version.json`
64+
- `apps/ios/fastlane/metadata/en-US/release_notes.txt`
65+
- generated from `apps/ios/CHANGELOG.md`
66+
- `apps/ios/build/Version.xcconfig`
67+
- local gitignored build override generated per build or beta prep
68+
69+
## Tooling surfaces
70+
71+
### Version parsing and sync tooling
72+
73+
- `scripts/lib/ios-version.ts`
74+
- validates pinned iOS CalVer
75+
- normalizes gateway version -> pinned iOS CalVer
76+
- renders checked-in xcconfig and release notes
77+
- `scripts/ios-version.ts`
78+
- CLI for JSON, shell, or single-field version reads
79+
- `scripts/ios-sync-versioning.ts`
80+
- syncs checked-in derived files from the pinned iOS version
81+
- `scripts/ios-pin-version.ts`
82+
- explicitly pins iOS to a chosen release version or the current gateway version
83+
84+
### Build and beta flow
85+
86+
- `scripts/ios-write-version-xcconfig.sh`
87+
- reads the pinned iOS version
88+
- writes the local numeric build override file in `apps/ios/build/Version.xcconfig`
89+
- `scripts/ios-beta-prepare.sh`
90+
- prepares beta signing and bundle settings against the pinned iOS version
91+
- `apps/ios/fastlane/Fastfile`
92+
- resolves version metadata from the pinned iOS helper
93+
- increments TestFlight build numbers for the pinned short version
94+
95+
## Release-note resolution order
96+
97+
When generating `apps/ios/fastlane/metadata/en-US/release_notes.txt`, the tooling reads the first available changelog section in this order:
98+
99+
1. exact pinned version, for example `## 2026.4.10`
100+
2. `## Unreleased`
101+
102+
Recommended workflow:
103+
104+
- while iterating on a TestFlight train, keep pending notes under `## Unreleased`
105+
- before the production release, move or copy the final notes under `## <pinned version>` and run sync again
106+
107+
## Common commands
108+
109+
```bash
110+
pnpm ios:version
111+
pnpm ios:version:check
112+
pnpm ios:version:sync
113+
pnpm ios:version:pin -- --from-gateway
114+
pnpm ios:version:pin -- --version 2026.4.10
115+
```
116+
117+
## Normal TestFlight iteration workflow
118+
119+
1. keep `apps/ios/version.json` pinned to the current TestFlight train version
120+
2. update `apps/ios/CHANGELOG.md` under `## Unreleased` while iterating
121+
3. upload more betas with the usual flow
122+
4. let Fastlane increment only `CFBundleVersion`
123+
124+
This keeps the TestFlight version stable while review is in flight.
125+
126+
## New release promotion workflow
127+
128+
When you want the next production iOS release to align with the current gateway release:
129+
130+
1. pin iOS from the root gateway version:
131+
132+
```bash
133+
pnpm ios:version:pin -- --from-gateway
134+
```
135+
136+
2. review the generated changes in:
137+
- `apps/ios/version.json`
138+
- `apps/ios/Config/Version.xcconfig`
139+
- `apps/ios/fastlane/metadata/en-US/release_notes.txt`
140+
3. update `apps/ios/CHANGELOG.md` for the new release if needed
141+
4. run `pnpm ios:version:sync` again if the changelog changed
142+
5. submit the first TestFlight build for that newly pinned version
143+
6. keep iterating only by build number until the release candidate is ready
144+
7. release that reviewed TestFlight build to production
145+
146+
## Important invariant
147+
148+
Fastlane and Xcode should consume only the pinned iOS version from `apps/ios/version.json`.
149+
150+
Changing `package.json.version` alone must not change the iOS app version until a maintainer explicitly runs the pin step.

0 commit comments

Comments
 (0)