@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.
Files changed (138) hide show
  1. package/README.md +93 -658
  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,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