feat(mobile): add iOS Live Activity and widgets - #5553
Open
iscekic wants to merge 12 commits into
Open
Conversation
1 task
Contributor
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (2 files)
Previous Review Summaries (3 snapshots, latest commit 5043f7a)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 5043f7a)Status: No Issues Found | Recommendation: Merge Files Reviewed (1 files)
Previous review (commit 119f2a2)Status: No Issues Found | Recommendation: Merge Files Reviewed (4 files)
Previous review (commit b49e6b3)Status: 4 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)CRITICAL
WARNING
Files Reviewed (16 files)
Reviewed by grok-4.6 · Input: 154.7K · Output: 9.1K · Cached: 513.3K Review guidance: REVIEW.md from base branch |
This was referenced Aug 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The new
iosSinkimplements theGlanceableSinkcontract for the iOS surfaces.publishwrites a widget snapshot plus a two-frame timeline whose second frame, atexpiresAt, carries the zeroed expired snapshot;startOrUpdatestarts or adopts a single Live Activity, ignores a revision at or below the last applied one, and treats onlyERR_LIVE_ACTIVITIES_NOT_SUPPORTEDas permanent denial.endImmediateadopts a leftover activity after a process restart and ends it with the last published content date, then unregisters delivery tokens.Files
apps/mobile/src/glanceable-ios/ios-sink.ts(added, +191) — the sink: publish/startOrUpdate/endImmediate, ActivityKit adoption and denial handling, revision guard, content-date tracking,getActivityKitDenied, and_resetIosSinkForTests.apps/mobile/src/glanceable-ios/register.ts(added, +10) — registersiosSinkat import time, with no React dependency.The
GlanceableViewPropstype is the single payload that crosses into the widget extension, andbuildGlanceableViewPropsis its only producer. It maps the snapshot and surface flags to translated status copy, ranked count lines, a compact primary count, an elapsed anchor, and a spoken accessibility label. It excludes every identifier, title, and revision, so the out-of-process widget holds only counts and translated strings.Files
apps/mobile/src/glanceable-ios/view-props.ts(added, +64) — definesGlanceableViewProps,GlanceableCount, and the builder that translates snapshot state into the surface payload.ActiveAgentsLiveActivitydeclares the banner, compact leading/trailing, minimal, and expanded leading/trailing/bottom Dynamic Island regions. It renders translated count lines, a muted status line, and a relative-date elapsed anchor, and its'widget'body references only widget globals andPlatformColor, so Babel can stringify and re-evaluate the layout in the widget extension. Only stringifiedGlanceableViewPropsreach it; translation happens before the boundary.Files
apps/mobile/src/glanceable-ios/active-agents-live-activity.tsx(added, +112) — thecreateLiveActivitylayout function with the five Dynamic Island regions and the inline English fallbacks for the gallery placeholder.ActiveAgentsWidgetrenders the small, medium, large, and accessory widget families. Compact families collapse to one headline with the primary count and label, and non-compact layouts add the translated "Open agents" affordance for happy and stale snapshots. Every family deep-links to the agents tab viawidgetURL.Files
apps/mobile/src/glanceable-ios/active-agents-widget.tsx(added, +105) — thecreateWidgetlayout function, its compact/non-compact branches, and thewidgetURLdeep link.The Expo config registers the
expo-widgetsplugin for oneActiveAgentsWidgettarget with bundle idcom.kilocode.kiloapp.ExpoWidgetsTarget, push enabled, and six supported families, and it reuses the existing app groupgroup.com.kilocode.kiloappinstead of creating a second one. Two local plugins follow it:withActiveAgentsLiveUpdateverifies the local module'sexpo-module.config.jsonexists, andwithActiveAgentsAndroidWidgetstays a no-op until level 3 writes the Android widget config, so a level 2 prebuild is unchanged.Files
apps/mobile/app.config.ts(modified, +31) — adds theexpo-widgetsplugin block and registers the two local config plugins.apps/mobile/plugins/withActiveAgentsLiveUpdate.js(added, +19) — resolves the local module directory and throws if its config file is missing.apps/mobile/plugins/withActiveAgentsAndroidWidget.js(added, +27) — loadsreact-native-android-widget/app.plugin.jsonly when the level-3 widget config file exists and lists widgets.A local
active-agents-live-updateExpo module is added as afile:dependency with empty native module lists and no-opstart/update/endplusisLiveUpdateCapable()returning false; level 3 fills in the Android side. The root layout imports it and the iOS sink registration, so the sink subscribes to the publisher for the whole process on both platforms.@expo/uiis added and pinned to 57.0.12 through a workspace override so expo-widgets and expo-router share one native-module copy, andreact-native-android-widgetis added for the level 3 widget.Files
apps/mobile/modules/active-agents-live-update/package.json(added, +12) — module manifest with the TypeScript entry and peer dependencies.apps/mobile/modules/active-agents-live-update/expo-module.config.json(added, +9) — empty apple/android native module lists.apps/mobile/modules/active-agents-live-update/src/index.ts(added, +32) — no-op native functions and the try/catch require of the future Android register.apps/mobile/package.json(modified, +4) — adds@expo/ui,expo-widgets,react-native-android-widget, and theactive-agents-live-updatefile dependency.apps/mobile/src/app/_layout.tsx(modified, +6) — imports the local module and@/glanceable-ios/registerat bootstrap.pnpm-workspace.yaml(modified, +3) — adds the@expo/ui57.0.12 override.The pure vitest project now includes the glanceable-ios test directory, so the sink suite runs under the node environment with no React mounting and stays out of the mounted-test harness.
Files
apps/mobile/vitest.pure.config.ts(modified, +1) — addssrc/glanceable-ios/**/*.test.tsto the include list.Test: 1 new suite added,
apps/mobile/src/glanceable-ios/ios-sink.test.ts(+399).Generated: 1 lockfile updated,
pnpm-lock.yaml(~239 lines changed).Verification
Visual Changes
Visual Changes: N/A
Reviewer Notes
Stacked PRs — merge bottom to top. Each level shows only its own diff.
Runtime verification (E2E, user advocacy, simplify) runs on the tip PR over every level.
Every level keeps its own checks, its own bot review, and its own threads; each one is answered on its own PR.
Each level is its own deliverable: it builds and passes its own checks alone.
A finding on a level is repaired on that level, then carried upward with stack.sh forward.
audit-w8b-live-activities-3cf8— feat(mobile): add glanceable agents snapshot contract #5535audit-w8b-live-activities-3cf8-s2— feat(mobile): add iOS Live Activity and widgets #5553 ← this PRaudit-w8b-live-activities-3cf8-s3— feat(mobile): add Android agents widget and live update #5585audit-w8b-live-activities-3cf8-s4— feat(mobile): deliver glanceable snapshot updates #5620 (tip)