--- summary: "Design notes for unified provider session keepalive scheduling and refresh control." read_when: - Planning provider session keepalive work - Refactoring Augment keepalive behavior - Designing background session refresh scheduling --- # Session Keepalive Enhancement Design **Date:** 2026-01-04 **Feature:** Proactive session management for all providers **Inspiration:** Quotio's "Auto-Warmup" feature --- ## Problem Statement **Current State:** - Augment has reactive keepalive (checks every 5min, refreshes when cookies near expiry) - Other providers (Claude, Codex) have no automatic session management - Users experience auth failures when sessions expire during idle periods - Manual re-authentication is disruptive to workflow **Pain Points:** 1. **Session expiration during idle time** - User comes back to expired session 2. **No proactive refresh** - We only react to expiration, don't prevent it 3. **Provider-specific logic** - Each provider needs custom keepalive code 4. **No user control** - Can't configure refresh intervals or disable keepalive --- ## Proposed Solution: Unified Session Keepalive System ### Alternative Names (Better than "Warmup") 1. **Session Keepalive** ✅ (current Augment terminology) 2. **Session Refresh** (more accurate - we're refreshing, not warming) 3. **Auto-Refresh** (simple, user-friendly) 4. **Session Maintenance** (professional, clear intent) 5. **Stay Alive** (casual, friendly) **Recommendation:** **"Session Keepalive"** - already used in codebase, technically accurate --- ## Architecture ### 1. Core Components #### `SessionKeepaliveManager` (New) ```swift @MainActor public final class SessionKeepaliveManager { // Unified scheduler for all providers private var scheduledTasks: [Provider: Task] = [:] // Per-provider configuration private var configs: [Provider: KeepaliveConfig] = [:] // Start keepalive for a provider func start(provider: Provider, config: KeepaliveConfig) // Stop keepalive for a provider func stop(provider: Provider) // Force immediate refresh func forceRefresh(provider: Provider) async } ``` #### `KeepaliveConfig` (New) ```swift public struct KeepaliveConfig { enum Mode { case interval(TimeInterval) // Every X seconds case daily(hour: Int, minute: Int) // Daily at specific time case beforeExpiry(buffer: TimeInterval) // X seconds before expiry } let mode: Mode let enabled: Bool let minRefreshInterval: TimeInterval // Rate limiting } ``` ### 2. Provider Integration #### Augment (Existing - Refactor) - **Current:** `AugmentSessionKeepalive` (standalone actor) - **New:** Integrate with `SessionKeepaliveManager` - **Strategy:** `beforeExpiry(buffer: 300)` - refresh 5min before cookie expiry - **Action:** Ping session endpoint + re-import cookies #### Claude (New) - **Strategy:** `interval(1800)` - refresh every 30 minutes - **Action:** Run `/status` command via CLI to keep session alive - **Fallback:** OAuth token refresh if CLI unavailable #### Codex (New) - **Strategy:** `interval(3600)` - refresh every hour - **Action:** OAuth token refresh using refresh token - **Benefit:** Prevents "session expired" errors during long coding sessions #### Cursor, Gemini, etc. (Future) - **Strategy:** TBD based on provider auth mechanism - **Extensible:** Protocol-based design allows easy addition --- ## Implementation Plan ### Phase 1: Core Infrastructure (Week 1) 1. Create `SessionKeepaliveManager` actor 2. Define `KeepaliveConfig` model 3. Add UserDefaults persistence for per-provider configs 4. Create Settings UI for keepalive configuration ### Phase 2: Provider Integration (Week 2) 1. **Augment:** Refactor existing `AugmentSessionKeepalive` to use new manager 2. **Claude:** Implement CLI-based keepalive 3. **Codex:** Implement OAuth token refresh keepalive ### Phase 3: UI & Polish (Week 3) 1. Settings → Providers → [Provider] → "Session Keepalive" section 2. Toggle: Enable/Disable 3. Mode picker: Interval / Daily / Before Expiry 4. Status indicator: Last refresh time, next scheduled refresh 5. Manual "Refresh Now" button --- ## Settings UI Design ``` Settings → Providers → Augment ┌─────────────────────────────────────────┐ │ Session Keepalive │ ├─────────────────────────────────────────┤ │ ☑ Keep session alive automatically │ │ │ │ Mode: ⦿ Before Expiry │ │ ○ Every 30 minutes │ │ ○ Daily at 9:00 AM │ │ │ │ Last refresh: 2 minutes ago │ │ Next refresh: in 3 minutes │ │ │ │ [Refresh Now] │ └─────────────────────────────────────────┘ ``` --- ## Key Differences from Quotio's "Warmup" | Aspect | Quotio Warmup | CodexBar Keepalive | |--------|---------------|-------------------| | **Purpose** | Trigger 1-token API calls to reset quota counters | Refresh auth sessions to prevent expiration | | **Target** | Antigravity only (quota reset) | All providers (session management) | | **Action** | Make minimal API request (costs 1 token) | Refresh auth tokens/cookies (free) | | **Benefit** | Faster quota resets during peak hours | Uninterrupted access, no auth failures | | **Cost** | Consumes tokens | No cost (just auth refresh) | **Why different?** - Quotio has a proxy server that routes requests → warmup keeps quota fresh - CodexBar monitors providers directly → keepalive prevents auth expiration --- ## Benefits ### For Users 1. **No more "session expired" errors** during active work 2. **Seamless experience** - auth just works 3. **Configurable** - control refresh frequency per provider 4. **Transparent** - see when last refresh happened ### For Developers 1. **Unified system** - one manager for all providers 2. **Extensible** - easy to add new providers 3. **Testable** - clear separation of concerns 4. **Maintainable** - centralized keepalive logic --- ## Technical Considerations ### Rate Limiting - Minimum 2-minute interval between refreshes (prevent API abuse) - Exponential backoff on failures - Max 3 retry attempts before disabling ### Error Handling - Log failures but don't crash - Notify user if keepalive fails repeatedly - Automatic disable after 5 consecutive failures ### Performance - Background tasks use `.utility` priority - No blocking of main thread - Minimal memory footprint ### Privacy - No data sent to external servers - All refresh actions are local (CLI, OAuth, cookie import) - User can disable entirely --- ## Next Steps 1. **Review this design** - Get feedback on architecture 2. **Prototype core manager** - Build `SessionKeepaliveManager` 3. **Integrate Augment** - Refactor existing keepalive 4. **Add Claude support** - Implement CLI-based refresh 5. **Build Settings UI** - Per-provider configuration 6. **Test & iterate** - Ensure reliability --- ## Open Questions 1. **Should keepalive be enabled by default?** - Pro: Better UX out of the box - Con: Users might not want automatic refreshes - **Recommendation:** Enabled by default, easy to disable 2. **What's the default refresh interval?** - Augment: 5min before expiry (existing) - Claude: 30min interval - Codex: 60min interval - **Recommendation:** Conservative defaults, user-configurable 3. **Should we show keepalive status in menu bar?** - Pro: Transparency, user knows it's working - Con: Clutters UI - **Recommendation:** Show in Settings only, not menu bar