@pan-sec/notebooklm-mcp 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/gemini/gemini-client.d.ts +45 -0
- package/dist/gemini/gemini-client.d.ts.map +1 -0
- package/dist/gemini/gemini-client.js +211 -0
- package/dist/gemini/gemini-client.js.map +1 -0
- package/dist/gemini/index.d.ts +8 -0
- package/dist/gemini/index.d.ts.map +1 -0
- package/dist/gemini/index.js +8 -0
- package/dist/gemini/index.js.map +1 -0
- package/dist/gemini/types.d.ts +136 -0
- package/dist/gemini/types.d.ts.map +1 -0
- package/dist/gemini/types.js +10 -0
- package/dist/gemini/types.js.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/definitions/gemini.d.ts +12 -0
- package/dist/tools/definitions/gemini.d.ts.map +1 -0
- package/dist/tools/definitions/gemini.js +135 -0
- package/dist/tools/definitions/gemini.js.map +1 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +2 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +32 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +186 -0
- package/dist/tools/handlers.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini API Tool Definitions
|
|
3
|
+
*
|
|
4
|
+
* Tools for accessing Gemini models and the Deep Research agent
|
|
5
|
+
* via the Interactions API.
|
|
6
|
+
*/
|
|
7
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
/**
|
|
9
|
+
* All Gemini tools
|
|
10
|
+
*/
|
|
11
|
+
export declare const geminiTools: Tool[];
|
|
12
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/tools/definitions/gemini.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AA6H/D;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,IAAI,EAI7B,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini API Tool Definitions
|
|
3
|
+
*
|
|
4
|
+
* Tools for accessing Gemini models and the Deep Research agent
|
|
5
|
+
* via the Interactions API.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Deep Research tool - comprehensive research using Gemini's Deep Research agent
|
|
9
|
+
*/
|
|
10
|
+
const deepResearchTool = {
|
|
11
|
+
name: "deep_research",
|
|
12
|
+
description: `Perform deep research using Gemini's Deep Research agent.
|
|
13
|
+
|
|
14
|
+
This runs in the background and can take 1-5 minutes to complete.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
- You need comprehensive research on a topic
|
|
18
|
+
- No specific NotebookLM notebook is relevant
|
|
19
|
+
- You want web-grounded answers with citations
|
|
20
|
+
|
|
21
|
+
## Requirements
|
|
22
|
+
- GEMINI_API_KEY environment variable must be set
|
|
23
|
+
|
|
24
|
+
## Notes
|
|
25
|
+
- Deep Research is a premium feature that may incur costs
|
|
26
|
+
- Results are grounded in web sources with citations
|
|
27
|
+
- For notebook-specific queries, use ask_question instead`,
|
|
28
|
+
inputSchema: {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
query: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "The research question or topic to investigate",
|
|
34
|
+
},
|
|
35
|
+
wait_for_completion: {
|
|
36
|
+
type: "boolean",
|
|
37
|
+
default: true,
|
|
38
|
+
description: "Wait for research to complete (polls every 10s). Set to false to run in background.",
|
|
39
|
+
},
|
|
40
|
+
max_wait_seconds: {
|
|
41
|
+
type: "number",
|
|
42
|
+
default: 300,
|
|
43
|
+
description: "Maximum wait time in seconds (default 5 min, max 10 min)",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ["query"],
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Gemini Query tool - quick queries with optional grounding tools
|
|
51
|
+
*/
|
|
52
|
+
const geminiQueryTool = {
|
|
53
|
+
name: "gemini_query",
|
|
54
|
+
description: `Quick query to Gemini model with optional grounding tools.
|
|
55
|
+
|
|
56
|
+
Faster than deep_research for simpler questions. Supports:
|
|
57
|
+
- Google Search grounding for current information
|
|
58
|
+
- Code execution for calculations
|
|
59
|
+
- URL analysis for web content
|
|
60
|
+
|
|
61
|
+
## Requirements
|
|
62
|
+
- GEMINI_API_KEY environment variable must be set
|
|
63
|
+
|
|
64
|
+
## When to Use
|
|
65
|
+
- Quick factual questions
|
|
66
|
+
- Current events (with google_search tool)
|
|
67
|
+
- Code calculations (with code_execution tool)
|
|
68
|
+
- Web page analysis (with url_context tool)`,
|
|
69
|
+
inputSchema: {
|
|
70
|
+
type: "object",
|
|
71
|
+
properties: {
|
|
72
|
+
query: {
|
|
73
|
+
type: "string",
|
|
74
|
+
description: "The question or prompt",
|
|
75
|
+
},
|
|
76
|
+
model: {
|
|
77
|
+
type: "string",
|
|
78
|
+
enum: ["gemini-2.5-flash", "gemini-2.5-pro", "gemini-3-flash-preview"],
|
|
79
|
+
default: "gemini-2.5-flash",
|
|
80
|
+
description: "Model to use (flash is faster, pro is more capable)",
|
|
81
|
+
},
|
|
82
|
+
tools: {
|
|
83
|
+
type: "array",
|
|
84
|
+
items: {
|
|
85
|
+
type: "string",
|
|
86
|
+
enum: ["google_search", "code_execution", "url_context"],
|
|
87
|
+
},
|
|
88
|
+
description: "Built-in tools to enable for grounding",
|
|
89
|
+
},
|
|
90
|
+
urls: {
|
|
91
|
+
type: "array",
|
|
92
|
+
items: { type: "string" },
|
|
93
|
+
description: "URLs to analyze (automatically enables url_context)",
|
|
94
|
+
},
|
|
95
|
+
previous_interaction_id: {
|
|
96
|
+
type: "string",
|
|
97
|
+
description: "Continue a previous conversation (for multi-turn)",
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
required: ["query"],
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Get Research Status tool - check background task progress
|
|
105
|
+
*/
|
|
106
|
+
const getResearchStatusTool = {
|
|
107
|
+
name: "get_research_status",
|
|
108
|
+
description: `Check the status of a background deep research task.
|
|
109
|
+
|
|
110
|
+
Use this when you started deep_research with wait_for_completion=false.
|
|
111
|
+
|
|
112
|
+
## Returns
|
|
113
|
+
- status: pending | running | completed | failed
|
|
114
|
+
- answer: The research result (if completed)
|
|
115
|
+
- error: Error message (if failed)`,
|
|
116
|
+
inputSchema: {
|
|
117
|
+
type: "object",
|
|
118
|
+
properties: {
|
|
119
|
+
interaction_id: {
|
|
120
|
+
type: "string",
|
|
121
|
+
description: "The interaction ID returned from deep_research",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
required: ["interaction_id"],
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* All Gemini tools
|
|
129
|
+
*/
|
|
130
|
+
export const geminiTools = [
|
|
131
|
+
deepResearchTool,
|
|
132
|
+
geminiQueryTool,
|
|
133
|
+
getResearchStatusTool,
|
|
134
|
+
];
|
|
135
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/tools/definitions/gemini.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,gBAAgB,GAAS;IAC7B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE;;;;;;;;;;;;;;;0DAe2C;IACxD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,+CAA+C;aAC7D;YACD,mBAAmB,EAAE;gBACnB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,qFAAqF;aACnG;YACD,gBAAgB,EAAE;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,GAAG;gBACZ,WAAW,EAAE,0DAA0D;aACxE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,eAAe,GAAS;IAC5B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE;;;;;;;;;;;;;;4CAc6B;IAC1C,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wBAAwB;aACtC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,wBAAwB,CAAC;gBACtE,OAAO,EAAE,kBAAkB;gBAC3B,WAAW,EAAE,qDAAqD;aACnE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC;iBACzD;gBACD,WAAW,EAAE,wCAAwC;aACtD;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,qDAAqD;aACnE;YACD,uBAAuB,EAAE;gBACvB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,qBAAqB,GAAS;IAClC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE;;;;;;;mCAOoB;IACjC,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,cAAc,EAAE;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;aAC9D;SACF;QACD,QAAQ,EAAE,CAAC,gBAAgB,CAAC;KAC7B;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC,gBAAgB;IAChB,eAAe;IACf,qBAAqB;CACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAUjE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,EAAE,CAcrE"}
|
|
@@ -7,6 +7,7 @@ import { askQuestionTool, buildAskQuestionDescription, } from "./definitions/ask
|
|
|
7
7
|
import { notebookManagementTools } from "./definitions/notebook-management.js";
|
|
8
8
|
import { sessionManagementTools } from "./definitions/session-management.js";
|
|
9
9
|
import { systemTools } from "./definitions/system.js";
|
|
10
|
+
import { geminiTools } from "./definitions/gemini.js";
|
|
10
11
|
/**
|
|
11
12
|
* Build Tool Definitions with NotebookLibrary context
|
|
12
13
|
*/
|
|
@@ -21,6 +22,7 @@ export function buildToolDefinitions(library) {
|
|
|
21
22
|
...notebookManagementTools,
|
|
22
23
|
...sessionManagementTools,
|
|
23
24
|
...systemTools,
|
|
25
|
+
...geminiTools,
|
|
24
26
|
];
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=definitions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,eAAe,EACf,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,qEAAqE;IACrE,MAAM,sBAAsB,GAAG;QAC7B,GAAG,eAAe;QAClB,WAAW,EAAE,2BAA2B,CAAC,OAAO,CAAC;KAClD,CAAC;IAEF,OAAO;QACL,sBAAsB;QACtB,GAAG,uBAAuB;QAC1B,GAAG,sBAAsB;QACzB,GAAG,WAAW;KACf,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,eAAe,EACf,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,qEAAqE;IACrE,MAAM,sBAAsB,GAAG;QAC7B,GAAG,eAAe;QAClB,WAAW,EAAE,2BAA2B,CAAC,OAAO,CAAC;KAClD,CAAC;IAEF,OAAO;QACL,sBAAsB;QACtB,GAAG,uBAAuB;QAC1B,GAAG,sBAAsB;QACzB,GAAG,WAAW;QACd,GAAG,WAAW;KACf,CAAC;AACJ,CAAC"}
|
package/dist/tools/handlers.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { type ListSourcesResult, type AddSourceResult, type RemoveSourceResult }
|
|
|
14
14
|
import { type AudioStatus, type GenerateAudioResult, type DownloadAudioResult } from "../notebook-creation/audio-manager.js";
|
|
15
15
|
import type { CreateNotebookInput, CreatedNotebook, NotebookSource } from "../notebook-creation/types.js";
|
|
16
16
|
import { type WebhookConfig, type WebhookStats } from "../webhooks/index.js";
|
|
17
|
+
import { type GeminiInteraction, type DeepResearchResult, type GeminiQueryResult, type GeminiTool, type GeminiModel } from "../gemini/index.js";
|
|
17
18
|
/**
|
|
18
19
|
* MCP Tool Handlers
|
|
19
20
|
*/
|
|
@@ -22,6 +23,7 @@ export declare class ToolHandlers {
|
|
|
22
23
|
private authManager;
|
|
23
24
|
private library;
|
|
24
25
|
private rateLimiter;
|
|
26
|
+
private geminiClient;
|
|
25
27
|
constructor(sessionManager: SessionManager, authManager: AuthManager, library: NotebookLibrary);
|
|
26
28
|
/**
|
|
27
29
|
* Handle ask_question tool
|
|
@@ -430,6 +432,36 @@ export declare class ToolHandlers {
|
|
|
430
432
|
removed: boolean;
|
|
431
433
|
id: string;
|
|
432
434
|
}>>;
|
|
435
|
+
/**
|
|
436
|
+
* Handle deep_research tool
|
|
437
|
+
*
|
|
438
|
+
* Performs comprehensive research using Gemini's Deep Research agent.
|
|
439
|
+
*/
|
|
440
|
+
handleDeepResearch(args: {
|
|
441
|
+
query: string;
|
|
442
|
+
wait_for_completion?: boolean;
|
|
443
|
+
max_wait_seconds?: number;
|
|
444
|
+
}, sendProgress?: ProgressCallback): Promise<ToolResult<DeepResearchResult>>;
|
|
445
|
+
/**
|
|
446
|
+
* Handle gemini_query tool
|
|
447
|
+
*
|
|
448
|
+
* Quick query to Gemini model with optional grounding tools.
|
|
449
|
+
*/
|
|
450
|
+
handleGeminiQuery(args: {
|
|
451
|
+
query: string;
|
|
452
|
+
model?: GeminiModel;
|
|
453
|
+
tools?: GeminiTool[];
|
|
454
|
+
urls?: string[];
|
|
455
|
+
previous_interaction_id?: string;
|
|
456
|
+
}): Promise<ToolResult<GeminiQueryResult>>;
|
|
457
|
+
/**
|
|
458
|
+
* Handle get_research_status tool
|
|
459
|
+
*
|
|
460
|
+
* Check the status of a background deep research task.
|
|
461
|
+
*/
|
|
462
|
+
handleGetResearchStatus(args: {
|
|
463
|
+
interaction_id: string;
|
|
464
|
+
}): Promise<ToolResult<GeminiInteraction>>;
|
|
433
465
|
/**
|
|
434
466
|
* Cleanup all resources (called on server shutdown)
|
|
435
467
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAerB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAiB,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC9I,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC3I,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,EAAwB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/handlers.js
CHANGED
|
@@ -16,6 +16,7 @@ import { SourceManager } from "../notebook-creation/source-manager.js";
|
|
|
16
16
|
import { AudioManager } from "../notebook-creation/audio-manager.js";
|
|
17
17
|
import { getWebhookDispatcher } from "../webhooks/index.js";
|
|
18
18
|
import { getQuotaManager } from "../quota/index.js";
|
|
19
|
+
import { GeminiClient, } from "../gemini/index.js";
|
|
19
20
|
const FOLLOW_UP_REMINDER = "\n\nEXTREMELY IMPORTANT: Is that ALL you need to know? You can always ask another question using the same session ID! Think about it carefully: before you reply to the user, review their original request and this answer. If anything is still unclear or missing, ask me another question first.";
|
|
20
21
|
/**
|
|
21
22
|
* MCP Tool Handlers
|
|
@@ -25,12 +26,15 @@ export class ToolHandlers {
|
|
|
25
26
|
authManager;
|
|
26
27
|
library;
|
|
27
28
|
rateLimiter;
|
|
29
|
+
geminiClient;
|
|
28
30
|
constructor(sessionManager, authManager, library) {
|
|
29
31
|
this.sessionManager = sessionManager;
|
|
30
32
|
this.authManager = authManager;
|
|
31
33
|
this.library = library;
|
|
32
34
|
// Rate limit: 100 requests per minute per session (protective limit)
|
|
33
35
|
this.rateLimiter = new RateLimiter(100, 60000);
|
|
36
|
+
// Initialize Gemini client (may be unavailable if no API key)
|
|
37
|
+
this.geminiClient = new GeminiClient();
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* Handle ask_question tool
|
|
@@ -1712,6 +1716,188 @@ export class ToolHandlers {
|
|
|
1712
1716
|
return { success: false, error: errorMessage };
|
|
1713
1717
|
}
|
|
1714
1718
|
}
|
|
1719
|
+
// ==================== GEMINI API HANDLERS ====================
|
|
1720
|
+
/**
|
|
1721
|
+
* Handle deep_research tool
|
|
1722
|
+
*
|
|
1723
|
+
* Performs comprehensive research using Gemini's Deep Research agent.
|
|
1724
|
+
*/
|
|
1725
|
+
async handleDeepResearch(args, sendProgress) {
|
|
1726
|
+
const startTime = Date.now();
|
|
1727
|
+
log.info(`🔧 [TOOL] deep_research called`);
|
|
1728
|
+
log.info(` Query: "${sanitizeForLogging(args.query.substring(0, 100))}"...`);
|
|
1729
|
+
// Check if Gemini is available
|
|
1730
|
+
if (!this.geminiClient.isAvailable()) {
|
|
1731
|
+
log.error(`❌ [TOOL] deep_research failed: Gemini API key not configured`);
|
|
1732
|
+
return {
|
|
1733
|
+
success: false,
|
|
1734
|
+
error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
|
|
1735
|
+
};
|
|
1736
|
+
}
|
|
1737
|
+
try {
|
|
1738
|
+
// Validate query
|
|
1739
|
+
if (!args.query || args.query.trim().length === 0) {
|
|
1740
|
+
throw new Error("Query cannot be empty");
|
|
1741
|
+
}
|
|
1742
|
+
if (args.query.length > 10000) {
|
|
1743
|
+
throw new Error("Query too long (max 10000 characters)");
|
|
1744
|
+
}
|
|
1745
|
+
// Validate max_wait_seconds
|
|
1746
|
+
const maxWaitSeconds = Math.min(args.max_wait_seconds || 300, 600); // Max 10 minutes
|
|
1747
|
+
const maxWaitMs = maxWaitSeconds * 1000;
|
|
1748
|
+
if (sendProgress) {
|
|
1749
|
+
await sendProgress("Starting deep research...", 0, 100);
|
|
1750
|
+
}
|
|
1751
|
+
// Start the research
|
|
1752
|
+
const interaction = await this.geminiClient.deepResearch({
|
|
1753
|
+
query: args.query,
|
|
1754
|
+
background: true,
|
|
1755
|
+
waitForCompletion: args.wait_for_completion !== false,
|
|
1756
|
+
maxWaitMs,
|
|
1757
|
+
progressCallback: sendProgress,
|
|
1758
|
+
});
|
|
1759
|
+
const durationMs = Date.now() - startTime;
|
|
1760
|
+
// Extract the answer
|
|
1761
|
+
const answer = interaction.outputs.find(o => o.type === "text")?.text || "";
|
|
1762
|
+
// Audit log
|
|
1763
|
+
await audit.tool("deep_research", { query: sanitizeForLogging(args.query) }, true, durationMs);
|
|
1764
|
+
log.success(`✅ [TOOL] deep_research completed in ${durationMs}ms`);
|
|
1765
|
+
return {
|
|
1766
|
+
success: true,
|
|
1767
|
+
data: {
|
|
1768
|
+
interactionId: interaction.id,
|
|
1769
|
+
status: interaction.status,
|
|
1770
|
+
answer,
|
|
1771
|
+
tokensUsed: interaction.usage?.totalTokens,
|
|
1772
|
+
durationMs,
|
|
1773
|
+
},
|
|
1774
|
+
};
|
|
1775
|
+
}
|
|
1776
|
+
catch (error) {
|
|
1777
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1778
|
+
const durationMs = Date.now() - startTime;
|
|
1779
|
+
log.error(`❌ [TOOL] deep_research failed: ${errorMessage}`);
|
|
1780
|
+
await audit.tool("deep_research", { query: sanitizeForLogging(args.query) }, false, durationMs, errorMessage);
|
|
1781
|
+
return { success: false, error: errorMessage };
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
/**
|
|
1785
|
+
* Handle gemini_query tool
|
|
1786
|
+
*
|
|
1787
|
+
* Quick query to Gemini model with optional grounding tools.
|
|
1788
|
+
*/
|
|
1789
|
+
async handleGeminiQuery(args) {
|
|
1790
|
+
const startTime = Date.now();
|
|
1791
|
+
log.info(`🔧 [TOOL] gemini_query called`);
|
|
1792
|
+
log.info(` Query: "${sanitizeForLogging(args.query.substring(0, 100))}"...`);
|
|
1793
|
+
log.info(` Model: ${args.model || "default"}`);
|
|
1794
|
+
if (args.tools)
|
|
1795
|
+
log.info(` Tools: ${args.tools.join(", ")}`);
|
|
1796
|
+
// Check if Gemini is available
|
|
1797
|
+
if (!this.geminiClient.isAvailable()) {
|
|
1798
|
+
log.error(`❌ [TOOL] gemini_query failed: Gemini API key not configured`);
|
|
1799
|
+
return {
|
|
1800
|
+
success: false,
|
|
1801
|
+
error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
|
|
1802
|
+
};
|
|
1803
|
+
}
|
|
1804
|
+
try {
|
|
1805
|
+
// Validate query
|
|
1806
|
+
if (!args.query || args.query.trim().length === 0) {
|
|
1807
|
+
throw new Error("Query cannot be empty");
|
|
1808
|
+
}
|
|
1809
|
+
if (args.query.length > 30000) {
|
|
1810
|
+
throw new Error("Query too long (max 30000 characters)");
|
|
1811
|
+
}
|
|
1812
|
+
// If URLs provided, auto-enable url_context
|
|
1813
|
+
let tools = args.tools || [];
|
|
1814
|
+
if (args.urls && args.urls.length > 0 && !tools.includes("url_context")) {
|
|
1815
|
+
tools = [...tools, "url_context"];
|
|
1816
|
+
}
|
|
1817
|
+
// Validate URLs if provided
|
|
1818
|
+
if (args.urls) {
|
|
1819
|
+
for (const url of args.urls) {
|
|
1820
|
+
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
|
1821
|
+
throw new Error(`Invalid URL: ${url} (must start with http:// or https://)`);
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
}
|
|
1825
|
+
const interaction = await this.geminiClient.query({
|
|
1826
|
+
query: args.query,
|
|
1827
|
+
model: args.model,
|
|
1828
|
+
tools,
|
|
1829
|
+
urls: args.urls,
|
|
1830
|
+
previousInteractionId: args.previous_interaction_id,
|
|
1831
|
+
});
|
|
1832
|
+
const durationMs = Date.now() - startTime;
|
|
1833
|
+
// Extract the answer
|
|
1834
|
+
const answer = interaction.outputs.find(o => o.type === "text")?.text || "";
|
|
1835
|
+
// Identify which tools were used
|
|
1836
|
+
const toolsUsed = interaction.outputs
|
|
1837
|
+
.filter(o => o.type === "function_call")
|
|
1838
|
+
.map(o => o.name)
|
|
1839
|
+
.filter((name) => !!name);
|
|
1840
|
+
// Audit log
|
|
1841
|
+
await audit.tool("gemini_query", {
|
|
1842
|
+
query: sanitizeForLogging(args.query),
|
|
1843
|
+
model: args.model,
|
|
1844
|
+
tools: args.tools,
|
|
1845
|
+
}, true, durationMs);
|
|
1846
|
+
log.success(`✅ [TOOL] gemini_query completed in ${durationMs}ms`);
|
|
1847
|
+
return {
|
|
1848
|
+
success: true,
|
|
1849
|
+
data: {
|
|
1850
|
+
interactionId: interaction.id,
|
|
1851
|
+
answer,
|
|
1852
|
+
model: interaction.model || args.model || CONFIG.geminiDefaultModel,
|
|
1853
|
+
tokensUsed: interaction.usage?.totalTokens,
|
|
1854
|
+
toolsUsed: toolsUsed.length > 0 ? toolsUsed : undefined,
|
|
1855
|
+
},
|
|
1856
|
+
};
|
|
1857
|
+
}
|
|
1858
|
+
catch (error) {
|
|
1859
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1860
|
+
const durationMs = Date.now() - startTime;
|
|
1861
|
+
log.error(`❌ [TOOL] gemini_query failed: ${errorMessage}`);
|
|
1862
|
+
await audit.tool("gemini_query", { query: sanitizeForLogging(args.query) }, false, durationMs, errorMessage);
|
|
1863
|
+
return { success: false, error: errorMessage };
|
|
1864
|
+
}
|
|
1865
|
+
}
|
|
1866
|
+
/**
|
|
1867
|
+
* Handle get_research_status tool
|
|
1868
|
+
*
|
|
1869
|
+
* Check the status of a background deep research task.
|
|
1870
|
+
*/
|
|
1871
|
+
async handleGetResearchStatus(args) {
|
|
1872
|
+
log.info(`🔧 [TOOL] get_research_status called`);
|
|
1873
|
+
log.info(` Interaction ID: ${args.interaction_id}`);
|
|
1874
|
+
// Check if Gemini is available
|
|
1875
|
+
if (!this.geminiClient.isAvailable()) {
|
|
1876
|
+
log.error(`❌ [TOOL] get_research_status failed: Gemini API key not configured`);
|
|
1877
|
+
return {
|
|
1878
|
+
success: false,
|
|
1879
|
+
error: "Gemini API key not configured. Set GEMINI_API_KEY environment variable.",
|
|
1880
|
+
};
|
|
1881
|
+
}
|
|
1882
|
+
try {
|
|
1883
|
+
// Validate interaction_id
|
|
1884
|
+
if (!args.interaction_id || args.interaction_id.trim().length === 0) {
|
|
1885
|
+
throw new Error("Interaction ID cannot be empty");
|
|
1886
|
+
}
|
|
1887
|
+
const interaction = await this.geminiClient.getInteraction(args.interaction_id);
|
|
1888
|
+
log.success(`✅ [TOOL] get_research_status: ${interaction.status}`);
|
|
1889
|
+
return {
|
|
1890
|
+
success: true,
|
|
1891
|
+
data: interaction,
|
|
1892
|
+
};
|
|
1893
|
+
}
|
|
1894
|
+
catch (error) {
|
|
1895
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1896
|
+
log.error(`❌ [TOOL] get_research_status failed: ${errorMessage}`);
|
|
1897
|
+
return { success: false, error: errorMessage };
|
|
1898
|
+
}
|
|
1899
|
+
}
|
|
1900
|
+
// ==================== CLEANUP ====================
|
|
1715
1901
|
/**
|
|
1716
1902
|
* Cleanup all resources (called on server shutdown)
|
|
1717
1903
|
*/
|