@roomi-fields/notebooklm-mcp 1.3.6 → 1.5.1
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.
- package/LICENSE +22 -22
- package/README.md +71 -34
- package/deployment/INDEX.md +292 -0
- package/deployment/PACKAGE-FILES.txt +180 -0
- package/deployment/QUICK-START.md +100 -0
- package/deployment/docs/01-INSTALL.md +611 -0
- package/deployment/docs/02-CONFIGURATION.md +404 -0
- package/deployment/docs/03-API.md +1691 -0
- package/deployment/docs/04-N8N-INTEGRATION.md +373 -0
- package/deployment/docs/05-TROUBLESHOOTING.md +429 -0
- package/deployment/docs/06-NOTEBOOK-LIBRARY.md +692 -0
- package/deployment/docs/07-AUTO-DISCOVERY.md +236 -0
- package/deployment/docs/08-WSL-USAGE.md +363 -0
- package/deployment/docs/09-MULTI-INTERFACE.md +293 -0
- package/deployment/docs/10-CONTENT-MANAGEMENT.md +421 -0
- package/deployment/docs/11-MULTI-ACCOUNT.md +295 -0
- package/deployment/docs/README.md +207 -0
- package/deployment/scripts/README.md +564 -0
- package/deployment/scripts/install.ps1 +114 -0
- package/deployment/scripts/setup-auth.ps1 +217 -0
- package/deployment/scripts/start-server.ps1 +72 -0
- package/deployment/scripts/stop-server.ps1 +51 -0
- package/deployment/scripts/test-api.ps1 +651 -0
- package/deployment/scripts/test-auth.ps1 +323 -0
- package/deployment/scripts/test-auto-discovery.ps1 +295 -0
- package/deployment/scripts/test-cors.ps1 +398 -0
- package/deployment/scripts/test-errors.ps1 +581 -0
- package/deployment/scripts/test-server.ps1 +140 -0
- package/deployment/scripts/test-sessions.ps1 +426 -0
- package/deployment/scripts/test-validation.ps1 +299 -0
- package/dist/accounts/account-manager.d.ts +163 -0
- package/dist/accounts/account-manager.d.ts.map +1 -0
- package/dist/accounts/account-manager.js +614 -0
- package/dist/accounts/account-manager.js.map +1 -0
- package/dist/accounts/auto-login-manager.d.ts +62 -0
- package/dist/accounts/auto-login-manager.d.ts.map +1 -0
- package/dist/accounts/auto-login-manager.js +537 -0
- package/dist/accounts/auto-login-manager.js.map +1 -0
- package/dist/accounts/crypto.d.ts +45 -0
- package/dist/accounts/crypto.d.ts.map +1 -0
- package/dist/accounts/crypto.js +138 -0
- package/dist/accounts/crypto.js.map +1 -0
- package/dist/accounts/index.d.ts +14 -0
- package/dist/accounts/index.d.ts.map +1 -0
- package/dist/accounts/index.js +14 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/accounts/types.d.ts +103 -0
- package/dist/accounts/types.d.ts.map +1 -0
- package/dist/accounts/types.js +7 -0
- package/dist/accounts/types.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +9 -2
- package/dist/auth/auth-manager.d.ts.map +1 -1
- package/dist/auth/auth-manager.js +60 -6
- package/dist/auth/auth-manager.js.map +1 -1
- package/dist/auto-discovery/auto-discovery.d.ts.map +1 -1
- package/dist/auto-discovery/auto-discovery.js +2 -1
- package/dist/auto-discovery/auto-discovery.js.map +1 -1
- package/dist/cli/accounts.d.ts +13 -0
- package/dist/cli/accounts.d.ts.map +1 -0
- package/dist/cli/accounts.js +195 -0
- package/dist/cli/accounts.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -0
- package/dist/config.js.map +1 -1
- package/dist/content/content-generator.d.ts +153 -0
- package/dist/content/content-generator.d.ts.map +1 -0
- package/dist/content/content-generator.js +637 -0
- package/dist/content/content-generator.js.map +1 -0
- package/dist/content/content-manager.d.ts +364 -0
- package/dist/content/content-manager.d.ts.map +1 -0
- package/dist/content/content-manager.js +3841 -0
- package/dist/content/content-manager.js.map +1 -0
- package/dist/content/content-templates.d.ts +183 -0
- package/dist/content/content-templates.d.ts.map +1 -0
- package/dist/content/content-templates.js +719 -0
- package/dist/content/content-templates.js.map +1 -0
- package/dist/content/index.d.ts +14 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +14 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/types.d.ts +285 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +10 -0
- package/dist/content/types.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/http-wrapper.d.ts +7 -0
- package/dist/http-wrapper.d.ts.map +1 -1
- package/dist/http-wrapper.js +449 -29
- package/dist/http-wrapper.js.map +1 -1
- package/dist/i18n/en.json +120 -0
- package/dist/i18n/fr.json +120 -0
- package/dist/i18n/index.d.ts +168 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +213 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/library/notebook-library.d.ts +4 -0
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +20 -3
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/session/browser-session.d.ts +35 -8
- package/dist/session/browser-session.d.ts.map +1 -1
- package/dist/session/browser-session.js +243 -28
- package/dist/session/browser-session.js.map +1 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +46 -14
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/shared-context-manager.d.ts +3 -3
- package/dist/session/shared-context-manager.d.ts.map +1 -1
- package/dist/session/shared-context-manager.js +10 -7
- package/dist/session/shared-context-manager.js.map +1 -1
- package/dist/stdio-http-proxy.d.ts +24 -0
- package/dist/stdio-http-proxy.d.ts.map +1 -0
- package/dist/stdio-http-proxy.js +592 -0
- package/dist/stdio-http-proxy.js.map +1 -0
- package/dist/tools/index.d.ts +106 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1028 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +81 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/citation-extractor.d.ts +66 -0
- package/dist/utils/citation-extractor.d.ts.map +1 -0
- package/dist/utils/citation-extractor.js +492 -0
- package/dist/utils/citation-extractor.js.map +1 -0
- package/dist/utils/page-utils.d.ts +8 -0
- package/dist/utils/page-utils.d.ts.map +1 -1
- package/dist/utils/page-utils.js +112 -8
- package/dist/utils/page-utils.js.map +1 -1
- package/docs/ADDING_A_LANGUAGE.md +209 -0
- package/docs/ARCHITECTURE_MIGRATION_STUDY.md +894 -0
- package/docs/CHROME_PROFILE_LIMITATION.md +15 -1
- package/docs/MULTI_ACCOUNT_SYSTEM.md +304 -0
- package/package.json +15 -12
- package/scripts/archive/add-and-activate-notebook.ps1 +31 -0
- package/scripts/archive/add-new-notebook.ps1 +25 -0
- package/scripts/archive/add-rom1pey.ps1 +2 -0
- package/scripts/archive/add-rpmonster.ps1 +2 -0
- package/scripts/archive/add-source-debug.ps1 +11 -0
- package/scripts/archive/add-source-e2e.ps1 +28 -0
- package/scripts/archive/add-source-visible.ps1 +11 -0
- package/scripts/archive/add-test-notebook.ps1 +13 -0
- package/scripts/archive/add-test-source.ps1 +50 -0
- package/scripts/archive/capture-screen.ps1 +11 -0
- package/scripts/archive/change-language.mjs +45 -0
- package/scripts/archive/change-language.ts +44 -0
- package/scripts/archive/check-account.ps1 +19 -0
- package/scripts/archive/check-notebook-2.ps1 +8 -0
- package/scripts/archive/check-test-notebook.ps1 +11 -0
- package/scripts/archive/create-notebook-auto.ps1 +31 -0
- package/scripts/archive/create-notebook.ps1 +8 -0
- package/scripts/archive/create-rom1pey-notebook.ps1 +19 -0
- package/scripts/archive/create-rom1pey.ps1 +8 -0
- package/scripts/archive/create-test-notebook-fresh.ps1 +21 -0
- package/scripts/archive/create-test-notebook.ps1 +16 -0
- package/scripts/archive/debug-add-source-auto.ps1 +29 -0
- package/scripts/archive/debug-add-source.ps1 +19 -0
- package/scripts/archive/debug-add-text-source.ps1 +47 -0
- package/scripts/archive/debug-home.ps1 +10 -0
- package/scripts/archive/debug-selectors.ps1 +55 -0
- package/scripts/archive/debug-sources-panel.ps1 +22 -0
- package/scripts/archive/debug-ui.ps1 +17 -0
- package/scripts/archive/discover-home.ps1 +26 -0
- package/scripts/archive/kill-automation-chrome.ps1 +37 -0
- package/scripts/archive/list-my-notebooks.ps1 +27 -0
- package/scripts/archive/navigate-home-visible.ps1 +23 -0
- package/scripts/archive/navigate-home.ps1 +15 -0
- package/scripts/archive/run-e2e-english.ps1 +111 -0
- package/scripts/archive/run-e2e-rom1pey-v2.ps1 +122 -0
- package/scripts/archive/run-e2e-rom1pey.ps1 +117 -0
- package/scripts/archive/setup-english-test.ps1 +36 -0
- package/scripts/archive/setup-test-notebook.ps1 +71 -0
- package/scripts/archive/simple-add-source.ps1 +14 -0
- package/scripts/archive/t10.ps1 +2 -0
- package/scripts/archive/t20.ps1 +4 -0
- package/scripts/archive/t30.ps1 +9 -0
- package/scripts/archive/t31.ps1 +11 -0
- package/scripts/archive/t32.ps1 +6 -0
- package/scripts/archive/t39.ps1 +5 -0
- package/scripts/archive/t40.ps1 +5 -0
- package/scripts/archive/t53.ps1 +12 -0
- package/scripts/archive/t54.ps1 +12 -0
- package/scripts/archive/t55.ps1 +11 -0
- package/scripts/archive/t9.ps1 +1 -0
- package/scripts/archive/test-access.ps1 +28 -0
- package/scripts/archive/test-add-delete-source.ps1 +64 -0
- package/scripts/archive/test-add-source-visible.ps1 +16 -0
- package/scripts/archive/test-add-source.ps1 +19 -0
- package/scripts/archive/test-add-text-debug.ps1 +28 -0
- package/scripts/archive/test-add-text-source.ps1 +8 -0
- package/scripts/archive/test-add-url-source.ps1 +7 -0
- package/scripts/archive/test-ask-ascii.ps1 +20 -0
- package/scripts/archive/test-ask-cnv.ps1 +20 -0
- package/scripts/archive/test-ask-headed.ps1 +51 -0
- package/scripts/archive/test-ask-ifs.ps1 +16 -0
- package/scripts/archive/test-ask-now.ps1 +24 -0
- package/scripts/archive/test-ask-real.ps1 +19 -0
- package/scripts/archive/test-ask-visible.ps1 +20 -0
- package/scripts/archive/test-create-notebook.ps1 +8 -0
- package/scripts/archive/test-create-then-add.ps1 +17 -0
- package/scripts/archive/test-delete-source.ps1 +41 -0
- package/scripts/archive/test-e2e-notebook.ps1 +21 -0
- package/scripts/archive/test-english-notebook.ps1 +20 -0
- package/scripts/archive/test-english.ps1 +7 -0
- package/scripts/archive/test-full-custom-instructions.ps1 +40 -0
- package/scripts/archive/test-full-infographic.ps1 +34 -0
- package/scripts/archive/test-full-language.ps1 +21 -0
- package/scripts/archive/test-full-presentation.ps1 +85 -0
- package/scripts/archive/test-full-report.ps1 +34 -0
- package/scripts/archive/test-full-source-selection.ps1 +35 -0
- package/scripts/archive/test-full-video-brief.ps1 +22 -0
- package/scripts/archive/test-full-video-explainer.ps1 +22 -0
- package/scripts/archive/test-full-video-styles.ps1 +37 -0
- package/scripts/archive/test-generate-report.ps1 +15 -0
- package/scripts/archive/test-generate-study-guide.ps1 +11 -0
- package/scripts/archive/test-headed-ask.ps1 +13 -0
- package/scripts/archive/test-headed-now.ps1 +9 -0
- package/scripts/archive/test-headed.ps1 +9 -0
- package/scripts/archive/test-hello.ps1 +7 -0
- package/scripts/archive/test-i18n-studio.ps1 +8 -0
- package/scripts/archive/test-i18n.ps1 +7 -0
- package/scripts/archive/test-manual-headed.ps1 +26 -0
- package/scripts/archive/test-mathieu-quota.ps1 +8 -0
- package/scripts/archive/test-notebook-1.ps1 +10 -0
- package/scripts/archive/test-notebook-2-sources.ps1 +12 -0
- package/scripts/archive/test-notebook1.ps1 +14 -0
- package/scripts/archive/test-personal-notebook.ps1 +14 -0
- package/scripts/archive/test-rate-limit.ps1 +19 -0
- package/scripts/archive/test-real-ask.ps1 +50 -0
- package/scripts/archive/test-real-ask2.ps1 +30 -0
- package/scripts/archive/test-rom1pey.ps1 +7 -0
- package/scripts/archive/test-rotation-complete.ps1 +14 -0
- package/scripts/archive/test-rotation.ps1 +8 -0
- package/scripts/archive/test-show-browser.ps1 +39 -0
- package/scripts/archive/test-update-notebook.ps1 +4 -0
- package/scripts/archive/verify-language-slow.ps1 +21 -0
- package/scripts/archive/verify-language.ps1 +15 -0
- package/scripts/check-server.ps1 +46 -0
- package/scripts/mcp-wsl-helper.sh +146 -0
- package/scripts/start-server.ps1 +94 -0
- package/scripts/stop-server.ps1 +30 -0
- package/scripts/switch-account-language.sh +191 -0
- package/scripts/test-account.ps1 +58 -0
- package/dist/__tests__/cleanup-manager.test.d.ts +0 -2
- package/dist/__tests__/cleanup-manager.test.d.ts.map +0 -1
- package/dist/__tests__/cleanup-manager.test.js +0 -341
- package/dist/__tests__/cleanup-manager.test.js.map +0 -1
- package/dist/__tests__/config-parsing.test.d.ts +0 -2
- package/dist/__tests__/config-parsing.test.d.ts.map +0 -1
- package/dist/__tests__/config-parsing.test.js +0 -338
- package/dist/__tests__/config-parsing.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -267
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -166
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/logger.test.d.ts +0 -2
- package/dist/__tests__/logger.test.d.ts.map +0 -1
- package/dist/__tests__/logger.test.js +0 -324
- package/dist/__tests__/logger.test.js.map +0 -1
- package/dist/__tests__/page-utils.test.d.ts +0 -2
- package/dist/__tests__/page-utils.test.d.ts.map +0 -1
- package/dist/__tests__/page-utils.test.js +0 -349
- package/dist/__tests__/page-utils.test.js.map +0 -1
- package/dist/__tests__/setup-verification.test.d.ts +0 -2
- package/dist/__tests__/setup-verification.test.d.ts.map +0 -1
- package/dist/__tests__/setup-verification.test.js +0 -15
- package/dist/__tests__/setup-verification.test.js.map +0 -1
- package/dist/__tests__/stealth-utils.test.d.ts +0 -2
- package/dist/__tests__/stealth-utils.test.d.ts.map +0 -1
- package/dist/__tests__/stealth-utils.test.js +0 -413
- package/dist/__tests__/stealth-utils.test.js.map +0 -1
- package/dist/__tests__/types.test.d.ts +0 -2
- package/dist/__tests__/types.test.d.ts.map +0 -1
- package/dist/__tests__/types.test.js +0 -461
- 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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"}
|