@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,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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"}
|