@pan-sec/notebooklm-mcp 2026.2.1 → 2026.2.11

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 (117) hide show
  1. package/README.md +39 -18
  2. package/dist/auth/auth-manager.d.ts +37 -2
  3. package/dist/auth/auth-manager.d.ts.map +1 -1
  4. package/dist/auth/auth-manager.js +133 -11
  5. package/dist/auth/auth-manager.js.map +1 -1
  6. package/dist/auth/mcp-auth.d.ts +25 -4
  7. package/dist/auth/mcp-auth.d.ts.map +1 -1
  8. package/dist/auth/mcp-auth.js +145 -29
  9. package/dist/auth/mcp-auth.js.map +1 -1
  10. package/dist/compliance/retention-engine.js +1 -1
  11. package/dist/compliance/retention-engine.js.map +1 -1
  12. package/dist/config.d.ts +24 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +56 -8
  15. package/dist/config.js.map +1 -1
  16. package/dist/gemini/gemini-client.d.ts.map +1 -1
  17. package/dist/gemini/gemini-client.js +58 -20
  18. package/dist/gemini/gemini-client.js.map +1 -1
  19. package/dist/index.js +87 -180
  20. package/dist/index.js.map +1 -1
  21. package/dist/notebook-creation/audio-manager.js +2 -2
  22. package/dist/notebook-creation/audio-manager.js.map +1 -1
  23. package/dist/notebook-creation/data-table-manager.d.ts +13 -3
  24. package/dist/notebook-creation/data-table-manager.d.ts.map +1 -1
  25. package/dist/notebook-creation/data-table-manager.js +70 -32
  26. package/dist/notebook-creation/data-table-manager.js.map +1 -1
  27. package/dist/notebook-creation/discover-creation-flow.js +1 -1
  28. package/dist/notebook-creation/discover-creation-flow.js.map +1 -1
  29. package/dist/notebook-creation/discover-quota.js +1 -1
  30. package/dist/notebook-creation/discover-quota.js.map +1 -1
  31. package/dist/notebook-creation/discover-sources.js +1 -1
  32. package/dist/notebook-creation/discover-sources.js.map +1 -1
  33. package/dist/notebook-creation/notebook-creator.d.ts.map +1 -1
  34. package/dist/notebook-creation/notebook-creator.js +49 -26
  35. package/dist/notebook-creation/notebook-creator.js.map +1 -1
  36. package/dist/notebook-creation/notebook-sync.js +1 -1
  37. package/dist/notebook-creation/notebook-sync.js.map +1 -1
  38. package/dist/notebook-creation/selectors.d.ts +21 -16
  39. package/dist/notebook-creation/selectors.d.ts.map +1 -1
  40. package/dist/notebook-creation/selectors.js +37 -20
  41. package/dist/notebook-creation/selectors.js.map +1 -1
  42. package/dist/notebook-creation/source-manager.d.ts.map +1 -1
  43. package/dist/notebook-creation/source-manager.js +29 -6
  44. package/dist/notebook-creation/source-manager.js.map +1 -1
  45. package/dist/notebook-creation/video-manager.d.ts +10 -1
  46. package/dist/notebook-creation/video-manager.d.ts.map +1 -1
  47. package/dist/notebook-creation/video-manager.js +103 -42
  48. package/dist/notebook-creation/video-manager.js.map +1 -1
  49. package/dist/quota/quota-manager.d.ts.map +1 -1
  50. package/dist/quota/quota-manager.js +46 -15
  51. package/dist/quota/quota-manager.js.map +1 -1
  52. package/dist/session/browser-session.d.ts.map +1 -1
  53. package/dist/session/browser-session.js +21 -14
  54. package/dist/session/browser-session.js.map +1 -1
  55. package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
  56. package/dist/tools/definitions/notebook-management.js +64 -0
  57. package/dist/tools/definitions/notebook-management.js.map +1 -1
  58. package/dist/tools/handlers/ask-question.d.ts +18 -0
  59. package/dist/tools/handlers/ask-question.d.ts.map +1 -0
  60. package/dist/tools/handlers/ask-question.js +236 -0
  61. package/dist/tools/handlers/ask-question.js.map +1 -0
  62. package/dist/tools/handlers/audio-video.d.ts +42 -0
  63. package/dist/tools/handlers/audio-video.d.ts.map +1 -0
  64. package/dist/tools/handlers/audio-video.js +356 -0
  65. package/dist/tools/handlers/audio-video.js.map +1 -0
  66. package/dist/tools/handlers/auth.d.ts +41 -0
  67. package/dist/tools/handlers/auth.d.ts.map +1 -0
  68. package/dist/tools/handlers/auth.js +171 -0
  69. package/dist/tools/handlers/auth.js.map +1 -0
  70. package/dist/tools/handlers/gemini.d.ts +142 -0
  71. package/dist/tools/handlers/gemini.d.ts.map +1 -0
  72. package/dist/tools/handlers/gemini.js +626 -0
  73. package/dist/tools/handlers/gemini.js.map +1 -0
  74. package/dist/tools/handlers/index.d.ts +295 -0
  75. package/dist/tools/handlers/index.d.ts.map +1 -0
  76. package/dist/tools/handlers/index.js +197 -0
  77. package/dist/tools/handlers/index.js.map +1 -0
  78. package/dist/tools/handlers/notebook-creation.d.ts +75 -0
  79. package/dist/tools/handlers/notebook-creation.d.ts.map +1 -0
  80. package/dist/tools/handlers/notebook-creation.js +598 -0
  81. package/dist/tools/handlers/notebook-creation.js.map +1 -0
  82. package/dist/tools/handlers/notebook-management.d.ts +64 -0
  83. package/dist/tools/handlers/notebook-management.d.ts.map +1 -0
  84. package/dist/tools/handlers/notebook-management.js +214 -0
  85. package/dist/tools/handlers/notebook-management.js.map +1 -0
  86. package/dist/tools/handlers/session-management.d.ts +68 -0
  87. package/dist/tools/handlers/session-management.d.ts.map +1 -0
  88. package/dist/tools/handlers/session-management.js +238 -0
  89. package/dist/tools/handlers/session-management.js.map +1 -0
  90. package/dist/tools/handlers/system.d.ts +102 -0
  91. package/dist/tools/handlers/system.d.ts.map +1 -0
  92. package/dist/tools/handlers/system.js +275 -0
  93. package/dist/tools/handlers/system.js.map +1 -0
  94. package/dist/tools/handlers/types.d.ts +19 -0
  95. package/dist/tools/handlers/types.d.ts.map +1 -0
  96. package/dist/tools/handlers/types.js +5 -0
  97. package/dist/tools/handlers/types.js.map +1 -0
  98. package/dist/tools/handlers/webhooks.d.ts +34 -0
  99. package/dist/tools/handlers/webhooks.d.ts.map +1 -0
  100. package/dist/tools/handlers/webhooks.js +122 -0
  101. package/dist/tools/handlers/webhooks.js.map +1 -0
  102. package/dist/tools/handlers.d.ts +27 -0
  103. package/dist/tools/handlers.d.ts.map +1 -1
  104. package/dist/tools/handlers.js +226 -5
  105. package/dist/tools/handlers.js.map +1 -1
  106. package/dist/tools/index.d.ts +1 -1
  107. package/dist/tools/index.d.ts.map +1 -1
  108. package/dist/tools/index.js +1 -1
  109. package/dist/tools/index.js.map +1 -1
  110. package/dist/utils/cleanup-manager.d.ts.map +1 -1
  111. package/dist/utils/cleanup-manager.js +8 -10
  112. package/dist/utils/cleanup-manager.js.map +1 -1
  113. package/dist/utils/file-permissions.d.ts.map +1 -1
  114. package/dist/utils/file-permissions.js +41 -6
  115. package/dist/utils/file-permissions.js.map +1 -1
  116. package/docs/improvement-sprint-2026.2.10.md +210 -0
  117. package/package.json +6 -3
