* feat(ios): render plugin approvals as native Allow/Deny notifications
Extend the iOS approval handling from exec to plugin approvals so the native
push the gateway now sends (#108505) shows a phone notification with Allow/Deny.
Extract a shared ApprovalNotificationBridge with exec/plugin wrappers owning
their own kind constants and category; tag the parsed prompt with its kind;
register the plugin category and route plugin pushes in the app delegate; add a
.plugin case that maps the plugin presentation (title/description/pluginId/
severity) into the existing prompt and widens the exec-only validation, current,
cache-restore, and resolve guards to accept plugin; parameterize the dialog copy
by kind. Watch snapshot publication stays exec-only; the phone notification still
mirrors to the watch via WatchConnectivity. Reuses the unified approval.get/
approval.resolve RPCs (already kind-generic); no server or protocol changes.
* chore(i18n): sync native inventory after rebase
* chore(ios): drop accidentally committed local Version.xcconfig build override
* fix(ios): sync Apple i18n catalog and remove dead approval-bridge methods
Sync apps/ios/Resources/Localizable.xcstrings for the new plugin-approval
strings (native inventory sync alone did not cover the Apple catalog).
Remove the superseded per-bridge registerCategory variants and the redundant
exec parseResolvedPush wrapper flagged by the iOS Periphery dead-code scan;
registration uses ApprovalNotificationBridge.registerCategories and the shared
parse helpers.
* chore(ios): drop generated SwiftSources filelist; reconcile native i18n inventory
* chore(ios): drop generated Xcode project from tracking
Codex generated OpenClaw.xcodeproj for its simulator test run and the initial
apps/ios directory commit force-added it; xcodegen regenerates it in CI, so it
must not be tracked (matches main).
* chore(ios): reconcile native i18n inventory after rebase
* feat(ios): mascot moods for onboarding and gateway quick setup
The activation glyph now takes a mood: the onboarding welcome step
shows the hard-hat working mascot while connecting, the success step
celebrates, and the gateway quick-setup header derives working/sad/
curious/idle from its connect state.
* fix(ios): quick-setup mood reflects app-level gateway problems too
The sheet renders two error surfaces — the local connect error and the
app-level gateway problem banner — and the mascot now goes sad for
either instead of only the sheet-local failure.
* fix(ios): attach EKAlarm to reminders.add so due-time notifications fire
EKReminder.dueDateComponents only sets the deadline; without an explicit
EKAlarm, iOS does not produce lock-screen or banner notifications.
Closes#105523
* fix(ios): configure reminder due alerts
Co-authored-by: xialonglee <li.xialong@xydigit.com>
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Reorder Settings -> Gateway by intent: pairing (Add Gateway with Scan QR,
setup code, discovered gateways) right below status, nav-bar QR scanner
button on the gateway route, and a Scan QR to Pair status-card hero while
nothing is paired (honoring the shared connect lock). Manual Gateway and
credentials move to the bottom. Fix setup-code Connect busy spinner to
track the whole attempt. New strings ran the full native i18n pipeline.
Closes#106013
* feat(ios): guide first launch through pairing explainer and permissions
* fix(ios): keep first-run flow resumable and surface limited grants in onboarding
* chore(ios): regenerate native i18n after rebase
* chore(android): project refreshed native translations into strings.xml
* fix(ios): move i18n wrapper contract to shared permission row and sync catalog
* fix(ios): focus missing gateway credentials
Co-authored-by: Colin <colin@solvely.net>
* test(macos): let main actor polling suspend
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>