@google/gemini-cli-core 0.1.21 → 0.1.22
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 +26 -28
- package/dist/src/code_assist/converter.d.ts +1 -0
- package/dist/src/code_assist/converter.js +1 -0
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -0
- package/dist/src/code_assist/oauth2.js +37 -20
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +51 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +1 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +14 -8
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/config/config.d.ts +2 -0
- package/dist/src/config/config.js +7 -6
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +22 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/core/client.d.ts +4 -11
- package/dist/src/core/client.js +46 -28
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +294 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +19 -9
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +39 -15
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +6 -2
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +46 -63
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/logger.d.ts +22 -1
- package/dist/src/core/logger.js +103 -17
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +86 -20
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +79 -36
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +4 -4
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.js +8 -8
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +5 -1
- package/dist/src/ide/ide-client.js +57 -21
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.d.ts +6 -0
- package/dist/src/ide/ide-client.test.js +43 -0
- package/dist/src/ide/ide-client.test.js.map +1 -0
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ideContext.d.ts +6 -6
- package/dist/src/ide/process-utils.d.ts +14 -0
- package/dist/src/ide/process-utils.js +57 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +176 -58
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +132 -62
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +3 -1
- package/dist/src/mcp/oauth-utils.js +50 -12
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +17 -2
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +5 -5
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +13 -3
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +22 -4
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +60 -34
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +11 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +91 -39
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +5 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +10 -11
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +1 -0
- package/dist/src/telemetry/constants.js +1 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/integration.test.circular.js +1 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +22 -4
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +27 -2
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +4 -0
- package/dist/src/telemetry/metrics.js +21 -8
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +31 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.js +64 -36
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.d.ts +6 -0
- package/dist/src/telemetry/sdk.test.js +82 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +8 -1
- package/dist/src/telemetry/types.js +8 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +21 -6
- package/dist/src/test-utils/tools.js +77 -12
- package/dist/src/test-utils/tools.js.map +1 -1
- package/dist/src/tools/mcp-client.js +40 -10
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +31 -1
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +21 -3
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +57 -0
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/shell.js +25 -8
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +12 -0
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +3 -3
- package/dist/src/tools/tool-registry.js +45 -30
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +14 -73
- package/dist/src/tools/tools.js +52 -108
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +91 -2
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +4 -5
- package/dist/src/tools/web-search.js +51 -50
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +139 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +15 -11
- package/dist/src/tools/write-file.js +133 -144
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +57 -88
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/browser.js +4 -3
- package/dist/src/utils/browser.js.map +1 -1
- package/dist/src/utils/editCorrector.js +13 -13
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.js +1 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +10 -10
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawler.test.js +468 -0
- package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
- package/dist/src/utils/filesearch/fileSearch.js +62 -117
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +95 -197
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.d.ts +7 -0
- package/dist/src/utils/filesearch/ignore.js +25 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.test.js +89 -2
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +3 -3
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +3 -2
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +2 -6
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/paths.d.ts +7 -0
- package/dist/src/utils/paths.js +15 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +74 -2
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +4 -3
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +39 -0
- package/dist/src/utils/shell-utils.js +72 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +132 -4
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/systemEncoding.test.js +23 -23
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +22 -7
- package/dist/src/utils/workspaceContext.js +81 -55
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +221 -137
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -1
package/dist/src/tools/tools.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { ToolErrorType } from './tool-error.js';
|
|
6
7
|
/**
|
|
7
8
|
* A convenience base class for ToolInvocation.
|
|
8
9
|
*/
|
|
@@ -18,30 +19,6 @@ export class BaseToolInvocation {
|
|
|
18
19
|
return Promise.resolve(false);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
|
-
/**
|
|
22
|
-
* An adapter that wraps the legacy `Tool` interface to make it compatible
|
|
23
|
-
* with the new `ToolInvocation` pattern.
|
|
24
|
-
*/
|
|
25
|
-
export class LegacyToolInvocation {
|
|
26
|
-
legacyTool;
|
|
27
|
-
params;
|
|
28
|
-
constructor(legacyTool, params) {
|
|
29
|
-
this.legacyTool = legacyTool;
|
|
30
|
-
this.params = params;
|
|
31
|
-
}
|
|
32
|
-
getDescription() {
|
|
33
|
-
return this.legacyTool.getDescription(this.params);
|
|
34
|
-
}
|
|
35
|
-
toolLocations() {
|
|
36
|
-
return this.legacyTool.toolLocations(this.params);
|
|
37
|
-
}
|
|
38
|
-
shouldConfirmExecute(abortSignal) {
|
|
39
|
-
return this.legacyTool.shouldConfirmExecute(this.params, abortSignal);
|
|
40
|
-
}
|
|
41
|
-
execute(signal, updateOutput) {
|
|
42
|
-
return this.legacyTool.execute(this.params, signal, updateOutput);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
22
|
/**
|
|
46
23
|
* New base class for tools that separates validation from execution.
|
|
47
24
|
* New tools should extend this class.
|
|
@@ -93,6 +70,57 @@ export class DeclarativeTool {
|
|
|
93
70
|
const invocation = this.build(params);
|
|
94
71
|
return invocation.execute(signal, updateOutput);
|
|
95
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Similar to `build` but never throws.
|
|
75
|
+
* @param params The raw, untrusted parameters from the model.
|
|
76
|
+
* @returns A `ToolInvocation` instance.
|
|
77
|
+
*/
|
|
78
|
+
silentBuild(params) {
|
|
79
|
+
try {
|
|
80
|
+
return this.build(params);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
if (e instanceof Error) {
|
|
84
|
+
return e;
|
|
85
|
+
}
|
|
86
|
+
return new Error(String(e));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A convenience method that builds and executes the tool in one step.
|
|
91
|
+
* Never throws.
|
|
92
|
+
* @param params The raw, untrusted parameters from the model.
|
|
93
|
+
* @params abortSignal a signal to abort.
|
|
94
|
+
* @returns The result of the tool execution.
|
|
95
|
+
*/
|
|
96
|
+
async validateBuildAndExecute(params, abortSignal) {
|
|
97
|
+
const invocationOrError = this.silentBuild(params);
|
|
98
|
+
if (invocationOrError instanceof Error) {
|
|
99
|
+
const errorMessage = invocationOrError.message;
|
|
100
|
+
return {
|
|
101
|
+
llmContent: `Error: Invalid parameters provided. Reason: ${errorMessage}`,
|
|
102
|
+
returnDisplay: errorMessage,
|
|
103
|
+
error: {
|
|
104
|
+
message: errorMessage,
|
|
105
|
+
type: ToolErrorType.INVALID_TOOL_PARAMS,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
return await invocationOrError.execute(abortSignal);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
114
|
+
return {
|
|
115
|
+
llmContent: `Error: Tool call execution failed. Reason: ${errorMessage}`,
|
|
116
|
+
returnDisplay: errorMessage,
|
|
117
|
+
error: {
|
|
118
|
+
message: errorMessage,
|
|
119
|
+
type: ToolErrorType.EXECUTION_FAILED,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
96
124
|
}
|
|
97
125
|
/**
|
|
98
126
|
* New base class for declarative tools that separates validation from execution.
|
|
@@ -109,90 +137,6 @@ export class BaseDeclarativeTool extends DeclarativeTool {
|
|
|
109
137
|
return this.createInvocation(params);
|
|
110
138
|
}
|
|
111
139
|
}
|
|
112
|
-
/**
|
|
113
|
-
* Base implementation for tools with common functionality
|
|
114
|
-
* @deprecated Use `DeclarativeTool` for new tools.
|
|
115
|
-
*/
|
|
116
|
-
export class BaseTool extends DeclarativeTool {
|
|
117
|
-
name;
|
|
118
|
-
displayName;
|
|
119
|
-
description;
|
|
120
|
-
kind;
|
|
121
|
-
parameterSchema;
|
|
122
|
-
isOutputMarkdown;
|
|
123
|
-
canUpdateOutput;
|
|
124
|
-
/**
|
|
125
|
-
* Creates a new instance of BaseTool
|
|
126
|
-
* @param name Internal name of the tool (used for API calls)
|
|
127
|
-
* @param displayName User-friendly display name of the tool
|
|
128
|
-
* @param description Description of what the tool does
|
|
129
|
-
* @param isOutputMarkdown Whether the tool's output should be rendered as markdown
|
|
130
|
-
* @param canUpdateOutput Whether the tool supports live (streaming) output
|
|
131
|
-
* @param parameterSchema JSON Schema defining the parameters
|
|
132
|
-
*/
|
|
133
|
-
constructor(name, displayName, description, kind, parameterSchema, isOutputMarkdown = true, canUpdateOutput = false) {
|
|
134
|
-
super(name, displayName, description, kind, parameterSchema, isOutputMarkdown, canUpdateOutput);
|
|
135
|
-
this.name = name;
|
|
136
|
-
this.displayName = displayName;
|
|
137
|
-
this.description = description;
|
|
138
|
-
this.kind = kind;
|
|
139
|
-
this.parameterSchema = parameterSchema;
|
|
140
|
-
this.isOutputMarkdown = isOutputMarkdown;
|
|
141
|
-
this.canUpdateOutput = canUpdateOutput;
|
|
142
|
-
}
|
|
143
|
-
build(params) {
|
|
144
|
-
const validationError = this.validateToolParams(params);
|
|
145
|
-
if (validationError) {
|
|
146
|
-
throw new Error(validationError);
|
|
147
|
-
}
|
|
148
|
-
return new LegacyToolInvocation(this, params);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Validates the parameters for the tool
|
|
152
|
-
* This is a placeholder implementation and should be overridden
|
|
153
|
-
* Should be called from both `shouldConfirmExecute` and `execute`
|
|
154
|
-
* `shouldConfirmExecute` should return false immediately if invalid
|
|
155
|
-
* @param params Parameters to validate
|
|
156
|
-
* @returns An error message string if invalid, null otherwise
|
|
157
|
-
*/
|
|
158
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
159
|
-
validateToolParams(params) {
|
|
160
|
-
// Implementation would typically use a JSON Schema validator
|
|
161
|
-
// This is a placeholder that should be implemented by derived classes
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Gets a pre-execution description of the tool operation
|
|
166
|
-
* Default implementation that should be overridden by derived classes
|
|
167
|
-
* @param params Parameters for the tool execution
|
|
168
|
-
* @returns A markdown string describing what the tool will do
|
|
169
|
-
*/
|
|
170
|
-
getDescription(params) {
|
|
171
|
-
return JSON.stringify(params);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Determines if the tool should prompt for confirmation before execution
|
|
175
|
-
* @param params Parameters for the tool execution
|
|
176
|
-
* @returns Whether or not execute should be confirmed by the user.
|
|
177
|
-
*/
|
|
178
|
-
shouldConfirmExecute(
|
|
179
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
180
|
-
params,
|
|
181
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
182
|
-
abortSignal) {
|
|
183
|
-
return Promise.resolve(false);
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Determines what file system paths the tool will affect
|
|
187
|
-
* @param params Parameters for the tool execution
|
|
188
|
-
* @returns A list of such paths
|
|
189
|
-
*/
|
|
190
|
-
toolLocations(
|
|
191
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
192
|
-
params) {
|
|
193
|
-
return [];
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
140
|
/**
|
|
197
141
|
* Detects cycles in a JSON schemas due to `$ref`s.
|
|
198
142
|
* @param schema The root of the JSON schema.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,97 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { describe, it, expect } from 'vitest';
|
|
7
|
-
import { hasCycleInSchema } from './tools.js';
|
|
6
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
+
import { DeclarativeTool, hasCycleInSchema, Kind, } from './tools.js';
|
|
8
|
+
import { ToolErrorType } from './tool-error.js';
|
|
9
|
+
class TestToolInvocation {
|
|
10
|
+
params;
|
|
11
|
+
executeFn;
|
|
12
|
+
constructor(params, executeFn) {
|
|
13
|
+
this.params = params;
|
|
14
|
+
this.executeFn = executeFn;
|
|
15
|
+
}
|
|
16
|
+
getDescription() {
|
|
17
|
+
return 'A test invocation';
|
|
18
|
+
}
|
|
19
|
+
toolLocations() {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
shouldConfirmExecute() {
|
|
23
|
+
return Promise.resolve(false);
|
|
24
|
+
}
|
|
25
|
+
execute() {
|
|
26
|
+
return this.executeFn();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
class TestTool extends DeclarativeTool {
|
|
30
|
+
buildFn;
|
|
31
|
+
constructor(buildFn) {
|
|
32
|
+
super('test-tool', 'Test Tool', 'A tool for testing', Kind.Other, {});
|
|
33
|
+
this.buildFn = buildFn;
|
|
34
|
+
}
|
|
35
|
+
build(params) {
|
|
36
|
+
return this.buildFn(params);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
describe('DeclarativeTool', () => {
|
|
40
|
+
describe('validateBuildAndExecute', () => {
|
|
41
|
+
const abortSignal = new AbortController().signal;
|
|
42
|
+
it('should return INVALID_TOOL_PARAMS error if build fails', async () => {
|
|
43
|
+
const buildError = new Error('Invalid build parameters');
|
|
44
|
+
const buildFn = vi.fn().mockImplementation(() => {
|
|
45
|
+
throw buildError;
|
|
46
|
+
});
|
|
47
|
+
const tool = new TestTool(buildFn);
|
|
48
|
+
const params = { foo: 'bar' };
|
|
49
|
+
const result = await tool.validateBuildAndExecute(params, abortSignal);
|
|
50
|
+
expect(buildFn).toHaveBeenCalledWith(params);
|
|
51
|
+
expect(result).toEqual({
|
|
52
|
+
llmContent: `Error: Invalid parameters provided. Reason: ${buildError.message}`,
|
|
53
|
+
returnDisplay: buildError.message,
|
|
54
|
+
error: {
|
|
55
|
+
message: buildError.message,
|
|
56
|
+
type: ToolErrorType.INVALID_TOOL_PARAMS,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it('should return EXECUTION_FAILED error if execute fails', async () => {
|
|
61
|
+
const executeError = new Error('Execution failed');
|
|
62
|
+
const executeFn = vi.fn().mockRejectedValue(executeError);
|
|
63
|
+
const invocation = new TestToolInvocation({}, executeFn);
|
|
64
|
+
const buildFn = vi.fn().mockReturnValue(invocation);
|
|
65
|
+
const tool = new TestTool(buildFn);
|
|
66
|
+
const params = { foo: 'bar' };
|
|
67
|
+
const result = await tool.validateBuildAndExecute(params, abortSignal);
|
|
68
|
+
expect(buildFn).toHaveBeenCalledWith(params);
|
|
69
|
+
expect(executeFn).toHaveBeenCalled();
|
|
70
|
+
expect(result).toEqual({
|
|
71
|
+
llmContent: `Error: Tool call execution failed. Reason: ${executeError.message}`,
|
|
72
|
+
returnDisplay: executeError.message,
|
|
73
|
+
error: {
|
|
74
|
+
message: executeError.message,
|
|
75
|
+
type: ToolErrorType.EXECUTION_FAILED,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
it('should return the result of execute on success', async () => {
|
|
80
|
+
const successResult = {
|
|
81
|
+
llmContent: 'Success!',
|
|
82
|
+
returnDisplay: 'Success!',
|
|
83
|
+
summary: 'Tool executed successfully',
|
|
84
|
+
};
|
|
85
|
+
const executeFn = vi.fn().mockResolvedValue(successResult);
|
|
86
|
+
const invocation = new TestToolInvocation({}, executeFn);
|
|
87
|
+
const buildFn = vi.fn().mockReturnValue(invocation);
|
|
88
|
+
const tool = new TestTool(buildFn);
|
|
89
|
+
const params = { foo: 'bar' };
|
|
90
|
+
const result = await tool.validateBuildAndExecute(params, abortSignal);
|
|
91
|
+
expect(buildFn).toHaveBeenCalledWith(params);
|
|
92
|
+
expect(executeFn).toHaveBeenCalled();
|
|
93
|
+
expect(result).toEqual(successResult);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
8
97
|
describe('hasCycleInSchema', () => {
|
|
9
98
|
it('should detect a simple direct cycle', () => {
|
|
10
99
|
const schema = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/tools/tools.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../../src/tools/tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { GroundingMetadata } from '@google/genai';
|
|
7
|
-
import {
|
|
7
|
+
import { BaseDeclarativeTool, ToolInvocation, ToolResult } from './tools.js';
|
|
8
8
|
import { Config } from '../config/config.js';
|
|
9
9
|
interface GroundingChunkWeb {
|
|
10
10
|
uri?: string;
|
|
@@ -33,7 +33,7 @@ export interface WebSearchToolResult extends ToolResult {
|
|
|
33
33
|
/**
|
|
34
34
|
* A tool to perform web searches using Google Search via the Gemini API.
|
|
35
35
|
*/
|
|
36
|
-
export declare class WebSearchTool extends
|
|
36
|
+
export declare class WebSearchTool extends BaseDeclarativeTool<WebSearchToolParams, WebSearchToolResult> {
|
|
37
37
|
private readonly config;
|
|
38
38
|
static readonly Name: string;
|
|
39
39
|
constructor(config: Config);
|
|
@@ -42,8 +42,7 @@ export declare class WebSearchTool extends BaseTool<WebSearchToolParams, WebSear
|
|
|
42
42
|
* @param params The parameters to validate
|
|
43
43
|
* @returns An error message string if validation fails, null if valid
|
|
44
44
|
*/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
execute(params: WebSearchToolParams, signal: AbortSignal): Promise<WebSearchToolResult>;
|
|
45
|
+
protected validateToolParams(params: WebSearchToolParams): string | null;
|
|
46
|
+
protected createInvocation(params: WebSearchToolParams): ToolInvocation<WebSearchToolParams, WebSearchToolResult>;
|
|
48
47
|
}
|
|
49
48
|
export {};
|
|
@@ -3,66 +3,30 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import { Type } from '@google/genai';
|
|
6
|
+
import { BaseDeclarativeTool, BaseToolInvocation, Kind, } from './tools.js';
|
|
8
7
|
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
9
8
|
import { getErrorMessage } from '../utils/errors.js';
|
|
10
9
|
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
11
|
-
|
|
12
|
-
* A tool to perform web searches using Google Search via the Gemini API.
|
|
13
|
-
*/
|
|
14
|
-
export class WebSearchTool extends BaseTool {
|
|
10
|
+
class WebSearchToolInvocation extends BaseToolInvocation {
|
|
15
11
|
config;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
super(WebSearchTool.Name, 'GoogleSearch', 'Performs a web search using Google Search (via the Gemini API) and returns the results. This tool is useful for finding information on the internet based on a query.', Kind.Search, {
|
|
19
|
-
type: Type.OBJECT,
|
|
20
|
-
properties: {
|
|
21
|
-
query: {
|
|
22
|
-
type: Type.STRING,
|
|
23
|
-
description: 'The search query to find information on the web.',
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
required: ['query'],
|
|
27
|
-
});
|
|
12
|
+
constructor(config, params) {
|
|
13
|
+
super(params);
|
|
28
14
|
this.config = config;
|
|
29
15
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
* @param params The parameters to validate
|
|
33
|
-
* @returns An error message string if validation fails, null if valid
|
|
34
|
-
*/
|
|
35
|
-
validateParams(params) {
|
|
36
|
-
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
37
|
-
if (errors) {
|
|
38
|
-
return errors;
|
|
39
|
-
}
|
|
40
|
-
if (!params.query || params.query.trim() === '') {
|
|
41
|
-
return "The 'query' parameter cannot be empty.";
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
16
|
+
getDescription() {
|
|
17
|
+
return `Searching the web for: "${this.params.query}"`;
|
|
44
18
|
}
|
|
45
|
-
|
|
46
|
-
return `Searching the web for: "${params.query}"`;
|
|
47
|
-
}
|
|
48
|
-
async execute(params, signal) {
|
|
49
|
-
const validationError = this.validateToolParams(params);
|
|
50
|
-
if (validationError) {
|
|
51
|
-
return {
|
|
52
|
-
llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
|
|
53
|
-
returnDisplay: validationError,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
19
|
+
async execute(signal) {
|
|
56
20
|
const geminiClient = this.config.getGeminiClient();
|
|
57
21
|
try {
|
|
58
|
-
const response = await geminiClient.generateContent([{ role: 'user', parts: [{ text: params.query }] }], { tools: [{ googleSearch: {} }] }, signal);
|
|
22
|
+
const response = await geminiClient.generateContent([{ role: 'user', parts: [{ text: this.params.query }] }], { tools: [{ googleSearch: {} }] }, signal);
|
|
59
23
|
const responseText = getResponseText(response);
|
|
60
24
|
const groundingMetadata = response.candidates?.[0]?.groundingMetadata;
|
|
61
25
|
const sources = groundingMetadata?.groundingChunks;
|
|
62
26
|
const groundingSupports = groundingMetadata?.groundingSupports;
|
|
63
27
|
if (!responseText || !responseText.trim()) {
|
|
64
28
|
return {
|
|
65
|
-
llmContent: `No search results or information found for query: "${params.query}"`,
|
|
29
|
+
llmContent: `No search results or information found for query: "${this.params.query}"`,
|
|
66
30
|
returnDisplay: 'No information found.',
|
|
67
31
|
};
|
|
68
32
|
}
|
|
@@ -91,24 +55,23 @@ export class WebSearchTool extends BaseTool {
|
|
|
91
55
|
insertions.sort((a, b) => b.index - a.index);
|
|
92
56
|
const responseChars = modifiedResponseText.split(''); // Use new variable
|
|
93
57
|
insertions.forEach((insertion) => {
|
|
94
|
-
// Fixed arrow function syntax
|
|
95
58
|
responseChars.splice(insertion.index, 0, insertion.marker);
|
|
96
59
|
});
|
|
97
60
|
modifiedResponseText = responseChars.join(''); // Assign back to modifiedResponseText
|
|
98
61
|
}
|
|
99
62
|
if (sourceListFormatted.length > 0) {
|
|
100
63
|
modifiedResponseText +=
|
|
101
|
-
'\n\nSources:\n' + sourceListFormatted.join('\n');
|
|
64
|
+
'\n\nSources:\n' + sourceListFormatted.join('\n');
|
|
102
65
|
}
|
|
103
66
|
}
|
|
104
67
|
return {
|
|
105
|
-
llmContent: `Web search results for "${params.query}":\n\n${modifiedResponseText}`,
|
|
106
|
-
returnDisplay: `Search results for "${params.query}" returned.`,
|
|
68
|
+
llmContent: `Web search results for "${this.params.query}":\n\n${modifiedResponseText}`,
|
|
69
|
+
returnDisplay: `Search results for "${this.params.query}" returned.`,
|
|
107
70
|
sources,
|
|
108
71
|
};
|
|
109
72
|
}
|
|
110
73
|
catch (error) {
|
|
111
|
-
const errorMessage = `Error during web search for query "${params.query}": ${getErrorMessage(error)}`;
|
|
74
|
+
const errorMessage = `Error during web search for query "${this.params.query}": ${getErrorMessage(error)}`;
|
|
112
75
|
console.error(errorMessage, error);
|
|
113
76
|
return {
|
|
114
77
|
llmContent: `Error: ${errorMessage}`,
|
|
@@ -117,4 +80,42 @@ export class WebSearchTool extends BaseTool {
|
|
|
117
80
|
}
|
|
118
81
|
}
|
|
119
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* A tool to perform web searches using Google Search via the Gemini API.
|
|
85
|
+
*/
|
|
86
|
+
export class WebSearchTool extends BaseDeclarativeTool {
|
|
87
|
+
config;
|
|
88
|
+
static Name = 'google_web_search';
|
|
89
|
+
constructor(config) {
|
|
90
|
+
super(WebSearchTool.Name, 'GoogleSearch', 'Performs a web search using Google Search (via the Gemini API) and returns the results. This tool is useful for finding information on the internet based on a query.', Kind.Search, {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
query: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'The search query to find information on the web.',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
required: ['query'],
|
|
99
|
+
});
|
|
100
|
+
this.config = config;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Validates the parameters for the WebSearchTool.
|
|
104
|
+
* @param params The parameters to validate
|
|
105
|
+
* @returns An error message string if validation fails, null if valid
|
|
106
|
+
*/
|
|
107
|
+
validateToolParams(params) {
|
|
108
|
+
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
109
|
+
if (errors) {
|
|
110
|
+
return errors;
|
|
111
|
+
}
|
|
112
|
+
if (!params.query || params.query.trim() === '') {
|
|
113
|
+
return "The 'query' parameter cannot be empty.";
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
createInvocation(params) {
|
|
118
|
+
return new WebSearchToolInvocation(this.config, params);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
120
121
|
//# sourceMappingURL=web-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
|