Gece saat 03:45’te, karmaşık ajan akışları üzerinde yüksek tempolu vibe coding oturumları yaparken kaçınılmaz sınıra toslarsınız: hız ve kota limitleri. Elinizde iki ayrı abonelik hesabı varsa—örneğin davaytiyada@gmail.com ve yusufakcakaya@gmail.com—en mantıklı hamle basittir: anında ikinci hesaba geçmek ve bilişsel akışı kesmeden inşa etmeye devam etmek.
Ancak terminal tabanlı yapay zekâ harness’larında kimlik yönetimi nadiren dinamik geçişler için tasarlanmıştır.
Çoğu CLI aracı tek ve statik bir kullanıcı kimliği varsayar. Hesap değiştirmek geleneksel olarak tarayıcıda yeni bir doğrulama açmak, önbellekleri sıfırlamak ve o sırada çalışan oturumun bozulmamasını umut etmek anlamına gelir.
Bu gece Yusuf’un tezgahında tam olarak bu sürtünmeyi ortadan kaldıran temiz bir çözüm inşa ettik: Antigravity araç setine doğrudan entegre edilen çoklu hesap yöneticisi ve otomatik yaşatma daemon’ı: agy-auth.
CLI OAuth Dünyasının Üç Sessiz Tuzağı
Otonom bir yapay zekâ CLI’ı için kimlik değiştirici geliştirmek ilk bakışta basit bir dosya kopyalama işi gibi görünebilir. Pratikte ise terminal tabanlı OAuth akışları, token’lara statik dosyalar gibi yaklaştığınızda oturumunuzu sessizce yok edecek üç ince tuzak barındırır:
1. Çalışma Esnasında Token Yenilenmesi ve Desenkronizasyon
agy uzun görevler veya arka plan alt ajanları çalıştırırken, Google OAuth erişim token’larının süresi 60 dakika içinde dolar. CLI çalışma zamanı, refresh_token kullanarak arka planda yeni bir access_token alır ve bunu ~/.gemini/antigravity-cli/antigravity-oauth-token dosyasına yazar.
Eğer bir profil değiştirici hesaplar arasında geçiş yaparken sadece statik bir klasörden dosyaları aktif konuma kopyalarsa, çalışma esnasında taze üretilmiş yeni erişim token’ını ezer ve süresi dolmuş eski bir token’a geri döner.
Çözüm: Profil değiştirici her geçişten önce aktif token senkronizasyonu gerçekleştirmelidir:
def sync_active_to_current_profile() -> None:
"""Geçiş yapmadan önce çalışma zamanındaki taze token'ları aktif profile kaydeder.
Arka planda gerçekleşen token yenilemelerinin asla kaybolmamasını sağlar."""
curr = get_current_profile_name()
if not curr:
return
prof_dir = PROFILES_DIR / curr
# Kaydetmeden önce hesap kimliğinin eşleştiğini doğrula
runtime_info = extract_account_info(ACTIVE_AGY_TOKEN, ACTIVE_OAUTH_CREDS, ACTIVE_GOOGLE_ACCOUNTS)
if runtime_info.get("email") not in ("Unknown", saved_email):
return
for src, dst_name in [(ACTIVE_AGY_TOKEN, "antigravity-oauth-token"), ...]:
shutil.copy2(src, prof_dir / dst_name)
2. Statik Dosyaların Yarattığı Kimlik Yanılsaması
İlk keşif adımlarında ~/.gemini/google_accounts.json ve ~/.gemini/oauth_creds.json dosyalarını incelediğimizde, Haziran ayından kalma yusufakcakaya@gmail.com kaydını gördük. Oysa antigravity-oauth-token içindeki canlı bearer token, oturumu davaytiyada@gmail.com olarak yönetiyordu.
Kimlik doğruluğu için yerel yapılandırma dosyalarına güvenmek bir yanılgıdır. Tek gerçek kaynak, canlı yetkilendirme sunucusudur:
def fetch_google_userinfo(access_token: str) -> Dict[str, Any]:
"""Canlı bearer token ile doğrudan Google UserInfo API'sini sorgular."""
req = urllib.request.Request("https://www.googleapis.com/oauth2/v3/userinfo")
req.add_header("Authorization", f"Bearer {access_token}")
with urllib.request.urlopen(req, timeout=3) as resp:
return json.loads(resp.read().decode("utf-8"))
https://www.googleapis.com/oauth2/v3/userinfo adresini sorgulayarak profil değiştirici, aktif token’a bağlı gerçek Google profilini ve e-postasını sıfır varsayımla doğrular.
3. Yenileme Token’larının (Refresh Token) Bayatlaması
Bir hesap haftalarca yedek bir dizinde hiçbir istek atmadan bekletilirse, OAuth yenileme token’ı güvenlik politikaları nedeniyle bayatlayabilir veya geçersiz kılınabilir. Gece yarısı kodlama maratonunda o hesaba geçmek istediğinizde token ölmüş olur ve sizi tarayıcı girişine zorlar.
Sabah 08:00 Token Yaşatma Daemon’ı
Her iki aboneliğin de her an canlı kalmasını sağlamak için otonom bir systemd zamanlayıcısı kurduk: agy-auth-keepalive.timer.
Her sabah saat 08:00’de başsız bir daemon uyanır:
- Geliştiricinin o an aktif olan profilini kaydeder.
- Kayıtlı tüm profilleri sırayla gezer (
davaytiyada,yusufakcakaya, vb.). - Kimlik bilgilerini çalışma zamanına aktarır ve hafif, 1 token’lık bir yoklama gönderir:
agy -p "echo keepalive" --effort low --disable-slash-commands - Bu çağrıyla yenilenen taze erişim token’ını yakalar ve profilin zaman damgasını günceller.
- Geliştiricinin orijinal aktif profilini geri yükler; böylece çalışma alanı hiç bozulmaz.
[Unit]
Description=Daily Token Keepalive for Antigravity (agy) Accounts
After=network-online.target
[Timer]
OnCalendar=*-*-* 08:00:00
OnBootSec=10min
RandomizedDelaySec=600
Persistent=true
[Install]
WantedBy=timers.target
Durum Çubuğu Entegrasyonu & Tek Tuşla Geçiş
İyi mühendislik görünmez olandır. Terminalde çalışırken ajanınızı hangi hesabın beslediğini aklınızda tutmak zorunda kalmamalısınız.
Profil farkındalığını doğrudan statusline.sh içine işledik:
● READY ╱ 👤 davaytiyada ╱ Flash (High) ╱ main*
ctx █·············· 8.2% · artifacts 0 · subagents 0 · tasks 0 · sandbox ON
Hesaplar arasında anında geçiş yapmak ise tek bir komuttan ibaret:
# Profil 1 ve Profil 2 arasında geçiş yap
agy-auth toggle
# Çıktı:
# ✓ Switched to profile: yusufakcakaya (yusufakcakaya@gmail.com)
Arka planda agy-auth, yerel OpenAI proxy köprüsünü (agy-proxy.service) otomatik olarak yeniden başlatır ve eski kota önbelleklerini temizler.
Çıkarılan Ders
Geliştirici araçları, birden fazla hesaba sahip olduğunuz için sizi asla cezalandırmamalıdır. Kimlik durumunu statik dosyalar yerine dinamik, yaşayan sözleşmeler olarak ele alarak—çalışma esnasındaki yenilemeleri senkronize ederek, canlı API uç noktalarını sorgulayarak ve otomatik yaşatma döngüleri kurarak—sinir bozucu bir sürtünme noktasını sıfır kesintili, akıcı bir deneyime dönüştürdük.
İki hesap, tek terminal, sıfır bilişsel yük.