notebooklm-kit 0.0.1 → 2.1.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.
Files changed (100) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +4102 -0
  3. package/dist/src/auth/auth.d.ts +46 -0
  4. package/dist/src/auth/auth.d.ts.map +1 -0
  5. package/dist/src/auth/auth.js +323 -0
  6. package/dist/src/auth/auth.js.map +1 -0
  7. package/dist/src/auth/refresh.d.ts +150 -0
  8. package/dist/src/auth/refresh.d.ts.map +1 -0
  9. package/dist/src/auth/refresh.js +433 -0
  10. package/dist/src/auth/refresh.js.map +1 -0
  11. package/dist/src/client/notebooklm-client.d.ts +372 -0
  12. package/dist/src/client/notebooklm-client.d.ts.map +1 -0
  13. package/dist/src/client/notebooklm-client.js +550 -0
  14. package/dist/src/client/notebooklm-client.js.map +1 -0
  15. package/dist/src/index.d.ts +50 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/index.js +45 -0
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/rpc/rpc-client.d.ts +48 -0
  20. package/dist/src/rpc/rpc-client.d.ts.map +1 -0
  21. package/dist/src/rpc/rpc-client.js +94 -0
  22. package/dist/src/rpc/rpc-client.js.map +1 -0
  23. package/dist/src/rpc/rpc-methods.d.ts +127 -0
  24. package/dist/src/rpc/rpc-methods.d.ts.map +1 -0
  25. package/dist/src/rpc/rpc-methods.js +169 -0
  26. package/dist/src/rpc/rpc-methods.js.map +1 -0
  27. package/dist/src/services/artifacts.d.ts +1017 -0
  28. package/dist/src/services/artifacts.d.ts.map +1 -0
  29. package/dist/src/services/artifacts.js +5413 -0
  30. package/dist/src/services/artifacts.js.map +1 -0
  31. package/dist/src/services/generation.d.ts +147 -0
  32. package/dist/src/services/generation.d.ts.map +1 -0
  33. package/dist/src/services/generation.js +479 -0
  34. package/dist/src/services/generation.js.map +1 -0
  35. package/dist/src/services/notebook-language.d.ts +109 -0
  36. package/dist/src/services/notebook-language.d.ts.map +1 -0
  37. package/dist/src/services/notebook-language.js +204 -0
  38. package/dist/src/services/notebook-language.js.map +1 -0
  39. package/dist/src/services/notebooks.d.ts +26 -0
  40. package/dist/src/services/notebooks.d.ts.map +1 -0
  41. package/dist/src/services/notebooks.js +539 -0
  42. package/dist/src/services/notebooks.js.map +1 -0
  43. package/dist/src/services/notes.d.ts +72 -0
  44. package/dist/src/services/notes.d.ts.map +1 -0
  45. package/dist/src/services/notes.js +340 -0
  46. package/dist/src/services/notes.js.map +1 -0
  47. package/dist/src/services/sources.d.ts +1085 -0
  48. package/dist/src/services/sources.d.ts.map +1 -0
  49. package/dist/src/services/sources.js +2675 -0
  50. package/dist/src/services/sources.js.map +1 -0
  51. package/dist/src/types/artifact.d.ts +258 -0
  52. package/dist/src/types/artifact.d.ts.map +1 -0
  53. package/dist/src/types/artifact.js +42 -0
  54. package/dist/src/types/artifact.js.map +1 -0
  55. package/dist/src/types/common.d.ts +226 -0
  56. package/dist/src/types/common.d.ts.map +1 -0
  57. package/dist/src/types/common.js +80 -0
  58. package/dist/src/types/common.js.map +1 -0
  59. package/dist/src/types/languages.d.ts +179 -0
  60. package/dist/src/types/languages.d.ts.map +1 -0
  61. package/dist/src/types/languages.js +254 -0
  62. package/dist/src/types/languages.js.map +1 -0
  63. package/dist/src/types/note.d.ts +41 -0
  64. package/dist/src/types/note.d.ts.map +1 -0
  65. package/dist/src/types/note.js +12 -0
  66. package/dist/src/types/note.js.map +1 -0
  67. package/dist/src/types/notebook.d.ts +81 -0
  68. package/dist/src/types/notebook.d.ts.map +1 -0
  69. package/dist/src/types/notebook.js +5 -0
  70. package/dist/src/types/notebook.js.map +1 -0
  71. package/dist/src/types/source.d.ts +241 -0
  72. package/dist/src/types/source.d.ts.map +1 -0
  73. package/dist/src/types/source.js +60 -0
  74. package/dist/src/types/source.js.map +1 -0
  75. package/dist/src/utils/batch-execute.d.ts +58 -0
  76. package/dist/src/utils/batch-execute.d.ts.map +1 -0
  77. package/dist/src/utils/batch-execute.js +398 -0
  78. package/dist/src/utils/batch-execute.js.map +1 -0
  79. package/dist/src/utils/chunked-decoder.d.ts +11 -0
  80. package/dist/src/utils/chunked-decoder.d.ts.map +1 -0
  81. package/dist/src/utils/chunked-decoder.js +326 -0
  82. package/dist/src/utils/chunked-decoder.js.map +1 -0
  83. package/dist/src/utils/chunked-parser.d.ts +61 -0
  84. package/dist/src/utils/chunked-parser.d.ts.map +1 -0
  85. package/dist/src/utils/chunked-parser.js +609 -0
  86. package/dist/src/utils/chunked-parser.js.map +1 -0
  87. package/dist/src/utils/errors.d.ts +58 -0
  88. package/dist/src/utils/errors.d.ts.map +1 -0
  89. package/dist/src/utils/errors.js +357 -0
  90. package/dist/src/utils/errors.js.map +1 -0
  91. package/dist/src/utils/quota.d.ts +213 -0
  92. package/dist/src/utils/quota.d.ts.map +1 -0
  93. package/dist/src/utils/quota.js +518 -0
  94. package/dist/src/utils/quota.js.map +1 -0
  95. package/dist/src/utils/streaming-client.d.ts +129 -0
  96. package/dist/src/utils/streaming-client.d.ts.map +1 -0
  97. package/dist/src/utils/streaming-client.js +559 -0
  98. package/dist/src/utils/streaming-client.js.map +1 -0
  99. package/package.json +85 -7
  100. package/index.js +0 -2
