SIGN IN SIGN UP

fix(oauth): surface unreadable-token state + log decryption failures

Two diagnostic fixes for the recurring "calendar shows disconnected
even though I just reconnected" loop:

- load_oauth_json_exact silently swallowed SecretStore decryption
  errors. The most common cause is a keychain ACL mismatch (dev↔prod
  bundle id, recent encryption toggle, or revoked keychain item) which
  makes every encrypted token unreadable — but the caller saw None,
  indistinguishable from "no token stored", and pushed the user toward
  a reconnect that just re-encrypts under the active bundle's key and
  breaks the same way next time. Now logs a WARN with the underlying
  cause so next failure is diagnosable from logs alone.
- OAuthStatus gains a needs_attention field, set by oauth_status when a
  token row exists in the store but is_oauth_instance_connected returns
  false. Calendar UI uses it to flip the google provider into "ok=false,
  connected=true" so the meeting-notes empty state shows "calendar needs
  attention" instead of pushing the user to a reconnect that won't help.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
L
Louis Beaumont committed
2359d1c2b35d34bc7ca30c0df03d13d40fe7f19e
Parent: 49dd9e0