@roomi-fields/notebooklm-mcp 1.1.2
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 -0
- package/README.md +548 -0
- package/dist/auth/auth-manager.d.ts +139 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +981 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/config.d.ts +89 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +216 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/http-wrapper.d.ts +8 -0
- package/dist/http-wrapper.d.ts.map +1 -0
- package/dist/http-wrapper.js +221 -0
- package/dist/http-wrapper.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +499 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +81 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +362 -0
- package/dist/library/notebook-library.js.map +1 -0
- package/dist/library/types.d.ts +67 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +8 -0
- package/dist/library/types.js.map +1 -0
- package/dist/session/browser-session.d.ts +108 -0
- package/dist/session/browser-session.d.ts.map +1 -0
- package/dist/session/browser-session.js +630 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +76 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +273 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/shared-context-manager.d.ts +107 -0
- package/dist/session/shared-context-manager.d.ts.map +1 -0
- package/dist/session/shared-context-manager.js +447 -0
- package/dist/session/shared-context-manager.js.map +1 -0
- package/dist/tools/index.d.ts +225 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1396 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +133 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +673 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/page-utils.d.ts +54 -0
- package/dist/utils/page-utils.d.ts.map +1 -0
- package/dist/utils/page-utils.js +422 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/stealth-utils.d.ts +135 -0
- package/dist/utils/stealth-utils.d.ts.map +1 -0
- package/dist/utils/stealth-utils.js +398 -0
- package/dist/utils/stealth-utils.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotebookLM Library Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages a persistent library of NotebookLM notebooks.
|
|
5
|
+
* Allows Claude to autonomously add, remove, and switch between
|
|
6
|
+
* multiple notebooks based on the task at hand.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "fs";
|
|
9
|
+
import path from "path";
|
|
10
|
+
import { CONFIG } from "../config.js";
|
|
11
|
+
import { log } from "../utils/logger.js";
|
|
12
|
+
export class NotebookLibrary {
|
|
13
|
+
libraryPath;
|
|
14
|
+
library;
|
|
15
|
+
sessionManager;
|
|
16
|
+
constructor(sessionManager) {
|
|
17
|
+
this.sessionManager = sessionManager;
|
|
18
|
+
this.libraryPath = path.join(CONFIG.dataDir, "library.json");
|
|
19
|
+
this.library = this.loadLibrary();
|
|
20
|
+
log.info("📚 NotebookLibrary initialized");
|
|
21
|
+
log.info(` Library path: ${this.libraryPath}`);
|
|
22
|
+
log.info(` Notebooks: ${this.library.notebooks.length}`);
|
|
23
|
+
if (this.library.active_notebook_id) {
|
|
24
|
+
log.info(` Active: ${this.library.active_notebook_id}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load library from disk, or create default if not exists
|
|
29
|
+
*/
|
|
30
|
+
loadLibrary() {
|
|
31
|
+
try {
|
|
32
|
+
if (fs.existsSync(this.libraryPath)) {
|
|
33
|
+
const data = fs.readFileSync(this.libraryPath, "utf-8");
|
|
34
|
+
const library = JSON.parse(data);
|
|
35
|
+
log.success(` ✅ Loaded library with ${library.notebooks.length} notebooks`);
|
|
36
|
+
return library;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
log.warning(` ⚠️ Failed to load library: ${error}`);
|
|
41
|
+
}
|
|
42
|
+
// Create default library with current CONFIG as first entry
|
|
43
|
+
log.info(" 🆕 Creating new library...");
|
|
44
|
+
const defaultLibrary = this.createDefaultLibrary();
|
|
45
|
+
this.saveLibrary(defaultLibrary);
|
|
46
|
+
return defaultLibrary;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create default library from current CONFIG
|
|
50
|
+
*/
|
|
51
|
+
createDefaultLibrary() {
|
|
52
|
+
const hasConfig = CONFIG.notebookUrl &&
|
|
53
|
+
CONFIG.notebookDescription &&
|
|
54
|
+
CONFIG.notebookDescription !== "General knowledge base - configure NOTEBOOK_DESCRIPTION to help Claude understand what's in this notebook";
|
|
55
|
+
const notebooks = [];
|
|
56
|
+
if (hasConfig) {
|
|
57
|
+
// Create first entry from CONFIG
|
|
58
|
+
const id = this.generateId(CONFIG.notebookDescription);
|
|
59
|
+
notebooks.push({
|
|
60
|
+
id,
|
|
61
|
+
url: CONFIG.notebookUrl,
|
|
62
|
+
name: CONFIG.notebookDescription.substring(0, 50), // First 50 chars as name
|
|
63
|
+
description: CONFIG.notebookDescription,
|
|
64
|
+
topics: CONFIG.notebookTopics,
|
|
65
|
+
content_types: CONFIG.notebookContentTypes,
|
|
66
|
+
use_cases: CONFIG.notebookUseCases,
|
|
67
|
+
added_at: new Date().toISOString(),
|
|
68
|
+
last_used: new Date().toISOString(),
|
|
69
|
+
use_count: 0,
|
|
70
|
+
tags: [],
|
|
71
|
+
});
|
|
72
|
+
log.success(` ✅ Created default notebook: ${id}`);
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
notebooks,
|
|
76
|
+
active_notebook_id: notebooks.length > 0 ? notebooks[0].id : null,
|
|
77
|
+
last_modified: new Date().toISOString(),
|
|
78
|
+
version: "1.0.0",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Save library to disk
|
|
83
|
+
*/
|
|
84
|
+
saveLibrary(library) {
|
|
85
|
+
try {
|
|
86
|
+
library.last_modified = new Date().toISOString();
|
|
87
|
+
const data = JSON.stringify(library, null, 2);
|
|
88
|
+
fs.writeFileSync(this.libraryPath, data, "utf-8");
|
|
89
|
+
this.library = library;
|
|
90
|
+
log.success(` 💾 Library saved (${library.notebooks.length} notebooks)`);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
log.error(` ❌ Failed to save library: ${error}`);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Generate a unique ID from a string (slug format)
|
|
99
|
+
*/
|
|
100
|
+
generateId(name) {
|
|
101
|
+
const base = name
|
|
102
|
+
.toLowerCase()
|
|
103
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
104
|
+
.replace(/^-+|-+$/g, "")
|
|
105
|
+
.substring(0, 30);
|
|
106
|
+
// Ensure uniqueness
|
|
107
|
+
let id = base;
|
|
108
|
+
let counter = 1;
|
|
109
|
+
while (this.library.notebooks.some((n) => n.id === id)) {
|
|
110
|
+
id = `${base}-${counter}`;
|
|
111
|
+
counter++;
|
|
112
|
+
}
|
|
113
|
+
return id;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Add a new notebook to the library
|
|
117
|
+
*/
|
|
118
|
+
async addNotebook(input) {
|
|
119
|
+
log.info(`📝 Adding notebook: ${input.name}`);
|
|
120
|
+
// Check if a notebook with this name already exists
|
|
121
|
+
const existingWithSameName = this.library.notebooks.find((n) => n.name.toLowerCase() === input.name.toLowerCase());
|
|
122
|
+
if (existingWithSameName) {
|
|
123
|
+
throw new Error(`A notebook with the name '${input.name}' already exists.\n\n` +
|
|
124
|
+
`Existing notebook ID: ${existingWithSameName.id}\n` +
|
|
125
|
+
`URL: ${existingWithSameName.url}\n\n` +
|
|
126
|
+
`Please use a different name, or update the existing notebook instead.\n` +
|
|
127
|
+
`To update: PUT /notebooks/${existingWithSameName.id} with new data\n` +
|
|
128
|
+
`To delete: DELETE /notebooks/${existingWithSameName.id}`);
|
|
129
|
+
}
|
|
130
|
+
// Validate URL format
|
|
131
|
+
if (!this.isValidNotebookUrl(input.url)) {
|
|
132
|
+
throw new Error(`Invalid NotebookLM URL: ${input.url}\n\n` +
|
|
133
|
+
`Expected format: https://notebooklm.google.com/notebook/[notebook-id]\n\n` +
|
|
134
|
+
`Example: https://notebooklm.google.com/notebook/abc-123-def-456\n\n` +
|
|
135
|
+
`To get the URL:\n` +
|
|
136
|
+
`1. Go to https://notebooklm.google.com\n` +
|
|
137
|
+
`2. Open your notebook\n` +
|
|
138
|
+
`3. Copy the URL from the address bar`);
|
|
139
|
+
}
|
|
140
|
+
// Validate notebook exists (live check)
|
|
141
|
+
await this.validateNotebookExists(input.url);
|
|
142
|
+
// Generate ID
|
|
143
|
+
const id = this.generateId(input.name);
|
|
144
|
+
// Create entry
|
|
145
|
+
const notebook = {
|
|
146
|
+
id,
|
|
147
|
+
url: input.url,
|
|
148
|
+
name: input.name,
|
|
149
|
+
description: input.description,
|
|
150
|
+
topics: input.topics,
|
|
151
|
+
content_types: input.content_types || ["documentation", "examples"],
|
|
152
|
+
use_cases: input.use_cases || [
|
|
153
|
+
`Learning about ${input.name}`,
|
|
154
|
+
`Implementing features with ${input.name}`,
|
|
155
|
+
],
|
|
156
|
+
added_at: new Date().toISOString(),
|
|
157
|
+
last_used: new Date().toISOString(),
|
|
158
|
+
use_count: 0,
|
|
159
|
+
tags: input.tags || [],
|
|
160
|
+
};
|
|
161
|
+
// Add to library
|
|
162
|
+
const updated = { ...this.library };
|
|
163
|
+
updated.notebooks.push(notebook);
|
|
164
|
+
// Set as active if it's the first notebook
|
|
165
|
+
if (updated.notebooks.length === 1) {
|
|
166
|
+
updated.active_notebook_id = id;
|
|
167
|
+
}
|
|
168
|
+
this.saveLibrary(updated);
|
|
169
|
+
log.success(`✅ Notebook added: ${id}`);
|
|
170
|
+
return notebook;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Validate NotebookLM URL format
|
|
174
|
+
*/
|
|
175
|
+
isValidNotebookUrl(url) {
|
|
176
|
+
try {
|
|
177
|
+
const urlObj = new URL(url);
|
|
178
|
+
return (urlObj.hostname === "notebooklm.google.com" &&
|
|
179
|
+
urlObj.pathname.startsWith("/notebook/") &&
|
|
180
|
+
urlObj.pathname.length > "/notebook/".length);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Validate that the notebook exists and is accessible
|
|
188
|
+
* Opens the notebook briefly to check if it loads correctly
|
|
189
|
+
*/
|
|
190
|
+
async validateNotebookExists(url) {
|
|
191
|
+
if (!this.sessionManager) {
|
|
192
|
+
log.warning(" ⚠️ SessionManager not available, skipping live validation");
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
log.info(" 🔍 Validating notebook exists (creating temporary session)...");
|
|
196
|
+
const tempSessionId = `validate-${Date.now()}`;
|
|
197
|
+
try {
|
|
198
|
+
// Use SessionManager to create a session (which will validate the notebook)
|
|
199
|
+
await this.sessionManager.getOrCreateSession(tempSessionId, url, true // headless
|
|
200
|
+
);
|
|
201
|
+
log.success(" ✅ Notebook validated successfully!");
|
|
202
|
+
// Close the validation session immediately
|
|
203
|
+
await this.sessionManager.closeSession(tempSessionId);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (error instanceof Error) {
|
|
207
|
+
// Parse the error to give better feedback
|
|
208
|
+
const errorMsg = error.message;
|
|
209
|
+
if (errorMsg.includes("Could not find NotebookLM chat input")) {
|
|
210
|
+
throw new Error(`Invalid or inaccessible notebook.\n\n` +
|
|
211
|
+
`URL: ${url}\n\n` +
|
|
212
|
+
`The notebook page loaded but the chat interface was not found.\n` +
|
|
213
|
+
`This usually means:\n` +
|
|
214
|
+
`- The notebook doesn't exist\n` +
|
|
215
|
+
`- You don't have access to this notebook\n` +
|
|
216
|
+
`- The notebook ID in the URL is incorrect\n\n` +
|
|
217
|
+
`Please verify the URL by:\n` +
|
|
218
|
+
`1. Go to https://notebooklm.google.com\n` +
|
|
219
|
+
`2. Open the notebook manually\n` +
|
|
220
|
+
`3. Copy the exact URL from the address bar`);
|
|
221
|
+
}
|
|
222
|
+
throw new Error(`Failed to validate notebook:\n${errorMsg}\n\n` +
|
|
223
|
+
`Please verify:\n` +
|
|
224
|
+
`1. The URL is correct: ${url}\n` +
|
|
225
|
+
`2. You have access to this notebook\n` +
|
|
226
|
+
`3. You are authenticated (run setup-auth if needed)`);
|
|
227
|
+
}
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* List all notebooks in library
|
|
233
|
+
*/
|
|
234
|
+
listNotebooks() {
|
|
235
|
+
return this.library.notebooks;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get a specific notebook by ID
|
|
239
|
+
*/
|
|
240
|
+
getNotebook(id) {
|
|
241
|
+
return this.library.notebooks.find((n) => n.id === id) || null;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get the currently active notebook
|
|
245
|
+
*/
|
|
246
|
+
getActiveNotebook() {
|
|
247
|
+
if (!this.library.active_notebook_id) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
return this.getNotebook(this.library.active_notebook_id);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Select a notebook as active
|
|
254
|
+
*/
|
|
255
|
+
selectNotebook(id) {
|
|
256
|
+
const notebook = this.getNotebook(id);
|
|
257
|
+
if (!notebook) {
|
|
258
|
+
throw new Error(`Notebook not found: ${id}`);
|
|
259
|
+
}
|
|
260
|
+
log.info(`🎯 Selecting notebook: ${id}`);
|
|
261
|
+
const updated = { ...this.library };
|
|
262
|
+
updated.active_notebook_id = id;
|
|
263
|
+
// Update last_used
|
|
264
|
+
const notebookIndex = updated.notebooks.findIndex((n) => n.id === id);
|
|
265
|
+
updated.notebooks[notebookIndex] = {
|
|
266
|
+
...notebook,
|
|
267
|
+
last_used: new Date().toISOString(),
|
|
268
|
+
};
|
|
269
|
+
this.saveLibrary(updated);
|
|
270
|
+
log.success(`✅ Active notebook: ${id}`);
|
|
271
|
+
return updated.notebooks[notebookIndex];
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Update notebook metadata
|
|
275
|
+
*/
|
|
276
|
+
updateNotebook(input) {
|
|
277
|
+
const notebook = this.getNotebook(input.id);
|
|
278
|
+
if (!notebook) {
|
|
279
|
+
throw new Error(`Notebook not found: ${input.id}`);
|
|
280
|
+
}
|
|
281
|
+
log.info(`📝 Updating notebook: ${input.id}`);
|
|
282
|
+
const updated = { ...this.library };
|
|
283
|
+
const index = updated.notebooks.findIndex((n) => n.id === input.id);
|
|
284
|
+
updated.notebooks[index] = {
|
|
285
|
+
...notebook,
|
|
286
|
+
...(input.name && { name: input.name }),
|
|
287
|
+
...(input.description && { description: input.description }),
|
|
288
|
+
...(input.topics && { topics: input.topics }),
|
|
289
|
+
...(input.content_types && { content_types: input.content_types }),
|
|
290
|
+
...(input.use_cases && { use_cases: input.use_cases }),
|
|
291
|
+
...(input.tags && { tags: input.tags }),
|
|
292
|
+
...(input.url && { url: input.url }),
|
|
293
|
+
};
|
|
294
|
+
this.saveLibrary(updated);
|
|
295
|
+
log.success(`✅ Notebook updated: ${input.id}`);
|
|
296
|
+
return updated.notebooks[index];
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Remove notebook from library
|
|
300
|
+
*/
|
|
301
|
+
removeNotebook(id) {
|
|
302
|
+
const notebook = this.getNotebook(id);
|
|
303
|
+
if (!notebook) {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
log.info(`🗑️ Removing notebook: ${id}`);
|
|
307
|
+
const updated = { ...this.library };
|
|
308
|
+
updated.notebooks = updated.notebooks.filter((n) => n.id !== id);
|
|
309
|
+
// If we removed the active notebook, select another one
|
|
310
|
+
if (updated.active_notebook_id === id) {
|
|
311
|
+
updated.active_notebook_id =
|
|
312
|
+
updated.notebooks.length > 0 ? updated.notebooks[0].id : null;
|
|
313
|
+
}
|
|
314
|
+
this.saveLibrary(updated);
|
|
315
|
+
log.success(`✅ Notebook removed: ${id}`);
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Increment use count for a notebook
|
|
320
|
+
*/
|
|
321
|
+
incrementUseCount(id) {
|
|
322
|
+
const notebookIndex = this.library.notebooks.findIndex((n) => n.id === id);
|
|
323
|
+
if (notebookIndex === -1) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
const notebook = this.library.notebooks[notebookIndex];
|
|
327
|
+
const updated = { ...this.library };
|
|
328
|
+
const updatedNotebook = {
|
|
329
|
+
...notebook,
|
|
330
|
+
use_count: notebook.use_count + 1,
|
|
331
|
+
last_used: new Date().toISOString(),
|
|
332
|
+
};
|
|
333
|
+
updated.notebooks[notebookIndex] = updatedNotebook;
|
|
334
|
+
this.saveLibrary(updated);
|
|
335
|
+
return updatedNotebook;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get library statistics
|
|
339
|
+
*/
|
|
340
|
+
getStats() {
|
|
341
|
+
const totalQueries = this.library.notebooks.reduce((sum, n) => sum + n.use_count, 0);
|
|
342
|
+
const mostUsed = this.library.notebooks.reduce((max, n) => n.use_count > (max?.use_count || 0) ? n : max, null);
|
|
343
|
+
return {
|
|
344
|
+
total_notebooks: this.library.notebooks.length,
|
|
345
|
+
active_notebook: this.library.active_notebook_id,
|
|
346
|
+
most_used_notebook: mostUsed?.id || null,
|
|
347
|
+
total_queries: totalQueries,
|
|
348
|
+
last_modified: this.library.last_modified,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Search notebooks by query (searches name, description, topics)
|
|
353
|
+
*/
|
|
354
|
+
searchNotebooks(query) {
|
|
355
|
+
const lowerQuery = query.toLowerCase();
|
|
356
|
+
return this.library.notebooks.filter((n) => n.name.toLowerCase().includes(lowerQuery) ||
|
|
357
|
+
n.description.toLowerCase().includes(lowerQuery) ||
|
|
358
|
+
n.topics.some((t) => t.toLowerCase().includes(lowerQuery)) ||
|
|
359
|
+
n.tags?.some((t) => t.toLowerCase().includes(lowerQuery)));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=notebook-library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-library.js","sourceRoot":"","sources":["../../src/library/notebook-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotebookLM Library Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the structure for managing multiple NotebookLM notebooks
|
|
5
|
+
* in a persistent library that Claude can manage autonomously.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Single notebook entry in the library
|
|
9
|
+
*/
|
|
10
|
+
export interface NotebookEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
url: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
topics: string[];
|
|
16
|
+
content_types: string[];
|
|
17
|
+
use_cases: string[];
|
|
18
|
+
added_at: string;
|
|
19
|
+
last_used: string;
|
|
20
|
+
use_count: number;
|
|
21
|
+
tags?: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The complete notebook library
|
|
25
|
+
*/
|
|
26
|
+
export interface Library {
|
|
27
|
+
notebooks: NotebookEntry[];
|
|
28
|
+
active_notebook_id: string | null;
|
|
29
|
+
last_modified: string;
|
|
30
|
+
version: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Input for adding a new notebook
|
|
34
|
+
*/
|
|
35
|
+
export interface AddNotebookInput {
|
|
36
|
+
url: string;
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
topics: string[];
|
|
40
|
+
content_types?: string[];
|
|
41
|
+
use_cases?: string[];
|
|
42
|
+
tags?: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Input for updating a notebook
|
|
46
|
+
*/
|
|
47
|
+
export interface UpdateNotebookInput {
|
|
48
|
+
id: string;
|
|
49
|
+
name?: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
topics?: string[];
|
|
52
|
+
content_types?: string[];
|
|
53
|
+
use_cases?: string[];
|
|
54
|
+
tags?: string[];
|
|
55
|
+
url?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Statistics about library usage
|
|
59
|
+
*/
|
|
60
|
+
export interface LibraryStats {
|
|
61
|
+
total_notebooks: number;
|
|
62
|
+
active_notebook: string | null;
|
|
63
|
+
most_used_notebook: string | null;
|
|
64
|
+
total_queries: number;
|
|
65
|
+
last_modified: string;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IAGpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAGlB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Session
|
|
3
|
+
*
|
|
4
|
+
* Represents a single browser session for NotebookLM interactions.
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Human-like question typing
|
|
8
|
+
* - Streaming response detection
|
|
9
|
+
* - Auto-login on session expiry
|
|
10
|
+
* - Session activity tracking
|
|
11
|
+
* - Chat history reset
|
|
12
|
+
*
|
|
13
|
+
* Based on the Python implementation from browser_session.py
|
|
14
|
+
*/
|
|
15
|
+
import type { Page } from "patchright";
|
|
16
|
+
import { SharedContextManager } from "./shared-context-manager.js";
|
|
17
|
+
import { AuthManager } from "../auth/auth-manager.js";
|
|
18
|
+
import type { SessionInfo, ProgressCallback } from "../types.js";
|
|
19
|
+
export declare class BrowserSession {
|
|
20
|
+
readonly sessionId: string;
|
|
21
|
+
readonly notebookUrl: string;
|
|
22
|
+
readonly createdAt: number;
|
|
23
|
+
lastActivity: number;
|
|
24
|
+
messageCount: number;
|
|
25
|
+
private context;
|
|
26
|
+
private sharedContextManager;
|
|
27
|
+
private authManager;
|
|
28
|
+
private page;
|
|
29
|
+
private initialized;
|
|
30
|
+
constructor(sessionId: string, sharedContextManager: SharedContextManager, authManager: AuthManager, notebookUrl: string);
|
|
31
|
+
/**
|
|
32
|
+
* Initialize the session by creating a page and navigating to the notebook
|
|
33
|
+
*/
|
|
34
|
+
init(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Wait for NotebookLM interface to be ready
|
|
37
|
+
*
|
|
38
|
+
* IMPORTANT: Matches Python implementation EXACTLY!
|
|
39
|
+
* - Uses SPECIFIC selectors (textarea.query-box-input)
|
|
40
|
+
* - Checks ONLY for "visible" state (NOT disabled!)
|
|
41
|
+
* - NO placeholder checks (let NotebookLM handle that!)
|
|
42
|
+
*
|
|
43
|
+
* Based on Python _wait_for_ready() from browser_session.py:104-113
|
|
44
|
+
*/
|
|
45
|
+
private waitForNotebookLMReady;
|
|
46
|
+
private isPageClosedSafe;
|
|
47
|
+
/**
|
|
48
|
+
* Ensure the session is authenticated, perform auto-login if needed
|
|
49
|
+
*/
|
|
50
|
+
private ensureAuthenticated;
|
|
51
|
+
private getOriginFromUrl;
|
|
52
|
+
/**
|
|
53
|
+
* Safely restore sessionStorage when the page is on the expected origin
|
|
54
|
+
*/
|
|
55
|
+
private restoreSessionStorage;
|
|
56
|
+
/**
|
|
57
|
+
* Ask a question to NotebookLM
|
|
58
|
+
*/
|
|
59
|
+
ask(question: string, sendProgress?: ProgressCallback): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Find the chat input element
|
|
62
|
+
*
|
|
63
|
+
* IMPORTANT: Matches Python implementation EXACTLY!
|
|
64
|
+
* - Uses SPECIFIC selectors from Python
|
|
65
|
+
* - Checks ONLY visibility (NOT disabled state!)
|
|
66
|
+
*
|
|
67
|
+
* Based on Python ask() method from browser_session.py:166-171
|
|
68
|
+
*/
|
|
69
|
+
private findChatInput;
|
|
70
|
+
/**
|
|
71
|
+
* Detect if a rate limit error occurred
|
|
72
|
+
*
|
|
73
|
+
* Searches the page for error messages indicating rate limit/quota exhaustion.
|
|
74
|
+
* Free NotebookLM accounts have 50 queries/day limit.
|
|
75
|
+
*
|
|
76
|
+
* @returns true if rate limit error detected, false otherwise
|
|
77
|
+
*/
|
|
78
|
+
private detectRateLimitError;
|
|
79
|
+
/**
|
|
80
|
+
* Reset the chat history (start a new conversation)
|
|
81
|
+
*/
|
|
82
|
+
reset(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Close the session
|
|
85
|
+
*/
|
|
86
|
+
close(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Update last activity timestamp
|
|
89
|
+
*/
|
|
90
|
+
updateActivity(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Check if session has expired (inactive for too long)
|
|
93
|
+
*/
|
|
94
|
+
isExpired(timeoutSeconds: number): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Get session information
|
|
97
|
+
*/
|
|
98
|
+
getInfo(): SessionInfo;
|
|
99
|
+
/**
|
|
100
|
+
* Get the underlying page (for advanced operations)
|
|
101
|
+
*/
|
|
102
|
+
getPage(): Page | null;
|
|
103
|
+
/**
|
|
104
|
+
* Check if session is initialized
|
|
105
|
+
*/
|
|
106
|
+
isInitialized(): boolean;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=browser-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../src/session/browser-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAkB,IAAI,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQtD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGjE,qBAAa,cAAc;IACzB,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,SAAS,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,WAAW,CAAkB;gBAGnC,SAAS,EAAE,MAAM,EACjB,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM;IAarB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoF3B;;;;;;;;;OASG;YACW,sBAAsB;IAyCpC,OAAO,CAAC,gBAAgB;IAexB;;OAEG;YACW,mBAAmB;IAwEjC,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;YACW,qBAAqB;IA8DnC;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IA6G7E;;;;;;;;OAQG;YACW,aAAa;IA+B3B;;;;;;;OAOG;YACW,oBAAoB;IAuFlC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAK1C;;OAEG;IACH,OAAO,IAAI,WAAW;IAatB;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI;IAItB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
|