Originally created by: Akarsh-Hegde
Summary
open_permission_pane's notifications URL had no app anchor, so "Open Settings" landed on the general Notifications list instead of Meridian's own row. Anchored it with ?id=<bundle-id> — verified live against NotificationsSettings.appex's metadata, which documents support for this param (allowsXAppleSystemPreferencesURLScheme).
grantNotifications always called request_notifications first, even when already denied. macOS never re-prompts after a deny, so this was a pointless async round-trip through the Swift notification-plugin bridge before ever reaching the Settings pane — a plausible source of the reported "flickers, doesn't open" behavior. Now skips straight to open_permission_pane when the caller already knows the state is denied.
- Notifications card flicker (found during live manual testing above):
check_notifications polls every 2s; a transient Swift-bridge hiccup can make the Rust command return 'unavailable' as a normal (non-error) result for a single poll tick, which the card's hide-when-unavailable check then treats as the plugin having vanished — flashing the whole card away and back. Bundled-ness is fixed for the process lifetime, so once a real state (prompt/granted/denied) has been observed, a later 'unavailable' can only be that glitch, never a genuine regression — the poll now keeps the last known-good state instead.
- Notifications row now omits the REQUIRED/OPTIONAL badge (Accessibility/Screen Recording still show
REQUIRED). Intentional, requested during live wizard testing: unlike those two, notifications doesn't gate canNext on the Permissions step — nothing about the row conveys a requirement to satisfy, so the OPTIONAL label was pure visual noise where REQUIRED on the other two rows is actually meaningful (it signals what blocks continuing). Dropping it declutters the row without losing information.
- Copy: notifications description now uses a plain hyphen (
Quiet by default - you control…) instead of an em dash, matching the hyphen style used everywhere else in the wizard's copy.
- New: semi-circular gauge (
MemoryGauge in atoms.tsx) for the Local-intelligence step's "Expected memory" panel, replacing the straight Bar there. Kept Bar itself untouched/reused as-is for download progress elsewhere — the two are visually distinct on purpose (straight = loading, arc = capacity). Drawn as two arcs meeting at the footprint percentage: amber for what Meridian expects to use, green for the unified memory left over.
All found/requested while manually testing PR [#418] (notifications permission card) on a staging build, then a locally packaged build of this branch.
Test plan
- [x]
cargo fmt --check + cargo clippy -- -D warnings clean
- [x]
npm run build (ui) succeeds, /setup route compiles
- [x] Verified the
?id=com.meridiona.tray deep link lands on Meridian's specific notification detail pane (Allow toggle, Alert Style, etc.) rather than the general app list, via direct open testing against this machine's NotificationsSettings.appex
- [x] Manual: clicked "Open Settings" on a denied Notifications permission in a locally packaged build of this branch — opens directly to Meridian's row, no flicker
- [x] Manual: verified the memory gauge renders correctly (amber/green split arc) in the same packaged build
Originally posted by: coderabbitai[bot]
✨ Finishing Touches
🧪 Generate unit tests (beta)
- [ ] Create PR with unit tests - [ ] Commit unit tests in branch `fix/notifications-pane-deep-link`Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
❤️ Share
- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)Comment
@coderabbitai helpto get the list of available commands.Originally posted by: Akarsh-Hegde
Thanks for the review — addressing the one open question and updating on scope.
REQUIRED/OPTIONAL badge removal — intentional, not a leftover. This row is the only permission in the list that doesn't gate
canNexton the Permissions step (canNext: e => !!(e.perms.accessibility && e.perms.screen)— notifications isn't in that check). SoREQUIREDon the other two rows is meaningful signal (it tells you what's blocking Continue), butOPTIONALon this one wasn't conveying anything actionable — it was just visual noise. Dropped it, keptREQUIREDon Accessibility/Screen Recording. Explained in the updated PR summary now.Also pushed since your review (all found/requested during the same live manual test pass, on both a staging build and a locally packaged build of this branch):
check_notificationspolls every 2s, and a transient Swift-bridge hiccup can make the Rust command return'unavailable'as a normal result for a single tick — which was hiding the whole card for that tick since bundled-ness can't actually change mid-session. Now sticky on the last known-good state.Bar(which stays untouched/reused as-is for download progress elsewhere).Last test-plan checkbox is now checked too — verified the no-flicker Open Settings behavior and the new gauge live in a packaged build. PR summary is updated to match everything currently in the diff.
Ticket changed by: Akarsh-Hegde