@roomi-fields/notebooklm-mcp 1.3.6 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +69 -34
  2. package/dist/accounts/account-manager.d.ts +163 -0
  3. package/dist/accounts/account-manager.d.ts.map +1 -0
  4. package/dist/accounts/account-manager.js +614 -0
  5. package/dist/accounts/account-manager.js.map +1 -0
  6. package/dist/accounts/auto-login-manager.d.ts +62 -0
  7. package/dist/accounts/auto-login-manager.d.ts.map +1 -0
  8. package/dist/accounts/auto-login-manager.js +537 -0
  9. package/dist/accounts/auto-login-manager.js.map +1 -0
  10. package/dist/accounts/crypto.d.ts +45 -0
  11. package/dist/accounts/crypto.d.ts.map +1 -0
  12. package/dist/accounts/crypto.js +138 -0
  13. package/dist/accounts/crypto.js.map +1 -0
  14. package/dist/accounts/index.d.ts +14 -0
  15. package/dist/accounts/index.d.ts.map +1 -0
  16. package/dist/accounts/index.js +14 -0
  17. package/dist/accounts/index.js.map +1 -0
  18. package/dist/accounts/types.d.ts +103 -0
  19. package/dist/accounts/types.d.ts.map +1 -0
  20. package/dist/accounts/types.js +7 -0
  21. package/dist/accounts/types.js.map +1 -0
  22. package/dist/auth/auth-manager.d.ts +9 -2
  23. package/dist/auth/auth-manager.d.ts.map +1 -1
  24. package/dist/auth/auth-manager.js +60 -6
  25. package/dist/auth/auth-manager.js.map +1 -1
  26. package/dist/auto-discovery/auto-discovery.d.ts.map +1 -1
  27. package/dist/auto-discovery/auto-discovery.js +2 -1
  28. package/dist/auto-discovery/auto-discovery.js.map +1 -1
  29. package/dist/cli/accounts.d.ts +13 -0
  30. package/dist/cli/accounts.d.ts.map +1 -0
  31. package/dist/cli/accounts.js +195 -0
  32. package/dist/cli/accounts.js.map +1 -0
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +9 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/content/content-generator.d.ts +153 -0
  37. package/dist/content/content-generator.d.ts.map +1 -0
  38. package/dist/content/content-generator.js +637 -0
  39. package/dist/content/content-generator.js.map +1 -0
  40. package/dist/content/content-manager.d.ts +364 -0
  41. package/dist/content/content-manager.d.ts.map +1 -0
  42. package/dist/content/content-manager.js +3846 -0
  43. package/dist/content/content-manager.js.map +1 -0
  44. package/dist/content/content-templates.d.ts +183 -0
  45. package/dist/content/content-templates.d.ts.map +1 -0
  46. package/dist/content/content-templates.js +719 -0
  47. package/dist/content/content-templates.js.map +1 -0
  48. package/dist/content/index.d.ts +14 -0
  49. package/dist/content/index.d.ts.map +1 -0
  50. package/dist/content/index.js +14 -0
  51. package/dist/content/index.js.map +1 -0
  52. package/dist/content/types.d.ts +285 -0
  53. package/dist/content/types.d.ts.map +1 -0
  54. package/dist/content/types.js +10 -0
  55. package/dist/content/types.js.map +1 -0
  56. package/dist/errors.d.ts +1 -1
  57. package/dist/errors.d.ts.map +1 -1
  58. package/dist/errors.js.map +1 -1
  59. package/dist/http-wrapper.d.ts +7 -0
  60. package/dist/http-wrapper.d.ts.map +1 -1
  61. package/dist/http-wrapper.js +449 -29
  62. package/dist/http-wrapper.js.map +1 -1
  63. package/dist/index.js +26 -2
  64. package/dist/index.js.map +1 -1
  65. package/dist/library/notebook-library.d.ts +4 -0
  66. package/dist/library/notebook-library.d.ts.map +1 -1
  67. package/dist/library/notebook-library.js +20 -3
  68. package/dist/library/notebook-library.js.map +1 -1
  69. package/dist/session/browser-session.d.ts +35 -8
  70. package/dist/session/browser-session.d.ts.map +1 -1
  71. package/dist/session/browser-session.js +242 -28
  72. package/dist/session/browser-session.js.map +1 -1
  73. package/dist/session/session-manager.d.ts +6 -0
  74. package/dist/session/session-manager.d.ts.map +1 -1
  75. package/dist/session/session-manager.js +46 -14
  76. package/dist/session/session-manager.js.map +1 -1
  77. package/dist/session/shared-context-manager.d.ts +3 -3
  78. package/dist/session/shared-context-manager.d.ts.map +1 -1
  79. package/dist/session/shared-context-manager.js +8 -7
  80. package/dist/session/shared-context-manager.js.map +1 -1
  81. package/dist/stdio-http-proxy.d.ts +24 -0
  82. package/dist/stdio-http-proxy.d.ts.map +1 -0
  83. package/dist/stdio-http-proxy.js +592 -0
  84. package/dist/stdio-http-proxy.js.map +1 -0
  85. package/dist/tools/index.d.ts +106 -1
  86. package/dist/tools/index.d.ts.map +1 -1
  87. package/dist/tools/index.js +1028 -7
  88. package/dist/tools/index.js.map +1 -1
  89. package/dist/types.d.ts +81 -17
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/utils/citation-extractor.d.ts +66 -0
  92. package/dist/utils/citation-extractor.d.ts.map +1 -0
  93. package/dist/utils/citation-extractor.js +492 -0
  94. package/dist/utils/citation-extractor.js.map +1 -0
  95. package/dist/utils/page-utils.d.ts +8 -0
  96. package/dist/utils/page-utils.d.ts.map +1 -1
  97. package/dist/utils/page-utils.js +112 -8
  98. package/dist/utils/page-utils.js.map +1 -1
  99. package/docs/ARCHITECTURE_MIGRATION_STUDY.md +894 -0
  100. package/docs/CHROME_PROFILE_LIMITATION.md +15 -1
  101. package/docs/MULTI_ACCOUNT_SYSTEM.md +304 -0
  102. package/package.json +10 -10
  103. package/dist/__tests__/cleanup-manager.test.d.ts +0 -2
  104. package/dist/__tests__/cleanup-manager.test.d.ts.map +0 -1
  105. package/dist/__tests__/cleanup-manager.test.js +0 -341
  106. package/dist/__tests__/cleanup-manager.test.js.map +0 -1
  107. package/dist/__tests__/config-parsing.test.d.ts +0 -2
  108. package/dist/__tests__/config-parsing.test.d.ts.map +0 -1
  109. package/dist/__tests__/config-parsing.test.js +0 -338
  110. package/dist/__tests__/config-parsing.test.js.map +0 -1
  111. package/dist/__tests__/config.test.d.ts +0 -2
  112. package/dist/__tests__/config.test.d.ts.map +0 -1
  113. package/dist/__tests__/config.test.js +0 -267
  114. package/dist/__tests__/config.test.js.map +0 -1
  115. package/dist/__tests__/errors.test.d.ts +0 -2
  116. package/dist/__tests__/errors.test.d.ts.map +0 -1
  117. package/dist/__tests__/errors.test.js +0 -166
  118. package/dist/__tests__/errors.test.js.map +0 -1
  119. package/dist/__tests__/logger.test.d.ts +0 -2
  120. package/dist/__tests__/logger.test.d.ts.map +0 -1
  121. package/dist/__tests__/logger.test.js +0 -324
  122. package/dist/__tests__/logger.test.js.map +0 -1
  123. package/dist/__tests__/page-utils.test.d.ts +0 -2
  124. package/dist/__tests__/page-utils.test.d.ts.map +0 -1
  125. package/dist/__tests__/page-utils.test.js +0 -349
  126. package/dist/__tests__/page-utils.test.js.map +0 -1
  127. package/dist/__tests__/setup-verification.test.d.ts +0 -2
  128. package/dist/__tests__/setup-verification.test.d.ts.map +0 -1
  129. package/dist/__tests__/setup-verification.test.js +0 -15
  130. package/dist/__tests__/setup-verification.test.js.map +0 -1
  131. package/dist/__tests__/stealth-utils.test.d.ts +0 -2
  132. package/dist/__tests__/stealth-utils.test.d.ts.map +0 -1
  133. package/dist/__tests__/stealth-utils.test.js +0 -413
  134. package/dist/__tests__/stealth-utils.test.js.map +0 -1
  135. package/dist/__tests__/types.test.d.ts +0 -2
  136. package/dist/__tests__/types.test.d.ts.map +0 -1
  137. package/dist/__tests__/types.test.js +0 -461
  138. package/dist/__tests__/types.test.js.map +0 -1
