@pan-sec/notebooklm-mcp 1.6.0 → 1.7.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/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/index.js +59 -2
- 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/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/handlers.d.ts +225 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +911 -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 +1 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover Source Management UI Elements
|
|
3
|
+
*
|
|
4
|
+
* Finds selectors for listing, adding, and removing sources in NotebookLM.
|
|
5
|
+
* Run: node dist/notebook-creation/discover-sources.js
|
|
6
|
+
*/
|
|
7
|
+
import { AuthManager } from "../auth/auth-manager.js";
|
|
8
|
+
import { SharedContextManager } from "../session/shared-context-manager.js";
|
|
9
|
+
import { log } from "../utils/logger.js";
|
|
10
|
+
// Use a notebook URL with existing sources for discovery
|
|
11
|
+
const TEST_NOTEBOOK_URL = process.env.TEST_NOTEBOOK_URL || "";
|
|
12
|
+
// Future: Interface for discovered selectors (when UI discovery is complete)
|
|
13
|
+
// interface DiscoveredSourceSelectors {
|
|
14
|
+
// sourceListContainer: string | null;
|
|
15
|
+
// sourceItems: string[];
|
|
16
|
+
// sourceTitle: string | null;
|
|
17
|
+
// sourceDeleteButton: string | null;
|
|
18
|
+
// sourceOptionsMenu: string | null;
|
|
19
|
+
// sourceCount: string | null;
|
|
20
|
+
// }
|
|
21
|
+
async function dumpSourceElements(page) {
|
|
22
|
+
return await page.evaluate(() => {
|
|
23
|
+
const results = [];
|
|
24
|
+
// Look for source-related elements
|
|
25
|
+
// @ts-expect-error - DOM types
|
|
26
|
+
const allElements = document.querySelectorAll("*");
|
|
27
|
+
for (const el of allElements) {
|
|
28
|
+
const text = el.textContent?.trim().substring(0, 100) || "";
|
|
29
|
+
const ariaLabel = el.getAttribute("aria-label") || "";
|
|
30
|
+
const classes = el.className || "";
|
|
31
|
+
const tag = el.tagName;
|
|
32
|
+
// Skip if no useful info
|
|
33
|
+
if (!text && !ariaLabel && !classes)
|
|
34
|
+
continue;
|
|
35
|
+
// Look for source-related patterns
|
|
36
|
+
const patterns = [
|
|
37
|
+
/source/i,
|
|
38
|
+
/document/i,
|
|
39
|
+
/upload/i,
|
|
40
|
+
/file/i,
|
|
41
|
+
/delete/i,
|
|
42
|
+
/remove/i,
|
|
43
|
+
/trash/i,
|
|
44
|
+
/more.*options/i,
|
|
45
|
+
/\d+\s*(source|file|document)/i,
|
|
46
|
+
];
|
|
47
|
+
const isRelevant = patterns.some((p) => p.test(text) || p.test(ariaLabel) || p.test(classes));
|
|
48
|
+
if (isRelevant && text.length < 200) {
|
|
49
|
+
// Get data attributes
|
|
50
|
+
const dataAttrs = {};
|
|
51
|
+
for (const attr of Array.from(el.attributes)) {
|
|
52
|
+
if (attr.name.startsWith("data-")) {
|
|
53
|
+
dataAttrs[attr.name] = attr.value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
results.push({
|
|
57
|
+
selector: el.id ? `#${el.id}` : `.${classes.split(" ")[0]}`,
|
|
58
|
+
text: text.substring(0, 100),
|
|
59
|
+
ariaLabel,
|
|
60
|
+
classes: classes.substring(0, 100),
|
|
61
|
+
tag,
|
|
62
|
+
dataAttrs,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function findSourceListElements(page) {
|
|
70
|
+
log.info("\n📋 Looking for source list elements...");
|
|
71
|
+
// Look for the sources panel/sidebar
|
|
72
|
+
const sourceElements = await page.evaluate(() => {
|
|
73
|
+
const results = [];
|
|
74
|
+
// Common patterns for source lists
|
|
75
|
+
const listSelectors = [
|
|
76
|
+
'[class*="source-list"]',
|
|
77
|
+
'[class*="sources-panel"]',
|
|
78
|
+
'[class*="sidebar"]',
|
|
79
|
+
'[role="list"]',
|
|
80
|
+
'[role="listbox"]',
|
|
81
|
+
"mat-list",
|
|
82
|
+
"mat-nav-list",
|
|
83
|
+
];
|
|
84
|
+
for (const selector of listSelectors) {
|
|
85
|
+
// @ts-expect-error - DOM types
|
|
86
|
+
const elements = document.querySelectorAll(selector);
|
|
87
|
+
for (const el of elements) {
|
|
88
|
+
const text = el.textContent?.substring(0, 200) || "";
|
|
89
|
+
if (text.toLowerCase().includes("source")) {
|
|
90
|
+
results.push({
|
|
91
|
+
selector,
|
|
92
|
+
childCount: el.children.length,
|
|
93
|
+
text: text.substring(0, 100),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return results;
|
|
99
|
+
});
|
|
100
|
+
for (const item of sourceElements) {
|
|
101
|
+
log.dim(` Found: ${item.selector} (${item.childCount} children)`);
|
|
102
|
+
log.dim(` Text: "${item.text}"`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function findSourceItems(page) {
|
|
106
|
+
log.info("\n📋 Looking for individual source items...");
|
|
107
|
+
const items = await page.evaluate(() => {
|
|
108
|
+
const results = [];
|
|
109
|
+
// Look for list items that might be sources
|
|
110
|
+
// @ts-expect-error - DOM types
|
|
111
|
+
const listItems = document.querySelectorAll('mat-list-item, [role="listitem"], .source-item, [class*="source"]');
|
|
112
|
+
for (const item of listItems) {
|
|
113
|
+
const text = item.textContent?.trim().substring(0, 100) || "";
|
|
114
|
+
const classes = item.className || "";
|
|
115
|
+
// Skip if it's clearly not a source item
|
|
116
|
+
if (text.toLowerCase().includes("add") && text.length < 20)
|
|
117
|
+
continue;
|
|
118
|
+
results.push({
|
|
119
|
+
tag: item.tagName,
|
|
120
|
+
classes: classes.substring(0, 80),
|
|
121
|
+
text,
|
|
122
|
+
hasCheckbox: !!item.querySelector('input[type="checkbox"], mat-checkbox'),
|
|
123
|
+
hasDeleteBtn: !!item.querySelector('[aria-label*="delete" i], [aria-label*="remove" i], button[class*="delete"]'),
|
|
124
|
+
hasOptionsBtn: !!item.querySelector('[aria-label*="more" i], [aria-label*="option" i], button[class*="menu"]'),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
});
|
|
129
|
+
for (const item of items) {
|
|
130
|
+
log.dim(` [${item.tag}] "${item.text}"`);
|
|
131
|
+
log.dim(` Classes: ${item.classes}`);
|
|
132
|
+
log.dim(` Has: checkbox=${item.hasCheckbox}, delete=${item.hasDeleteBtn}, options=${item.hasOptionsBtn}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function findDeleteButtons(page) {
|
|
136
|
+
log.info("\n📋 Looking for delete/remove buttons...");
|
|
137
|
+
const buttons = await page.evaluate(() => {
|
|
138
|
+
const results = [];
|
|
139
|
+
// @ts-expect-error - DOM types
|
|
140
|
+
const allButtons = document.querySelectorAll("button, [role='button']");
|
|
141
|
+
for (const btn of allButtons) {
|
|
142
|
+
const ariaLabel = btn.getAttribute("aria-label") || "";
|
|
143
|
+
const text = btn.textContent?.trim() || "";
|
|
144
|
+
const classes = btn.className || "";
|
|
145
|
+
const isDelete = /delete|remove|trash|discard/i.test(ariaLabel) ||
|
|
146
|
+
/delete|remove|trash|discard/i.test(text) ||
|
|
147
|
+
/delete|remove|trash/i.test(classes);
|
|
148
|
+
if (isDelete) {
|
|
149
|
+
results.push({
|
|
150
|
+
tag: btn.tagName,
|
|
151
|
+
ariaLabel,
|
|
152
|
+
text: text.substring(0, 50),
|
|
153
|
+
classes: classes.substring(0, 80),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return results;
|
|
158
|
+
});
|
|
159
|
+
for (const btn of buttons) {
|
|
160
|
+
log.dim(` [${btn.tag}] aria="${btn.ariaLabel}" text="${btn.text}"`);
|
|
161
|
+
log.dim(` Classes: ${btn.classes}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function findSourceCount(page) {
|
|
165
|
+
log.info("\n📋 Looking for source count indicator...");
|
|
166
|
+
const counts = await page.evaluate(() => {
|
|
167
|
+
const results = [];
|
|
168
|
+
// Look for "X sources" or "X/Y" patterns
|
|
169
|
+
// @ts-expect-error - DOM types
|
|
170
|
+
const allText = document.body.innerText;
|
|
171
|
+
const matches = allText.match(/(\d+)\s*(source|file|document)s?/gi) || [];
|
|
172
|
+
// Also look for specific elements
|
|
173
|
+
// @ts-expect-error - DOM types
|
|
174
|
+
const spans = document.querySelectorAll("span, div, p");
|
|
175
|
+
for (const el of spans) {
|
|
176
|
+
const text = el.textContent?.trim() || "";
|
|
177
|
+
if (/^\d+\s*(source|file|document)s?$/i.test(text) || /^\d+\s*\/\s*\d+$/.test(text)) {
|
|
178
|
+
results.push({
|
|
179
|
+
tag: el.tagName,
|
|
180
|
+
text,
|
|
181
|
+
classes: (el.className || "").substring(0, 80),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { textMatches: matches, elements: results };
|
|
186
|
+
});
|
|
187
|
+
log.dim(` Text matches: ${counts.textMatches.join(", ") || "none"}`);
|
|
188
|
+
for (const el of counts.elements) {
|
|
189
|
+
log.dim(` [${el.tag}] "${el.text}" class="${el.classes}"`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function main() {
|
|
193
|
+
log.info("🔍 Discovering Source Management UI Elements...\n");
|
|
194
|
+
if (!TEST_NOTEBOOK_URL) {
|
|
195
|
+
log.warning("⚠️ No TEST_NOTEBOOK_URL environment variable set.");
|
|
196
|
+
log.warning(" Set it to a notebook URL with existing sources:");
|
|
197
|
+
log.warning(" TEST_NOTEBOOK_URL=https://notebooklm.google.com/notebook/xxx node dist/notebook-creation/discover-sources.js");
|
|
198
|
+
log.warning("\n Continuing without URL - will navigate to homepage first...\n");
|
|
199
|
+
}
|
|
200
|
+
const authManager = new AuthManager();
|
|
201
|
+
const contextManager = new SharedContextManager(authManager);
|
|
202
|
+
try {
|
|
203
|
+
const context = await contextManager.getOrCreateContext(true);
|
|
204
|
+
const isAuth = await authManager.validateCookiesExpiry(context);
|
|
205
|
+
if (!isAuth) {
|
|
206
|
+
log.error("❌ Not authenticated. Run setup_auth first.");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const page = await context.newPage();
|
|
210
|
+
// Navigate to notebook or homepage
|
|
211
|
+
const url = TEST_NOTEBOOK_URL || "https://notebooklm.google.com/";
|
|
212
|
+
log.info(`📍 Navigating to: ${url}`);
|
|
213
|
+
await page.goto(url, { waitUntil: "domcontentloaded" });
|
|
214
|
+
await page.waitForLoadState("networkidle").catch(() => { });
|
|
215
|
+
await page.waitForTimeout(3000);
|
|
216
|
+
// If on homepage, try to click on first notebook
|
|
217
|
+
if (!TEST_NOTEBOOK_URL) {
|
|
218
|
+
log.info("📍 Looking for a notebook to open...");
|
|
219
|
+
const clicked = await page.evaluate(() => {
|
|
220
|
+
// @ts-expect-error - DOM types
|
|
221
|
+
const rows = document.querySelectorAll("tr");
|
|
222
|
+
for (const row of rows) {
|
|
223
|
+
if (row.textContent?.includes("Source")) {
|
|
224
|
+
row.click();
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
});
|
|
230
|
+
if (clicked) {
|
|
231
|
+
log.success(" ✅ Clicked on a notebook");
|
|
232
|
+
await page.waitForTimeout(3000);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
log.warning(" ⚠️ No notebooks found to click");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Run discovery
|
|
239
|
+
log.info("\n=== Source UI Discovery ===\n");
|
|
240
|
+
// 1. Dump all source-related elements
|
|
241
|
+
log.info("📋 All source-related elements:");
|
|
242
|
+
const allElements = await dumpSourceElements(page);
|
|
243
|
+
for (const el of allElements.slice(0, 20)) {
|
|
244
|
+
log.dim(` [${el.tag}] "${el.text}" aria="${el.ariaLabel}"`);
|
|
245
|
+
}
|
|
246
|
+
if (allElements.length > 20) {
|
|
247
|
+
log.dim(` ... and ${allElements.length - 20} more`);
|
|
248
|
+
}
|
|
249
|
+
// 2. Find source list container
|
|
250
|
+
await findSourceListElements(page);
|
|
251
|
+
// 3. Find individual source items
|
|
252
|
+
await findSourceItems(page);
|
|
253
|
+
// 4. Find delete buttons
|
|
254
|
+
await findDeleteButtons(page);
|
|
255
|
+
// 5. Find source count
|
|
256
|
+
await findSourceCount(page);
|
|
257
|
+
// Take a screenshot for reference
|
|
258
|
+
const screenshotPath = "/tmp/notebooklm-sources-discovery.png";
|
|
259
|
+
await page.screenshot({ path: screenshotPath, fullPage: true });
|
|
260
|
+
log.info(`\n📸 Screenshot saved: ${screenshotPath}`);
|
|
261
|
+
// Keep browser open for inspection
|
|
262
|
+
log.info("\n✅ Discovery complete. Browser open for 60 seconds...");
|
|
263
|
+
await page.waitForTimeout(60000);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
log.error(`❌ Error: ${error}`);
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
await contextManager.closeContext();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
main().catch(console.error);
|
|
273
|
+
//# sourceMappingURL=discover-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-sources.js","sourceRoot":"","sources":["../../src/notebook-creation/discover-sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-text-input.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/discover-text-input.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover Text Input After Clicking "Copied text"
|
|
3
|
+
*
|
|
4
|
+
* Run: node dist/notebook-creation/discover-text-input.js
|
|
5
|
+
*/
|
|
6
|
+
import { AuthManager } from "../auth/auth-manager.js";
|
|
7
|
+
import { SharedContextManager } from "../session/shared-context-manager.js";
|
|
8
|
+
import { log } from "../utils/logger.js";
|
|
9
|
+
const NOTEBOOKLM_URL = "https://notebooklm.google.com/";
|
|
10
|
+
async function dumpInputElements(page, description) {
|
|
11
|
+
log.info(`\n📋 ${description}:`);
|
|
12
|
+
const elements = await page.evaluate(() => {
|
|
13
|
+
const results = [];
|
|
14
|
+
// @ts-expect-error - DOM types
|
|
15
|
+
const els = document.querySelectorAll('input, textarea, [contenteditable="true"], div[role="textbox"]');
|
|
16
|
+
for (const el of els) {
|
|
17
|
+
const visible = el.offsetParent !== null;
|
|
18
|
+
if (!visible)
|
|
19
|
+
continue;
|
|
20
|
+
results.push({
|
|
21
|
+
tag: el.tagName,
|
|
22
|
+
type: el.getAttribute("type") || "",
|
|
23
|
+
placeholder: el.getAttribute("placeholder") || "",
|
|
24
|
+
ariaLabel: el.getAttribute("aria-label") || "",
|
|
25
|
+
classes: el.className?.substring(0, 80) || "",
|
|
26
|
+
id: el.id || "",
|
|
27
|
+
contentEditable: el.contentEditable,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return results;
|
|
31
|
+
});
|
|
32
|
+
for (const el of elements) {
|
|
33
|
+
const info = [`tag=${el.tag}`];
|
|
34
|
+
if (el.type)
|
|
35
|
+
info.push(`type=${el.type}`);
|
|
36
|
+
if (el.placeholder)
|
|
37
|
+
info.push(`placeholder="${el.placeholder}"`);
|
|
38
|
+
if (el.ariaLabel)
|
|
39
|
+
info.push(`aria="${el.ariaLabel}"`);
|
|
40
|
+
if (el.contentEditable === "true")
|
|
41
|
+
info.push(`contenteditable`);
|
|
42
|
+
if (el.classes)
|
|
43
|
+
info.push(`class="${el.classes}"`);
|
|
44
|
+
log.dim(` ${info.join(", ")}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function main() {
|
|
48
|
+
log.info("🔍 Discovering Text Input After 'Copied text' Click...\n");
|
|
49
|
+
const authManager = new AuthManager();
|
|
50
|
+
const contextManager = new SharedContextManager(authManager);
|
|
51
|
+
try {
|
|
52
|
+
const context = await contextManager.getOrCreateContext(true);
|
|
53
|
+
const isAuth = await authManager.validateCookiesExpiry(context);
|
|
54
|
+
if (!isAuth) {
|
|
55
|
+
log.error("❌ Not authenticated. Run setup_auth first.");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const page = await context.newPage();
|
|
59
|
+
// Navigate and create notebook
|
|
60
|
+
log.info("📍 Navigating to NotebookLM...");
|
|
61
|
+
await page.goto(NOTEBOOKLM_URL, { waitUntil: "domcontentloaded" });
|
|
62
|
+
await page.waitForLoadState("networkidle").catch(() => { });
|
|
63
|
+
await page.waitForTimeout(3000);
|
|
64
|
+
log.info("📍 Creating new notebook...");
|
|
65
|
+
const createButton = await page.$('button[aria-label="Create new notebook"]');
|
|
66
|
+
if (createButton) {
|
|
67
|
+
await createButton.click();
|
|
68
|
+
await page.waitForTimeout(3000);
|
|
69
|
+
log.success("✅ Created new notebook");
|
|
70
|
+
}
|
|
71
|
+
// Show input elements BEFORE clicking "Copied text"
|
|
72
|
+
await dumpInputElements(page, "Input elements BEFORE clicking 'Copied text'");
|
|
73
|
+
// Click "Copied text"
|
|
74
|
+
log.info("\n📍 Clicking 'Copied text'...");
|
|
75
|
+
const clicked = await page.evaluate(() => {
|
|
76
|
+
// @ts-expect-error - DOM types
|
|
77
|
+
const spans = document.querySelectorAll('span');
|
|
78
|
+
for (const span of spans) {
|
|
79
|
+
if (span.textContent?.trim() === "Copied text") {
|
|
80
|
+
span.click();
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
});
|
|
86
|
+
if (clicked) {
|
|
87
|
+
log.success("✅ Clicked 'Copied text'");
|
|
88
|
+
await page.waitForTimeout(2000);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
log.error("❌ Could not find 'Copied text'");
|
|
92
|
+
}
|
|
93
|
+
// Show input elements AFTER clicking "Copied text"
|
|
94
|
+
await dumpInputElements(page, "Input elements AFTER clicking 'Copied text'");
|
|
95
|
+
// Also dump all visible buttons
|
|
96
|
+
log.info("\n📋 Buttons after clicking 'Copied text':");
|
|
97
|
+
const buttons = await page.evaluate(() => {
|
|
98
|
+
const results = [];
|
|
99
|
+
// @ts-expect-error - DOM types
|
|
100
|
+
const els = document.querySelectorAll('button');
|
|
101
|
+
for (const el of els) {
|
|
102
|
+
const visible = el.offsetParent !== null;
|
|
103
|
+
if (!visible)
|
|
104
|
+
continue;
|
|
105
|
+
results.push({
|
|
106
|
+
text: el.textContent?.trim().substring(0, 40) || "",
|
|
107
|
+
ariaLabel: el.getAttribute("aria-label") || "",
|
|
108
|
+
type: el.type || "",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return results;
|
|
112
|
+
});
|
|
113
|
+
for (const btn of buttons) {
|
|
114
|
+
const info = [];
|
|
115
|
+
if (btn.text)
|
|
116
|
+
info.push(`"${btn.text}"`);
|
|
117
|
+
if (btn.ariaLabel)
|
|
118
|
+
info.push(`aria="${btn.ariaLabel}"`);
|
|
119
|
+
if (btn.type)
|
|
120
|
+
info.push(`type=${btn.type}`);
|
|
121
|
+
log.dim(` BUTTON: ${info.join(", ")}`);
|
|
122
|
+
}
|
|
123
|
+
// Keep browser open
|
|
124
|
+
log.info("\n✅ Discovery complete. Browser open for 60 seconds...");
|
|
125
|
+
await page.waitForTimeout(60000);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
log.error(`❌ Error: ${error}`);
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await contextManager.closeContext();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
main().catch(console.error);
|
|
135
|
+
//# sourceMappingURL=discover-text-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-text-input.js","sourceRoot":"","sources":["../../src/notebook-creation/discover-text-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notebook Creation Module
|
|
3
|
+
*
|
|
4
|
+
* Provides functionality for programmatically creating NotebookLM notebooks
|
|
5
|
+
* with sources via browser automation.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export * from "./selectors.js";
|
|
9
|
+
export * from "./selector-discovery.js";
|
|
10
|
+
export * from "./notebook-creator.js";
|
|
11
|
+
export * from "./notebook-sync.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notebook Creation Module
|
|
3
|
+
*
|
|
4
|
+
* Provides functionality for programmatically creating NotebookLM notebooks
|
|
5
|
+
* with sources via browser automation.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export * from "./selectors.js";
|
|
9
|
+
export * from "./selector-discovery.js";
|
|
10
|
+
export * from "./notebook-creator.js";
|
|
11
|
+
export * from "./notebook-sync.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notebook-creation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotebookLM Notebook Creator
|
|
3
|
+
*
|
|
4
|
+
* Creates notebooks programmatically via browser automation.
|
|
5
|
+
* Supports URL, text, and file sources.
|
|
6
|
+
*/
|
|
7
|
+
import type { CreateNotebookOptions, CreatedNotebook } from "./types.js";
|
|
8
|
+
import { AuthManager } from "../auth/auth-manager.js";
|
|
9
|
+
import { SharedContextManager } from "../session/shared-context-manager.js";
|
|
10
|
+
/**
|
|
11
|
+
* Creates NotebookLM notebooks with sources
|
|
12
|
+
*/
|
|
13
|
+
export declare class NotebookCreator {
|
|
14
|
+
private authManager;
|
|
15
|
+
private contextManager;
|
|
16
|
+
private page;
|
|
17
|
+
constructor(authManager: AuthManager, contextManager: SharedContextManager);
|
|
18
|
+
/**
|
|
19
|
+
* Create a new notebook with sources
|
|
20
|
+
*/
|
|
21
|
+
createNotebook(options: CreateNotebookOptions): Promise<CreatedNotebook>;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize browser and navigate to NotebookLM
|
|
24
|
+
*/
|
|
25
|
+
private initialize;
|
|
26
|
+
/**
|
|
27
|
+
* Click the "New notebook" button
|
|
28
|
+
*/
|
|
29
|
+
private clickNewNotebook;
|
|
30
|
+
/**
|
|
31
|
+
* Set the notebook name
|
|
32
|
+
*/
|
|
33
|
+
private setNotebookName;
|
|
34
|
+
/**
|
|
35
|
+
* Add a source to the notebook
|
|
36
|
+
*/
|
|
37
|
+
private addSource;
|
|
38
|
+
/**
|
|
39
|
+
* Check if the source dialog is already open
|
|
40
|
+
*/
|
|
41
|
+
private isSourceDialogOpen;
|
|
42
|
+
/**
|
|
43
|
+
* Click the "Add source" button
|
|
44
|
+
*/
|
|
45
|
+
private clickAddSource;
|
|
46
|
+
/**
|
|
47
|
+
* Add a URL source
|
|
48
|
+
*/
|
|
49
|
+
private addUrlSource;
|
|
50
|
+
/**
|
|
51
|
+
* Add a text source
|
|
52
|
+
*/
|
|
53
|
+
private addTextSource;
|
|
54
|
+
/**
|
|
55
|
+
* Add a file source
|
|
56
|
+
*/
|
|
57
|
+
private addFileSource;
|
|
58
|
+
/**
|
|
59
|
+
* Click a source type by text content (for the new dialog structure)
|
|
60
|
+
*/
|
|
61
|
+
private clickSourceTypeByText;
|
|
62
|
+
/**
|
|
63
|
+
* Click the submit/add button
|
|
64
|
+
*/
|
|
65
|
+
private clickSubmitButton;
|
|
66
|
+
/**
|
|
67
|
+
* Click the "Insert" button (for text sources)
|
|
68
|
+
*/
|
|
69
|
+
private clickInsertButton;
|
|
70
|
+
/**
|
|
71
|
+
* Wait for source processing to complete
|
|
72
|
+
*/
|
|
73
|
+
private waitForSourceProcessing;
|
|
74
|
+
/**
|
|
75
|
+
* Lenient version of waitForSourceProcessing that ignores false positive errors
|
|
76
|
+
*/
|
|
77
|
+
private waitForSourceProcessingLenient;
|
|
78
|
+
/**
|
|
79
|
+
* Finalize notebook creation and get the URL
|
|
80
|
+
*/
|
|
81
|
+
private finalizeAndGetUrl;
|
|
82
|
+
/**
|
|
83
|
+
* Get a human-readable description of a source
|
|
84
|
+
*/
|
|
85
|
+
private getSourceDescription;
|
|
86
|
+
/**
|
|
87
|
+
* Cleanup resources
|
|
88
|
+
*/
|
|
89
|
+
private cleanup;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a notebook with the given options
|
|
93
|
+
*/
|
|
94
|
+
export declare function createNotebook(authManager: AuthManager, contextManager: SharedContextManager, options: CreateNotebookOptions): Promise<CreatedNotebook>;
|
|
95
|
+
//# sourceMappingURL=notebook-creator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-creator.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/notebook-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,qBAAqB,EACrB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAM5E;;GAEG;AACH,qBAAa,eAAe;IAIxB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,cAAc;IAJxB,OAAO,CAAC,IAAI,CAAqB;gBAGvB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,oBAAoB;IAG9C;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IA+D9E;;OAEG;YACW,UAAU;IAmCxB;;OAEG;YACW,gBAAgB;IAsD9B;;OAEG;YACW,eAAe;IAiC7B;;OAEG;YACW,SAAS;IA6BvB;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;YACW,cAAc;IA2D5B;;OAEG;YACW,YAAY;IAgC1B;;OAEG;YACW,aAAa;IA4F3B;;OAEG;YACW,aAAa;IAsD3B;;OAEG;YACW,qBAAqB;IAmCnC;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;YACW,uBAAuB;IAsCrC;;OAEG;YACW,8BAA8B;IAuC5C;;OAEG;YACW,iBAAiB;IA4B/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;YACW,OAAO;CAUtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,oBAAoB,EACpC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAG1B"}
|