@pan-sec/notebooklm-mcp 1.6.0 โ 1.8.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/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/events/event-emitter.d.ts +45 -0
- package/dist/events/event-emitter.d.ts.map +1 -0
- package/dist/events/event-emitter.js +100 -0
- package/dist/events/event-emitter.js.map +1 -0
- package/dist/events/event-types.d.ts +124 -0
- package/dist/events/event-types.d.ts.map +1 -0
- package/dist/events/event-types.js +18 -0
- package/dist/events/event-types.js.map +1 -0
- package/dist/gemini/gemini-client.d.ts +45 -0
- package/dist/gemini/gemini-client.d.ts.map +1 -0
- package/dist/gemini/gemini-client.js +211 -0
- package/dist/gemini/gemini-client.js.map +1 -0
- package/dist/gemini/index.d.ts +8 -0
- package/dist/gemini/index.d.ts.map +1 -0
- package/dist/gemini/index.js +8 -0
- package/dist/gemini/index.js.map +1 -0
- package/dist/gemini/types.d.ts +136 -0
- package/dist/gemini/types.d.ts.map +1 -0
- package/dist/gemini/types.js +10 -0
- package/dist/gemini/types.js.map +1 -0
- package/dist/index.js +76 -3
- package/dist/index.js.map +1 -1
- package/dist/library/notebook-library.d.ts +25 -2
- package/dist/library/notebook-library.d.ts.map +1 -1
- package/dist/library/notebook-library.js +142 -2
- package/dist/library/notebook-library.js.map +1 -1
- package/dist/library/types.d.ts +15 -0
- package/dist/library/types.d.ts.map +1 -1
- package/dist/notebook-creation/audio-manager.d.ts +56 -0
- package/dist/notebook-creation/audio-manager.d.ts.map +1 -0
- package/dist/notebook-creation/audio-manager.js +335 -0
- package/dist/notebook-creation/audio-manager.js.map +1 -0
- package/dist/notebook-creation/discover-creation-flow.d.ts +8 -0
- package/dist/notebook-creation/discover-creation-flow.d.ts.map +1 -0
- package/dist/notebook-creation/discover-creation-flow.js +177 -0
- package/dist/notebook-creation/discover-creation-flow.js.map +1 -0
- package/dist/notebook-creation/discover-quota.d.ts +8 -0
- package/dist/notebook-creation/discover-quota.d.ts.map +1 -0
- package/dist/notebook-creation/discover-quota.js +195 -0
- package/dist/notebook-creation/discover-quota.js.map +1 -0
- package/dist/notebook-creation/discover-source-dialog.d.ts +8 -0
- package/dist/notebook-creation/discover-source-dialog.d.ts.map +1 -0
- package/dist/notebook-creation/discover-source-dialog.js +134 -0
- package/dist/notebook-creation/discover-source-dialog.js.map +1 -0
- package/dist/notebook-creation/discover-sources.d.ts +8 -0
- package/dist/notebook-creation/discover-sources.d.ts.map +1 -0
- package/dist/notebook-creation/discover-sources.js +273 -0
- package/dist/notebook-creation/discover-sources.js.map +1 -0
- package/dist/notebook-creation/discover-text-input.d.ts +7 -0
- package/dist/notebook-creation/discover-text-input.d.ts.map +1 -0
- package/dist/notebook-creation/discover-text-input.js +135 -0
- package/dist/notebook-creation/discover-text-input.js.map +1 -0
- package/dist/notebook-creation/index.d.ts +12 -0
- package/dist/notebook-creation/index.d.ts.map +1 -0
- package/dist/notebook-creation/index.js +12 -0
- package/dist/notebook-creation/index.js.map +1 -0
- package/dist/notebook-creation/notebook-creator.d.ts +95 -0
- package/dist/notebook-creation/notebook-creator.d.ts.map +1 -0
- package/dist/notebook-creation/notebook-creator.js +689 -0
- package/dist/notebook-creation/notebook-creator.js.map +1 -0
- package/dist/notebook-creation/notebook-sync.d.ts +93 -0
- package/dist/notebook-creation/notebook-sync.d.ts.map +1 -0
- package/dist/notebook-creation/notebook-sync.js +370 -0
- package/dist/notebook-creation/notebook-sync.js.map +1 -0
- package/dist/notebook-creation/run-discovery.d.ts +11 -0
- package/dist/notebook-creation/run-discovery.d.ts.map +1 -0
- package/dist/notebook-creation/run-discovery.js +151 -0
- package/dist/notebook-creation/run-discovery.js.map +1 -0
- package/dist/notebook-creation/selector-discovery.d.ts +65 -0
- package/dist/notebook-creation/selector-discovery.d.ts.map +1 -0
- package/dist/notebook-creation/selector-discovery.js +421 -0
- package/dist/notebook-creation/selector-discovery.js.map +1 -0
- package/dist/notebook-creation/selectors.d.ts +150 -0
- package/dist/notebook-creation/selectors.d.ts.map +1 -0
- package/dist/notebook-creation/selectors.js +225 -0
- package/dist/notebook-creation/selectors.js.map +1 -0
- package/dist/notebook-creation/source-manager.d.ts +73 -0
- package/dist/notebook-creation/source-manager.d.ts.map +1 -0
- package/dist/notebook-creation/source-manager.js +486 -0
- package/dist/notebook-creation/source-manager.js.map +1 -0
- package/dist/notebook-creation/test-create.d.ts +8 -0
- package/dist/notebook-creation/test-create.d.ts.map +1 -0
- package/dist/notebook-creation/test-create.js +72 -0
- package/dist/notebook-creation/test-create.js.map +1 -0
- package/dist/notebook-creation/types.d.ts +173 -0
- package/dist/notebook-creation/types.d.ts.map +1 -0
- package/dist/notebook-creation/types.js +5 -0
- package/dist/notebook-creation/types.js.map +1 -0
- package/dist/quota/index.d.ts +8 -0
- package/dist/quota/index.d.ts.map +1 -0
- package/dist/quota/index.js +8 -0
- package/dist/quota/index.js.map +1 -0
- package/dist/quota/quota-manager.d.ts +125 -0
- package/dist/quota/quota-manager.d.ts.map +1 -0
- package/dist/quota/quota-manager.js +330 -0
- package/dist/quota/quota-manager.js.map +1 -0
- package/dist/session/session-manager.d.ts +5 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +6 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/tools/definitions/gemini.d.ts +12 -0
- package/dist/tools/definitions/gemini.d.ts.map +1 -0
- package/dist/tools/definitions/gemini.js +135 -0
- package/dist/tools/definitions/gemini.js.map +1 -0
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
- package/dist/tools/definitions/notebook-management.js +525 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -1
- package/dist/tools/definitions/system.d.ts.map +1 -1
- package/dist/tools/definitions/system.js +158 -0
- package/dist/tools/definitions/system.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +2 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +257 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +1097 -0
- package/dist/tools/handlers.js.map +1 -1
- package/dist/webhooks/index.d.ts +8 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +8 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/types.d.ts +57 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/types.js +5 -0
- package/dist/webhooks/types.js.map +1 -0
- package/dist/webhooks/webhook-dispatcher.d.ts +120 -0
- package/dist/webhooks/webhook-dispatcher.d.ts.map +1 -0
- package/dist/webhooks/webhook-dispatcher.js +519 -0
- package/dist/webhooks/webhook-dispatcher.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages sources within NotebookLM notebooks (list, add, remove).
|
|
5
|
+
*/
|
|
6
|
+
import { log } from "../utils/logger.js";
|
|
7
|
+
import { randomDelay, humanType } from "../utils/stealth-utils.js";
|
|
8
|
+
import { NOTEBOOKLM_SELECTORS } from "./selectors.js";
|
|
9
|
+
export class SourceManager {
|
|
10
|
+
authManager;
|
|
11
|
+
contextManager;
|
|
12
|
+
page = null;
|
|
13
|
+
constructor(authManager, contextManager) {
|
|
14
|
+
this.authManager = authManager;
|
|
15
|
+
this.contextManager = contextManager;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Navigate to a notebook and ensure we're on the right page
|
|
19
|
+
*/
|
|
20
|
+
async navigateToNotebook(notebookUrl) {
|
|
21
|
+
const context = await this.contextManager.getOrCreateContext(true);
|
|
22
|
+
const isAuth = await this.authManager.validateCookiesExpiry(context);
|
|
23
|
+
if (!isAuth) {
|
|
24
|
+
throw new Error("Not authenticated. Run setup_auth first.");
|
|
25
|
+
}
|
|
26
|
+
this.page = await context.newPage();
|
|
27
|
+
await this.page.goto(notebookUrl, { waitUntil: "domcontentloaded" });
|
|
28
|
+
await this.page.waitForLoadState("networkidle").catch(() => { });
|
|
29
|
+
await randomDelay(1500, 2500);
|
|
30
|
+
return this.page;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* List all sources in a notebook
|
|
34
|
+
*/
|
|
35
|
+
async listSources(notebookUrl) {
|
|
36
|
+
log.info(`๐ Listing sources for: ${notebookUrl}`);
|
|
37
|
+
const page = await this.navigateToNotebook(notebookUrl);
|
|
38
|
+
try {
|
|
39
|
+
// Wait for the sources panel to load
|
|
40
|
+
await page.waitForTimeout(2000);
|
|
41
|
+
// Extract source information from the page
|
|
42
|
+
const sources = await page.evaluate(() => {
|
|
43
|
+
const results = [];
|
|
44
|
+
// Look for source items in the sidebar/sources panel
|
|
45
|
+
// Common patterns in NotebookLM:
|
|
46
|
+
// - mat-list-item elements
|
|
47
|
+
// - Elements with source-related classes
|
|
48
|
+
// - Elements within a sources container
|
|
49
|
+
const sourceSelectors = [
|
|
50
|
+
'mat-list-item',
|
|
51
|
+
'[class*="source-item"]',
|
|
52
|
+
'[class*="source-card"]',
|
|
53
|
+
'[role="listitem"]',
|
|
54
|
+
'.sources-list > *',
|
|
55
|
+
];
|
|
56
|
+
for (const selector of sourceSelectors) {
|
|
57
|
+
// @ts-expect-error - DOM types
|
|
58
|
+
const items = document.querySelectorAll(selector);
|
|
59
|
+
for (let i = 0; i < items.length; i++) {
|
|
60
|
+
const item = items[i];
|
|
61
|
+
const text = item.textContent?.trim() || "";
|
|
62
|
+
// Skip if it looks like a button or action item
|
|
63
|
+
if (text.length < 3 || text.toLowerCase().includes("add source"))
|
|
64
|
+
continue;
|
|
65
|
+
// Try to determine type from icons or classes
|
|
66
|
+
const classes = item.className || "";
|
|
67
|
+
const hasUrlIcon = classes.includes("link") || classes.includes("web") ||
|
|
68
|
+
text.includes("http") || text.includes(".com");
|
|
69
|
+
const hasFileIcon = classes.includes("file") || classes.includes("pdf") ||
|
|
70
|
+
classes.includes("doc");
|
|
71
|
+
const hasDriveIcon = classes.includes("drive") || classes.includes("google");
|
|
72
|
+
let type = "unknown";
|
|
73
|
+
if (hasUrlIcon)
|
|
74
|
+
type = "url";
|
|
75
|
+
else if (hasFileIcon)
|
|
76
|
+
type = "file";
|
|
77
|
+
else if (hasDriveIcon)
|
|
78
|
+
type = "drive";
|
|
79
|
+
else
|
|
80
|
+
type = "text";
|
|
81
|
+
// Check for status indicators
|
|
82
|
+
const hasError = classes.includes("error") || classes.includes("failed");
|
|
83
|
+
const hasProcessing = classes.includes("processing") || classes.includes("loading");
|
|
84
|
+
let status = "ready";
|
|
85
|
+
if (hasError)
|
|
86
|
+
status = "failed";
|
|
87
|
+
else if (hasProcessing)
|
|
88
|
+
status = "processing";
|
|
89
|
+
results.push({
|
|
90
|
+
id: `source-${i}`,
|
|
91
|
+
title: text.substring(0, 100),
|
|
92
|
+
type,
|
|
93
|
+
status,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// If we found items with this selector, stop searching
|
|
97
|
+
if (results.length > 0)
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
});
|
|
102
|
+
log.success(` โ
Found ${sources.length} sources`);
|
|
103
|
+
return {
|
|
104
|
+
sources,
|
|
105
|
+
count: sources.length,
|
|
106
|
+
notebookUrl,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
await this.closePage();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Add a source to an existing notebook
|
|
115
|
+
*/
|
|
116
|
+
async addSource(notebookUrl, source) {
|
|
117
|
+
log.info(`โ Adding source to: ${notebookUrl}`);
|
|
118
|
+
log.info(` Type: ${source.type}, Value: ${source.value.substring(0, 50)}...`);
|
|
119
|
+
const page = await this.navigateToNotebook(notebookUrl);
|
|
120
|
+
try {
|
|
121
|
+
// Check if source dialog is already open (new/empty notebooks may auto-open it)
|
|
122
|
+
const dialogAlreadyOpen = await page.evaluate(() => {
|
|
123
|
+
// @ts-expect-error - DOM types
|
|
124
|
+
const uploadDialog = document.querySelector('upload-dialog, .cdk-overlay-container mat-dialog-container');
|
|
125
|
+
// @ts-expect-error - DOM types
|
|
126
|
+
const dropzone = document.querySelector('.dropzone__file-dialog-button, span[xapscottyuploadertrigger]');
|
|
127
|
+
return !!(uploadDialog || dropzone);
|
|
128
|
+
});
|
|
129
|
+
if (dialogAlreadyOpen) {
|
|
130
|
+
log.info(" ๐ Source dialog already open");
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Click "Add source" button to open dialog
|
|
134
|
+
log.info(" Opening source dialog...");
|
|
135
|
+
const addSourceBtn = await page.$(NOTEBOOKLM_SELECTORS.addSourceButton.primary);
|
|
136
|
+
if (!addSourceBtn) {
|
|
137
|
+
// Try fallbacks
|
|
138
|
+
for (const fallback of NOTEBOOKLM_SELECTORS.addSourceButton.fallbacks) {
|
|
139
|
+
const btn = await page.$(fallback);
|
|
140
|
+
if (btn) {
|
|
141
|
+
await btn.click();
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
await addSourceBtn.click();
|
|
148
|
+
}
|
|
149
|
+
await randomDelay(1000, 1500);
|
|
150
|
+
}
|
|
151
|
+
// Handle based on source type
|
|
152
|
+
if (source.type === "url") {
|
|
153
|
+
await this.addUrlSourceInternal(page, source.value);
|
|
154
|
+
}
|
|
155
|
+
else if (source.type === "text") {
|
|
156
|
+
await this.addTextSourceInternal(page, source.value, source.title);
|
|
157
|
+
}
|
|
158
|
+
else if (source.type === "file") {
|
|
159
|
+
await this.addFileSourceInternal(page, source.value);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
throw new Error(`Unsupported source type: ${source.type}`);
|
|
163
|
+
}
|
|
164
|
+
// Wait for processing
|
|
165
|
+
await this.waitForSourceProcessing(page);
|
|
166
|
+
log.success(` โ
Source added successfully`);
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
source: {
|
|
170
|
+
id: `source-new-${Date.now()}`,
|
|
171
|
+
title: source.title || source.value.substring(0, 50),
|
|
172
|
+
type: source.type,
|
|
173
|
+
status: "ready",
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
179
|
+
log.error(` โ Failed to add source: ${msg}`);
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
error: msg,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
await this.closePage();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Remove a source from a notebook
|
|
191
|
+
*/
|
|
192
|
+
async removeSource(notebookUrl, sourceId) {
|
|
193
|
+
log.info(`๐๏ธ Removing source ${sourceId} from: ${notebookUrl}`);
|
|
194
|
+
const page = await this.navigateToNotebook(notebookUrl);
|
|
195
|
+
try {
|
|
196
|
+
// Find the source item by index (sourceId format: "source-0", "source-1", etc.)
|
|
197
|
+
const indexMatch = sourceId.match(/source-(\d+)/);
|
|
198
|
+
if (!indexMatch) {
|
|
199
|
+
throw new Error(`Invalid source ID format: ${sourceId}`);
|
|
200
|
+
}
|
|
201
|
+
const sourceIndex = parseInt(indexMatch[1], 10);
|
|
202
|
+
// Find and click on the source to select it
|
|
203
|
+
const clicked = await page.evaluate((index) => {
|
|
204
|
+
const sourceSelectors = [
|
|
205
|
+
'mat-list-item',
|
|
206
|
+
'[class*="source-item"]',
|
|
207
|
+
'[role="listitem"]',
|
|
208
|
+
];
|
|
209
|
+
for (const selector of sourceSelectors) {
|
|
210
|
+
// @ts-expect-error - DOM types
|
|
211
|
+
const items = document.querySelectorAll(selector);
|
|
212
|
+
if (items.length > index) {
|
|
213
|
+
// Look for delete button within the item or select it
|
|
214
|
+
const item = items[index];
|
|
215
|
+
// Try to find delete button
|
|
216
|
+
const deleteBtn = item.querySelector('[aria-label*="delete" i], [aria-label*="remove" i], button[class*="delete"]');
|
|
217
|
+
if (deleteBtn) {
|
|
218
|
+
deleteBtn.click();
|
|
219
|
+
return "deleted";
|
|
220
|
+
}
|
|
221
|
+
// Otherwise click the item to select it
|
|
222
|
+
item.click();
|
|
223
|
+
return "selected";
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}, sourceIndex);
|
|
228
|
+
if (!clicked) {
|
|
229
|
+
throw new Error(`Source not found at index ${sourceIndex}`);
|
|
230
|
+
}
|
|
231
|
+
if (clicked === "selected") {
|
|
232
|
+
// Look for delete button in toolbar or context menu
|
|
233
|
+
await randomDelay(500, 800);
|
|
234
|
+
const deleted = await page.evaluate(() => {
|
|
235
|
+
// Look for delete button that appeared after selection
|
|
236
|
+
const deleteSelectors = [
|
|
237
|
+
'button[aria-label*="delete" i]',
|
|
238
|
+
'button[aria-label*="remove" i]',
|
|
239
|
+
'[class*="delete"]',
|
|
240
|
+
'[class*="trash"]',
|
|
241
|
+
];
|
|
242
|
+
for (const selector of deleteSelectors) {
|
|
243
|
+
// @ts-expect-error - DOM types
|
|
244
|
+
const btn = document.querySelector(selector);
|
|
245
|
+
if (btn && btn.offsetParent !== null) {
|
|
246
|
+
btn.click();
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
251
|
+
});
|
|
252
|
+
if (!deleted) {
|
|
253
|
+
throw new Error("Could not find delete button after selecting source");
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Confirm deletion if dialog appears
|
|
257
|
+
await randomDelay(500, 800);
|
|
258
|
+
await page.evaluate(() => {
|
|
259
|
+
// Look for confirm button in dialog
|
|
260
|
+
// @ts-expect-error - DOM types
|
|
261
|
+
const buttons = document.querySelectorAll("button");
|
|
262
|
+
for (const btn of buttons) {
|
|
263
|
+
const text = btn.textContent?.toLowerCase() || "";
|
|
264
|
+
if (text.includes("delete") || text.includes("remove") || text.includes("confirm")) {
|
|
265
|
+
btn.click();
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
});
|
|
271
|
+
await randomDelay(1000, 1500);
|
|
272
|
+
log.success(` โ
Source removed successfully`);
|
|
273
|
+
return {
|
|
274
|
+
success: true,
|
|
275
|
+
removedId: sourceId,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
280
|
+
log.error(` โ Failed to remove source: ${msg}`);
|
|
281
|
+
return {
|
|
282
|
+
success: false,
|
|
283
|
+
error: msg,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
await this.closePage();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Internal: Add URL source
|
|
292
|
+
*/
|
|
293
|
+
async addUrlSourceInternal(page, url) {
|
|
294
|
+
// Click URL/Website option
|
|
295
|
+
const urlOptionClicked = await page.evaluate(() => {
|
|
296
|
+
// @ts-expect-error - DOM types
|
|
297
|
+
const buttons = document.querySelectorAll("button, [role='button'], mat-chip");
|
|
298
|
+
for (const btn of buttons) {
|
|
299
|
+
const text = btn.textContent?.toLowerCase() || "";
|
|
300
|
+
const aria = btn.getAttribute("aria-label")?.toLowerCase() || "";
|
|
301
|
+
if (text.includes("website") || text.includes("url") || text.includes("link") ||
|
|
302
|
+
aria.includes("website") || aria.includes("discover")) {
|
|
303
|
+
btn.click();
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return false;
|
|
308
|
+
});
|
|
309
|
+
if (!urlOptionClicked) {
|
|
310
|
+
throw new Error("Could not find URL/Website source option");
|
|
311
|
+
}
|
|
312
|
+
await randomDelay(800, 1200);
|
|
313
|
+
// Find and fill URL input
|
|
314
|
+
const urlInput = await page.$('input[type="url"], input[type="text"][placeholder*="URL" i], input[placeholder*="http" i]');
|
|
315
|
+
if (!urlInput) {
|
|
316
|
+
throw new Error("Could not find URL input field");
|
|
317
|
+
}
|
|
318
|
+
await humanType(page, 'input[type="url"], input[type="text"]', url);
|
|
319
|
+
await randomDelay(500, 800);
|
|
320
|
+
// Submit
|
|
321
|
+
await page.keyboard.press("Enter");
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Internal: Add text source
|
|
325
|
+
*/
|
|
326
|
+
async addTextSourceInternal(page, text, _title) {
|
|
327
|
+
// Click text/paste option
|
|
328
|
+
const textOptionClicked = await page.evaluate(() => {
|
|
329
|
+
// @ts-expect-error - DOM types
|
|
330
|
+
const buttons = document.querySelectorAll("button, [role='button'], mat-chip");
|
|
331
|
+
for (const btn of buttons) {
|
|
332
|
+
const btnText = btn.textContent?.toLowerCase() || "";
|
|
333
|
+
const aria = btn.getAttribute("aria-label")?.toLowerCase() || "";
|
|
334
|
+
if (btnText.includes("copied text") || btnText.includes("paste") || btnText.includes("text") ||
|
|
335
|
+
aria.includes("copied") || aria.includes("paste")) {
|
|
336
|
+
btn.click();
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return false;
|
|
341
|
+
});
|
|
342
|
+
if (!textOptionClicked) {
|
|
343
|
+
throw new Error("Could not find text/paste source option");
|
|
344
|
+
}
|
|
345
|
+
await randomDelay(800, 1200);
|
|
346
|
+
// Fill text area
|
|
347
|
+
const textArea = await page.$(NOTEBOOKLM_SELECTORS.textInput.primary);
|
|
348
|
+
if (!textArea) {
|
|
349
|
+
throw new Error("Could not find text input area");
|
|
350
|
+
}
|
|
351
|
+
// Use clipboard for large text
|
|
352
|
+
if (text.length > 500) {
|
|
353
|
+
await page.evaluate((t) => {
|
|
354
|
+
// @ts-expect-error - navigator available in browser context
|
|
355
|
+
navigator.clipboard.writeText(t);
|
|
356
|
+
}, text);
|
|
357
|
+
await textArea.focus();
|
|
358
|
+
await page.keyboard.down("Control");
|
|
359
|
+
await page.keyboard.press("v");
|
|
360
|
+
await page.keyboard.up("Control");
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
await humanType(page, NOTEBOOKLM_SELECTORS.textInput.primary, text);
|
|
364
|
+
}
|
|
365
|
+
await randomDelay(500, 800);
|
|
366
|
+
// Click Insert button
|
|
367
|
+
const insertClicked = await page.evaluate(() => {
|
|
368
|
+
// @ts-expect-error - DOM types
|
|
369
|
+
const buttons = document.querySelectorAll("button");
|
|
370
|
+
for (const btn of buttons) {
|
|
371
|
+
const text = btn.textContent?.toLowerCase() || "";
|
|
372
|
+
if (text.includes("insert") || text.includes("add") || text.includes("submit")) {
|
|
373
|
+
btn.click();
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return false;
|
|
378
|
+
});
|
|
379
|
+
if (!insertClicked) {
|
|
380
|
+
throw new Error("Could not find Insert button");
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Internal: Add file source
|
|
385
|
+
* December 2025: NotebookLM uses a dropzone with hidden file input
|
|
386
|
+
*/
|
|
387
|
+
async addFileSourceInternal(page, filePath) {
|
|
388
|
+
log.info(" Attempting file upload...");
|
|
389
|
+
// Method 1: Try to use setInputFiles directly on any file input
|
|
390
|
+
// This works even on hidden inputs and bypasses click interception
|
|
391
|
+
try {
|
|
392
|
+
await page.setInputFiles('input[type="file"]', filePath);
|
|
393
|
+
log.info(" File uploaded via direct setInputFiles");
|
|
394
|
+
await randomDelay(500, 1000);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
catch (e) {
|
|
398
|
+
log.info(` Direct setInputFiles failed: ${e}`);
|
|
399
|
+
}
|
|
400
|
+
// Method 2: Click using JavaScript to bypass Playwright overlay checks
|
|
401
|
+
log.info(" Trying JavaScript click on choose file button...");
|
|
402
|
+
const jsClicked = await page.evaluate(() => {
|
|
403
|
+
// @ts-expect-error - DOM types
|
|
404
|
+
const btn = document.querySelector('span.dropzone__file-dialog-button');
|
|
405
|
+
if (btn) {
|
|
406
|
+
btn.click();
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
// @ts-expect-error - DOM types
|
|
410
|
+
const btn2 = document.querySelector('span[xapscottyuploadertrigger]');
|
|
411
|
+
if (btn2) {
|
|
412
|
+
btn2.click();
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
return false;
|
|
416
|
+
});
|
|
417
|
+
if (jsClicked) {
|
|
418
|
+
await randomDelay(500, 800);
|
|
419
|
+
try {
|
|
420
|
+
await page.setInputFiles('input[type="file"]', filePath);
|
|
421
|
+
log.info(" File uploaded via JS click + setInputFiles");
|
|
422
|
+
await randomDelay(500, 1000);
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
catch (e) {
|
|
426
|
+
log.info(` setInputFiles after JS click failed: ${e}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// Method 3: Try drag and drop simulation
|
|
430
|
+
log.info(" Trying drag-drop simulation...");
|
|
431
|
+
const fileInputExists = await page.evaluate(() => {
|
|
432
|
+
// @ts-expect-error - DOM types
|
|
433
|
+
return !!document.querySelector('input[type="file"]');
|
|
434
|
+
});
|
|
435
|
+
if (fileInputExists) {
|
|
436
|
+
try {
|
|
437
|
+
// Use locator for more robust handling
|
|
438
|
+
const fileInput = page.locator('input[type="file"]');
|
|
439
|
+
await fileInput.setInputFiles(filePath);
|
|
440
|
+
log.info(" File uploaded via locator setInputFiles");
|
|
441
|
+
await randomDelay(500, 1000);
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
catch (e) {
|
|
445
|
+
log.info(` Locator setInputFiles failed: ${e}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
throw new Error("Could not upload file - all methods failed");
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Wait for source processing to complete
|
|
452
|
+
*/
|
|
453
|
+
async waitForSourceProcessing(page, timeoutMs = 30000) {
|
|
454
|
+
const startTime = Date.now();
|
|
455
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
456
|
+
const isProcessing = await page.evaluate(() => {
|
|
457
|
+
// Look for processing indicators
|
|
458
|
+
// @ts-expect-error - DOM types
|
|
459
|
+
const progressBar = document.querySelector('[role="progressbar"]');
|
|
460
|
+
// @ts-expect-error - DOM types
|
|
461
|
+
const spinner = document.querySelector('[class*="spinner"], [class*="loading"]');
|
|
462
|
+
return !!(progressBar || spinner);
|
|
463
|
+
});
|
|
464
|
+
if (!isProcessing) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
await page.waitForTimeout(1000);
|
|
468
|
+
}
|
|
469
|
+
log.warning(" โ ๏ธ Source processing timeout - continuing anyway");
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Close the page if open
|
|
473
|
+
*/
|
|
474
|
+
async closePage() {
|
|
475
|
+
if (this.page) {
|
|
476
|
+
try {
|
|
477
|
+
await this.page.close();
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
// Ignore close errors
|
|
481
|
+
}
|
|
482
|
+
this.page = null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=source-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-manager.js","sourceRoot":"","sources":["../../src/notebook-creation/source-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-create.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/test-create.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Create Notebook Flow
|
|
3
|
+
*
|
|
4
|
+
* Simple test to verify create_notebook works with the updated selectors.
|
|
5
|
+
* Run: node dist/notebook-creation/test-create.js
|
|
6
|
+
*/
|
|
7
|
+
import { AuthManager } from "../auth/auth-manager.js";
|
|
8
|
+
import { SharedContextManager } from "../session/shared-context-manager.js";
|
|
9
|
+
import { NotebookCreator } from "./notebook-creator.js";
|
|
10
|
+
import { log } from "../utils/logger.js";
|
|
11
|
+
async function testCreateNotebook() {
|
|
12
|
+
log.info("๐งช Testing create_notebook flow...\n");
|
|
13
|
+
const authManager = new AuthManager();
|
|
14
|
+
const contextManager = new SharedContextManager(authManager);
|
|
15
|
+
try {
|
|
16
|
+
// First check authentication
|
|
17
|
+
const context = await contextManager.getOrCreateContext(true); // Show browser
|
|
18
|
+
const isAuth = await authManager.validateCookiesExpiry(context);
|
|
19
|
+
if (!isAuth) {
|
|
20
|
+
log.error("โ Not authenticated. Run setup_auth first.");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
log.success("โ
Authentication verified\n");
|
|
24
|
+
// Create the notebook creator
|
|
25
|
+
const creator = new NotebookCreator(authManager, contextManager);
|
|
26
|
+
// Test with a simple text source
|
|
27
|
+
log.info("๐ Creating test notebook with text source...\n");
|
|
28
|
+
const result = await creator.createNotebook({
|
|
29
|
+
name: "Test Notebook " + new Date().toISOString().slice(0, 16),
|
|
30
|
+
sources: [
|
|
31
|
+
{
|
|
32
|
+
type: "text",
|
|
33
|
+
value: "This is a test source for NotebookLM MCP. It contains some sample content to verify the create_notebook functionality works correctly.",
|
|
34
|
+
title: "Test Source"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
browserOptions: {
|
|
38
|
+
headless: false, // Show browser for debugging
|
|
39
|
+
},
|
|
40
|
+
sendProgress: async (message, current, total) => {
|
|
41
|
+
log.info(` [${current}/${total}] ${message}`);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
log.info("\n๐ Result:");
|
|
45
|
+
log.info(` URL: ${result.url}`);
|
|
46
|
+
log.info(` Name: ${result.name}`);
|
|
47
|
+
log.info(` Sources: ${result.sourceCount}`);
|
|
48
|
+
log.info(` Created: ${result.createdAt}`);
|
|
49
|
+
if (result.failedSources && result.failedSources.length > 0) {
|
|
50
|
+
log.warning("\nโ ๏ธ Failed sources:");
|
|
51
|
+
for (const failed of result.failedSources) {
|
|
52
|
+
log.warning(` - ${failed.source.type}: ${failed.error}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
log.success("\nโ
Test completed successfully!");
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
log.error(`\nโ Test failed: ${error}`);
|
|
59
|
+
if (error instanceof Error && error.stack) {
|
|
60
|
+
log.dim(error.stack);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
// Keep browser open for inspection
|
|
65
|
+
log.info("\nโณ Keeping browser open for 30 seconds for inspection...");
|
|
66
|
+
await new Promise(resolve => setTimeout(resolve, 30000));
|
|
67
|
+
await contextManager.closeContext();
|
|
68
|
+
log.info("๐ Browser closed");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
testCreateNotebook().catch(console.error);
|
|
72
|
+
//# sourceMappingURL=test-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-create.js","sourceRoot":"","sources":["../../src/notebook-creation/test-create.ts"],"names":[],"mappings":"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"}
|