@pan-sec/notebooklm-mcp 1.4.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.
Files changed (230) hide show
  1. package/README.md +61 -7
  2. package/SECURITY.md +40 -6
  3. package/dist/auth/mcp-auth.d.ts.map +1 -1
  4. package/dist/auth/mcp-auth.js +3 -6
  5. package/dist/auth/mcp-auth.js.map +1 -1
  6. package/dist/compliance/alert-manager.d.ts +120 -0
  7. package/dist/compliance/alert-manager.d.ts.map +1 -0
  8. package/dist/compliance/alert-manager.js +420 -0
  9. package/dist/compliance/alert-manager.js.map +1 -0
  10. package/dist/compliance/breach-detection.d.ts +134 -0
  11. package/dist/compliance/breach-detection.d.ts.map +1 -0
  12. package/dist/compliance/breach-detection.js +456 -0
  13. package/dist/compliance/breach-detection.js.map +1 -0
  14. package/dist/compliance/change-log.d.ts +113 -0
  15. package/dist/compliance/change-log.d.ts.map +1 -0
  16. package/dist/compliance/change-log.js +275 -0
  17. package/dist/compliance/change-log.js.map +1 -0
  18. package/dist/compliance/compliance-logger.d.ts +136 -0
  19. package/dist/compliance/compliance-logger.d.ts.map +1 -0
  20. package/dist/compliance/compliance-logger.js +425 -0
  21. package/dist/compliance/compliance-logger.js.map +1 -0
  22. package/dist/compliance/compliance-tools.d.ts +18 -0
  23. package/dist/compliance/compliance-tools.d.ts.map +1 -0
  24. package/dist/compliance/compliance-tools.js +673 -0
  25. package/dist/compliance/compliance-tools.js.map +1 -0
  26. package/dist/compliance/consent-manager.d.ts +130 -0
  27. package/dist/compliance/consent-manager.d.ts.map +1 -0
  28. package/dist/compliance/consent-manager.js +386 -0
  29. package/dist/compliance/consent-manager.js.map +1 -0
  30. package/dist/compliance/dashboard.d.ts +243 -0
  31. package/dist/compliance/dashboard.d.ts.map +1 -0
  32. package/dist/compliance/dashboard.js +519 -0
  33. package/dist/compliance/dashboard.js.map +1 -0
  34. package/dist/compliance/data-classification.d.ts +117 -0
  35. package/dist/compliance/data-classification.d.ts.map +1 -0
  36. package/dist/compliance/data-classification.js +469 -0
  37. package/dist/compliance/data-classification.js.map +1 -0
  38. package/dist/compliance/data-erasure.d.ts +110 -0
  39. package/dist/compliance/data-erasure.d.ts.map +1 -0
  40. package/dist/compliance/data-erasure.js +501 -0
  41. package/dist/compliance/data-erasure.js.map +1 -0
  42. package/dist/compliance/data-export.d.ts +85 -0
  43. package/dist/compliance/data-export.d.ts.map +1 -0
  44. package/dist/compliance/data-export.js +394 -0
  45. package/dist/compliance/data-export.js.map +1 -0
  46. package/dist/compliance/data-inventory.d.ts +136 -0
  47. package/dist/compliance/data-inventory.d.ts.map +1 -0
  48. package/dist/compliance/data-inventory.js +335 -0
  49. package/dist/compliance/data-inventory.js.map +1 -0
  50. package/dist/compliance/dsar-handler.d.ts +123 -0
  51. package/dist/compliance/dsar-handler.d.ts.map +1 -0
  52. package/dist/compliance/dsar-handler.js +371 -0
  53. package/dist/compliance/dsar-handler.js.map +1 -0
  54. package/dist/compliance/evidence-collector.d.ts +187 -0
  55. package/dist/compliance/evidence-collector.d.ts.map +1 -0
  56. package/dist/compliance/evidence-collector.js +656 -0
  57. package/dist/compliance/evidence-collector.js.map +1 -0
  58. package/dist/compliance/health-monitor.d.ts +111 -0
  59. package/dist/compliance/health-monitor.d.ts.map +1 -0
  60. package/dist/compliance/health-monitor.js +509 -0
  61. package/dist/compliance/health-monitor.js.map +1 -0
  62. package/dist/compliance/incident-manager.d.ts +131 -0
  63. package/dist/compliance/incident-manager.d.ts.map +1 -0
  64. package/dist/compliance/incident-manager.js +418 -0
  65. package/dist/compliance/incident-manager.js.map +1 -0
  66. package/dist/compliance/index.d.ts +32 -0
  67. package/dist/compliance/index.d.ts.map +1 -0
  68. package/dist/compliance/index.js +35 -0
  69. package/dist/compliance/index.js.map +1 -0
  70. package/dist/compliance/policy-docs.d.ts +108 -0
  71. package/dist/compliance/policy-docs.d.ts.map +1 -0
  72. package/dist/compliance/policy-docs.js +464 -0
  73. package/dist/compliance/policy-docs.js.map +1 -0
  74. package/dist/compliance/privacy-notice-text.d.ts +58 -0
  75. package/dist/compliance/privacy-notice-text.d.ts.map +1 -0
  76. package/dist/compliance/privacy-notice-text.js +161 -0
  77. package/dist/compliance/privacy-notice-text.js.map +1 -0
  78. package/dist/compliance/privacy-notice.d.ts +128 -0
  79. package/dist/compliance/privacy-notice.d.ts.map +1 -0
  80. package/dist/compliance/privacy-notice.js +250 -0
  81. package/dist/compliance/privacy-notice.js.map +1 -0
  82. package/dist/compliance/report-generator.d.ts +168 -0
  83. package/dist/compliance/report-generator.d.ts.map +1 -0
  84. package/dist/compliance/report-generator.js +830 -0
  85. package/dist/compliance/report-generator.js.map +1 -0
  86. package/dist/compliance/retention-engine.d.ts +130 -0
  87. package/dist/compliance/retention-engine.d.ts.map +1 -0
  88. package/dist/compliance/retention-engine.js +510 -0
  89. package/dist/compliance/retention-engine.js.map +1 -0
  90. package/dist/compliance/siem-exporter.d.ts +150 -0
  91. package/dist/compliance/siem-exporter.d.ts.map +1 -0
  92. package/dist/compliance/siem-exporter.js +509 -0
  93. package/dist/compliance/siem-exporter.js.map +1 -0
  94. package/dist/compliance/types.d.ts +601 -0
  95. package/dist/compliance/types.d.ts.map +1 -0
  96. package/dist/compliance/types.js +22 -0
  97. package/dist/compliance/types.js.map +1 -0
  98. package/dist/config.d.ts +4 -0
  99. package/dist/config.d.ts.map +1 -1
  100. package/dist/config.js +8 -1
  101. package/dist/config.js.map +1 -1
  102. package/dist/events/event-emitter.d.ts +45 -0
  103. package/dist/events/event-emitter.d.ts.map +1 -0
  104. package/dist/events/event-emitter.js +100 -0
  105. package/dist/events/event-emitter.js.map +1 -0
  106. package/dist/events/event-types.d.ts +124 -0
  107. package/dist/events/event-types.d.ts.map +1 -0
  108. package/dist/events/event-types.js +18 -0
  109. package/dist/events/event-types.js.map +1 -0
  110. package/dist/index.js +59 -2
  111. package/dist/index.js.map +1 -1
  112. package/dist/library/notebook-library.d.ts +25 -2
  113. package/dist/library/notebook-library.d.ts.map +1 -1
  114. package/dist/library/notebook-library.js +144 -3
  115. package/dist/library/notebook-library.js.map +1 -1
  116. package/dist/library/types.d.ts +15 -0
  117. package/dist/library/types.d.ts.map +1 -1
  118. package/dist/notebook-creation/audio-manager.d.ts +56 -0
  119. package/dist/notebook-creation/audio-manager.d.ts.map +1 -0
  120. package/dist/notebook-creation/audio-manager.js +335 -0
  121. package/dist/notebook-creation/audio-manager.js.map +1 -0
  122. package/dist/notebook-creation/discover-creation-flow.d.ts +8 -0
  123. package/dist/notebook-creation/discover-creation-flow.d.ts.map +1 -0
  124. package/dist/notebook-creation/discover-creation-flow.js +177 -0
  125. package/dist/notebook-creation/discover-creation-flow.js.map +1 -0
  126. package/dist/notebook-creation/discover-quota.d.ts +8 -0
  127. package/dist/notebook-creation/discover-quota.d.ts.map +1 -0
  128. package/dist/notebook-creation/discover-quota.js +195 -0
  129. package/dist/notebook-creation/discover-quota.js.map +1 -0
  130. package/dist/notebook-creation/discover-source-dialog.d.ts +8 -0
  131. package/dist/notebook-creation/discover-source-dialog.d.ts.map +1 -0
  132. package/dist/notebook-creation/discover-source-dialog.js +134 -0
  133. package/dist/notebook-creation/discover-source-dialog.js.map +1 -0
  134. package/dist/notebook-creation/discover-sources.d.ts +8 -0
  135. package/dist/notebook-creation/discover-sources.d.ts.map +1 -0
  136. package/dist/notebook-creation/discover-sources.js +273 -0
  137. package/dist/notebook-creation/discover-sources.js.map +1 -0
  138. package/dist/notebook-creation/discover-text-input.d.ts +7 -0
  139. package/dist/notebook-creation/discover-text-input.d.ts.map +1 -0
  140. package/dist/notebook-creation/discover-text-input.js +135 -0
  141. package/dist/notebook-creation/discover-text-input.js.map +1 -0
  142. package/dist/notebook-creation/index.d.ts +12 -0
  143. package/dist/notebook-creation/index.d.ts.map +1 -0
  144. package/dist/notebook-creation/index.js +12 -0
  145. package/dist/notebook-creation/index.js.map +1 -0
  146. package/dist/notebook-creation/notebook-creator.d.ts +95 -0
  147. package/dist/notebook-creation/notebook-creator.d.ts.map +1 -0
  148. package/dist/notebook-creation/notebook-creator.js +689 -0
  149. package/dist/notebook-creation/notebook-creator.js.map +1 -0
  150. package/dist/notebook-creation/notebook-sync.d.ts +93 -0
  151. package/dist/notebook-creation/notebook-sync.d.ts.map +1 -0
  152. package/dist/notebook-creation/notebook-sync.js +370 -0
  153. package/dist/notebook-creation/notebook-sync.js.map +1 -0
  154. package/dist/notebook-creation/run-discovery.d.ts +11 -0
  155. package/dist/notebook-creation/run-discovery.d.ts.map +1 -0
  156. package/dist/notebook-creation/run-discovery.js +151 -0
  157. package/dist/notebook-creation/run-discovery.js.map +1 -0
  158. package/dist/notebook-creation/selector-discovery.d.ts +65 -0
  159. package/dist/notebook-creation/selector-discovery.d.ts.map +1 -0
  160. package/dist/notebook-creation/selector-discovery.js +421 -0
  161. package/dist/notebook-creation/selector-discovery.js.map +1 -0
  162. package/dist/notebook-creation/selectors.d.ts +150 -0
  163. package/dist/notebook-creation/selectors.d.ts.map +1 -0
  164. package/dist/notebook-creation/selectors.js +225 -0
  165. package/dist/notebook-creation/selectors.js.map +1 -0
  166. package/dist/notebook-creation/source-manager.d.ts +73 -0
  167. package/dist/notebook-creation/source-manager.d.ts.map +1 -0
  168. package/dist/notebook-creation/source-manager.js +486 -0
  169. package/dist/notebook-creation/source-manager.js.map +1 -0
  170. package/dist/notebook-creation/test-create.d.ts +8 -0
  171. package/dist/notebook-creation/test-create.d.ts.map +1 -0
  172. package/dist/notebook-creation/test-create.js +72 -0
  173. package/dist/notebook-creation/test-create.js.map +1 -0
  174. package/dist/notebook-creation/types.d.ts +173 -0
  175. package/dist/notebook-creation/types.d.ts.map +1 -0
  176. package/dist/notebook-creation/types.js +5 -0
  177. package/dist/notebook-creation/types.js.map +1 -0
  178. package/dist/quota/index.d.ts +8 -0
  179. package/dist/quota/index.d.ts.map +1 -0
  180. package/dist/quota/index.js +8 -0
  181. package/dist/quota/index.js.map +1 -0
  182. package/dist/quota/quota-manager.d.ts +125 -0
  183. package/dist/quota/quota-manager.d.ts.map +1 -0
  184. package/dist/quota/quota-manager.js +330 -0
  185. package/dist/quota/quota-manager.js.map +1 -0
  186. package/dist/session/session-manager.d.ts +5 -0
  187. package/dist/session/session-manager.d.ts.map +1 -1
  188. package/dist/session/session-manager.js +6 -0
  189. package/dist/session/session-manager.js.map +1 -1
  190. package/dist/session/shared-context-manager.d.ts.map +1 -1
  191. package/dist/session/shared-context-manager.js +2 -1
  192. package/dist/session/shared-context-manager.js.map +1 -1
  193. package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
  194. package/dist/tools/definitions/notebook-management.js +525 -0
  195. package/dist/tools/definitions/notebook-management.js.map +1 -1
  196. package/dist/tools/definitions/system.d.ts.map +1 -1
  197. package/dist/tools/definitions/system.js +158 -0
  198. package/dist/tools/definitions/system.js.map +1 -1
  199. package/dist/tools/handlers.d.ts +225 -0
  200. package/dist/tools/handlers.d.ts.map +1 -1
  201. package/dist/tools/handlers.js +911 -0
  202. package/dist/tools/handlers.js.map +1 -1
  203. package/dist/utils/audit-logger.d.ts +21 -1
  204. package/dist/utils/audit-logger.d.ts.map +1 -1
  205. package/dist/utils/audit-logger.js +53 -4
  206. package/dist/utils/audit-logger.js.map +1 -1
  207. package/dist/utils/crypto.d.ts.map +1 -1
  208. package/dist/utils/crypto.js +8 -15
  209. package/dist/utils/crypto.js.map +1 -1
  210. package/dist/utils/file-permissions.d.ts +85 -0
  211. package/dist/utils/file-permissions.d.ts.map +1 -0
  212. package/dist/utils/file-permissions.js +180 -0
  213. package/dist/utils/file-permissions.js.map +1 -0
  214. package/dist/utils/settings-manager.d.ts.map +1 -1
  215. package/dist/utils/settings-manager.js +6 -11
  216. package/dist/utils/settings-manager.js.map +1 -1
  217. package/dist/webhooks/index.d.ts +8 -0
  218. package/dist/webhooks/index.d.ts.map +1 -0
  219. package/dist/webhooks/index.js +8 -0
  220. package/dist/webhooks/index.js.map +1 -0
  221. package/dist/webhooks/types.d.ts +57 -0
  222. package/dist/webhooks/types.d.ts.map +1 -0
  223. package/dist/webhooks/types.js +5 -0
  224. package/dist/webhooks/types.js.map +1 -0
  225. package/dist/webhooks/webhook-dispatcher.d.ts +120 -0
  226. package/dist/webhooks/webhook-dispatcher.d.ts.map +1 -0
  227. package/dist/webhooks/webhook-dispatcher.js +519 -0
  228. package/dist/webhooks/webhook-dispatcher.js.map +1 -0
  229. package/docs/COMPLIANCE-SPEC.md +1452 -0
  230. package/package.json +30 -4
@@ -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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=test-create.d.ts.map
@@ -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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"}