@@ -0,0 +1,614 @@
1
+ /**
2
+ * Account Manager
3
+ *
4
+ * Manages multiple Google accounts for NotebookLM with:
5
+ * - Account pool with rotation strategies
6
+ * - Encrypted credential storage
7
+ * - Quota tracking per account
8
+ * - Session health monitoring
9
+ * - Auto-login when sessions expire
10
+ */
11
+ import fs from 'fs/promises';
12
+ import { existsSync } from 'fs';
13
+ import path from 'path';
14
+ import { CONFIG } from '../config.js';
15
+ import { log } from '../utils/logger.js';
16
+ import { encrypt, decrypt, maskEmail, verifyEncryption } from './crypto.js';
17
+ const DEFAULT_DAILY_QUOTA = 50; // NotebookLM free tier
18
+ export class AccountManager {
19
+ configPath;
20
+ accountsDir;
21
+ config = null;
22
+ accounts = new Map();
23
+ lastUsedIndex = 0;
24
+ constructor() {
25
+ this.configPath = path.join(CONFIG.dataDir, 'accounts.json');
26
+ this.accountsDir = path.join(CONFIG.dataDir, 'accounts');
27
+ }
28
+ // ============================================================================
29
+ // Initialization
30
+ // ============================================================================
31
+ /**
32
+ * Initialize the account manager
33
+ */
34
+ async initialize() {
35
+ log.info('🔄 Initializing Account Manager...');
36
+ // Ensure directories exist
37
+ await this.ensureDirectories();
38
+ // Verify encryption is working
39
+ if (!(await verifyEncryption())) {
40
+ throw new Error('Encryption verification failed');
41
+ }
42
+ // Load configuration
43
+ await this.loadConfig();
44
+ // Load all accounts
45
+ await this.loadAccounts();
46
+ log.success(`✅ Account Manager initialized (${this.accounts.size} accounts)`);
47
+ }
48
+ /**
49
+ * Ensure required directories exist
50
+ */
51
+ async ensureDirectories() {
52
+ const dirs = [CONFIG.dataDir, this.accountsDir];
53
+ for (const dir of dirs) {
54
+ if (!existsSync(dir)) {
55
+ await fs.mkdir(dir, { recursive: true });
56
+ log.info(` 📁 Created: ${dir}`);
57
+ }
58
+ }
59
+ }
60
+ /**
61
+ * Load accounts configuration
62
+ */
63
+ async loadConfig() {
64
+ if (!existsSync(this.configPath)) {
65
+ // Create default config
66
+ this.config = {
67
+ accounts: [],
68
+ rotationStrategy: 'least_used',
69
+ keepAliveIntervalHours: 12,
70
+ autoLoginEnabled: true,
71
+ };
72
+ await this.saveConfig();
73
+ log.info(' 📄 Created default accounts.json');
74
+ return;
75
+ }
76
+ try {
77
+ const data = await fs.readFile(this.configPath, 'utf-8');
78
+ this.config = JSON.parse(data);
79
+ log.info(` 📄 Loaded config: ${this.config?.accounts.length || 0} accounts configured`);
80
+ }
81
+ catch (error) {
82
+ log.error(`❌ Failed to load accounts config: ${error}`);
83
+ throw error;
84
+ }
85
+ }
86
+ /**
87
+ * Save accounts configuration
88
+ */
89
+ async saveConfig() {
90
+ if (!this.config)
91
+ return;
92
+ await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8');
93
+ }
94
+ /**
95
+ * Load all accounts from disk
96
+ */
97
+ async loadAccounts() {
98
+ if (!this.config)
99
+ return;
100
+ for (const accountConfig of this.config.accounts) {
101
+ if (!accountConfig.enabled)
102
+ continue;
103
+ try {
104
+ const account = await this.loadAccount(accountConfig);
105
+ this.accounts.set(accountConfig.id, account);
106
+ log.info(` 👤 Loaded: ${maskEmail(accountConfig.email)}`);
107
+ }
108
+ catch (error) {
109
+ log.warning(` ⚠️ Failed to load account ${accountConfig.id}: ${error}`);
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * Load a single account
115
+ */
116
+ async loadAccount(config) {
117
+ const accountDir = path.join(this.accountsDir, config.id);
118
+ // Ensure account directory exists
119
+ if (!existsSync(accountDir)) {
120
+ await fs.mkdir(accountDir, { recursive: true });
121
+ }
122
+ // Load or create quota
123
+ const quotaPath = path.join(accountDir, 'quota.json');
124
+ let quota;
125
+ if (existsSync(quotaPath)) {
126
+ const quotaData = await fs.readFile(quotaPath, 'utf-8');
127
+ quota = JSON.parse(quotaData);
128
+ // Check if quota needs reset (new day)
129
+ const resetDate = new Date(quota.resetAt);
130
+ const now = new Date();
131
+ if (now >= resetDate) {
132
+ quota = this.createFreshQuota();
133
+ await fs.writeFile(quotaPath, JSON.stringify(quota, null, 2));
134
+ }
135
+ }
136
+ else {
137
+ quota = this.createFreshQuota();
138
+ await fs.writeFile(quotaPath, JSON.stringify(quota, null, 2));
139
+ }
140
+ // Load or create state
141
+ const statePath = path.join(accountDir, 'state.json');
142
+ let state;
143
+ if (existsSync(statePath)) {
144
+ const stateData = await fs.readFile(statePath, 'utf-8');
145
+ state = JSON.parse(stateData);
146
+ }
147
+ else {
148
+ state = {
149
+ sessionStatus: 'unknown',
150
+ lastActivity: null,
151
+ lastLoginAttempt: null,
152
+ loginFailures: 0,
153
+ consecutiveFailures: 0,
154
+ };
155
+ await fs.writeFile(statePath, JSON.stringify(state, null, 2));
156
+ }
157
+ return {
158
+ config,
159
+ quota,
160
+ state,
161
+ profileDir: path.join(accountDir, 'profile'),
162
+ stateFilePath: path.join(accountDir, 'browser_state', 'state.json'),
163
+ };
164
+ }
165
+ /**
166
+ * Create fresh quota (resets at midnight UTC)
167
+ */
168
+ createFreshQuota() {
169
+ const now = new Date();
170
+ const tomorrow = new Date(now);
171
+ tomorrow.setUTCDate(tomorrow.getUTCDate() + 1);
172
+ tomorrow.setUTCHours(0, 0, 0, 0);
173
+ return {
174
+ used: 0,
175
+ limit: DEFAULT_DAILY_QUOTA,
176
+ resetAt: tomorrow.toISOString(),
177
+ lastUpdated: now.toISOString(),
178
+ };
179
+ }
180
+ // ============================================================================
181
+ // Account Management
182
+ // ============================================================================
183
+ /**
184
+ * Add a new account
185
+ */
186
+ async addAccount(email, password, totpSecret, options = {}) {
187
+ if (!this.config) {
188
+ throw new Error('Account manager not initialized');
189
+ }
190
+ // Generate unique ID
191
+ const id = `account-${Date.now()}`;
192
+ // Create account config
193
+ const accountConfig = {
194
+ id,
195
+ email,
196
+ enabled: true,
197
+ priority: options.priority ?? this.config.accounts.length + 1,
198
+ hasCredentials: true,
199
+ hasTotp: !!totpSecret,
200
+ createdAt: new Date().toISOString(),
201
+ notes: options.notes,
202
+ };
203
+ // Create account directory
204
+ const accountDir = path.join(this.accountsDir, id);
205
+ await fs.mkdir(accountDir, { recursive: true });
206
+ await fs.mkdir(path.join(accountDir, 'browser_state'), { recursive: true });
207
+ await fs.mkdir(path.join(accountDir, 'profile'), { recursive: true });
208
+ // Encrypt and save credentials
209
+ const credentials = {
210
+ emailEncrypted: await encrypt(email),
211
+ passwordEncrypted: await encrypt(password),
212
+ totpSecretEncrypted: totpSecret ? await encrypt(totpSecret) : undefined,
213
+ encryptedAt: new Date().toISOString(),
214
+ };
215
+ await fs.writeFile(path.join(accountDir, 'credentials.enc.json'), JSON.stringify(credentials, null, 2), { mode: 0o600 });
216
+ // Add to config
217
+ this.config.accounts.push(accountConfig);
218
+ await this.saveConfig();
219
+ // Load the account
220
+ const account = await this.loadAccount(accountConfig);
221
+ this.accounts.set(id, account);
222
+ log.success(`✅ Account added: ${maskEmail(email)} (${id})`);
223
+ return id;
224
+ }
225
+ /**
226
+ * Remove an account
227
+ */
228
+ async removeAccount(accountId) {
229
+ if (!this.config)
230
+ return false;
231
+ const index = this.config.accounts.findIndex((a) => a.id === accountId);
232
+ if (index === -1) {
233
+ log.warning(`⚠️ Account not found: ${accountId}`);
234
+ return false;
235
+ }
236
+ // Remove from config
237
+ const [removed] = this.config.accounts.splice(index, 1);
238
+ await this.saveConfig();
239
+ // Remove from memory
240
+ this.accounts.delete(accountId);
241
+ // Delete account directory
242
+ const accountDir = path.join(this.accountsDir, accountId);
243
+ if (existsSync(accountDir)) {
244
+ await fs.rm(accountDir, { recursive: true, force: true });
245
+ }
246
+ log.success(`✅ Account removed: ${maskEmail(removed.email)}`);
247
+ return true;
248
+ }
249
+ /**
250
+ * List all accounts
251
+ */
252
+ listAccounts() {
253
+ return Array.from(this.accounts.values());
254
+ }
255
+ /**
256
+ * Get account by ID
257
+ */
258
+ getAccount(accountId) {
259
+ return this.accounts.get(accountId);
260
+ }
261
+ /**
262
+ * Get credentials for an account
263
+ */
264
+ async getCredentials(accountId) {
265
+ const account = this.accounts.get(accountId);
266
+ if (!account) {
267
+ log.warning(`⚠️ Account not found: ${accountId}`);
268
+ return null;
269
+ }
270
+ const credentialsPath = path.join(this.accountsDir, accountId, 'credentials.enc.json');
271
+ if (!existsSync(credentialsPath)) {
272
+ log.warning(`⚠️ No credentials file for: ${accountId}`);
273
+ return null;
274
+ }
275
+ try {
276
+ const data = await fs.readFile(credentialsPath, 'utf-8');
277
+ const credentials = JSON.parse(data);
278
+ return {
279
+ email: await decrypt(credentials.emailEncrypted),
280
+ password: await decrypt(credentials.passwordEncrypted),
281
+ totpSecret: credentials.totpSecretEncrypted
282
+ ? await decrypt(credentials.totpSecretEncrypted)
283
+ : undefined,
284
+ };
285
+ }
286
+ catch (error) {
287
+ log.error(`❌ Failed to decrypt credentials for ${accountId}: ${error}`);
288
+ return null;
289
+ }
290
+ }
291
+ // ============================================================================
292
+ // Account Selection
293
+ // ============================================================================
294
+ /**
295
+ * Get the best available account based on rotation strategy
296
+ * @param excludeAccountId Optional account ID to exclude (e.g., rate-limited account)
297
+ */
298
+ async getBestAccount(excludeAccountId) {
299
+ if (!this.config || this.accounts.size === 0) {
300
+ return null;
301
+ }
302
+ const strategy = this.config.rotationStrategy;
303
+ let availableAccounts = this.getAvailableAccounts();
304
+ // Exclude specific account if requested (e.g., the one that hit rate limit)
305
+ if (excludeAccountId) {
306
+ availableAccounts = availableAccounts.filter((a) => a.config.id !== excludeAccountId);
307
+ log.info(` 🔄 Excluding ${excludeAccountId} from selection (${availableAccounts.length} remaining)`);
308
+ }
309
+ if (availableAccounts.length === 0) {
310
+ log.warning('⚠️ No available accounts (all disabled, quota exhausted, or failed)');
311
+ return null;
312
+ }
313
+ let selected;
314
+ let reason;
315
+ switch (strategy) {
316
+ case 'least_used':
317
+ selected = this.selectLeastUsed(availableAccounts);
318
+ reason = `Least used (${selected.quota.used}/${selected.quota.limit} queries)`;
319
+ break;
320
+ case 'round_robin':
321
+ selected = this.selectRoundRobin(availableAccounts);
322
+ reason = 'Round robin rotation';
323
+ break;
324
+ case 'failover':
325
+ selected = this.selectFailover(availableAccounts);
326
+ reason = `Failover (priority ${selected.config.priority})`;
327
+ break;
328
+ case 'random':
329
+ selected = availableAccounts[Math.floor(Math.random() * availableAccounts.length)];
330
+ reason = 'Random selection';
331
+ break;
332
+ default:
333
+ selected = availableAccounts[0];
334
+ reason = 'Default (first available)';
335
+ }
336
+ log.info(`🎯 Selected: ${maskEmail(selected.config.email)} (${reason})`);
337
+ return { account: selected, reason };
338
+ }
339
+ /**
340
+ * Get accounts that are available for use
341
+ */
342
+ getAvailableAccounts() {
343
+ return Array.from(this.accounts.values()).filter((account) => {
344
+ // Must be enabled
345
+ if (!account.config.enabled)
346
+ return false;
347
+ // Must have quota remaining
348
+ if (account.quota.used >= account.quota.limit)
349
+ return false;
350
+ // Must not have too many consecutive failures
351
+ if (account.state.consecutiveFailures >= 3)
352
+ return false;
353
+ return true;
354
+ });
355
+ }
356
+ /**
357
+ * Select account with most remaining quota
358
+ */
359
+ selectLeastUsed(accounts) {
360
+ return accounts.reduce((best, current) => {
361
+ const bestRemaining = best.quota.limit - best.quota.used;
362
+ const currentRemaining = current.quota.limit - current.quota.used;
363
+ return currentRemaining > bestRemaining ? current : best;
364
+ });
365
+ }
366
+ /**
367
+ * Select account using round-robin
368
+ */
369
+ selectRoundRobin(accounts) {
370
+ this.lastUsedIndex = (this.lastUsedIndex + 1) % accounts.length;
371
+ return accounts[this.lastUsedIndex];
372
+ }
373
+ /**
374
+ * Select account by priority (failover)
375
+ */
376
+ selectFailover(accounts) {
377
+ return accounts.sort((a, b) => a.config.priority - b.config.priority)[0];
378
+ }
379
+ // ============================================================================
380
+ // Quota Management
381
+ // ============================================================================
382
+ /**
383
+ * Record a query usage for an account
384
+ */
385
+ async recordUsage(accountId) {
386
+ const account = this.accounts.get(accountId);
387
+ if (!account)
388
+ return;
389
+ account.quota.used++;
390
+ account.quota.lastUpdated = new Date().toISOString();
391
+ account.state.lastActivity = new Date().toISOString();
392
+ // Save quota
393
+ const quotaPath = path.join(this.accountsDir, accountId, 'quota.json');
394
+ await fs.writeFile(quotaPath, JSON.stringify(account.quota, null, 2));
395
+ // Save state
396
+ const statePath = path.join(this.accountsDir, accountId, 'state.json');
397
+ await fs.writeFile(statePath, JSON.stringify(account.state, null, 2));
398
+ const remaining = account.quota.limit - account.quota.used;
399
+ log.dim(` 📊 Quota: ${account.quota.used}/${account.quota.limit} (${remaining} remaining)`);
400
+ }
401
+ /**
402
+ * Mark account as rate-limited (quota exhausted)
403
+ * This ensures the account won't be selected again until quota resets
404
+ */
405
+ async markRateLimited(accountId) {
406
+ const account = this.accounts.get(accountId);
407
+ if (!account)
408
+ return;
409
+ log.warning(`🚫 Marking account ${maskEmail(account.config.email)} as rate-limited`);
410
+ // Set quota to exhausted
411
+ account.quota.used = account.quota.limit;
412
+ account.quota.lastUpdated = new Date().toISOString();
413
+ // Save quota
414
+ const quotaPath = path.join(this.accountsDir, accountId, 'quota.json');
415
+ await fs.writeFile(quotaPath, JSON.stringify(account.quota, null, 2));
416
+ log.info(` 📊 Account quota exhausted: ${account.quota.used}/${account.quota.limit}`);
417
+ }
418
+ /**
419
+ * Save the ID of the currently active account
420
+ * This is used to identify which account is currently loaded in the main profile
421
+ */
422
+ async saveCurrentAccountId(accountId) {
423
+ const currentAccountPath = path.join(CONFIG.dataDir, 'current-account.txt');
424
+ await fs.writeFile(currentAccountPath, accountId, 'utf-8');
425
+ log.info(` 📋 Current account set: ${accountId}`);
426
+ }
427
+ /**
428
+ * Get the ID of the currently active account
429
+ * Returns null if no account is set or file doesn't exist
430
+ */
431
+ async getCurrentAccountId() {
432
+ const currentAccountPath = path.join(CONFIG.dataDir, 'current-account.txt');
433
+ try {
434
+ const id = await fs.readFile(currentAccountPath, 'utf-8');
435
+ return id.trim() || null;
436
+ }
437
+ catch {
438
+ return null;
439
+ }
440
+ }
441
+ /**
442
+ * Record a login failure
443
+ */
444
+ async recordLoginFailure(accountId, error) {
445
+ const account = this.accounts.get(accountId);
446
+ if (!account)
447
+ return;
448
+ account.state.loginFailures++;
449
+ account.state.consecutiveFailures++;
450
+ account.state.lastLoginAttempt = new Date().toISOString();
451
+ account.state.lastError = error;
452
+ account.state.sessionStatus = 'expired';
453
+ const statePath = path.join(this.accountsDir, accountId, 'state.json');
454
+ await fs.writeFile(statePath, JSON.stringify(account.state, null, 2));
455
+ }
456
+ /**
457
+ * Record a successful login
458
+ */
459
+ async recordLoginSuccess(accountId) {
460
+ const account = this.accounts.get(accountId);
461
+ if (!account)
462
+ return;
463
+ account.state.consecutiveFailures = 0;
464
+ account.state.lastLoginAttempt = new Date().toISOString();
465
+ account.state.lastActivity = new Date().toISOString();
466
+ account.state.sessionStatus = 'valid';
467
+ delete account.state.lastError;
468
+ const statePath = path.join(this.accountsDir, accountId, 'state.json');
469
+ await fs.writeFile(statePath, JSON.stringify(account.state, null, 2));
470
+ }
471
+ /**
472
+ * Update session status for an account
473
+ */
474
+ async updateSessionStatus(accountId, status) {
475
+ const account = this.accounts.get(accountId);
476
+ if (!account)
477
+ return;
478
+ account.state.sessionStatus = status;
479
+ const statePath = path.join(this.accountsDir, accountId, 'state.json');
480
+ await fs.writeFile(statePath, JSON.stringify(account.state, null, 2));
481
+ }
482
+ // ============================================================================
483
+ // Health Checks
484
+ // ============================================================================
485
+ /**
486
+ * Check health of all accounts
487
+ */
488
+ async healthCheck() {
489
+ const results = [];
490
+ for (const [accountId, account] of this.accounts) {
491
+ const health = await this.checkAccountHealth(accountId, account);
492
+ results.push(health);
493
+ }
494
+ return results;
495
+ }
496
+ /**
497
+ * Check health of a single account
498
+ */
499
+ async checkAccountHealth(accountId, account) {
500
+ const issues = [];
501
+ // Check quota
502
+ const quotaRemaining = account.quota.limit - account.quota.used;
503
+ const quotaPercent = Math.round((quotaRemaining / account.quota.limit) * 100);
504
+ if (quotaRemaining <= 0) {
505
+ issues.push('Quota exhausted');
506
+ }
507
+ else if (quotaPercent < 20) {
508
+ issues.push(`Low quota (${quotaPercent}% remaining)`);
509
+ }
510
+ // Check session
511
+ let sessionValid = account.state.sessionStatus === 'valid';
512
+ // Verify by checking state file exists
513
+ if (existsSync(account.stateFilePath)) {
514
+ try {
515
+ const stateData = await fs.readFile(account.stateFilePath, 'utf-8');
516
+ const state = JSON.parse(stateData);
517
+ if (!state.cookies || state.cookies.length === 0) {
518
+ sessionValid = false;
519
+ issues.push('No cookies in state file');
520
+ }
521
+ }
522
+ catch {
523
+ sessionValid = false;
524
+ issues.push('Invalid state file');
525
+ }
526
+ }
527
+ else {
528
+ sessionValid = false;
529
+ issues.push('No state file (needs login)');
530
+ }
531
+ // Check consecutive failures
532
+ if (account.state.consecutiveFailures >= 3) {
533
+ issues.push(`${account.state.consecutiveFailures} consecutive login failures`);
534
+ }
535
+ // Check last activity
536
+ if (account.state.lastActivity) {
537
+ const lastActivity = new Date(account.state.lastActivity);
538
+ const hoursSinceActivity = (Date.now() - lastActivity.getTime()) / (1000 * 60 * 60);
539
+ if (hoursSinceActivity > 24) {
540
+ issues.push(`Inactive for ${Math.round(hoursSinceActivity)} hours`);
541
+ }
542
+ }
543
+ return {
544
+ accountId,
545
+ email: account.config.email,
546
+ enabled: account.config.enabled,
547
+ sessionValid,
548
+ quotaRemaining,
549
+ quotaPercent,
550
+ lastActivity: account.state.lastActivity,
551
+ issues,
552
+ };
553
+ }
554
+ // ============================================================================
555
+ // Configuration
556
+ // ============================================================================
557
+ /**
558
+ * Get current rotation strategy
559
+ */
560
+ getRotationStrategy() {
561
+ return this.config?.rotationStrategy ?? 'least_used';
562
+ }
563
+ /**
564
+ * Set rotation strategy
565
+ */
566
+ async setRotationStrategy(strategy) {
567
+ if (!this.config)
568
+ return;
569
+ this.config.rotationStrategy = strategy;
570
+ await this.saveConfig();
571
+ log.success(`✅ Rotation strategy set to: ${strategy}`);
572
+ }
573
+ /**
574
+ * Check if auto-login is enabled
575
+ */
576
+ isAutoLoginEnabled() {
577
+ return this.config?.autoLoginEnabled ?? false;
578
+ }
579
+ /**
580
+ * Enable/disable auto-login
581
+ */
582
+ async setAutoLoginEnabled(enabled) {
583
+ if (!this.config)
584
+ return;
585
+ this.config.autoLoginEnabled = enabled;
586
+ await this.saveConfig();
587
+ log.success(`✅ Auto-login ${enabled ? 'enabled' : 'disabled'}`);
588
+ }
589
+ /**
590
+ * Get account count
591
+ */
592
+ getAccountCount() {
593
+ return this.accounts.size;
594
+ }
595
+ /**
596
+ * Check if any accounts are configured
597
+ */
598
+ hasAccounts() {
599
+ return this.accounts.size > 0;
600
+ }
601
+ }
602
+ // Singleton instance
603
+ let accountManagerInstance = null;
604
+ /**
605
+ * Get or create the account manager instance
606
+ */
607
+ export async function getAccountManager() {
608
+ if (!accountManagerInstance) {
609
+ accountManagerInstance = new AccountManager();
610
+ await accountManagerInstance.initialize();
611
+ }
612
+ return accountManagerInstance;
613
+ }
614
+ //# sourceMappingURL=account-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-manager.js","sourceRoot":"","sources":["../../src/accounts/account-manager.ts"],"names":[],"mappings":"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"}