Fix Meet detection picking a lobby tab over the live call; auto-clear stale Accessibility grants on upgrade - #4
Merged
Conversation
…first; clear stale Accessibility grants on upgrade Field report: jump kept going to a stale Safari green-room tab instead of the live call, and the hotkey stayed dead through repeated Accessibility re-grants. Detection: mic-priority matched processes by browser bundle-ID prefix, but Safari captures audio in com.apple.WebKit.GPU — no com.apple.Safari prefix — so Safari never won (or lost) the mic tiebreak and fell back to config order, where it sits first by default. Browsers now declare micBundlePrefixes. And a URL-only tab hit in a mic-less browser no longer short-circuits the AX window scan of the browser actually transmitting audio: mic holders are exhausted (tab probe + AX scan) before anything else is trusted. Hotkey: ad-hoc signing pins TCC grants to the exact binary, so every upgrade silently kills the Accessibility grant, and re-toggling the stale System Settings row never revalidates it. `jumpcall install` now detects a changed binary and clears the dead grant (tccutil reset) so the fresh prompt works; `jumpcall status` explains the recovery when the hotkey is stuck waiting. Co-Authored-By: Claude Fable 5 <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.
Bugs (from a field report, macOS Tahoe 26)
1. Jump went to a Safari green-room tab instead of the live call. A Meet link opened in Safari (default browser) parks on the join page; its URL is indistinguishable from an in-call tab, and the mic tiebreaker that should resolve this never fires for Safari: mic processes are matched by browser bundle-ID prefix, but Safari captures audio in
com.apple.WebKit.GPU. With the tiebreaker inert, Safari wins on config order (it's first by default) and stays "live" as long as the tab is open. A URL hit in any browser also short-circuited the AX window scan that could have found the real call in a hidden Chrome profile.2. Hotkey dead through repeated Accessibility grants. Builds are ad-hoc signed (designated requirement =
cdhashof the exact binary), so every upgrade invalidates the grant. macOS keeps showing the stale System Settings row and re-toggling it re-approves the dead record —tccutil reset+ fresh approval is the only fix. The reporter's machine had three stale TCC rows stacked up.Fixes
Browsernow declaresmicBundlePrefixes; Safari includescom.apple.WebKit.so its GPU process counts. (WebKit.GPU can serve other WKWebView apps too — accepted over-match; it only influences scan order and the last-resort fallback, both gated on the browser running.)detect()exhausts mic-holding browsers completely — tab probe, then profile-agnostic AX window scan — before trusting URL-only hits from mic-less browsers.jumpcall installcompares the old and new binaries; on change (with the hotkey enabled) it runstccutil reset Accessibility io.github.joncode.jumpcalland says so, making the fresh prompt meaningful.jumpcall statusnow prints the stale-grant recovery when the hotkey is stuck on "waiting for Accessibility permission".Tests:
holdsMic/ordering coverage for the WebKit.GPU mapping. 87 passed, 0 failed.Known residual: if the green-room tab itself holds the mic (preview) in one browser while the real call runs in another, both are mic holders and config order still decides. Distinguishing lobby from call needs a signal we don't have yet (tab audio output?).
🤖 Generated with Claude Code