@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.
- package/README.md +39 -18
- package/dist/auth/auth-manager.d.ts +37 -2
- package/dist/auth/auth-manager.d.ts.map +1 -1
- package/dist/auth/auth-manager.js +133 -11
- package/dist/auth/auth-manager.js.map +1 -1
- package/dist/auth/mcp-auth.d.ts +25 -4
- package/dist/auth/mcp-auth.d.ts.map +1 -1
- package/dist/auth/mcp-auth.js +145 -29
- package/dist/auth/mcp-auth.js.map +1 -1
- package/dist/compliance/retention-engine.js +1 -1
- package/dist/compliance/retention-engine.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +56 -8
- package/dist/config.js.map +1 -1
- package/dist/gemini/gemini-client.d.ts.map +1 -1
- package/dist/gemini/gemini-client.js +58 -20
- package/dist/gemini/gemini-client.js.map +1 -1
- package/dist/index.js +87 -180
- package/dist/index.js.map +1 -1
- package/dist/notebook-creation/audio-manager.js +2 -2
- package/dist/notebook-creation/audio-manager.js.map +1 -1
- package/dist/notebook-creation/data-table-manager.d.ts +13 -3
- package/dist/notebook-creation/data-table-manager.d.ts.map +1 -1
- package/dist/notebook-creation/data-table-manager.js +70 -32
- package/dist/notebook-creation/data-table-manager.js.map +1 -1
- package/dist/notebook-creation/discover-creation-flow.js +1 -1
- package/dist/notebook-creation/discover-creation-flow.js.map +1 -1
- package/dist/notebook-creation/discover-quota.js +1 -1
- package/dist/notebook-creation/discover-quota.js.map +1 -1
- package/dist/notebook-creation/discover-sources.js +1 -1
- package/dist/notebook-creation/discover-sources.js.map +1 -1
- package/dist/notebook-creation/notebook-creator.d.ts.map +1 -1
- package/dist/notebook-creation/notebook-creator.js +49 -26
- package/dist/notebook-creation/notebook-creator.js.map +1 -1
- package/dist/notebook-creation/notebook-sync.js +1 -1
- package/dist/notebook-creation/notebook-sync.js.map +1 -1
- package/dist/notebook-creation/selectors.d.ts +21 -16
- package/dist/notebook-creation/selectors.d.ts.map +1 -1
- package/dist/notebook-creation/selectors.js +37 -20
- package/dist/notebook-creation/selectors.js.map +1 -1
- package/dist/notebook-creation/source-manager.d.ts.map +1 -1
- package/dist/notebook-creation/source-manager.js +29 -6
- package/dist/notebook-creation/source-manager.js.map +1 -1
- package/dist/notebook-creation/video-manager.d.ts +10 -1
- package/dist/notebook-creation/video-manager.d.ts.map +1 -1
- package/dist/notebook-creation/video-manager.js +103 -42
- package/dist/notebook-creation/video-manager.js.map +1 -1
- package/dist/quota/quota-manager.d.ts.map +1 -1
- package/dist/quota/quota-manager.js +46 -15
- package/dist/quota/quota-manager.js.map +1 -1
- package/dist/session/browser-session.d.ts.map +1 -1
- package/dist/session/browser-session.js +21 -14
- package/dist/session/browser-session.js.map +1 -1
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
- package/dist/tools/definitions/notebook-management.js +64 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -1
- package/dist/tools/handlers/ask-question.d.ts +18 -0
- package/dist/tools/handlers/ask-question.d.ts.map +1 -0
- package/dist/tools/handlers/ask-question.js +236 -0
- package/dist/tools/handlers/ask-question.js.map +1 -0
- package/dist/tools/handlers/audio-video.d.ts +42 -0
- package/dist/tools/handlers/audio-video.d.ts.map +1 -0
- package/dist/tools/handlers/audio-video.js +356 -0
- package/dist/tools/handlers/audio-video.js.map +1 -0
- package/dist/tools/handlers/auth.d.ts +41 -0
- package/dist/tools/handlers/auth.d.ts.map +1 -0
- package/dist/tools/handlers/auth.js +171 -0
- package/dist/tools/handlers/auth.js.map +1 -0
- package/dist/tools/handlers/gemini.d.ts +142 -0
- package/dist/tools/handlers/gemini.d.ts.map +1 -0
- package/dist/tools/handlers/gemini.js +626 -0
- package/dist/tools/handlers/gemini.js.map +1 -0
- package/dist/tools/handlers/index.d.ts +295 -0
- package/dist/tools/handlers/index.d.ts.map +1 -0
- package/dist/tools/handlers/index.js +197 -0
- package/dist/tools/handlers/index.js.map +1 -0
- package/dist/tools/handlers/notebook-creation.d.ts +75 -0
- package/dist/tools/handlers/notebook-creation.d.ts.map +1 -0
- package/dist/tools/handlers/notebook-creation.js +598 -0
- package/dist/tools/handlers/notebook-creation.js.map +1 -0
- package/dist/tools/handlers/notebook-management.d.ts +64 -0
- package/dist/tools/handlers/notebook-management.d.ts.map +1 -0
- package/dist/tools/handlers/notebook-management.js +214 -0
- package/dist/tools/handlers/notebook-management.js.map +1 -0
- package/dist/tools/handlers/session-management.d.ts +68 -0
- package/dist/tools/handlers/session-management.d.ts.map +1 -0
- package/dist/tools/handlers/session-management.js +238 -0
- package/dist/tools/handlers/session-management.js.map +1 -0
- package/dist/tools/handlers/system.d.ts +102 -0
- package/dist/tools/handlers/system.d.ts.map +1 -0
- package/dist/tools/handlers/system.js +275 -0
- package/dist/tools/handlers/system.js.map +1 -0
- package/dist/tools/handlers/types.d.ts +19 -0
- package/dist/tools/handlers/types.d.ts.map +1 -0
- package/dist/tools/handlers/types.js +5 -0
- package/dist/tools/handlers/types.js.map +1 -0
- package/dist/tools/handlers/webhooks.d.ts +34 -0
- package/dist/tools/handlers/webhooks.d.ts.map +1 -0
- package/dist/tools/handlers/webhooks.js +122 -0
- package/dist/tools/handlers/webhooks.js.map +1 -0
- package/dist/tools/handlers.d.ts +27 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +226 -5
- package/dist/tools/handlers.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/utils/cleanup-manager.d.ts.map +1 -1
- package/dist/utils/cleanup-manager.js +8 -10
- package/dist/utils/cleanup-manager.js.map +1 -1
- package/dist/utils/file-permissions.d.ts.map +1 -1
- package/dist/utils/file-permissions.js +41 -6
- package/dist/utils/file-permissions.js.map +1 -1
- package/docs/improvement-sprint-2026.2.10.md +210 -0
- 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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"}
|