* Store OAuth token - now uses multi-account system * If setAsActive is true, also sets this account as active
(oauthToken: string, setAsActive = true)
| 49 | * If setAsActive is true, also sets this account as active |
| 50 | */ |
| 51 | function storeOAuthToken(oauthToken: string, setAsActive = true): string { |
| 52 | const authManager = getAuthManager() |
| 53 | const user = authManager.getUser() |
| 54 | |
| 55 | const encryptedToken = encryptToken(oauthToken) |
| 56 | const db = getDatabase() |
| 57 | const newId = createId() |
| 58 | |
| 59 | // Store in new multi-account table |
| 60 | db.insert(anthropicAccounts) |
| 61 | .values({ |
| 62 | id: newId, |
| 63 | oauthToken: encryptedToken, |
| 64 | displayName: "Anthropic Account", |
| 65 | connectedAt: new Date(), |
| 66 | desktopUserId: user?.id ?? null, |
| 67 | }) |
| 68 | .run() |
| 69 | |
| 70 | if (setAsActive) { |
| 71 | // Set as active account |
| 72 | db.insert(anthropicSettings) |
| 73 | .values({ |
| 74 | id: "singleton", |
| 75 | activeAccountId: newId, |
| 76 | updatedAt: new Date(), |
| 77 | }) |
| 78 | .onConflictDoUpdate({ |
| 79 | target: anthropicSettings.id, |
| 80 | set: { |
| 81 | activeAccountId: newId, |
| 82 | updatedAt: new Date(), |
| 83 | }, |
| 84 | }) |
| 85 | .run() |
| 86 | } |
| 87 | |
| 88 | // Also update legacy table for backward compatibility |
| 89 | db.delete(claudeCodeCredentials) |
| 90 | .where(eq(claudeCodeCredentials.id, "default")) |
| 91 | .run() |
| 92 | |
| 93 | db.insert(claudeCodeCredentials) |
| 94 | .values({ |
| 95 | id: "default", |
| 96 | oauthToken: encryptedToken, |
| 97 | connectedAt: new Date(), |
| 98 | userId: user?.id ?? null, |
| 99 | }) |
| 100 | .run() |
| 101 | |
| 102 | return newId |
| 103 | } |
| 104 | |
| 105 | /** |
| 106 | * Claude Code OAuth router for desktop |
no test coverage detected