@@ -0,0 +1,598 @@
1
+ /**
2
+ * Notebook creation and source management handlers
3
+ *
4
+ * Extracted from handlers.ts — handles create_notebook, batch_create_notebooks,
5
+ * sync_library, list_sources, add_source, add_folder, and remove_source.
6
+ */
7
+ import { NotebookCreator } from "../../notebook-creation/notebook-creator.js";
8
+ import { NotebookSync } from "../../notebook-creation/notebook-sync.js";
9
+ import { SourceManager } from "../../notebook-creation/source-manager.js";
10
+ import { validateNotebookUrl } from "../../utils/security.js";
11
+ import { getQuotaManager } from "../../quota/index.js";
12
+ import { log } from "../../utils/logger.js";
13
+ import { audit } from "../../utils/audit-logger.js";
14
+ export async function handleCreateNotebook(ctx, args, sendProgress) {
15
+ log.info(`🔧 [TOOL] create_notebook called`);
16
+ log.info(` Name: ${args.name}`);
17
+ log.info(` Sources: ${args.sources?.length || 0}`);
18
+ try {
19
+ // Validate inputs
20
+ if (!args.name || typeof args.name !== "string") {
21
+ throw new Error("Notebook name is required");
22
+ }
23
+ if (!args.sources || !Array.isArray(args.sources) || args.sources.length === 0) {
24
+ throw new Error("At least one source is required");
25
+ }
26
+ // Validate each source
27
+ for (const source of args.sources) {
28
+ if (!source.type || !["url", "text", "file"].includes(source.type)) {
29
+ throw new Error(`Invalid source type: ${source.type}. Must be url, text, or file.`);
30
+ }
31
+ if (!source.value || typeof source.value !== "string") {
32
+ throw new Error("Source value is required");
33
+ }
34
+ if (source.type === "url") {
35
+ try {
36
+ new URL(source.value);
37
+ }
38
+ catch {
39
+ throw new Error(`Invalid URL: ${source.value}`);
40
+ }
41
+ }
42
+ }
43
+ // === QUOTA CHECK ===
44
+ const quotaManager = getQuotaManager();
45
+ const canCreate = quotaManager.canCreateNotebook();
46
+ if (!canCreate.allowed) {
47
+ log.warning(`⚠️ Quota limit: ${canCreate.reason}`);
48
+ return {
49
+ success: false,
50
+ error: canCreate.reason || "Notebook quota limit reached",
51
+ };
52
+ }
53
+ // Check source limit
54
+ const sourceLimits = quotaManager.getLimits();
55
+ if (args.sources.length > sourceLimits.sourcesPerNotebook) {
56
+ const reason = `Too many sources (${args.sources.length}). Limit is ${sourceLimits.sourcesPerNotebook} per notebook.`;
57
+ log.warning(`⚠️ Quota limit: ${reason}`);
58
+ return {
59
+ success: false,
60
+ error: reason,
61
+ };
62
+ }
63
+ // Get the shared context manager from session manager
64
+ const contextManager = ctx.sessionManager.getContextManager();
65
+ // Create notebook
66
+ const creator = new NotebookCreator(ctx.authManager, contextManager);
67
+ const result = await creator.createNotebook({
68
+ name: args.name,
69
+ sources: args.sources,
70
+ sendProgress,
71
+ browserOptions: args.browser_options || (args.show_browser ? { show: true } : undefined),
72
+ });
73
+ // Auto-add to library if requested (default: true)
74
+ if (args.auto_add_to_library !== false) {
75
+ try {
76
+ ctx.library.addNotebook({
77
+ url: result.url,
78
+ name: args.name,
79
+ description: args.description || `Created ${new Date().toLocaleDateString()}`,
80
+ topics: args.topics || [],
81
+ });
82
+ log.success(`✅ Added notebook to library: ${args.name}`);
83
+ }
84
+ catch (libError) {
85
+ log.warning(`⚠️ Failed to add to library: ${libError}`);
86
+ // Don't fail the whole operation
87
+ }
88
+ }
89
+ // Update quota tracking
90
+ quotaManager.incrementNotebookCount();
91
+ // Audit log
92
+ await audit.tool("create_notebook", {
93
+ name: args.name,
94
+ sourceCount: args.sources.length,
95
+ url: result.url,
96
+ }, true, 0);
97
+ log.success(`✅ [TOOL] create_notebook completed: ${result.url}`);
98
+ return {
99
+ success: true,
100
+ data: result,
101
+ };
102
+ }
103
+ catch (error) {
104
+ const errorMessage = error instanceof Error ? error.message : String(error);
105
+ log.error(`❌ [TOOL] create_notebook failed: ${errorMessage}`);
106
+ await audit.tool("create_notebook", {
107
+ name: args.name,
108
+ error: errorMessage,
109
+ }, false, 0, errorMessage);
110
+ return {
111
+ success: false,
112
+ error: errorMessage,
113
+ };
114
+ }
115
+ }
116
+ export async function handleBatchCreateNotebooks(ctx, args, sendProgress) {
117
+ log.info(`🔧 [TOOL] batch_create_notebooks called`);
118
+ log.info(` Notebooks: ${args.notebooks.length}`);
119
+ log.info(` Stop on error: ${args.stop_on_error || false}`);
120
+ try {
121
+ // Validate input
122
+ if (!args.notebooks || !Array.isArray(args.notebooks)) {
123
+ throw new Error("notebooks array is required");
124
+ }
125
+ if (args.notebooks.length === 0) {
126
+ throw new Error("At least one notebook is required");
127
+ }
128
+ if (args.notebooks.length > 10) {
129
+ throw new Error("Maximum 10 notebooks per batch");
130
+ }
131
+ const results = [];
132
+ const total = args.notebooks.length;
133
+ let succeeded = 0;
134
+ let failed = 0;
135
+ for (let i = 0; i < args.notebooks.length; i++) {
136
+ const notebook = args.notebooks[i];
137
+ await sendProgress?.(`Creating notebook ${i + 1}/${total}: ${notebook.name}`, i, total);
138
+ log.info(` 📓 Creating notebook ${i + 1}/${total}: ${notebook.name}`);
139
+ try {
140
+ const result = await handleCreateNotebook(ctx, {
141
+ name: notebook.name,
142
+ sources: notebook.sources,
143
+ description: notebook.description,
144
+ topics: notebook.topics,
145
+ auto_add_to_library: true,
146
+ show_browser: args.show_browser,
147
+ });
148
+ if (result.success && result.data) {
149
+ results.push({
150
+ name: notebook.name,
151
+ success: true,
152
+ url: result.data.url,
153
+ });
154
+ succeeded++;
155
+ log.success(` ✅ Created: ${result.data.url}`);
156
+ }
157
+ else {
158
+ results.push({
159
+ name: notebook.name,
160
+ success: false,
161
+ error: result.error || "Unknown error",
162
+ });
163
+ failed++;
164
+ log.error(` ❌ Failed: ${result.error}`);
165
+ if (args.stop_on_error) {
166
+ log.warning(` ⚠️ Stopping batch due to error (stop_on_error=true)`);
167
+ break;
168
+ }
169
+ }
170
+ }
171
+ catch (error) {
172
+ const errorMessage = error instanceof Error ? error.message : String(error);
173
+ results.push({
174
+ name: notebook.name,
175
+ success: false,
176
+ error: errorMessage,
177
+ });
178
+ failed++;
179
+ log.error(` ❌ Exception: ${errorMessage}`);
180
+ if (args.stop_on_error) {
181
+ log.warning(` ⚠️ Stopping batch due to exception (stop_on_error=true)`);
182
+ break;
183
+ }
184
+ }
185
+ // Delay between notebooks to avoid rate limiting
186
+ if (i < args.notebooks.length - 1) {
187
+ const delay = 2000 + Math.random() * 2000; // 2-4 seconds
188
+ await new Promise((resolve) => setTimeout(resolve, delay));
189
+ }
190
+ }
191
+ await sendProgress?.(`Batch complete: ${succeeded}/${total} succeeded`, total, total);
192
+ log.success(`✅ [TOOL] batch_create_notebooks completed: ${succeeded}/${total} succeeded`);
193
+ return {
194
+ success: failed === 0,
195
+ data: {
196
+ total,
197
+ succeeded,
198
+ failed,
199
+ results,
200
+ },
201
+ };
202
+ }
203
+ catch (error) {
204
+ const errorMessage = error instanceof Error ? error.message : String(error);
205
+ log.error(`❌ [TOOL] batch_create_notebooks failed: ${errorMessage}`);
206
+ return {
207
+ success: false,
208
+ error: errorMessage,
209
+ };
210
+ }
211
+ }
212
+ export async function handleSyncLibrary(ctx, args) {
213
+ log.info(`🔧 [TOOL] sync_library called`);
214
+ log.info(` Auto-fix: ${args.auto_fix || false}`);
215
+ log.info(` Show browser: ${args.show_browser || false}`);
216
+ try {
217
+ // Get the shared context manager from session manager
218
+ const contextManager = ctx.sessionManager.getContextManager();
219
+ // Sync library
220
+ const sync = new NotebookSync(ctx.authManager, contextManager, ctx.library);
221
+ const result = await sync.syncLibrary({
222
+ autoFix: args.auto_fix,
223
+ showBrowser: args.show_browser,
224
+ });
225
+ // Audit log
226
+ await audit.tool("sync_library", {
227
+ matched: result.matched.length,
228
+ stale: result.staleEntries.length,
229
+ missing: result.missingNotebooks.length,
230
+ autoFix: args.auto_fix,
231
+ }, true, 0);
232
+ log.success(`✅ [TOOL] sync_library completed`);
233
+ return {
234
+ success: true,
235
+ data: result,
236
+ };
237
+ }
238
+ catch (error) {
239
+ const errorMessage = error instanceof Error ? error.message : String(error);
240
+ log.error(`❌ [TOOL] sync_library failed: ${errorMessage}`);
241
+ await audit.tool("sync_library", {
242
+ error: errorMessage,
243
+ }, false, 0, errorMessage);
244
+ return {
245
+ success: false,
246
+ error: errorMessage,
247
+ };
248
+ }
249
+ }
250
+ export async function handleListSources(ctx, args) {
251
+ log.info(`🔧 [TOOL] list_sources called`);
252
+ try {
253
+ // Resolve notebook URL
254
+ let notebookUrl = args.notebook_url;
255
+ if (!notebookUrl && args.notebook_id) {
256
+ const notebook = ctx.library.getNotebook(args.notebook_id);
257
+ if (!notebook) {
258
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
259
+ }
260
+ notebookUrl = notebook.url;
261
+ log.info(` Resolved notebook: ${notebook.name}`);
262
+ }
263
+ else if (!notebookUrl) {
264
+ const active = ctx.library.getActiveNotebook();
265
+ if (active) {
266
+ notebookUrl = active.url;
267
+ log.info(` Using active notebook: ${active.name}`);
268
+ }
269
+ else {
270
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
271
+ }
272
+ }
273
+ // Validate URL
274
+ const safeUrl = validateNotebookUrl(notebookUrl);
275
+ // Get the shared context manager from session manager
276
+ const contextManager = ctx.sessionManager.getContextManager();
277
+ // List sources
278
+ const sourceManager = new SourceManager(ctx.authManager, contextManager);
279
+ const result = await sourceManager.listSources(safeUrl);
280
+ log.success(`✅ [TOOL] list_sources completed (${result.count} sources)`);
281
+ return {
282
+ success: true,
283
+ data: result,
284
+ };
285
+ }
286
+ catch (error) {
287
+ const errorMessage = error instanceof Error ? error.message : String(error);
288
+ log.error(`❌ [TOOL] list_sources failed: ${errorMessage}`);
289
+ return {
290
+ success: false,
291
+ error: errorMessage,
292
+ };
293
+ }
294
+ }
295
+ export async function handleAddSource(ctx, args) {
296
+ log.info(`🔧 [TOOL] add_source called`);
297
+ log.info(` Source type: ${args.source?.type}`);
298
+ try {
299
+ // Validate source
300
+ if (!args.source || !args.source.type || !args.source.value) {
301
+ throw new Error("Source with type and value is required");
302
+ }
303
+ if (!["url", "text", "file"].includes(args.source.type)) {
304
+ throw new Error(`Invalid source type: ${args.source.type}. Must be url, text, or file.`);
305
+ }
306
+ // Resolve notebook URL
307
+ let notebookUrl = args.notebook_url;
308
+ if (!notebookUrl && args.notebook_id) {
309
+ const notebook = ctx.library.getNotebook(args.notebook_id);
310
+ if (!notebook) {
311
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
312
+ }
313
+ notebookUrl = notebook.url;
314
+ log.info(` Resolved notebook: ${notebook.name}`);
315
+ }
316
+ else if (!notebookUrl) {
317
+ const active = ctx.library.getActiveNotebook();
318
+ if (active) {
319
+ notebookUrl = active.url;
320
+ log.info(` Using active notebook: ${active.name}`);
321
+ }
322
+ else {
323
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
324
+ }
325
+ }
326
+ // Validate URL
327
+ const safeUrl = validateNotebookUrl(notebookUrl);
328
+ // Get the shared context manager from session manager
329
+ const contextManager = ctx.sessionManager.getContextManager();
330
+ // Add source
331
+ const sourceManager = new SourceManager(ctx.authManager, contextManager);
332
+ const result = await sourceManager.addSource(safeUrl, args.source);
333
+ if (result.success) {
334
+ log.success(`✅ [TOOL] add_source completed`);
335
+ }
336
+ else {
337
+ log.warning(`⚠️ [TOOL] add_source failed: ${result.error}`);
338
+ }
339
+ return {
340
+ success: result.success,
341
+ data: result,
342
+ ...(result.error && { error: result.error }),
343
+ };
344
+ }
345
+ catch (error) {
346
+ const errorMessage = error instanceof Error ? error.message : String(error);
347
+ log.error(`❌ [TOOL] add_source failed: ${errorMessage}`);
348
+ return {
349
+ success: false,
350
+ error: errorMessage,
351
+ };
352
+ }
353
+ }
354
+ export async function handleAddFolder(ctx, args, sendProgress) {
355
+ const { promises: fs } = await import("fs");
356
+ const path = await import("path");
357
+ const folderPath = args.folder_path;
358
+ const recursive = args.recursive ?? false;
359
+ const dryRun = args.dry_run ?? false;
360
+ const fileTypes = (args.file_types ?? [".pdf", ".txt", ".md", ".docx"]).map((e) => e.startsWith(".") ? e.toLowerCase() : `.${e.toLowerCase()}`);
361
+ log.info(`🔧 [TOOL] add_folder called`);
362
+ log.info(` Folder: ${folderPath}`);
363
+ log.info(` File types: ${fileTypes.join(", ")}`);
364
+ log.info(` Recursive: ${recursive}`);
365
+ log.info(` Dry run: ${dryRun}`);
366
+ try {
367
+ // ── 1. Validate folder ───────────────────────────────────────────────
368
+ let stat;
369
+ try {
370
+ stat = await fs.stat(folderPath);
371
+ }
372
+ catch {
373
+ throw new Error(`Folder not found: ${folderPath}`);
374
+ }
375
+ if (!stat.isDirectory()) {
376
+ throw new Error(`Path is not a directory: ${folderPath}`);
377
+ }
378
+ // ── 2. Scan files ────────────────────────────────────────────────────
379
+ const scanDir = async (dir) => {
380
+ const entries = await fs.readdir(dir, { withFileTypes: true });
381
+ const files = [];
382
+ for (const entry of entries) {
383
+ const fullPath = path.join(dir, entry.name);
384
+ if (entry.isDirectory() && recursive) {
385
+ files.push(...(await scanDir(fullPath)));
386
+ }
387
+ else if (entry.isFile()) {
388
+ const ext = path.extname(entry.name).toLowerCase();
389
+ if (fileTypes.includes(ext)) {
390
+ files.push(fullPath);
391
+ }
392
+ }
393
+ }
394
+ return files.sort();
395
+ };
396
+ await sendProgress?.("Scanning folder...", 0, 10);
397
+ const allFiles = await scanDir(folderPath);
398
+ if (allFiles.length === 0) {
399
+ return {
400
+ success: true,
401
+ data: {
402
+ files_found: 0,
403
+ files_added: 0,
404
+ files_failed: 0,
405
+ files_skipped: 0,
406
+ notebooks_used: [],
407
+ failed_files: [],
408
+ dry_run: dryRun,
409
+ },
410
+ error: `No supported files found in ${folderPath} (looking for: ${fileTypes.join(", ")})`,
411
+ };
412
+ }
413
+ log.info(` Found ${allFiles.length} files`);
414
+ await sendProgress?.(`Found ${allFiles.length} files`, 1, 10);
415
+ // ── 3. Dry run — return preview ──────────────────────────────────────
416
+ if (dryRun) {
417
+ return {
418
+ success: true,
419
+ data: {
420
+ files_found: allFiles.length,
421
+ files_added: 0,
422
+ files_failed: 0,
423
+ files_skipped: 0,
424
+ notebooks_used: [],
425
+ failed_files: [],
426
+ dry_run: true,
427
+ },
428
+ };
429
+ }
430
+ // ── 4. Resolve target notebook ───────────────────────────────────────
431
+ let notebookUrl = args.notebook_url;
432
+ let notebookName = args.notebook_name_prefix ?? path.basename(folderPath);
433
+ if (!notebookUrl && args.notebook_id) {
434
+ const notebook = ctx.library.getNotebook(args.notebook_id);
435
+ if (!notebook)
436
+ throw new Error(`Notebook not found: ${args.notebook_id}`);
437
+ notebookUrl = notebook.url;
438
+ notebookName = notebook.name;
439
+ log.info(` Target notebook: ${notebookName}`);
440
+ }
441
+ else if (!notebookUrl) {
442
+ const active = ctx.library.getActiveNotebook();
443
+ if (active) {
444
+ notebookUrl = active.url;
445
+ notebookName = active.name;
446
+ log.info(` Using active notebook: ${notebookName}`);
447
+ }
448
+ else {
449
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
450
+ }
451
+ }
452
+ // ── 5. Check tier limit and chunk files ──────────────────────────────
453
+ const limits = getQuotaManager().getLimits();
454
+ const chunkSize = limits.sourcesPerNotebook;
455
+ const chunks = [];
456
+ for (let i = 0; i < allFiles.length; i += chunkSize) {
457
+ chunks.push(allFiles.slice(i, i + chunkSize));
458
+ }
459
+ log.info(` Tier limit: ${chunkSize} sources/notebook → ${chunks.length} chunk(s)`);
460
+ // ── 6. Add files ─────────────────────────────────────────────────────
461
+ const contextManager = ctx.sessionManager.getContextManager();
462
+ const notebooksUsed = [];
463
+ const failedFiles = [];
464
+ let totalAdded = 0;
465
+ for (let chunkIdx = 0; chunkIdx < chunks.length; chunkIdx++) {
466
+ const chunk = chunks[chunkIdx];
467
+ // Determine notebook URL for this chunk
468
+ let targetUrl;
469
+ if (chunkIdx === 0) {
470
+ targetUrl = validateNotebookUrl(notebookUrl);
471
+ }
472
+ else {
473
+ // Auto-create overflow notebook
474
+ const overflowName = chunks.length === 2
475
+ ? `${notebookName} (2/2)`
476
+ : `${notebookName} (${chunkIdx + 1}/${chunks.length})`;
477
+ await sendProgress?.(`Creating overflow notebook: ${overflowName}`, 2, 10);
478
+ log.info(` Creating overflow notebook: ${overflowName}`);
479
+ const created = await handleCreateNotebook(ctx, { name: overflowName, sources: [], auto_add_to_library: true }, sendProgress);
480
+ if (!created.success || !created.data?.url) {
481
+ failedFiles.push(...chunk.map((f) => ({ file: f, error: `Could not create overflow notebook ${overflowName}` })));
482
+ continue;
483
+ }
484
+ targetUrl = validateNotebookUrl(created.data.url);
485
+ notebooksUsed.push(overflowName);
486
+ }
487
+ if (chunkIdx === 0) {
488
+ notebooksUsed.unshift(notebookName);
489
+ }
490
+ const sourceManager = new SourceManager(ctx.authManager, contextManager);
491
+ for (let i = 0; i < chunk.length; i++) {
492
+ const filePath = chunk[i];
493
+ const fileName = path.basename(filePath);
494
+ const globalIdx = chunkIdx * chunkSize + i + 1;
495
+ const progressStep = Math.min(9, 2 + Math.floor((globalIdx / allFiles.length) * 7));
496
+ await sendProgress?.(`Adding file ${globalIdx}/${allFiles.length}: ${fileName}`, progressStep, 10);
497
+ log.info(` [${globalIdx}/${allFiles.length}] Adding: ${fileName}`);
498
+ try {
499
+ const result = await sourceManager.addSource(targetUrl, {
500
+ type: "file",
501
+ value: filePath,
502
+ });
503
+ if (result.success) {
504
+ totalAdded++;
505
+ }
506
+ else {
507
+ failedFiles.push({ file: filePath, error: result.error ?? "Unknown error" });
508
+ log.warning(` ⚠️ Failed: ${fileName} — ${result.error}`);
509
+ }
510
+ }
511
+ catch (err) {
512
+ const msg = err instanceof Error ? err.message : String(err);
513
+ failedFiles.push({ file: filePath, error: msg });
514
+ log.warning(` ⚠️ Error: ${fileName} — ${msg}`);
515
+ }
516
+ }
517
+ }
518
+ await sendProgress?.("Done!", 10, 10);
519
+ log.success(`✅ [TOOL] add_folder complete: ${totalAdded}/${allFiles.length} added, ${failedFiles.length} failed`);
520
+ return {
521
+ success: failedFiles.length === 0,
522
+ data: {
523
+ files_found: allFiles.length,
524
+ files_added: totalAdded,
525
+ files_failed: failedFiles.length,
526
+ files_skipped: allFiles.length - totalAdded - failedFiles.length,
527
+ notebooks_used: notebooksUsed,
528
+ failed_files: failedFiles,
529
+ dry_run: false,
530
+ },
531
+ ...(failedFiles.length > 0 && {
532
+ error: `${failedFiles.length} file(s) failed to add`,
533
+ }),
534
+ };
535
+ }
536
+ catch (error) {
537
+ const errorMessage = error instanceof Error ? error.message : String(error);
538
+ log.error(`❌ [TOOL] add_folder failed: ${errorMessage}`);
539
+ return { success: false, error: errorMessage };
540
+ }
541
+ }
542
+ export async function handleRemoveSource(ctx, args) {
543
+ log.info(`🔧 [TOOL] remove_source called`);
544
+ log.info(` Source ID: ${args.source_id}`);
545
+ try {
546
+ // Validate source_id
547
+ if (!args.source_id) {
548
+ throw new Error("source_id is required");
549
+ }
550
+ // Resolve notebook URL
551
+ let notebookUrl = args.notebook_url;
552
+ if (!notebookUrl && args.notebook_id) {
553
+ const notebook = ctx.library.getNotebook(args.notebook_id);
554
+ if (!notebook) {
555
+ throw new Error(`Notebook not found in library: ${args.notebook_id}`);
556
+ }
557
+ notebookUrl = notebook.url;
558
+ log.info(` Resolved notebook: ${notebook.name}`);
559
+ }
560
+ else if (!notebookUrl) {
561
+ const active = ctx.library.getActiveNotebook();
562
+ if (active) {
563
+ notebookUrl = active.url;
564
+ log.info(` Using active notebook: ${active.name}`);
565
+ }
566
+ else {
567
+ throw new Error("No notebook specified. Provide notebook_id or notebook_url.");
568
+ }
569
+ }
570
+ // Validate URL
571
+ const safeUrl = validateNotebookUrl(notebookUrl);
572
+ // Get the shared context manager from session manager
573
+ const contextManager = ctx.sessionManager.getContextManager();
574
+ // Remove source
575
+ const sourceManager = new SourceManager(ctx.authManager, contextManager);
576
+ const result = await sourceManager.removeSource(safeUrl, args.source_id);
577
+ if (result.success) {
578
+ log.success(`✅ [TOOL] remove_source completed`);
579
+ }
580
+ else {
581
+ log.warning(`⚠️ [TOOL] remove_source failed: ${result.error}`);
582
+ }
583
+ return {
584
+ success: result.success,
585
+ data: result,
586
+ ...(result.error && { error: result.error }),
587
+ };
588
+ }
589
+ catch (error) {
590
+ const errorMessage = error instanceof Error ? error.message : String(error);
591
+ log.error(`❌ [TOOL] remove_source failed: ${errorMessage}`);
592
+ return {
593
+ success: false,
594
+ error: errorMessage,
595
+ };
596
+ }
597
+ }
598
+ //# sourceMappingURL=notebook-creation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-creation.js","sourceRoot":"","sources":["../../../src/tools/handlers/notebook-creation.ts"],"names":[],"mappings":"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"}