@@ -0,0 +1,433 @@
1
+ /**
2
+ * Authentication refresh utilities
3
+ * Keeps NotebookLM sessions alive by refreshing credentials
4
+ * Implements hybrid refresh strategy: expiration-based (primary) + time-based (fallback)
5
+ */
6
+ import { createHash } from 'crypto';
7
+ import { NotebookLMAuthError } from '../types/common.js';
8
+ /**
9
+ * Google Signaler API configuration
10
+ */
11
+ const SIGNALER_API_URL = 'https://signaler-pa.clients6.google.com/punctual/v1/refreshCreds';
12
+ /**
13
+ * Google Signaler API Key
14
+ *
15
+ * This is a PUBLIC Google API key used for credential refresh.
16
+ * It's safe to commit as it's a client-side key with limited scope.
17
+ * Can be overridden via NOTEBOOKLM_SIGNALER_API_KEY environment variable.
18
+ */
19
+ const SIGNALER_API_KEY = process.env.NOTEBOOKLM_SIGNALER_API_KEY || 'AIzaSyC_pzrI0AjEDXDYcg7kkq3uQEjnXV50pBM';
20
+ /**
21
+ * Refresh client for credential refresh
22
+ */
23
+ export class RefreshClient {
24
+ sapisid;
25
+ debug;
26
+ cookies;
27
+ onCredentialsUpdate;
28
+ constructor(cookies, debug = false, onCredentialsUpdate) {
29
+ this.cookies = cookies;
30
+ this.debug = debug;
31
+ this.onCredentialsUpdate = onCredentialsUpdate;
32
+ this.sapisid = this.extractCookieValue('SAPISID');
33
+ if (!this.sapisid) {
34
+ throw new NotebookLMAuthError('SAPISID not found in cookies');
35
+ }
36
+ }
37
+ /**
38
+ * Update cookies (called after refresh to keep credentials in sync)
39
+ */
40
+ updateCookies(cookies) {
41
+ this.cookies = cookies;
42
+ const newSapisid = this.extractCookieValue('SAPISID');
43
+ if (newSapisid) {
44
+ this.sapisid = newSapisid;
45
+ }
46
+ }
47
+ /**
48
+ * Get current cookies
49
+ */
50
+ getCookies() {
51
+ return this.cookies;
52
+ }
53
+ /**
54
+ * Refresh credentials
55
+ *
56
+ * @param gsessionId - Google session ID (optional)
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const refreshClient = new RefreshClient(cookies);
61
+ * await refreshClient.refreshCredentials();
62
+ * ```
63
+ */
64
+ async refreshCredentials(gsessionId) {
65
+ const url = new URL(SIGNALER_API_URL);
66
+ url.searchParams.set('key', SIGNALER_API_KEY);
67
+ if (gsessionId) {
68
+ url.searchParams.set('gsessionid', gsessionId);
69
+ }
70
+ // Generate SAPISIDHASH for authorization
71
+ const timestamp = Math.floor(Date.now() / 1000);
72
+ const authHash = this.generateSAPISIDHASH(timestamp);
73
+ // Request body - verified from actual NotebookLM API calls
74
+ const requestBody = JSON.stringify(['8hcNI0LV']);
75
+ if (this.debug) {
76
+ console.log('=== Credential Refresh Request ===');
77
+ console.log('URL:', url.toString());
78
+ console.log('Authorization:', `SAPISIDHASH ${timestamp}_${authHash.substring(0, 10)}...`);
79
+ console.log('Request Body:', requestBody);
80
+ }
81
+ // Make request
82
+ const response = await fetch(url.toString(), {
83
+ method: 'POST',
84
+ headers: {
85
+ 'Accept': '*/*',
86
+ 'Accept-Language': 'en-US,en;q=0.5',
87
+ 'Authorization': `SAPISIDHASH ${timestamp}_${authHash}`,
88
+ 'Content-Type': 'application/json+protobuf',
89
+ 'Cookie': this.cookies,
90
+ 'Origin': 'https://notebooklm.google.com',
91
+ 'Referer': 'https://notebooklm.google.com/',
92
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
93
+ },
94
+ body: requestBody,
95
+ });
96
+ if (this.debug) {
97
+ console.log('=== Credential Refresh Response ===');
98
+ console.log('Status:', response.status, response.statusText);
99
+ }
100
+ if (!response.ok) {
101
+ const body = await response.text();
102
+ throw new NotebookLMAuthError(`Refresh failed with status ${response.status}: ${body}`);
103
+ }
104
+ // Check for updated cookies in response headers (Set-Cookie)
105
+ // Note: Google may update cookies server-side without returning them
106
+ // We update our cookies if Set-Cookie headers are present
107
+ const setCookieHeaders = response.headers.get('set-cookie');
108
+ if (setCookieHeaders && this.onCredentialsUpdate) {
109
+ // Cookies may have been updated server-side
110
+ // The refresh API typically doesn't return new cookies, but we notify
111
+ // the callback in case credentials need to be refreshed from the browser
112
+ if (this.debug) {
113
+ console.log('Cookie update detected in response');
114
+ }
115
+ }
116
+ if (this.debug) {
117
+ console.log('Credentials refreshed successfully');
118
+ }
119
+ }
120
+ /**
121
+ * Generate SAPISIDHASH
122
+ * Format: SHA1(timestamp + " " + SAPISID + " " + origin)
123
+ */
124
+ generateSAPISIDHASH(timestamp) {
125
+ const origin = 'https://notebooklm.google.com';
126
+ const data = `${timestamp} ${this.sapisid} ${origin}`;
127
+ const hash = createHash('sha1');
128
+ hash.update(data);
129
+ return hash.digest('hex');
130
+ }
131
+ /**
132
+ * Extract cookie value by name
133
+ */
134
+ extractCookieValue(name) {
135
+ const parts = this.cookies.split(';');
136
+ for (const part of parts) {
137
+ const trimmed = part.trim();
138
+ if (trimmed.startsWith(`${name}=`)) {
139
+ return trimmed.substring(name.length + 1);
140
+ }
141
+ }
142
+ return '';
143
+ }
144
+ }
145
+ /**
146
+ * Parse auth token to extract expiration time
147
+ * Token format: "tokenValue:timestamp" where timestamp is Unix milliseconds
148
+ * Expiry: timestamp + 1 hour
149
+ */
150
+ export function parseAuthToken(token) {
151
+ const parts = token.split(':');
152
+ if (parts.length !== 2) {
153
+ throw new NotebookLMAuthError('Invalid token format - expected "token:timestamp"');
154
+ }
155
+ const tokenValue = parts[0];
156
+ const timestamp = parseInt(parts[1], 10);
157
+ if (isNaN(timestamp)) {
158
+ throw new NotebookLMAuthError('Invalid timestamp in token');
159
+ }
160
+ // Convert milliseconds to Date, add 1 hour for expiry
161
+ const expiryTime = new Date(timestamp + 3600000); // + 1 hour in ms
162
+ return { tokenValue, expiryTime };
163
+ }
164
+ /**
165
+ * Extract gsessionid from NotebookLM page
166
+ */
167
+ export async function extractGSessionId(cookies) {
168
+ try {
169
+ const response = await fetch('https://notebooklm.google.com/', {
170
+ headers: {
171
+ 'Cookie': cookies,
172
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',
173
+ },
174
+ });
175
+ if (!response.ok) {
176
+ return null; // Return null instead of throwing - gsessionId is optional
177
+ }
178
+ const body = await response.text();
179
+ // Look for gsessionid in the page
180
+ const patterns = [
181
+ /"gsessionid"\s*:\s*"([^"]+)"/,
182
+ /gsessionid\s*=\s*['"]([^'"]+)['"]/,
183
+ ];
184
+ for (const pattern of patterns) {
185
+ const match = body.match(pattern);
186
+ if (match && match[1]) {
187
+ return match[1];
188
+ }
189
+ }
190
+ return null; // Not found, but not critical
191
+ }
192
+ catch (error) {
193
+ return null; // Return null on error - gsessionId is optional
194
+ }
195
+ }
196
+ /**
197
+ * Default auto-refresh configuration
198
+ */
199
+ export function defaultAutoRefreshConfig() {
200
+ return {
201
+ enabled: true,
202
+ strategy: 'auto', // Auto: expiration-based primary, time-based fallback
203
+ interval: 10 * 60 * 1000, // 10 minutes (time-based fallback)
204
+ refreshAhead: 5 * 60 * 1000, // 5 minutes before expiry (expiration-based)
205
+ checkInterval: 60 * 1000, // Check every 1 minute (expiration-based)
206
+ debug: false,
207
+ };
208
+ }
209
+ /**
210
+ * Auto-refresh manager
211
+ * Automatically refreshes credentials in the background
212
+ * Supports three strategies: 'auto' (expiration-based + time-based fallback), 'time', 'expiration'
213
+ */
214
+ export class AutoRefreshManager {
215
+ config;
216
+ refreshClient;
217
+ timeIntervalId = null;
218
+ checkIntervalId = null;
219
+ running = false;
220
+ gsessionId;
221
+ authToken;
222
+ lastRefreshTime = 0;
223
+ constructor(cookies, config) {
224
+ this.config = config;
225
+ const onUpdate = (updatedCookies) => {
226
+ // Update refresh client cookies
227
+ this.refreshClient.updateCookies(updatedCookies);
228
+ // Notify callback if provided
229
+ if (config.onCredentialsUpdate) {
230
+ config.onCredentialsUpdate({
231
+ authToken: this.authToken || '',
232
+ cookies: updatedCookies,
233
+ });
234
+ }
235
+ };
236
+ this.refreshClient = new RefreshClient(cookies, config.debug, onUpdate);
237
+ this.authToken = config.authToken;
238
+ }
239
+ /**
240
+ * Update auth token (for expiration-based refresh)
241
+ */
242
+ updateAuthToken(authToken) {
243
+ this.authToken = authToken;
244
+ }
245
+ /**
246
+ * Update cookies
247
+ */
248
+ updateCookies(cookies) {
249
+ this.refreshClient.updateCookies(cookies);
250
+ }
251
+ /**
252
+ * Start auto-refresh
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * const manager = new AutoRefreshManager(cookies, {
257
+ * enabled: true,
258
+ * strategy: 'auto', // or 'time' or 'expiration'
259
+ * interval: 10 * 60 * 1000, // 10 minutes (time-based)
260
+ * refreshAhead: 5 * 60 * 1000, // 5 minutes before expiry (expiration-based)
261
+ * });
262
+ *
263
+ * await manager.start();
264
+ * ```
265
+ */
266
+ async start() {
267
+ if (this.running) {
268
+ throw new Error('Auto-refresh manager already running');
269
+ }
270
+ const strategy = this.config.strategy || 'auto';
271
+ const interval = this.config.interval || 10 * 60 * 1000;
272
+ const refreshAhead = this.config.refreshAhead || 5 * 60 * 1000;
273
+ const checkInterval = this.config.checkInterval || 60 * 1000;
274
+ // Extract gsessionId if not provided (optional, but recommended)
275
+ if (!this.config.gsessionId) {
276
+ this.gsessionId = await extractGSessionId(this.refreshClient.getCookies());
277
+ if (!this.gsessionId && this.config.debug) {
278
+ console.log('Note: gsessionId not found, refresh will continue without it');
279
+ }
280
+ }
281
+ else {
282
+ this.gsessionId = this.config.gsessionId;
283
+ }
284
+ // Do initial refresh to verify credentials work
285
+ try {
286
+ await this.performRefresh();
287
+ this.lastRefreshTime = Date.now();
288
+ if (this.config.debug) {
289
+ console.log('Initial credential refresh successful');
290
+ }
291
+ }
292
+ catch (error) {
293
+ if (this.config.debug) {
294
+ console.warn('Initial refresh failed, continuing anyway:', error.message);
295
+ }
296
+ // Don't throw - allow refresh to continue and retry later
297
+ }
298
+ this.running = true;
299
+ // Start expiration-based checking (if enabled in 'auto' or 'expiration' mode)
300
+ if (strategy === 'expiration' || strategy === 'auto') {
301
+ if (this.authToken) {
302
+ this.checkIntervalId = setInterval(() => {
303
+ this.checkAndRefreshExpiration(refreshAhead).catch(err => {
304
+ if (this.config.debug) {
305
+ console.error('Expiration check failed:', err);
306
+ }
307
+ // In 'auto' mode, fallback to time-based if expiration check fails
308
+ if (strategy === 'auto' && !this.timeIntervalId) {
309
+ if (this.config.debug) {
310
+ console.log('Falling back to time-based refresh due to expiration check failure');
311
+ }
312
+ }
313
+ });
314
+ }, checkInterval);
315
+ if (this.config.debug) {
316
+ const modeText = strategy === 'auto' ? 'auto (expiration-based primary)' : 'expiration-based';
317
+ console.log(`Auto-refresh started (${modeText}, checking every ${checkInterval}ms)`);
318
+ }
319
+ }
320
+ else if (strategy === 'expiration') {
321
+ throw new Error('Auth token required for expiration-based strategy');
322
+ }
323
+ else if (this.config.debug && strategy === 'auto') {
324
+ console.log('Note: Auth token not provided, using time-based refresh only');
325
+ }
326
+ }
327
+ // Start time-based refresh (if enabled in 'auto' or 'time' mode, or as fallback)
328
+ if (strategy === 'time' || strategy === 'auto') {
329
+ this.timeIntervalId = setInterval(async () => {
330
+ try {
331
+ await this.performRefresh();
332
+ this.lastRefreshTime = Date.now();
333
+ if (this.config.debug) {
334
+ const modeText = strategy === 'auto' ? 'time-based (fallback)' : 'time-based';
335
+ console.log(`Credentials refreshed (${modeText})`);
336
+ }
337
+ }
338
+ catch (error) {
339
+ if (this.config.debug) {
340
+ console.error('Time-based refresh failed:', error.message);
341
+ }
342
+ }
343
+ }, interval);
344
+ if (this.config.debug && strategy === 'time') {
345
+ console.log(`Auto-refresh started (time-based, interval: ${interval}ms)`);
346
+ }
347
+ else if (this.config.debug && strategy === 'auto') {
348
+ console.log(`Time-based fallback enabled (interval: ${interval}ms)`);
349
+ }
350
+ }
351
+ }
352
+ /**
353
+ * Check if token needs refresh based on expiration
354
+ */
355
+ async checkAndRefreshExpiration(refreshAhead) {
356
+ if (!this.authToken) {
357
+ return; // Can't check expiration without token
358
+ }
359
+ try {
360
+ const { expiryTime } = parseAuthToken(this.authToken);
361
+ const timeUntilExpiry = expiryTime.getTime() - Date.now();
362
+ if (timeUntilExpiry > refreshAhead) {
363
+ // Token still valid, no refresh needed
364
+ if (this.config.debug && timeUntilExpiry < refreshAhead * 2) {
365
+ // Only log when getting close to refresh time
366
+ const minutesUntilExpiry = Math.floor(timeUntilExpiry / 60000);
367
+ console.log(`Token valid for ${minutesUntilExpiry} more minutes, no refresh needed`);
368
+ }
369
+ return;
370
+ }
371
+ // Token expiring soon, refresh now
372
+ if (this.config.debug) {
373
+ const minutesUntilExpiry = Math.floor(timeUntilExpiry / 60000);
374
+ console.log(`Token expiring in ${minutesUntilExpiry} minutes, refreshing now...`);
375
+ }
376
+ await this.performRefresh();
377
+ this.lastRefreshTime = Date.now();
378
+ if (this.config.debug) {
379
+ console.log('Credentials refreshed (expiration-based)');
380
+ }
381
+ }
382
+ catch (error) {
383
+ // Token parsing failed, fall back to time-based if hybrid
384
+ if (this.config.debug) {
385
+ console.warn('Failed to parse token for expiration check:', error.message);
386
+ }
387
+ throw error;
388
+ }
389
+ }
390
+ /**
391
+ * Perform actual refresh operation
392
+ */
393
+ async performRefresh() {
394
+ await this.refreshClient.refreshCredentials(this.gsessionId || undefined);
395
+ }
396
+ /**
397
+ * Stop auto-refresh
398
+ */
399
+ stop() {
400
+ if (this.timeIntervalId) {
401
+ clearInterval(this.timeIntervalId);
402
+ this.timeIntervalId = null;
403
+ }
404
+ if (this.checkIntervalId) {
405
+ clearInterval(this.checkIntervalId);
406
+ this.checkIntervalId = null;
407
+ }
408
+ this.running = false;
409
+ if (this.config.debug) {
410
+ console.log('Auto-refresh stopped');
411
+ }
412
+ }
413
+ /**
414
+ * Check if auto-refresh is running
415
+ */
416
+ isRunning() {
417
+ return this.running;
418
+ }
419
+ /**
420
+ * Manually trigger a refresh
421
+ */
422
+ async refresh() {
423
+ await this.performRefresh();
424
+ this.lastRefreshTime = Date.now();
425
+ }
426
+ /**
427
+ * Get last refresh time
428
+ */
429
+ getLastRefreshTime() {
430
+ return this.lastRefreshTime;
431
+ }
432
+ }
433
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/auth/refresh.ts"],"names":[],"mappings":"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"}