@roomi-fields/notebooklm-mcp 1.3.5 → 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.
- package/README.md +93 -658
- 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.map +1 -1
- package/dist/config.js +9 -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 +3846 -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/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 +242 -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 +8 -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/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 +10 -10
- 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,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Login Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles automated login for accounts with stored credentials.
|
|
5
|
+
* Uses existing AuthManager infrastructure but with multi-account support.
|
|
6
|
+
*/
|
|
7
|
+
import { AccountManager } from './account-manager.js';
|
|
8
|
+
import type { AutoLoginResult } from './types.js';
|
|
9
|
+
export declare class AutoLoginManager {
|
|
10
|
+
private accountManager;
|
|
11
|
+
constructor(accountManager: AccountManager);
|
|
12
|
+
/**
|
|
13
|
+
* Perform auto-login for a specific account
|
|
14
|
+
*/
|
|
15
|
+
performAutoLogin(accountId: string, options?: {
|
|
16
|
+
showBrowser?: boolean;
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}): Promise<AutoLoginResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Check if page is on NotebookLM
|
|
21
|
+
*/
|
|
22
|
+
private isOnNotebookLM;
|
|
23
|
+
/**
|
|
24
|
+
* Fill email field
|
|
25
|
+
*/
|
|
26
|
+
private fillEmail;
|
|
27
|
+
/**
|
|
28
|
+
* Wait for password page to load
|
|
29
|
+
*/
|
|
30
|
+
private waitForPasswordPage;
|
|
31
|
+
/**
|
|
32
|
+
* Fill password field
|
|
33
|
+
*/
|
|
34
|
+
private fillPassword;
|
|
35
|
+
/**
|
|
36
|
+
* Handle 2FA with TOTP
|
|
37
|
+
*/
|
|
38
|
+
private handle2FA;
|
|
39
|
+
/**
|
|
40
|
+
* Click Next button
|
|
41
|
+
*/
|
|
42
|
+
private clickNextButton;
|
|
43
|
+
/**
|
|
44
|
+
* Wait for redirect to NotebookLM
|
|
45
|
+
*/
|
|
46
|
+
private waitForNotebookLM;
|
|
47
|
+
/**
|
|
48
|
+
* Handle Google interstitial pages that may appear after login
|
|
49
|
+
*/
|
|
50
|
+
private handleInterstitialPages;
|
|
51
|
+
/**
|
|
52
|
+
* Save browser state for account
|
|
53
|
+
*/
|
|
54
|
+
private saveState;
|
|
55
|
+
/**
|
|
56
|
+
* Auto-login for best available account
|
|
57
|
+
*/
|
|
58
|
+
autoLoginBestAccount(options?: {
|
|
59
|
+
showBrowser?: boolean;
|
|
60
|
+
}): Promise<AutoLoginResult | null>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=auto-login-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-login-manager.d.ts","sourceRoot":"","sources":["../../src/accounts/auto-login-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,KAAK,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,cAAc,CAAiB;gBAE3B,cAAc,EAAE,cAAc;IAI1C;;OAEG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACxD,OAAO,CAAC,eAAe,CAAC;IAyP3B;;OAEG;YACW,cAAc;IAS5B;;OAEG;YACW,SAAS;IA4CvB;;OAEG;YACW,mBAAmB;IA6BjC;;OAEG;YACW,YAAY;IAuC1B;;OAEG;YACW,SAAS;IAuDvB;;OAEG;YACW,eAAe;IAyB7B;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,uBAAuB;IAqCrC;;OAEG;YACW,SAAS;IAmCvB;;OAEG;IACG,oBAAoB,CACxB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAO,GACtC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;CAUnC"}
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Login Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles automated login for accounts with stored credentials.
|
|
5
|
+
* Uses existing AuthManager infrastructure but with multi-account support.
|
|
6
|
+
*/
|
|
7
|
+
import { chromium } from 'patchright';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import fs from 'fs/promises';
|
|
10
|
+
import { existsSync } from 'fs';
|
|
11
|
+
import { CONFIG, NOTEBOOKLM_AUTH_URL } from '../config.js';
|
|
12
|
+
import { log } from '../utils/logger.js';
|
|
13
|
+
import { humanType, randomDelay, realisticClick, randomMouseMovement, } from '../utils/stealth-utils.js';
|
|
14
|
+
import { maskEmail } from './crypto.js';
|
|
15
|
+
export class AutoLoginManager {
|
|
16
|
+
accountManager;
|
|
17
|
+
constructor(accountManager) {
|
|
18
|
+
this.accountManager = accountManager;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Perform auto-login for a specific account
|
|
22
|
+
*/
|
|
23
|
+
async performAutoLogin(accountId, options = {}) {
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
const account = this.accountManager.getAccount(accountId);
|
|
26
|
+
if (!account) {
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
accountId,
|
|
30
|
+
error: 'Account not found',
|
|
31
|
+
duration: Date.now() - startTime,
|
|
32
|
+
requiresManualIntervention: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Get credentials
|
|
36
|
+
const credentials = await this.accountManager.getCredentials(accountId);
|
|
37
|
+
if (!credentials) {
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
accountId,
|
|
41
|
+
error: 'No credentials available',
|
|
42
|
+
duration: Date.now() - startTime,
|
|
43
|
+
requiresManualIntervention: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
log.info(`🔄 Auto-login for: ${maskEmail(credentials.email)}`);
|
|
47
|
+
let context = null;
|
|
48
|
+
try {
|
|
49
|
+
// Ensure account profile directory exists
|
|
50
|
+
if (!existsSync(account.profileDir)) {
|
|
51
|
+
await fs.mkdir(account.profileDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
// Ensure browser_state directory exists
|
|
54
|
+
const browserStateDir = path.dirname(account.stateFilePath);
|
|
55
|
+
if (!existsSync(browserStateDir)) {
|
|
56
|
+
await fs.mkdir(browserStateDir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
// Launch persistent browser for this account
|
|
59
|
+
context = await chromium.launchPersistentContext(account.profileDir, {
|
|
60
|
+
headless: !options.showBrowser,
|
|
61
|
+
channel: 'chrome',
|
|
62
|
+
viewport: CONFIG.viewport,
|
|
63
|
+
locale: 'en-US',
|
|
64
|
+
timezoneId: 'Europe/Berlin',
|
|
65
|
+
args: [
|
|
66
|
+
'--disable-blink-features=AutomationControlled',
|
|
67
|
+
'--disable-dev-shm-usage',
|
|
68
|
+
'--no-first-run',
|
|
69
|
+
'--no-default-browser-check',
|
|
70
|
+
],
|
|
71
|
+
});
|
|
72
|
+
const page = context.pages()[0] || (await context.newPage());
|
|
73
|
+
const timeout = options.timeout ?? CONFIG.autoLoginTimeoutMs;
|
|
74
|
+
const deadline = Date.now() + timeout;
|
|
75
|
+
// Navigate to Google login
|
|
76
|
+
log.info(' 🌐 Navigating to Google login...');
|
|
77
|
+
await page.goto(NOTEBOOKLM_AUTH_URL, {
|
|
78
|
+
waitUntil: 'domcontentloaded',
|
|
79
|
+
timeout: 60000,
|
|
80
|
+
});
|
|
81
|
+
// Check if already authenticated
|
|
82
|
+
if (await this.isOnNotebookLM(page)) {
|
|
83
|
+
log.success(' ✅ Already authenticated!');
|
|
84
|
+
await this.saveState(context, page, account);
|
|
85
|
+
await this.accountManager.recordLoginSuccess(accountId);
|
|
86
|
+
await context.close();
|
|
87
|
+
return {
|
|
88
|
+
success: true,
|
|
89
|
+
accountId,
|
|
90
|
+
duration: Date.now() - startTime,
|
|
91
|
+
requiresManualIntervention: false,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Perform login steps
|
|
95
|
+
log.info(' 📧 Entering email...');
|
|
96
|
+
const emailResult = await this.fillEmail(page, credentials.email, deadline);
|
|
97
|
+
if (!emailResult.success) {
|
|
98
|
+
if (emailResult.alreadyAuthenticated) {
|
|
99
|
+
await this.saveState(context, page, account);
|
|
100
|
+
await this.accountManager.recordLoginSuccess(accountId);
|
|
101
|
+
await context.close();
|
|
102
|
+
return {
|
|
103
|
+
success: true,
|
|
104
|
+
accountId,
|
|
105
|
+
duration: Date.now() - startTime,
|
|
106
|
+
requiresManualIntervention: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
throw new Error(emailResult.error || 'Email step failed');
|
|
110
|
+
}
|
|
111
|
+
// Check if already on NotebookLM (session still valid)
|
|
112
|
+
if (await this.isOnNotebookLM(page)) {
|
|
113
|
+
log.success(' ✅ Already authenticated (session still valid)!');
|
|
114
|
+
await this.saveState(context, page, account);
|
|
115
|
+
await this.accountManager.recordLoginSuccess(accountId);
|
|
116
|
+
await context.close();
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
accountId,
|
|
120
|
+
duration: Date.now() - startTime,
|
|
121
|
+
requiresManualIntervention: false,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// Wait for password page
|
|
125
|
+
log.info(' 🔐 Waiting for password page...');
|
|
126
|
+
await this.waitForPasswordPage(page, deadline);
|
|
127
|
+
// Check again if redirected to NotebookLM during wait
|
|
128
|
+
if (await this.isOnNotebookLM(page)) {
|
|
129
|
+
log.success(' ✅ Already authenticated!');
|
|
130
|
+
await this.saveState(context, page, account);
|
|
131
|
+
await this.accountManager.recordLoginSuccess(accountId);
|
|
132
|
+
await context.close();
|
|
133
|
+
return {
|
|
134
|
+
success: true,
|
|
135
|
+
accountId,
|
|
136
|
+
duration: Date.now() - startTime,
|
|
137
|
+
requiresManualIntervention: false,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Enter password
|
|
141
|
+
log.info(' 🔐 Entering password...');
|
|
142
|
+
const passwordResult = await this.fillPassword(page, credentials.password, deadline);
|
|
143
|
+
if (!passwordResult.success) {
|
|
144
|
+
// Final check - maybe we got redirected during password entry
|
|
145
|
+
if (await this.isOnNotebookLM(page)) {
|
|
146
|
+
log.success(' ✅ Authentication completed!');
|
|
147
|
+
await this.saveState(context, page, account);
|
|
148
|
+
await this.accountManager.recordLoginSuccess(accountId);
|
|
149
|
+
await context.close();
|
|
150
|
+
return {
|
|
151
|
+
success: true,
|
|
152
|
+
accountId,
|
|
153
|
+
duration: Date.now() - startTime,
|
|
154
|
+
requiresManualIntervention: false,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
throw new Error(passwordResult.error || 'Password step failed');
|
|
158
|
+
}
|
|
159
|
+
// Check for 2FA
|
|
160
|
+
const currentUrl = page.url();
|
|
161
|
+
if (currentUrl.includes('challenge')) {
|
|
162
|
+
if (credentials.totpSecret) {
|
|
163
|
+
log.info(' 🔑 Handling 2FA with TOTP...');
|
|
164
|
+
const totpResult = await this.handle2FA(page, credentials.totpSecret, deadline);
|
|
165
|
+
if (!totpResult.success) {
|
|
166
|
+
throw new Error(totpResult.error || '2FA failed');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
log.warning(' ⚠️ 2FA required but no TOTP secret configured');
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
accountId,
|
|
174
|
+
error: '2FA required - no TOTP secret',
|
|
175
|
+
duration: Date.now() - startTime,
|
|
176
|
+
requiresManualIntervention: true,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Wait for redirect to NotebookLM
|
|
181
|
+
log.info(' ⏳ Waiting for NotebookLM redirect...');
|
|
182
|
+
const redirectSuccess = await this.waitForNotebookLM(page, deadline);
|
|
183
|
+
if (!redirectSuccess) {
|
|
184
|
+
// Check if we're on a challenge page
|
|
185
|
+
const url = page.url();
|
|
186
|
+
if (url.includes('challenge') || url.includes('signin/rejected')) {
|
|
187
|
+
log.error(' ❌ Google requires additional verification');
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
accountId,
|
|
191
|
+
error: 'Google verification required',
|
|
192
|
+
duration: Date.now() - startTime,
|
|
193
|
+
requiresManualIntervention: true,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
throw new Error('Redirect to NotebookLM timed out');
|
|
197
|
+
}
|
|
198
|
+
// Save state
|
|
199
|
+
log.info(' 💾 Saving authentication state...');
|
|
200
|
+
await this.saveState(context, page, account);
|
|
201
|
+
// Record success
|
|
202
|
+
await this.accountManager.recordLoginSuccess(accountId);
|
|
203
|
+
log.success(`✅ Auto-login successful for: ${maskEmail(credentials.email)}`);
|
|
204
|
+
await context.close();
|
|
205
|
+
return {
|
|
206
|
+
success: true,
|
|
207
|
+
accountId,
|
|
208
|
+
duration: Date.now() - startTime,
|
|
209
|
+
requiresManualIntervention: false,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
214
|
+
log.error(`❌ Auto-login failed: ${errorMsg}`);
|
|
215
|
+
// Record failure
|
|
216
|
+
await this.accountManager.recordLoginFailure(accountId, errorMsg);
|
|
217
|
+
// Try to take screenshot for debugging
|
|
218
|
+
if (context) {
|
|
219
|
+
try {
|
|
220
|
+
const pages = context.pages();
|
|
221
|
+
if (pages.length > 0) {
|
|
222
|
+
const screenshotPath = path.join(CONFIG.dataDir, `login_fail_${accountId}_${Date.now()}.png`);
|
|
223
|
+
await pages[0].screenshot({ path: screenshotPath });
|
|
224
|
+
log.info(` 📸 Screenshot saved: ${screenshotPath}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Ignore screenshot errors
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
await context.close();
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Ignore close errors
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
success: false,
|
|
239
|
+
accountId,
|
|
240
|
+
error: errorMsg,
|
|
241
|
+
duration: Date.now() - startTime,
|
|
242
|
+
requiresManualIntervention: errorMsg.includes('verification') || errorMsg.includes('2FA'),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Check if page is on NotebookLM
|
|
248
|
+
*/
|
|
249
|
+
async isOnNotebookLM(page) {
|
|
250
|
+
try {
|
|
251
|
+
const url = page.url();
|
|
252
|
+
return url.startsWith('https://notebooklm.google.com/');
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Fill email field
|
|
260
|
+
*/
|
|
261
|
+
async fillEmail(page, email, _deadline) {
|
|
262
|
+
const selectors = ['input#identifierId', "input[name='identifier']", "input[type='email']"];
|
|
263
|
+
for (const selector of selectors) {
|
|
264
|
+
try {
|
|
265
|
+
const field = await page.waitForSelector(selector, { state: 'visible', timeout: 5000 });
|
|
266
|
+
if (!field)
|
|
267
|
+
continue;
|
|
268
|
+
// Human-like interaction
|
|
269
|
+
const box = await field.boundingBox();
|
|
270
|
+
if (box) {
|
|
271
|
+
await randomMouseMovement(page, box.x + box.width / 2, box.y + box.height / 2);
|
|
272
|
+
await randomDelay(200, 400);
|
|
273
|
+
}
|
|
274
|
+
await realisticClick(page, selector, false);
|
|
275
|
+
await humanType(page, selector, email, { wpm: 180, withTypos: false });
|
|
276
|
+
await randomDelay(300, 600);
|
|
277
|
+
// Click Next
|
|
278
|
+
const nextClicked = await this.clickNextButton(page);
|
|
279
|
+
if (!nextClicked) {
|
|
280
|
+
await field.press('Enter');
|
|
281
|
+
}
|
|
282
|
+
await randomDelay(500, 1000);
|
|
283
|
+
return { success: true };
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Check if already on NotebookLM (was already logged in)
|
|
290
|
+
if (await this.isOnNotebookLM(page)) {
|
|
291
|
+
return { success: true, alreadyAuthenticated: true };
|
|
292
|
+
}
|
|
293
|
+
return { success: false, error: 'Email field not found' };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Wait for password page to load
|
|
297
|
+
*/
|
|
298
|
+
async waitForPasswordPage(page, deadline) {
|
|
299
|
+
const selectors = ["input[name='Passwd']", "input[type='password']"];
|
|
300
|
+
while (Date.now() < deadline) {
|
|
301
|
+
for (const selector of selectors) {
|
|
302
|
+
try {
|
|
303
|
+
const field = await page.$(selector);
|
|
304
|
+
if (field && (await field.isVisible())) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Check for challenge page
|
|
313
|
+
if (page.url().includes('challenge')) {
|
|
314
|
+
return; // Will handle 2FA
|
|
315
|
+
}
|
|
316
|
+
// Check if already on NotebookLM
|
|
317
|
+
if (await this.isOnNotebookLM(page)) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
await page.waitForTimeout(500);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Fill password field
|
|
325
|
+
*/
|
|
326
|
+
async fillPassword(page, password, _deadline) {
|
|
327
|
+
const selectors = ["input[name='Passwd']", "input[type='password']"];
|
|
328
|
+
for (const selector of selectors) {
|
|
329
|
+
try {
|
|
330
|
+
const field = await page.waitForSelector(selector, { state: 'visible', timeout: 5000 });
|
|
331
|
+
if (!field)
|
|
332
|
+
continue;
|
|
333
|
+
// Human-like interaction
|
|
334
|
+
const box = await field.boundingBox();
|
|
335
|
+
if (box) {
|
|
336
|
+
await randomMouseMovement(page, box.x + box.width / 2, box.y + box.height / 2);
|
|
337
|
+
await randomDelay(200, 400);
|
|
338
|
+
}
|
|
339
|
+
await realisticClick(page, selector, false);
|
|
340
|
+
await humanType(page, selector, password, { wpm: 150, withTypos: false });
|
|
341
|
+
await randomDelay(300, 600);
|
|
342
|
+
// Click Next
|
|
343
|
+
const nextClicked = await this.clickNextButton(page);
|
|
344
|
+
if (!nextClicked) {
|
|
345
|
+
await field.press('Enter');
|
|
346
|
+
}
|
|
347
|
+
await randomDelay(500, 1000);
|
|
348
|
+
return { success: true };
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return { success: false, error: 'Password field not found' };
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Handle 2FA with TOTP
|
|
358
|
+
*/
|
|
359
|
+
async handle2FA(page, totpSecret, _deadline) {
|
|
360
|
+
try {
|
|
361
|
+
// Dynamic import otplib only when needed
|
|
362
|
+
const { authenticator } = await import('otplib');
|
|
363
|
+
// Generate TOTP code
|
|
364
|
+
const code = authenticator.generate(totpSecret);
|
|
365
|
+
log.info(` 🔑 Generated TOTP code: ${code.slice(0, 2)}****`);
|
|
366
|
+
// Wait for TOTP input field
|
|
367
|
+
const totpSelectors = [
|
|
368
|
+
"input[name='totpPin']",
|
|
369
|
+
"input[type='tel']",
|
|
370
|
+
"input[autocomplete='one-time-code']",
|
|
371
|
+
];
|
|
372
|
+
for (const selector of totpSelectors) {
|
|
373
|
+
try {
|
|
374
|
+
const field = await page.waitForSelector(selector, { state: 'visible', timeout: 10000 });
|
|
375
|
+
if (!field)
|
|
376
|
+
continue;
|
|
377
|
+
await realisticClick(page, selector, false);
|
|
378
|
+
await humanType(page, selector, code, { wpm: 120, withTypos: false });
|
|
379
|
+
await randomDelay(300, 600);
|
|
380
|
+
// Click Next/Verify
|
|
381
|
+
const nextClicked = await this.clickNextButton(page);
|
|
382
|
+
if (!nextClicked) {
|
|
383
|
+
await field.press('Enter');
|
|
384
|
+
}
|
|
385
|
+
await randomDelay(1000, 2000);
|
|
386
|
+
return { success: true };
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Before failing, check if we're already on NotebookLM (Google skipped 2FA)
|
|
393
|
+
const currentUrl = page.url();
|
|
394
|
+
if (currentUrl.includes('notebooklm.google.com')) {
|
|
395
|
+
log.info(' ✅ 2FA was skipped (trusted device), already on NotebookLM');
|
|
396
|
+
return { success: true };
|
|
397
|
+
}
|
|
398
|
+
return { success: false, error: 'TOTP input field not found' };
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
return { success: false, error: `TOTP failed: ${error}` };
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Click Next button
|
|
406
|
+
*/
|
|
407
|
+
async clickNextButton(page) {
|
|
408
|
+
const selectors = [
|
|
409
|
+
'#identifierNext',
|
|
410
|
+
'#passwordNext',
|
|
411
|
+
'#totpNext',
|
|
412
|
+
"button:has-text('Next')",
|
|
413
|
+
"button:has-text('Weiter')",
|
|
414
|
+
"button:has-text('Verify')",
|
|
415
|
+
];
|
|
416
|
+
for (const selector of selectors) {
|
|
417
|
+
try {
|
|
418
|
+
const button = await page.locator(selector);
|
|
419
|
+
if ((await button.count()) > 0 && (await button.isVisible())) {
|
|
420
|
+
await realisticClick(page, selector, true);
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Wait for redirect to NotebookLM
|
|
432
|
+
*/
|
|
433
|
+
async waitForNotebookLM(page, deadline) {
|
|
434
|
+
while (Date.now() < deadline) {
|
|
435
|
+
if (await this.isOnNotebookLM(page)) {
|
|
436
|
+
// Wait for page to stabilize
|
|
437
|
+
try {
|
|
438
|
+
await page.waitForLoadState('networkidle', { timeout: 10000 });
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
// Ignore timeout
|
|
442
|
+
}
|
|
443
|
+
await page.waitForTimeout(2000);
|
|
444
|
+
return true;
|
|
445
|
+
}
|
|
446
|
+
// Handle Google interstitial pages (passkeys, security prompts, etc.)
|
|
447
|
+
await this.handleInterstitialPages(page);
|
|
448
|
+
await page.waitForTimeout(500);
|
|
449
|
+
}
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Handle Google interstitial pages that may appear after login
|
|
454
|
+
*/
|
|
455
|
+
async handleInterstitialPages(page) {
|
|
456
|
+
// List of buttons to click to dismiss interstitial pages
|
|
457
|
+
const dismissButtons = [
|
|
458
|
+
// Passkeys prompt
|
|
459
|
+
"button:has-text('Not now')",
|
|
460
|
+
"button:has-text('Nicht jetzt')",
|
|
461
|
+
"button:has-text('Pas maintenant')",
|
|
462
|
+
// Security prompt / Skip buttons
|
|
463
|
+
"button:has-text('Skip')",
|
|
464
|
+
"button:has-text('Überspringen')",
|
|
465
|
+
"button:has-text('Ignorer')",
|
|
466
|
+
// Continue / Done buttons (for info pages)
|
|
467
|
+
'#confirm',
|
|
468
|
+
"button:has-text('Done')",
|
|
469
|
+
"button:has-text('Fertig')",
|
|
470
|
+
"button:has-text('Terminé')",
|
|
471
|
+
// Reject cookies / consent
|
|
472
|
+
"button:has-text('Reject all')",
|
|
473
|
+
"button:has-text('Alle ablehnen')",
|
|
474
|
+
"button:has-text('Tout refuser')",
|
|
475
|
+
];
|
|
476
|
+
for (const selector of dismissButtons) {
|
|
477
|
+
try {
|
|
478
|
+
const button = page.locator(selector).first();
|
|
479
|
+
if (await button.isVisible({ timeout: 100 })) {
|
|
480
|
+
log.info(` 🔄 Dismissing interstitial page: ${selector}`);
|
|
481
|
+
await button.click({ timeout: 2000 });
|
|
482
|
+
await page.waitForTimeout(1000);
|
|
483
|
+
return; // Only click one button per iteration
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// Button not found or not visible, continue
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Save browser state for account
|
|
493
|
+
*/
|
|
494
|
+
async saveState(context, page, account) {
|
|
495
|
+
// Ensure directory exists
|
|
496
|
+
const stateDir = path.dirname(account.stateFilePath);
|
|
497
|
+
if (!existsSync(stateDir)) {
|
|
498
|
+
await fs.mkdir(stateDir, { recursive: true });
|
|
499
|
+
}
|
|
500
|
+
// Save storage state
|
|
501
|
+
await context.storageState({ path: account.stateFilePath });
|
|
502
|
+
// Save session storage
|
|
503
|
+
try {
|
|
504
|
+
const sessionData = await page.evaluate(() => {
|
|
505
|
+
// Runs in browser context where sessionStorage exists
|
|
506
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
507
|
+
const ss = globalThis.sessionStorage;
|
|
508
|
+
const storage = {};
|
|
509
|
+
for (let i = 0; i < ss.length; i++) {
|
|
510
|
+
const key = ss.key(i);
|
|
511
|
+
if (key) {
|
|
512
|
+
storage[key] = ss.getItem(key) || '';
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
return JSON.stringify(storage);
|
|
516
|
+
});
|
|
517
|
+
const sessionPath = path.join(stateDir, 'session.json');
|
|
518
|
+
await fs.writeFile(sessionPath, sessionData, 'utf-8');
|
|
519
|
+
}
|
|
520
|
+
catch {
|
|
521
|
+
// Ignore session storage errors
|
|
522
|
+
}
|
|
523
|
+
log.success(` ✅ State saved: ${account.stateFilePath}`);
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Auto-login for best available account
|
|
527
|
+
*/
|
|
528
|
+
async autoLoginBestAccount(options = {}) {
|
|
529
|
+
const selection = await this.accountManager.getBestAccount();
|
|
530
|
+
if (!selection) {
|
|
531
|
+
log.warning('⚠️ No accounts available for auto-login');
|
|
532
|
+
return null;
|
|
533
|
+
}
|
|
534
|
+
return this.performAutoLogin(selection.account.config.id, options);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=auto-login-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-login-manager.js","sourceRoot":"","sources":["../../src/accounts/auto-login-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cryptographic utilities for credential encryption
|
|
3
|
+
*
|
|
4
|
+
* Uses AES-256-GCM for authenticated encryption.
|
|
5
|
+
* Key is derived from environment variable or generated and stored.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get or create the encryption key
|
|
9
|
+
*
|
|
10
|
+
* Priority:
|
|
11
|
+
* 1. NBLM_ENCRYPTION_KEY environment variable (hex string, 64 chars)
|
|
12
|
+
* 2. Key file in data directory (~/.notebooklm-mcp/encryption.key)
|
|
13
|
+
* 3. Generate new key and save to file
|
|
14
|
+
*/
|
|
15
|
+
export declare function getEncryptionKey(): Promise<Buffer>;
|
|
16
|
+
/**
|
|
17
|
+
* Encrypt a string using AES-256-GCM
|
|
18
|
+
*
|
|
19
|
+
* Format: iv:authTag:ciphertext (all hex encoded)
|
|
20
|
+
*/
|
|
21
|
+
export declare function encrypt(plaintext: string): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Decrypt a string using AES-256-GCM
|
|
24
|
+
*
|
|
25
|
+
* Expects format: iv:authTag:ciphertext (all hex encoded)
|
|
26
|
+
*/
|
|
27
|
+
export declare function decrypt(encryptedData: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Verify the encryption key is valid by encrypting/decrypting a test string
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyEncryption(): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Generate a new encryption key (for key rotation)
|
|
34
|
+
* Returns the hex-encoded key (64 characters)
|
|
35
|
+
*/
|
|
36
|
+
export declare function generateNewKey(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Mask sensitive data for logging (shows first and last 2 chars)
|
|
39
|
+
*/
|
|
40
|
+
export declare function maskSensitive(value: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Mask email for logging (e.g., "t***t@gmail.com")
|
|
43
|
+
*/
|
|
44
|
+
export declare function maskEmail(email: string): string;
|
|
45
|
+
//# sourceMappingURL=crypto.d.ts.map
|