@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,626 @@
1
+ /**
2
+ * Gemini Handlers
3
+ *
4
+ * Handles deep_research, gemini_query, get_research_status,
5
+ * upload_document, query_document, list_documents, delete_document,
6
+ * query_chunked_document, get_query_history, and get_notebook_chat_history tools.
7
+ */
8
+ import { CONFIG, applyBrowserOptions } from "../../config.js";
9
+ import { log } from "../../utils/logger.js";
10
+ import { audit } from "../../utils/audit-logger.js";
11
+ import { validateNotebookUrl, validateNotebookId, sanitizeForLogging, } from "../../utils/security.js";
12
+ import { getQueryLogger } from "../../logging/index.js";
13
+ /**
14
+ * Handle deep_research tool
15
+ */
16
+ export async function handleDeepResearch(ctx, args, sendProgress) {
17
+ const startTime = Date.now();
18
+ log.info(`🔧 [TOOL] deep_research called`);
19
+ log.info(` Query: "${sanitizeForLogging(args.query.substring(0, 100))}"...`);
20
+ // Check if Gemini is available
21
+ if (!ctx.geminiClient.isAvailable()) {
22
+ log.error(`❌ [TOOL] deep_research failed: Gemini API key not configured`);
23
+ return {
24
+ success: false,
25
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
26
+ };
27
+ }
28
+ try {
29
+ // Validate query
30
+ if (!args.query || args.query.trim().length === 0) {
31
+ throw new Error("Query cannot be empty");
32
+ }
33
+ if (args.query.length > 10000) {
34
+ throw new Error("Query too long (max 10000 characters)");
35
+ }
36
+ // Validate max_wait_seconds
37
+ const maxWaitSeconds = Math.min(args.max_wait_seconds || 300, 600); // Max 10 minutes
38
+ const maxWaitMs = maxWaitSeconds * 1000;
39
+ if (sendProgress) {
40
+ await sendProgress("Starting deep research...", 0, 100);
41
+ }
42
+ // Start the research
43
+ const interaction = await ctx.geminiClient.deepResearch({
44
+ query: args.query,
45
+ background: true,
46
+ waitForCompletion: args.wait_for_completion !== false,
47
+ maxWaitMs,
48
+ progressCallback: sendProgress,
49
+ });
50
+ const durationMs = Date.now() - startTime;
51
+ // Extract the answer
52
+ const answer = interaction.outputs.find(o => o.type === "text")?.text || "";
53
+ // Audit log
54
+ await audit.tool("deep_research", { query: sanitizeForLogging(args.query) }, true, durationMs);
55
+ log.success(`✅ [TOOL] deep_research completed in ${durationMs}ms`);
56
+ return {
57
+ success: true,
58
+ data: {
59
+ interactionId: interaction.id,
60
+ status: interaction.status,
61
+ answer,
62
+ tokensUsed: interaction.usage?.totalTokens,
63
+ durationMs,
64
+ ...(interaction.deprecationWarning && { deprecationWarning: interaction.deprecationWarning }),
65
+ },
66
+ };
67
+ }
68
+ catch (error) {
69
+ const errorMessage = error instanceof Error ? error.message : String(error);
70
+ const durationMs = Date.now() - startTime;
71
+ log.error(`❌ [TOOL] deep_research failed: ${errorMessage}`);
72
+ await audit.tool("deep_research", { query: sanitizeForLogging(args.query) }, false, durationMs, errorMessage);
73
+ return { success: false, error: errorMessage };
74
+ }
75
+ }
76
+ /**
77
+ * Handle gemini_query tool
78
+ */
79
+ export async function handleGeminiQuery(ctx, args) {
80
+ const startTime = Date.now();
81
+ log.info(`🔧 [TOOL] gemini_query called`);
82
+ log.info(` Query: "${sanitizeForLogging(args.query.substring(0, 100))}"...`);
83
+ log.info(` Model: ${args.model || "default"}`);
84
+ if (args.tools)
85
+ log.info(` Tools: ${args.tools.join(", ")}`);
86
+ // Check if Gemini is available
87
+ if (!ctx.geminiClient.isAvailable()) {
88
+ log.error(`❌ [TOOL] gemini_query failed: Gemini API key not configured`);
89
+ return {
90
+ success: false,
91
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
92
+ };
93
+ }
94
+ try {
95
+ // Validate query
96
+ if (!args.query || args.query.trim().length === 0) {
97
+ throw new Error("Query cannot be empty");
98
+ }
99
+ if (args.query.length > 30000) {
100
+ throw new Error("Query too long (max 30000 characters)");
101
+ }
102
+ // If URLs provided, auto-enable url_context
103
+ let tools = args.tools || [];
104
+ if (args.urls && args.urls.length > 0 && !tools.includes("url_context")) {
105
+ tools = [...tools, "url_context"];
106
+ }
107
+ // Validate URLs if provided
108
+ if (args.urls) {
109
+ for (const url of args.urls) {
110
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
111
+ throw new Error(`Invalid URL: ${url} (must start with http:// or https://)`);
112
+ }
113
+ }
114
+ }
115
+ // Build generationConfig from thinking_level and response_schema
116
+ const hasGenConfig = args.thinking_level || args.response_schema;
117
+ const generationConfig = hasGenConfig ? {
118
+ ...(args.thinking_level && { thinkingLevel: args.thinking_level }),
119
+ ...(args.response_schema && {
120
+ responseMimeType: "application/json",
121
+ responseSchema: args.response_schema,
122
+ }),
123
+ } : undefined;
124
+ const interaction = await ctx.geminiClient.query({
125
+ query: args.query,
126
+ model: args.model,
127
+ tools,
128
+ urls: args.urls,
129
+ previousInteractionId: args.previous_interaction_id,
130
+ generationConfig,
131
+ });
132
+ const durationMs = Date.now() - startTime;
133
+ // Extract the answer
134
+ const answer = interaction.outputs.find(o => o.type === "text")?.text || "";
135
+ // Identify which tools were used
136
+ const toolsUsed = interaction.outputs
137
+ .filter(o => o.type === "function_call")
138
+ .map(o => o.name)
139
+ .filter((name) => !!name);
140
+ // Audit log
141
+ await audit.tool("gemini_query", {
142
+ query: sanitizeForLogging(args.query),
143
+ model: args.model,
144
+ tools: args.tools,
145
+ }, true, durationMs);
146
+ log.success(`✅ [TOOL] gemini_query completed in ${durationMs}ms`);
147
+ return {
148
+ success: true,
149
+ data: {
150
+ interactionId: interaction.id,
151
+ answer,
152
+ model: interaction.model || args.model || CONFIG.geminiDefaultModel,
153
+ tokensUsed: interaction.usage?.totalTokens,
154
+ toolsUsed: toolsUsed.length > 0 ? toolsUsed : undefined,
155
+ ...(interaction.deprecationWarning && { deprecationWarning: interaction.deprecationWarning }),
156
+ },
157
+ };
158
+ }
159
+ catch (error) {
160
+ const errorMessage = error instanceof Error ? error.message : String(error);
161
+ const durationMs = Date.now() - startTime;
162
+ log.error(`❌ [TOOL] gemini_query failed: ${errorMessage}`);
163
+ await audit.tool("gemini_query", { query: sanitizeForLogging(args.query) }, false, durationMs, errorMessage);
164
+ return { success: false, error: errorMessage };
165
+ }
166
+ }
167
+ /**
168
+ * Handle get_research_status tool
169
+ */
170
+ export async function handleGetResearchStatus(ctx, args) {
171
+ log.info(`🔧 [TOOL] get_research_status called`);
172
+ log.info(` Interaction ID: ${args.interaction_id}`);
173
+ // Check if Gemini is available
174
+ if (!ctx.geminiClient.isAvailable()) {
175
+ log.error(`❌ [TOOL] get_research_status failed: Gemini API key not configured`);
176
+ return {
177
+ success: false,
178
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
179
+ };
180
+ }
181
+ try {
182
+ // Validate interaction_id
183
+ if (!args.interaction_id || args.interaction_id.trim().length === 0) {
184
+ throw new Error("Interaction ID cannot be empty");
185
+ }
186
+ const interaction = await ctx.geminiClient.getInteraction(args.interaction_id);
187
+ log.success(`✅ [TOOL] get_research_status: ${interaction.status}`);
188
+ return {
189
+ success: true,
190
+ data: interaction,
191
+ };
192
+ }
193
+ catch (error) {
194
+ const errorMessage = error instanceof Error ? error.message : String(error);
195
+ log.error(`❌ [TOOL] get_research_status failed: ${errorMessage}`);
196
+ return { success: false, error: errorMessage };
197
+ }
198
+ }
199
+ // ==================== DOCUMENT TOOLS (v1.9.0) ====================
200
+ /**
201
+ * Upload a document to Gemini Files API
202
+ */
203
+ export async function handleUploadDocument(ctx, args) {
204
+ const startTime = Date.now();
205
+ log.info(`🔧 [TOOL] upload_document called`);
206
+ log.info(` File: ${args.file_path}`);
207
+ // Check if Gemini is available
208
+ if (!ctx.geminiClient.isAvailable()) {
209
+ log.error(`❌ [TOOL] upload_document failed: Gemini API key not configured`);
210
+ return {
211
+ success: false,
212
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
213
+ };
214
+ }
215
+ try {
216
+ // Validate file path
217
+ if (!args.file_path || args.file_path.trim().length === 0) {
218
+ throw new Error("File path cannot be empty");
219
+ }
220
+ const result = await ctx.geminiClient.uploadDocument({
221
+ filePath: args.file_path,
222
+ displayName: args.display_name,
223
+ });
224
+ const durationMs = Date.now() - startTime;
225
+ await audit.tool("upload_document", { file: sanitizeForLogging(args.file_path) }, true, durationMs);
226
+ log.success(`✅ [TOOL] upload_document completed in ${durationMs}ms`);
227
+ return {
228
+ success: true,
229
+ data: result,
230
+ };
231
+ }
232
+ catch (error) {
233
+ const errorMessage = error instanceof Error ? error.message : String(error);
234
+ const durationMs = Date.now() - startTime;
235
+ await audit.tool("upload_document", { file: sanitizeForLogging(args.file_path) }, false, durationMs, errorMessage);
236
+ log.error(`❌ [TOOL] upload_document failed: ${errorMessage}`);
237
+ return { success: false, error: errorMessage };
238
+ }
239
+ }
240
+ /**
241
+ * Query an uploaded document
242
+ */
243
+ export async function handleQueryDocument(ctx, args) {
244
+ const startTime = Date.now();
245
+ log.info(`🔧 [TOOL] query_document called`);
246
+ log.info(` File: ${args.file_name}`);
247
+ log.info(` Query: ${args.query.substring(0, 50)}...`);
248
+ // Check if Gemini is available
249
+ if (!ctx.geminiClient.isAvailable()) {
250
+ log.error(`❌ [TOOL] query_document failed: Gemini API key not configured`);
251
+ return {
252
+ success: false,
253
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
254
+ };
255
+ }
256
+ try {
257
+ // Validate inputs
258
+ if (!args.file_name || args.file_name.trim().length === 0) {
259
+ throw new Error("File name cannot be empty");
260
+ }
261
+ if (!args.query || args.query.trim().length === 0) {
262
+ throw new Error("Query cannot be empty");
263
+ }
264
+ const result = await ctx.geminiClient.queryDocument({
265
+ fileName: args.file_name,
266
+ query: args.query,
267
+ model: args.model,
268
+ additionalFiles: args.additional_files,
269
+ });
270
+ const durationMs = Date.now() - startTime;
271
+ await audit.tool("query_document", { file: args.file_name, query: sanitizeForLogging(args.query) }, true, durationMs);
272
+ log.success(`✅ [TOOL] query_document completed in ${durationMs}ms`);
273
+ return {
274
+ success: true,
275
+ data: result,
276
+ };
277
+ }
278
+ catch (error) {
279
+ const errorMessage = error instanceof Error ? error.message : String(error);
280
+ const durationMs = Date.now() - startTime;
281
+ await audit.tool("query_document", { file: args.file_name }, false, durationMs, errorMessage);
282
+ log.error(`❌ [TOOL] query_document failed: ${errorMessage}`);
283
+ return { success: false, error: errorMessage };
284
+ }
285
+ }
286
+ /**
287
+ * List all uploaded documents
288
+ */
289
+ export async function handleListDocuments(ctx, args) {
290
+ log.info(`🔧 [TOOL] list_documents called`);
291
+ // Check if Gemini is available
292
+ if (!ctx.geminiClient.isAvailable()) {
293
+ log.error(`❌ [TOOL] list_documents failed: Gemini API key not configured`);
294
+ return {
295
+ success: false,
296
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
297
+ };
298
+ }
299
+ try {
300
+ const result = await ctx.geminiClient.listFiles(args.page_size || 100);
301
+ log.success(`✅ [TOOL] list_documents: ${result.totalCount} files`);
302
+ return {
303
+ success: true,
304
+ data: result,
305
+ };
306
+ }
307
+ catch (error) {
308
+ const errorMessage = error instanceof Error ? error.message : String(error);
309
+ log.error(`❌ [TOOL] list_documents failed: ${errorMessage}`);
310
+ return { success: false, error: errorMessage };
311
+ }
312
+ }
313
+ /**
314
+ * Delete an uploaded document
315
+ */
316
+ export async function handleDeleteDocument(ctx, args) {
317
+ log.info(`🔧 [TOOL] delete_document called`);
318
+ log.info(` File: ${args.file_name}`);
319
+ // Check if Gemini is available
320
+ if (!ctx.geminiClient.isAvailable()) {
321
+ log.error(`❌ [TOOL] delete_document failed: Gemini API key not configured`);
322
+ return {
323
+ success: false,
324
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
325
+ };
326
+ }
327
+ try {
328
+ // Validate file name
329
+ if (!args.file_name || args.file_name.trim().length === 0) {
330
+ throw new Error("File name cannot be empty");
331
+ }
332
+ await ctx.geminiClient.deleteFile(args.file_name);
333
+ log.success(`✅ [TOOL] delete_document: ${args.file_name} deleted`);
334
+ return {
335
+ success: true,
336
+ data: { deleted: true, fileName: args.file_name },
337
+ };
338
+ }
339
+ catch (error) {
340
+ const errorMessage = error instanceof Error ? error.message : String(error);
341
+ log.error(`❌ [TOOL] delete_document failed: ${errorMessage}`);
342
+ return { success: false, error: errorMessage };
343
+ }
344
+ }
345
+ /**
346
+ * Query a chunked document (v1.10.0)
347
+ * Queries multiple chunks and aggregates results
348
+ */
349
+ export async function handleQueryChunkedDocument(ctx, args) {
350
+ log.info(`🔧 [TOOL] query_chunked_document called`);
351
+ log.info(` Chunks: ${args.file_names.length}`);
352
+ log.info(` Query: ${args.query.substring(0, 50)}...`);
353
+ // Check if Gemini is available
354
+ if (!ctx.geminiClient.isAvailable()) {
355
+ log.error(`❌ [TOOL] query_chunked_document failed: Gemini API key not configured`);
356
+ return {
357
+ success: false,
358
+ error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
359
+ };
360
+ }
361
+ try {
362
+ // Validate inputs
363
+ if (!args.file_names || args.file_names.length === 0) {
364
+ throw new Error("At least one file name is required");
365
+ }
366
+ if (!args.query || args.query.trim().length === 0) {
367
+ throw new Error("Query cannot be empty");
368
+ }
369
+ const result = await ctx.geminiClient.queryChunkedDocument(args.file_names, args.query, { model: args.model });
370
+ log.success(`✅ [TOOL] query_chunked_document completed`);
371
+ return {
372
+ success: true,
373
+ data: {
374
+ answer: result.answer,
375
+ model: result.model,
376
+ tokensUsed: result.tokensUsed,
377
+ chunksQueried: args.file_names.length,
378
+ filesUsed: result.filesUsed,
379
+ },
380
+ };
381
+ }
382
+ catch (error) {
383
+ const errorMessage = error instanceof Error ? error.message : String(error);
384
+ log.error(`❌ [TOOL] query_chunked_document failed: ${errorMessage}`);
385
+ return { success: false, error: errorMessage };
386
+ }
387
+ }
388
+ // ==================== QUERY HISTORY ====================
389
+ /**
390
+ * Handle get_query_history tool
391
+ */
392
+ export async function handleGetQueryHistory(_ctx, args) {
393
+ log.info(`🔧 [TOOL] get_query_history called`);
394
+ try {
395
+ const queryLogger = getQueryLogger();
396
+ const limit = Math.min(args.limit ?? 50, 500); // Cap at 500
397
+ let queries;
398
+ if (args.search) {
399
+ // Search across all queries
400
+ queries = await queryLogger.searchQueries(args.search, { limit });
401
+ log.info(` Searching for: "${args.search}"`);
402
+ }
403
+ else if (args.session_id) {
404
+ // Filter by session
405
+ queries = await queryLogger.getQueriesForSession(args.session_id);
406
+ log.info(` Filtering by session: ${args.session_id}`);
407
+ }
408
+ else if (args.notebook_id) {
409
+ // Filter by notebook
410
+ queries = await queryLogger.getQueriesForNotebookId(args.notebook_id);
411
+ log.info(` Filtering by notebook: ${args.notebook_id}`);
412
+ }
413
+ else if (args.date) {
414
+ // Filter by date
415
+ queries = await queryLogger.getQueriesForDate(args.date);
416
+ log.info(` Filtering by date: ${args.date}`);
417
+ }
418
+ else {
419
+ // Get recent queries
420
+ queries = await queryLogger.getRecentQueries(limit);
421
+ log.info(` Getting recent queries (limit: ${limit})`);
422
+ }
423
+ // Apply limit
424
+ const limitedQueries = queries.slice(0, limit);
425
+ log.success(`✅ [TOOL] get_query_history completed (${limitedQueries.length} queries)`);
426
+ return {
427
+ success: true,
428
+ data: {
429
+ count: limitedQueries.length,
430
+ queries: limitedQueries,
431
+ },
432
+ };
433
+ }
434
+ catch (error) {
435
+ const errorMessage = error instanceof Error ? error.message : String(error);
436
+ log.error(`❌ [TOOL] get_query_history failed: ${errorMessage}`);
437
+ return {
438
+ success: false,
439
+ error: errorMessage,
440
+ };
441
+ }
442
+ }
443
+ // ==================== CHAT HISTORY ====================
444
+ /**
445
+ * Handle get_notebook_chat_history tool
446
+ *
447
+ * Extracts conversation history from a NotebookLM notebook's chat UI
448
+ */
449
+ export async function handleGetNotebookChatHistory(ctx, args) {
450
+ log.info(`🔧 [TOOL] get_notebook_chat_history called${args.preview_only ? ' (preview mode)' : ''}`);
451
+ try {
452
+ // Resolve notebook URL
453
+ let notebookUrl;
454
+ let notebookName;
455
+ if (args.notebook_url) {
456
+ notebookUrl = validateNotebookUrl(args.notebook_url);
457
+ }
458
+ else if (args.notebook_id) {
459
+ validateNotebookId(args.notebook_id);
460
+ const notebook = ctx.library.getNotebook(args.notebook_id);
461
+ if (!notebook) {
462
+ return {
463
+ success: false,
464
+ error: `Notebook not found: ${args.notebook_id}. Use list_notebooks to see available notebooks.`,
465
+ };
466
+ }
467
+ notebookUrl = notebook.url;
468
+ notebookName = notebook.name;
469
+ }
470
+ else {
471
+ // Try to use active notebook
472
+ const activeNotebook = ctx.library.getActiveNotebook();
473
+ if (!activeNotebook) {
474
+ return {
475
+ success: false,
476
+ error: "No notebook specified. Provide notebook_id or notebook_url, or set an active notebook.",
477
+ };
478
+ }
479
+ notebookUrl = activeNotebook.url;
480
+ notebookName = activeNotebook.name;
481
+ }
482
+ log.info(` 📓 Extracting chat history from: ${notebookUrl}`);
483
+ // Apply browser options if show_browser is set
484
+ if (args.show_browser !== undefined) {
485
+ applyBrowserOptions({ show: args.show_browser });
486
+ }
487
+ // Create a temporary session to navigate to the notebook
488
+ const sessionId = `chat-history-${Date.now()}`;
489
+ const session = await ctx.sessionManager.getOrCreateSession(sessionId, notebookUrl);
490
+ try {
491
+ // Get the page from the session
492
+ const page = session.getPage();
493
+ if (!page) {
494
+ throw new Error("Failed to get page from session");
495
+ }
496
+ // Wait a bit for the chat history to fully load
497
+ await page.waitForTimeout(2000);
498
+ const messages = await page.evaluate(() => {
499
+ const result = [];
500
+ // Get all message containers (both user and assistant)
501
+ // User messages: .from-user-container / Assistant messages: .to-user-container
502
+ // @ts-expect-error - DOM types available in browser context
503
+ const allContainers = document.querySelectorAll(".from-user-container, .to-user-container");
504
+ let idx = 0;
505
+ allContainers.forEach((container) => {
506
+ const isUser = container.classList?.contains("from-user-container");
507
+ const isAssistant = container.classList?.contains("to-user-container");
508
+ if (isUser) {
509
+ // User message - look for query text
510
+ const queryText = container.querySelector(".query-text, .message-text-content, .user-message");
511
+ if (queryText) {
512
+ const content = queryText.innerText?.trim();
513
+ if (content) {
514
+ result.push({ role: "user", content, index: idx++ });
515
+ }
516
+ }
517
+ else {
518
+ // Fallback: get container text directly
519
+ const content = container.innerText?.trim();
520
+ if (content) {
521
+ result.push({ role: "user", content, index: idx++ });
522
+ }
523
+ }
524
+ }
525
+ else if (isAssistant) {
526
+ // Assistant message
527
+ const textContent = container.querySelector(".message-text-content");
528
+ if (textContent) {
529
+ const content = textContent.innerText?.trim();
530
+ if (content) {
531
+ result.push({ role: "assistant", content, index: idx++ });
532
+ }
533
+ }
534
+ }
535
+ });
536
+ return result;
537
+ });
538
+ // Calculate stats
539
+ const totalMessages = messages.length;
540
+ const userMessages = messages.filter(m => m.role === "user").length;
541
+ const assistantMessages = messages.filter(m => m.role === "assistant").length;
542
+ // Preview mode - just return stats without content
543
+ if (args.preview_only) {
544
+ log.success(`✅ [TOOL] get_notebook_chat_history preview completed (${totalMessages} messages found)`);
545
+ return {
546
+ success: true,
547
+ data: {
548
+ notebook_url: notebookUrl,
549
+ notebook_name: notebookName,
550
+ total_messages: totalMessages,
551
+ returned_messages: 0,
552
+ user_messages: userMessages,
553
+ assistant_messages: assistantMessages,
554
+ },
555
+ };
556
+ }
557
+ // Apply pagination (offset and limit)
558
+ const offset = args.offset ?? 0;
559
+ const limit = Math.min(args.limit ?? 50, 200);
560
+ const startIdx = offset * 2; // offset is in pairs, convert to message count
561
+ const endIdx = startIdx + (limit * 2);
562
+ const paginatedMessages = messages.slice(startIdx, endIdx);
563
+ const hasMore = endIdx < totalMessages;
564
+ // Re-index the paginated messages
565
+ const reindexedMessages = paginatedMessages.map((m, idx) => ({
566
+ ...m,
567
+ index: startIdx + idx,
568
+ }));
569
+ // Export to file if requested
570
+ if (args.output_file) {
571
+ const fs = await import("fs/promises");
572
+ const exportData = {
573
+ notebook_url: notebookUrl,
574
+ notebook_name: notebookName,
575
+ exported_at: new Date().toISOString(),
576
+ total_messages: totalMessages,
577
+ user_messages: userMessages,
578
+ assistant_messages: assistantMessages,
579
+ messages: reindexedMessages,
580
+ };
581
+ await fs.writeFile(args.output_file, JSON.stringify(exportData, null, 2));
582
+ log.success(`✅ [TOOL] get_notebook_chat_history exported to ${args.output_file}`);
583
+ return {
584
+ success: true,
585
+ data: {
586
+ notebook_url: notebookUrl,
587
+ notebook_name: notebookName,
588
+ total_messages: totalMessages,
589
+ returned_messages: reindexedMessages.length,
590
+ user_messages: userMessages,
591
+ assistant_messages: assistantMessages,
592
+ output_file: args.output_file,
593
+ },
594
+ };
595
+ }
596
+ log.success(`✅ [TOOL] get_notebook_chat_history completed (${reindexedMessages.length}/${totalMessages} messages)`);
597
+ return {
598
+ success: true,
599
+ data: {
600
+ notebook_url: notebookUrl,
601
+ notebook_name: notebookName,
602
+ total_messages: totalMessages,
603
+ returned_messages: reindexedMessages.length,
604
+ user_messages: userMessages,
605
+ assistant_messages: assistantMessages,
606
+ offset: offset,
607
+ has_more: hasMore,
608
+ messages: reindexedMessages,
609
+ },
610
+ };
611
+ }
612
+ finally {
613
+ // Close the temporary session
614
+ await ctx.sessionManager.closeSession(sessionId);
615
+ }
616
+ }
617
+ catch (error) {
618
+ const errorMessage = error instanceof Error ? error.message : String(error);
619
+ log.error(`❌ [TOOL] get_notebook_chat_history failed: ${errorMessage}`);
620
+ return {
621
+ success: false,
622
+ error: errorMessage,
623
+ };
624
+ }
625
+ }
626
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/tools/handlers/gemini.ts"],"names":[],"mappings":"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"}