fix(onboarding): detect agy settings.json as login fallback on macOS (#3289)
* fix(onboarding): detect agy settings.json as login fallback on macOS On macOS, agy 1.1.7+ stores OAuth credentials in Keychain and writes only ~/.gemini/antigravity-cli/settings.json (no oauth_creds.json). The existing gemini_auth_has_credential() missed this and falsely reported 'harness antigravity-native is not configured'. Accept the existence of settings.json as a fallback signal when no token files are found. This is safe because the caller (resolve_native_antigravity_launch) uses it only for an informational warning — agy always re-drives OAuth on first run regardless. - Update gemini_auth_has_credential() with settings.json fallback - Update docstrings to document the third detection path - Update warning message in antigravity_native_launch.py - Add unit test for settings.json-only detection - Fix _GEMINI_DIR isolation in existing test Signed-off-by: ElliotSun <elros1109@gmail.com> * fix(onboarding): prove agy login via CLI, not settings.json existence The macOS lockout this fixes is real: agy 1.1.7+ keeps OAuth in the Keychain and writes no token file, so the file-only check reported antigravity-native as unconfigured and connect.py refused to spawn a runner for a user who was in fact signed in. Accepting the bare existence of ~/.gemini/antigravity-cli/settings.json as the fallback signal does not work, because omnigent creates that file itself: the CLI launch path calls ensure_agy_feedback_survey_disabled under the real home before agy starts, and build_agy_launch emits no HOME override. One `omni antigravity` run therefore satisfied the credential gate forever, on every platform — turning a hard launch gate into a no-op and letting a runner spawn that dies on its first turn. That is worst on headless hosts, where agy's OAuth prompt has no TTY. Ask the CLI instead. `agy models` exits 0 only when signed in and reads the credential wherever agy stored it, Keychain included, so nothing omnigent writes can satisfy it. This mirrors ambient._claude_login_detected, which already solves the identical Keychain split for Claude Code, and reuses the probe harness_install already wires as the gemini family's status command. The fallback is gated on macOS: Linux writes a real token file, so its absence is a true negative there and the fallback would only add a subprocess while weakening a signal that works. Failures — missing binary, non-zero exit, timeout, unreadable home — all read as False, because readiness must never raise. Content inspection of settings.json was the alternative considered. It was rejected as unverifiable from here: no key in that file is known to mark a completed sign-in on 1.1.7, so keying on one risks reintroducing the very lockout being fixed. Signed-off-by: SabhyaC26 <sabhyachhabria@gmail.com> * docs(skills): note agy's macOS Keychain credential in the e2e pre-flight The pre-flight tells the reader agy's token lives under ~/.gemini, which leaves a Mac developer on agy 1.1.7+ hunting for a file that is never written. Name the Keychain case and the `agy models` fallback that gemini_login_detected() now uses there. Signed-off-by: SabhyaC26 <sabhyachhabria@gmail.com> --------- Signed-off-by: ElliotSun <elros1109@gmail.com> Signed-off-by: SabhyaC26 <sabhyachhabria@gmail.com> Co-authored-by: SabhyaC26 <sabhyachhabria@gmail.com>
This commit is contained in:
@@ -71,8 +71,10 @@ Three transports, easy to confuse:
|
||||
agy models # exits 0 and lists models only when signed in; else 'Please sign in'
|
||||
```
|
||||
`False` / non-zero → run `agy` once and sign in. agy's token lives under
|
||||
`~/.gemini` (`oauth_creds.json` on macOS, `antigravity-cli/antigravity-oauth-token`
|
||||
on Linux).
|
||||
`~/.gemini` (`oauth_creds.json` on macOS through 1.0.10,
|
||||
`antigravity-cli/antigravity-oauth-token` on Linux); agy 1.1.7+ on macOS
|
||||
writes no token file and keeps the credential in the Keychain, which is why
|
||||
`gemini_login_detected()` falls back to `agy models` there.
|
||||
4. **`tmux` is on PATH.** The agy terminal is a runner-owned tmux pane; the CLI
|
||||
attaches to it and the executor drives it via `tmux send-keys`
|
||||
(`_preflight_local_tools` hard-fails without tmux).
|
||||
|
||||
Reference in New Issue
Block a user