feat(ios): QR scan pairing + home-screen Widget#124
Merged
Conversation
Settings can now scan the lisa-pair:// QR code the Mac shows instead of only pasting it. An AVFoundation viewfinder (QRScannerView) requests the camera grant and degrades honestly when there's no camera (e.g. the Simulator) or access is denied — a message, not a black screen. The decoded string flows through the existing applyPairing path, so both lisa-pair:// and http://…?token= strings work. Also gitignore the xcodegen-generated Widgets/Info.plist (the Sources one was already ignored), so a build no longer dirties the tree. Verified: ./build.sh → BUILD SUCCEEDED; NSCameraUsageDescription is present in the built app's Info.plist. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A WidgetKit StaticConfiguration + TimelineProvider (added to the existing LisaPocketWidgets extension) that glances the roster: active (working) and stuck (waiting / pending-permission / error) counts, plus total + an "as of" time on the medium size. Privacy-first sharing: the app keeps making the authenticated /api/agents/sessions fetch and writes only a counts-only AgentSnapshot — no session content, no token — to an App Group (group.ai.meetlisa.pocket); the extension reads that. The token never leaves the Keychain. The app nudges the timeline via WidgetCenter.reloadAllTimelines() on each roster change. App Group entitlements for both targets are generated from project.yml (like Info.plist) and gitignored. Verified: ./build.sh -> BUILD SUCCEEDED; both targets' generated entitlements carry the app group; the widget .appex is bundled. Honest limit: like Live Activities, runtime data-sharing needs a signed build — an unsigned Simulator build doesn't apply the App Group, so the Widget shows its placeholder. Compile-verified only. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
Two iOS companion follow-ups from the plan (docs/IOS_COMPANION_PLAN.md §G5, §5.3), both compile-verified for the simulator with
./build.sh. Based onmain(the #113–#123 stack already landed in v0.11.0).QR scan pairing
QRScannerView(AVFoundation) + a Scan QR code button/sheet in Settings.applyPairingpath, solisa-pair://…andhttp://…?token=both work.NSCameraUsageDescription.Home-screen Widget — active / stuck agent counts
StaticConfiguration+TimelineProviderin the existingLisaPocketWidgetsextension; small + medium families./api/agents/sessionsfetch and writes only a counts-onlyAgentSnapshot(no session content) to an App Group; the widget reads that, and the app nudges it viaWidgetCenter.reloadAllTimelines().project.yml(like Info.plist) and gitignored.Verification
./build.sh→ BUILD SUCCEEDED.NSCameraUsageDescriptionpresent in the built Info.plist; both targets' generated entitlements carrygroup.ai.meetlisa.pocket; the widget.appexis bundled.Honest limit
Like the existing Live Activity, the Widget is compile-verified on the Simulator; its App-Group data only populates on a signed build (capabilities aren't applied to unsigned Simulator builds), so unsigned it shows the "Open Lisa Pocket" placeholder. Noted in the README.
🤖 Generated with Claude Code