feat: Multi-Account OAuth Rotation with Settings UI and CLI Enhancements#9069
feat: Multi-Account OAuth Rotation with Settings UI and CLI Enhancements#9069mguttmann wants to merge 20 commits intoanomalyco:devfrom
Conversation
|
The following comment was made by an LLM, it may be inaccurate: Potential Related PRs Found#8590 - feat(auth): OAuth Marathon - multi-account credential rotation
#6905 - feat: display Anthropic and OpenAI OAuth usage in status dialog and sidebar
#5158 - add ratelimiter to opencode server
|
Context on Related PRs
This PR represents the complete implementation of multi-account OAuth with:
All functionality has been tested and works together cohesively. |
Non-network errors seen in logs: - AI_APICallError (402 deactivated_workspace) - AI_APICallError (500 server_error) - AI_LoadAPIKeyError / OpenAI API key is missing - ProviderInitError - ConfigInvalidError - ProviderAuthOauthCallbackFailed - NotFoundError - EditBuffer is destroyed
- Add getUsage() to fetch OAuth account status and health - Add fetchAnthropicUsage() to fetch Claude Max rate limits from Anthropic API - Add GET /auth/usage endpoint to expose usage data
- Add DialogAuthUsage component with rate limit visualization - Display Anthropic 5-hour and 7-day limits with progress bars - Show OAuth account status, cooldown state, and request counts - Add button in sidebar to open the dialog
- Add AuthUsageCommand to display rate limit info in terminal - Show account status, cooldown state, and request counts - Display Anthropic rate limits when available
The AI SDK's convertToModelMessages() does not accept 'step-start' as a valid UIMessagePart type. This caused AI_InvalidPromptError during session compaction. - Remove step-start from being added to UIMessage parts - Simplify the filter since step-start is no longer included - Fixes compaction breaking sessions with context overflow
Implements comprehensive multi-account OAuth support with automatic rate limit rotation, manual account switching, and a new Settings menu for the desktop app. - Add `Auth.OAuthPool.setActive()` to manually switch active OAuth account - Add `Auth.OAuthPool.snapshot()` returns `activeID` for credential selection - Update `rotating-fetch.ts` to prefer `activeID` while keeping auto-rotation - Update `fetchAnthropicUsage()` to respect `provider.active[namespace]` - Update `getAccounts()` to correctly identify active account - Add `POST /auth/active` endpoint to switch active OAuth account - Returns updated `anthropicUsage` for immediate UI updates - New `DialogSettings` component with tabbed interface - **Providers Tab**: View connected providers, add new providers with search - **Provider Detail View**: Account list, usage stats, switch functionality - **About Tab**: GitHub, docs, Discord links, keyboard shortcuts - Inline provider search without leaving settings context - Add Anthropic Rate Limits section in session context panel - Shows 5-hour, weekly (all models), weekly (sonnet) usage bars - Account switch buttons when multiple accounts configured - Only visible when current session uses Anthropic provider - `opencode auth usage`: Shows individual usage per OAuth account - `opencode auth switch`: Interactive command to switch active account - `opencode auth list`: Shows account count per provider - All provider lists now sorted alphabetically - `packages/opencode/src/auth/index.ts`: Core OAuth pool functions - `packages/opencode/src/auth/rotating-fetch.ts`: Credential selection - `packages/opencode/src/server/server.ts`: API endpoint - `packages/opencode/src/cli/cmd/auth.ts`: CLI commands - `packages/app/src/components/dialog-settings.tsx`: New settings UI - `packages/app/src/components/session/session-context-tab.tsx`: Context panel - `packages/app/src/pages/layout.tsx`: Settings button integration 1. Request uses `activeID` (manually selected or first available) 2. On 429 rate limit → account gets cooldown, moved to back 3. Next request automatically uses next available account 4. Manual switch via UI/CLI updates `provider.active[namespace]` Currently only Anthropic provides OAuth usage statistics. Other providers show multi-account switching but no usage bars. Contributions welcome for additional provider support.
- Add Auth.OAuthPool.removeRecord() to remove individual OAuth accounts - Add DELETE /auth/account API endpoint for Desktop app - Update CLI 'opencode auth logout' to select specific accounts - Add delete button with confirmation in Desktop Provider settings
- Move auth endpoints to provider routes - Add delete account functionality to dialog-auth-usage - Fix duplicate imports in layout.tsx - Fix message-v2.ts convertToModelMessages call - Regenerate SDK types
35b1cd5 to
3c1140f
Compare
Rebased to latest dev (936f3eb)This PR has been rebased onto the latest Changes in this update:
Features preserved:
Testing:
Ready for review! |
Update: Rebased onto latest dev (v1.1.30+)Branch has been rebased and updated to work with the new modular settings structure. Changes since last update:
Features included:
Typecheck passes ✅ | Build passes ✅ This is the base PR for #9073 (YOLO Mode) and #9455 (Auto-Relogin). |
- Enable Providers tab in Settings dialog - Full provider management: list, add, view details - Account switching and deletion - Rate limits display for Anthropic - Multi-account OAuth rotation info - Auto-rotation when rate limits hit
- Add browser session management UI for Anthropic accounts - Setup/Test/Remove buttons per account - Show last refresh time - Experimental label for the feature
- Restore browser.ts with Puppeteer-based browser session management - Add browser session routes to provider.ts: - GET /auth/browser/sessions - list all sessions - GET /auth/browser/sessions/:recordId - get session status - POST /auth/browser/sessions/:recordId/setup - setup browser session - POST /auth/browser/sessions/:recordId/refresh - refresh tokens - DELETE /auth/browser/sessions/:recordId - remove session - Add updateRecord() to OAuthPool for browser session sync
|
Closing in favor of combined PR with all features (Multi-Account, YOLO Mode, Auto-Relogin) |
Summary
Implements comprehensive multi-account OAuth support with automatic rate limit rotation, manual account switching, ability to delete individual accounts, and a new Settings menu for the desktop app.
Closes #9068
Changes
Backend - OAuth Pool Enhancements
Auth.OAuthPool.setActive()- Manually switch active OAuth accountAuth.OAuthPool.removeRecord()- Delete individual OAuth accountsAuth.OAuthPool.snapshot()- ReturnsactiveIDfor credential selectionrotating-fetch.ts- PrefersactiveIDwhile preserving auto-rotation on 429fetchAnthropicUsage()- Respectsprovider.active[namespace]getAccounts()- Correctly identifies active accountAPI
POST /auth/active- Switch active account, returns updated usage dataDELETE /auth/account- Delete individual OAuth accountDesktop App
New Settings Menu (
DialogSettings):Context Panel:
CLI
opencode auth usage: Per-account usage with rate limitsopencode auth switch: Interactive account switchingopencode auth logout: Now supports selecting individual accounts to removeopencode auth list: Shows account countsDelete Individual Accounts
CLI
Desktop
In Settings → Providers → [Provider]:
Auto-Rotation Flow
Files Changed
auth/index.tsremoveRecord()auth/rotating-fetch.tsserver/server.ts/auth/activeand/auth/accountendpointscli/cmd/auth.tsdialog-settings.tsxsession-context-tab.tsxlayout.tsxsdk.gen.ts,types.gen.tsTesting
CLI
Desktop
Limitations
Checklist