@google/adk 1.4.0 → 1.6.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/cjs/a2a/a2a_remote_agent.js +12 -2
- package/dist/cjs/a2a/agent_to_a2a.js +18 -3
- package/dist/cjs/a2a/auth.js +65 -0
- package/dist/cjs/a2a/event_converter_utils.js +47 -18
- package/dist/cjs/a2a/metadata_converter_utils.js +1 -1
- package/dist/cjs/agents/base_agent.js +39 -0
- package/dist/cjs/agents/functions.js +26 -28
- package/dist/cjs/agents/llm_agent.js +4 -2
- package/dist/cjs/agents/loop_agent.js +15 -3
- package/dist/cjs/agents/processors/basic_llm_request_processor.js +3 -2
- package/dist/cjs/agents/processors/content_processor_utils.js +2 -1
- package/dist/cjs/agents/processors/content_request_processor.js +2 -21
- package/dist/cjs/agents/processors/instructions_llm_request_processor.js +3 -1
- package/dist/cjs/agents/routed_agent.js +31 -0
- package/dist/cjs/agents/run_config.js +3 -2
- package/dist/cjs/artifacts/in_memory_artifact_service.js +17 -9
- package/dist/cjs/auth/credential_service/in_memory_credential_service.js +14 -3
- package/dist/cjs/code_executors/unsafe_local_code_executor.js +23 -12
- package/dist/cjs/common.js +35 -0
- package/dist/cjs/context/agent_controlled_context_compactor.js +2 -11
- package/dist/cjs/context/anchored_context_compactor.js +127 -0
- package/dist/cjs/context/compaction_utils.js +64 -0
- package/dist/cjs/context/token_based_context_compactor.js +13 -44
- package/dist/cjs/events/compacted_event.js +9 -3
- package/dist/cjs/events/event.js +28 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/integrations/agent_registry/agent_registry_mcp_toolset.js +9 -1
- package/dist/cjs/memory/in_memory_memory_service.js +13 -2
- package/dist/cjs/memory/vertex_ai_memory_bank_service.js +3 -0
- package/dist/cjs/plugins/base_plugin.js +4 -2
- package/dist/cjs/plugins/global_instruction_plugin.js +97 -0
- package/dist/cjs/runner/runner.js +69 -23
- package/dist/cjs/sessions/base_session_service.js +8 -3
- package/dist/cjs/sessions/in_memory_session_service.js +8 -8
- package/dist/cjs/sessions/vertex_ai_session_service.js +22 -10
- package/dist/cjs/skills/loader.js +40 -6
- package/dist/cjs/tools/enterprise_web_search_tool.js +81 -0
- package/dist/cjs/tools/example_tool.js +68 -0
- package/dist/cjs/tools/get_user_choice_tool.js +53 -0
- package/dist/cjs/tools/load_web_page.js +250 -0
- package/dist/cjs/tools/mcp/load_mcp_resource_tool.js +140 -0
- package/dist/cjs/tools/mcp/mcp_session_manager.js +35 -21
- package/dist/cjs/tools/mcp/mcp_toolset.js +63 -0
- package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +13 -10
- package/dist/cjs/tools/request_input_tool.js +54 -0
- package/dist/cjs/tools/skill/run_skill_inline_script_tool.js +54 -4
- package/dist/cjs/tools/skill/skill_toolset.js +4 -2
- package/dist/cjs/utils/branch_trie.js +41 -0
- package/dist/cjs/utils/crypto_shim.js +43 -0
- package/dist/cjs/utils/env_aware_utils.js +15 -13
- package/dist/cjs/utils/error_utils.js +120 -0
- package/dist/cjs/utils/file_utils.js +5 -2
- package/dist/cjs/utils/output_schema_utils.js +43 -0
- package/dist/cjs/utils/streaming_utils.js +5 -5
- package/dist/cjs/utils/vertex_ai_utils.js +3 -0
- package/dist/cjs/version.js +1 -1
- package/dist/esm/a2a/a2a_remote_agent.js +12 -2
- package/dist/esm/a2a/agent_to_a2a.js +18 -3
- package/dist/esm/a2a/auth.js +37 -0
- package/dist/esm/a2a/event_converter_utils.js +47 -18
- package/dist/esm/a2a/metadata_converter_utils.js +1 -1
- package/dist/esm/agents/base_agent.js +39 -0
- package/dist/esm/agents/functions.js +27 -24
- package/dist/esm/agents/llm_agent.js +6 -4
- package/dist/esm/agents/loop_agent.js +15 -3
- package/dist/esm/agents/processors/basic_llm_request_processor.js +3 -2
- package/dist/esm/agents/processors/content_processor_utils.js +2 -1
- package/dist/esm/agents/processors/content_request_processor.js +2 -21
- package/dist/esm/agents/processors/instructions_llm_request_processor.js +3 -1
- package/dist/esm/agents/routed_agent.js +31 -0
- package/dist/esm/agents/run_config.js +3 -2
- package/dist/esm/artifacts/in_memory_artifact_service.js +17 -9
- package/dist/esm/auth/credential_service/in_memory_credential_service.js +14 -3
- package/dist/esm/code_executors/unsafe_local_code_executor.js +22 -11
- package/dist/esm/common.js +29 -1
- package/dist/esm/context/agent_controlled_context_compactor.js +2 -11
- package/dist/esm/context/anchored_context_compactor.js +99 -0
- package/dist/esm/context/compaction_utils.js +38 -0
- package/dist/esm/context/token_based_context_compactor.js +16 -44
- package/dist/esm/events/compacted_event.js +7 -2
- package/dist/esm/events/event.js +24 -0
- package/dist/esm/index.js +8 -1
- package/dist/esm/integrations/agent_registry/agent_registry_mcp_toolset.js +9 -1
- package/dist/esm/memory/in_memory_memory_service.js +13 -2
- package/dist/esm/memory/vertex_ai_memory_bank_service.js +7 -1
- package/dist/esm/plugins/base_plugin.js +4 -2
- package/dist/esm/plugins/global_instruction_plugin.js +69 -0
- package/dist/esm/runner/runner.js +69 -23
- package/dist/esm/sessions/base_session_service.js +8 -3
- package/dist/esm/sessions/in_memory_session_service.js +8 -8
- package/dist/esm/sessions/vertex_ai_session_service.js +26 -11
- package/dist/esm/skills/loader.js +40 -6
- package/dist/esm/tools/enterprise_web_search_tool.js +55 -0
- package/dist/esm/tools/example_tool.js +42 -0
- package/dist/esm/tools/get_user_choice_tool.js +25 -0
- package/dist/esm/tools/load_web_page.js +221 -0
- package/dist/esm/tools/mcp/load_mcp_resource_tool.js +114 -0
- package/dist/esm/tools/mcp/mcp_session_manager.js +35 -21
- package/dist/esm/tools/mcp/mcp_toolset.js +63 -0
- package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +13 -10
- package/dist/esm/tools/request_input_tool.js +26 -0
- package/dist/esm/tools/skill/run_skill_inline_script_tool.js +53 -4
- package/dist/esm/tools/skill/skill_toolset.js +4 -2
- package/dist/esm/utils/branch_trie.js +13 -0
- package/dist/esm/utils/crypto_shim.js +15 -0
- package/dist/esm/utils/env_aware_utils.js +15 -13
- package/dist/esm/utils/error_utils.js +92 -0
- package/dist/esm/utils/file_utils.js +5 -2
- package/dist/esm/utils/output_schema_utils.js +15 -0
- package/dist/esm/utils/streaming_utils.js +1 -1
- package/dist/esm/utils/vertex_ai_utils.js +2 -0
- package/dist/esm/version.js +1 -1
- package/dist/types/a2a/a2a_remote_agent.d.ts +5 -1
- package/dist/types/a2a/agent_to_a2a.d.ts +38 -0
- package/dist/types/a2a/auth.d.ts +30 -0
- package/dist/types/a2a/event_converter_utils.d.ts +4 -1
- package/dist/types/agents/base_agent.d.ts +29 -1
- package/dist/types/agents/functions.d.ts +1 -9
- package/dist/types/agents/llm_agent.d.ts +5 -1
- package/dist/types/agents/loop_agent.d.ts +2 -2
- package/dist/types/agents/routed_agent.d.ts +24 -1
- package/dist/types/agents/run_config.d.ts +1 -1
- package/dist/types/auth/credential_service/in_memory_credential_service.d.ts +11 -0
- package/dist/types/code_executors/unsafe_local_code_executor.d.ts +5 -1
- package/dist/types/common.d.ts +11 -2
- package/dist/types/context/agent_controlled_context_compactor.d.ts +0 -1
- package/dist/types/context/anchored_context_compactor.d.ts +35 -0
- package/dist/types/context/compaction_utils.d.ts +23 -0
- package/dist/types/context/token_based_context_compactor.d.ts +0 -1
- package/dist/types/events/compacted_event.d.ts +10 -0
- package/dist/types/events/event.d.ts +13 -0
- package/dist/types/index.d.ts +5 -3
- package/dist/types/memory/in_memory_memory_service.d.ts +11 -0
- package/dist/types/plugins/base_plugin.d.ts +4 -2
- package/dist/types/plugins/global_instruction_plugin.d.ts +38 -0
- package/dist/types/runner/runner.d.ts +1 -1
- package/dist/types/sessions/base_session_service.d.ts +8 -0
- package/dist/types/sessions/in_memory_session_service.d.ts +9 -0
- package/dist/types/sessions/vertex_ai_session_service.d.ts +19 -1
- package/dist/types/skills/loader.d.ts +5 -0
- package/dist/types/tools/enterprise_web_search_tool.d.ts +26 -0
- package/dist/types/tools/example_tool.d.ts +21 -0
- package/dist/types/tools/get_user_choice_tool.d.ts +14 -0
- package/dist/types/tools/load_web_page.d.ts +33 -0
- package/dist/types/tools/mcp/load_mcp_resource_tool.d.ts +26 -0
- package/dist/types/tools/mcp/mcp_toolset.d.ts +27 -0
- package/dist/types/tools/request_input_tool.d.ts +15 -0
- package/dist/types/tools/skill/run_skill_inline_script_tool.d.ts +25 -0
- package/dist/types/tools/skill/skill_toolset.d.ts +9 -0
- package/dist/types/utils/branch_trie.d.ts +14 -0
- package/dist/types/utils/crypto_shim.d.ts +16 -0
- package/dist/types/utils/env_aware_utils.d.ts +23 -0
- package/dist/types/utils/error_utils.d.ts +18 -0
- package/dist/types/utils/output_schema_utils.d.ts +18 -0
- package/dist/types/utils/vertex_ai_utils.d.ts +1 -0
- package/dist/types/version.d.ts +1 -1
- package/dist/web/a2a/a2a_remote_agent.js +12 -2
- package/dist/web/a2a/agent_to_a2a.js +18 -3
- package/dist/web/a2a/auth.js +37 -0
- package/dist/web/a2a/event_converter_utils.js +47 -18
- package/dist/web/a2a/metadata_converter_utils.js +1 -1
- package/dist/web/agents/base_agent.js +39 -0
- package/dist/web/agents/functions.js +27 -24
- package/dist/web/agents/llm_agent.js +6 -4
- package/dist/web/agents/loop_agent.js +27 -3
- package/dist/web/agents/processors/basic_llm_request_processor.js +3 -2
- package/dist/web/agents/processors/content_processor_utils.js +2 -1
- package/dist/web/agents/processors/content_request_processor.js +2 -21
- package/dist/web/agents/processors/instructions_llm_request_processor.js +3 -1
- package/dist/web/agents/routed_agent.js +31 -0
- package/dist/web/agents/run_config.js +8 -3
- package/dist/web/artifacts/in_memory_artifact_service.js +17 -9
- package/dist/web/auth/credential_service/in_memory_credential_service.js +14 -3
- package/dist/web/code_executors/unsafe_local_code_executor.js +22 -11
- package/dist/web/common.js +29 -1
- package/dist/web/context/agent_controlled_context_compactor.js +2 -11
- package/dist/web/context/anchored_context_compactor.js +117 -0
- package/dist/web/context/compaction_utils.js +38 -0
- package/dist/web/context/token_based_context_compactor.js +16 -44
- package/dist/web/events/compacted_event.js +7 -2
- package/dist/web/events/event.js +24 -0
- package/dist/web/index.js +8 -1
- package/dist/web/integrations/agent_registry/agent_registry_mcp_toolset.js +9 -1
- package/dist/web/memory/in_memory_memory_service.js +13 -2
- package/dist/web/memory/vertex_ai_memory_bank_service.js +7 -1
- package/dist/web/plugins/base_plugin.js +4 -2
- package/dist/web/plugins/global_instruction_plugin.js +67 -0
- package/dist/web/runner/runner.js +65 -22
- package/dist/web/sessions/base_session_service.js +8 -3
- package/dist/web/sessions/in_memory_session_service.js +8 -8
- package/dist/web/sessions/vertex_ai_session_service.js +24 -11
- package/dist/web/skills/loader.js +40 -6
- package/dist/web/tools/enterprise_web_search_tool.js +55 -0
- package/dist/web/tools/example_tool.js +42 -0
- package/dist/web/tools/get_user_choice_tool.js +25 -0
- package/dist/web/tools/load_web_page.js +221 -0
- package/dist/web/tools/mcp/load_mcp_resource_tool.js +107 -0
- package/dist/web/tools/mcp/mcp_session_manager.js +35 -21
- package/dist/web/tools/mcp/mcp_toolset.js +63 -0
- package/dist/web/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +13 -10
- package/dist/web/tools/request_input_tool.js +26 -0
- package/dist/web/tools/skill/run_skill_inline_script_tool.js +51 -4
- package/dist/web/tools/skill/skill_toolset.js +4 -2
- package/dist/web/utils/branch_trie.js +13 -0
- package/dist/web/utils/crypto_shim.js +15 -0
- package/dist/web/utils/env_aware_utils.js +15 -13
- package/dist/web/utils/error_utils.js +92 -0
- package/dist/web/utils/file_utils.js +5 -2
- package/dist/web/utils/output_schema_utils.js +15 -0
- package/dist/web/utils/streaming_utils.js +1 -1
- package/dist/web/utils/vertex_ai_utils.js +2 -0
- package/dist/web/version.js +1 -1
- package/package.json +1 -1
|
@@ -71,16 +71,14 @@ let VertexAiSessionService = class extends import_base_session_service.BaseSessi
|
|
|
71
71
|
this.location,
|
|
72
72
|
options.expressModeApiKey
|
|
73
73
|
);
|
|
74
|
-
if (!options.sessions) {
|
|
75
|
-
if (!this.expressModeApiKey && (!this.projectId || !this.location)) {
|
|
76
|
-
throw new Error(
|
|
77
|
-
"Either (Project ID and Location) or an expressModeApiKey is required."
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
74
|
if (options.sessions) {
|
|
82
75
|
this.sessions = options.sessions;
|
|
83
76
|
} else {
|
|
77
|
+
if (!this.projectId || !this.location) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
this.expressModeApiKey ? import_vertex_ai_utils.EXPRESS_MODE_UNSUPPORTED_MESSAGE : "Project ID and Location are required."
|
|
80
|
+
);
|
|
81
|
+
}
|
|
84
82
|
const client = new import_client.Client({
|
|
85
83
|
project: this.projectId,
|
|
86
84
|
location: this.location
|
|
@@ -104,13 +102,25 @@ let VertexAiSessionService = class extends import_base_session_service.BaseSessi
|
|
|
104
102
|
}
|
|
105
103
|
return match[3];
|
|
106
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Creates a session on Vertex AI Agent Engine.
|
|
107
|
+
*
|
|
108
|
+
* @throws if both `ttl` and `expireTime` are specified.
|
|
109
|
+
*/
|
|
107
110
|
async createSession({
|
|
108
111
|
appName,
|
|
109
112
|
userId,
|
|
110
113
|
state,
|
|
111
|
-
sessionId
|
|
114
|
+
sessionId,
|
|
115
|
+
ttl,
|
|
116
|
+
expireTime
|
|
112
117
|
}) {
|
|
113
118
|
var _a;
|
|
119
|
+
if (ttl != null && expireTime != null) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
"Cannot specify both 'ttl' and 'expireTime' simultaneously."
|
|
122
|
+
);
|
|
123
|
+
}
|
|
114
124
|
const reasoningEngineId = this.getReasoningEngineId(appName);
|
|
115
125
|
const filteredState = state ? (0, import_base_session_service.trimTempState)(state) : void 0;
|
|
116
126
|
let apiResponse = await this.sessions.createInternal({
|
|
@@ -118,7 +128,9 @@ let VertexAiSessionService = class extends import_base_session_service.BaseSessi
|
|
|
118
128
|
userId,
|
|
119
129
|
config: {
|
|
120
130
|
...filteredState ? { sessionState: filteredState } : {},
|
|
121
|
-
...sessionId ? { sessionId } : {}
|
|
131
|
+
...sessionId ? { sessionId } : {},
|
|
132
|
+
...ttl != null ? { ttl } : {},
|
|
133
|
+
...expireTime != null ? { expireTime } : {}
|
|
122
134
|
}
|
|
123
135
|
});
|
|
124
136
|
const operationName = apiResponse.name;
|
|
@@ -204,7 +216,7 @@ let VertexAiSessionService = class extends import_base_session_service.BaseSessi
|
|
|
204
216
|
return session;
|
|
205
217
|
} catch (error) {
|
|
206
218
|
const err = error;
|
|
207
|
-
if (err.code === GRPC_NOT_FOUND || err.code === HTTP_NOT_FOUND) {
|
|
219
|
+
if (err.code === GRPC_NOT_FOUND || err.code === HTTP_NOT_FOUND || err.status === HTTP_NOT_FOUND) {
|
|
208
220
|
return void 0;
|
|
209
221
|
}
|
|
210
222
|
import_logger.logger.error(`Error getting session from Vertex AI: ${err.message}`);
|
|
@@ -57,6 +57,9 @@ const ALLOWED_FRONTMATTER_KEYS = /* @__PURE__ */ new Set([
|
|
|
57
57
|
"description",
|
|
58
58
|
"license",
|
|
59
59
|
"allowed-tools",
|
|
60
|
+
// Camel-case alias: FrontmatterSchema's preprocessor derives `allowedTools`
|
|
61
|
+
// from `allowed-tools`, and `.loose()` passes either spelling through.
|
|
62
|
+
"allowedTools",
|
|
60
63
|
"metadata",
|
|
61
64
|
"compatibility"
|
|
62
65
|
]);
|
|
@@ -119,7 +122,7 @@ async function loadDir(directoryPath) {
|
|
|
119
122
|
}
|
|
120
123
|
return files;
|
|
121
124
|
}
|
|
122
|
-
function
|
|
125
|
+
function parseFrontmatterYaml(content) {
|
|
123
126
|
if (!content.startsWith("---")) {
|
|
124
127
|
throw new Error("SKILL.md must start with YAML frontmatter (---)");
|
|
125
128
|
}
|
|
@@ -131,15 +134,34 @@ function parseSkillMdContent(content) {
|
|
|
131
134
|
const body = parts.filter((_, i) => i >= 2).join("---").trim();
|
|
132
135
|
try {
|
|
133
136
|
const parsed = import_js_yaml.default.load(frontmatterStr);
|
|
134
|
-
if (typeof parsed !== "object" || parsed === null) {
|
|
137
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
135
138
|
throw new Error("SKILL.md frontmatter must be a YAML mapping");
|
|
136
139
|
}
|
|
137
|
-
|
|
138
|
-
return { frontmatter, body };
|
|
140
|
+
return { raw: parsed, body };
|
|
139
141
|
} catch (e) {
|
|
140
142
|
throw new Error(`Invalid YAML in frontmatter: ${e.message}`);
|
|
141
143
|
}
|
|
142
144
|
}
|
|
145
|
+
function validateFrontmatter(raw) {
|
|
146
|
+
try {
|
|
147
|
+
return import_skill.FrontmatterSchema.parse(raw);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
throw new Error(`Invalid YAML in frontmatter: ${e.message}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function parseSkillMdContent(content) {
|
|
153
|
+
const { raw, body } = parseFrontmatterYaml(content);
|
|
154
|
+
return { frontmatter: validateFrontmatter(raw), body };
|
|
155
|
+
}
|
|
156
|
+
function isDangerousZipEntryName(entryName) {
|
|
157
|
+
if (path.posix.isAbsolute(entryName) || path.win32.isAbsolute(entryName)) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
return entryName.split(/[/\\]/).some((segment) => segment === "..");
|
|
161
|
+
}
|
|
162
|
+
function isBareSkillName(name) {
|
|
163
|
+
return name !== "." && name !== ".." && path.basename(name) === name;
|
|
164
|
+
}
|
|
143
165
|
async function loadSkillFromDir(skillDir) {
|
|
144
166
|
const resolvedDir = path.resolve(skillDir);
|
|
145
167
|
const skill = await loadSkillFile(skillDir);
|
|
@@ -279,6 +301,11 @@ async function loadAllSkillsInDir(skillsBasePath) {
|
|
|
279
301
|
function loadSkillFromZipBuffer(zipBuffer) {
|
|
280
302
|
const zip = new import_adm_zip.default(zipBuffer);
|
|
281
303
|
const entries = zip.getEntries();
|
|
304
|
+
for (const entry of entries) {
|
|
305
|
+
if (isDangerousZipEntryName(entry.entryName)) {
|
|
306
|
+
throw new Error(`Dangerous zip entry ignored: ${entry.entryName}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
282
309
|
let skillMdContent = "";
|
|
283
310
|
for (const entry of entries) {
|
|
284
311
|
if (entry.isDirectory) continue;
|
|
@@ -290,8 +317,15 @@ function loadSkillFromZipBuffer(zipBuffer) {
|
|
|
290
317
|
if (!skillMdContent) {
|
|
291
318
|
throw new Error("SKILL.md not found in zipped filesystem.");
|
|
292
319
|
}
|
|
293
|
-
const {
|
|
294
|
-
const
|
|
320
|
+
const { raw, body } = parseFrontmatterYaml(skillMdContent);
|
|
321
|
+
const skillName = raw["name"];
|
|
322
|
+
if (!skillName) {
|
|
323
|
+
throw new Error("SKILL.md frontmatter must contain 'name'");
|
|
324
|
+
}
|
|
325
|
+
if (typeof skillName !== "string" || !isBareSkillName(skillName)) {
|
|
326
|
+
throw new Error(`Invalid skill name in SKILL.md: ${String(skillName)}`);
|
|
327
|
+
}
|
|
328
|
+
const frontmatter = validateFrontmatter(raw);
|
|
295
329
|
const references = {};
|
|
296
330
|
const assets = {};
|
|
297
331
|
const scripts = {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
10
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name in all)
|
|
14
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var enterprise_web_search_tool_exports = {};
|
|
26
|
+
__export(enterprise_web_search_tool_exports, {
|
|
27
|
+
ENTERPRISE_WEB_SEARCH: () => ENTERPRISE_WEB_SEARCH,
|
|
28
|
+
EnterpriseWebSearchTool: () => EnterpriseWebSearchTool,
|
|
29
|
+
applyEnterpriseWebSearch: () => applyEnterpriseWebSearch
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(enterprise_web_search_tool_exports);
|
|
32
|
+
var import_model_name = require("../utils/model_name.js");
|
|
33
|
+
var import_base_tool = require("./base_tool.js");
|
|
34
|
+
/**
|
|
35
|
+
* @license
|
|
36
|
+
* Copyright 2026 Google LLC
|
|
37
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
38
|
+
*/
|
|
39
|
+
function applyEnterpriseWebSearch(llmRequest) {
|
|
40
|
+
if (!llmRequest.model) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const modelCheckDisabled = (0, import_model_name.isGeminiModelIdCheckDisabled)();
|
|
44
|
+
llmRequest.config = llmRequest.config || {};
|
|
45
|
+
llmRequest.config.tools = llmRequest.config.tools || [];
|
|
46
|
+
if ((0, import_model_name.isGeminiModel)(llmRequest.model) || modelCheckDisabled) {
|
|
47
|
+
if ((0, import_model_name.isGemini1Model)(llmRequest.model) && llmRequest.config.tools.length > 0) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
"Enterprise Web Search tool cannot be used with other tools in Gemini 1.x."
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
llmRequest.config.tools.push({ enterpriseWebSearch: {} });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
throw new Error(
|
|
56
|
+
`Enterprise Web Search tool is not supported for model ${llmRequest.model}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
class EnterpriseWebSearchTool extends import_base_tool.BaseTool {
|
|
60
|
+
constructor() {
|
|
61
|
+
super({
|
|
62
|
+
name: "enterprise_web_search",
|
|
63
|
+
description: "Enterprise Web Search Tool"
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
runAsync() {
|
|
67
|
+
return Promise.resolve();
|
|
68
|
+
}
|
|
69
|
+
async processLlmRequest({
|
|
70
|
+
llmRequest
|
|
71
|
+
}) {
|
|
72
|
+
applyEnterpriseWebSearch(llmRequest);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const ENTERPRISE_WEB_SEARCH = new EnterpriseWebSearchTool();
|
|
76
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
77
|
+
0 && (module.exports = {
|
|
78
|
+
ENTERPRISE_WEB_SEARCH,
|
|
79
|
+
EnterpriseWebSearchTool,
|
|
80
|
+
applyEnterpriseWebSearch
|
|
81
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
10
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name in all)
|
|
14
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var example_tool_exports = {};
|
|
26
|
+
__export(example_tool_exports, {
|
|
27
|
+
ExampleTool: () => ExampleTool
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(example_tool_exports);
|
|
30
|
+
var import_example_util = require("../examples/example_util.js");
|
|
31
|
+
var import_llm_request = require("../models/llm_request.js");
|
|
32
|
+
var import_base_tool = require("./base_tool.js");
|
|
33
|
+
/**
|
|
34
|
+
* @license
|
|
35
|
+
* Copyright 2026 Google LLC
|
|
36
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
37
|
+
*/
|
|
38
|
+
class ExampleTool extends import_base_tool.BaseTool {
|
|
39
|
+
constructor(examples) {
|
|
40
|
+
super({
|
|
41
|
+
// Name and description are not used because this tool only changes
|
|
42
|
+
// llmRequest.
|
|
43
|
+
name: "example_tool",
|
|
44
|
+
description: "example tool"
|
|
45
|
+
});
|
|
46
|
+
this.examples = examples;
|
|
47
|
+
}
|
|
48
|
+
async runAsync(_request) {
|
|
49
|
+
throw new Error("ExampleTool should not be called by model");
|
|
50
|
+
}
|
|
51
|
+
async processLlmRequest({
|
|
52
|
+
toolContext,
|
|
53
|
+
llmRequest
|
|
54
|
+
}) {
|
|
55
|
+
var _a, _b;
|
|
56
|
+
const parts = (_a = toolContext.userContent) == null ? void 0 : _a.parts;
|
|
57
|
+
if (!parts || !((_b = parts[0]) == null ? void 0 : _b.text)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
(0, import_llm_request.appendInstructions)(llmRequest, [
|
|
61
|
+
(0, import_example_util.buildExampleSi)(this.examples, parts[0].text, llmRequest.model)
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
66
|
+
0 && (module.exports = {
|
|
67
|
+
ExampleTool
|
|
68
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
10
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name in all)
|
|
14
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var get_user_choice_tool_exports = {};
|
|
26
|
+
__export(get_user_choice_tool_exports, {
|
|
27
|
+
getUserChoiceTool: () => getUserChoiceTool
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(get_user_choice_tool_exports);
|
|
30
|
+
var import_zod = require("zod");
|
|
31
|
+
var import_long_running_tool = require("./long_running_tool.js");
|
|
32
|
+
/**
|
|
33
|
+
* @license
|
|
34
|
+
* Copyright 2026 Google LLC
|
|
35
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
36
|
+
*/
|
|
37
|
+
const getUserChoiceTool = new import_long_running_tool.LongRunningFunctionTool({
|
|
38
|
+
name: "get_user_choice",
|
|
39
|
+
description: "Presents a list of options to the user and awaits their selection.",
|
|
40
|
+
parameters: import_zod.z.object({
|
|
41
|
+
options: import_zod.z.array(import_zod.z.string()).describe("List of options to present to the user.")
|
|
42
|
+
}),
|
|
43
|
+
execute: async (input, context) => {
|
|
44
|
+
if (context) {
|
|
45
|
+
context.actions.skipSummarization = true;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {
|
|
52
|
+
getUserChoiceTool
|
|
53
|
+
});
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
10
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __export = (target, all) => {
|
|
13
|
+
for (var name in all)
|
|
14
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
15
|
+
};
|
|
16
|
+
var __copyProps = (to, from, except, desc) => {
|
|
17
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
18
|
+
for (let key of __getOwnPropNames(from))
|
|
19
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
20
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
21
|
+
}
|
|
22
|
+
return to;
|
|
23
|
+
};
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var load_web_page_exports = {};
|
|
26
|
+
__export(load_web_page_exports, {
|
|
27
|
+
LOAD_WEB_PAGE: () => LOAD_WEB_PAGE,
|
|
28
|
+
loadWebPage: () => loadWebPage
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(load_web_page_exports);
|
|
31
|
+
var import_promises = require("node:dns/promises");
|
|
32
|
+
var import_node_net = require("node:net");
|
|
33
|
+
var import_zod = require("zod");
|
|
34
|
+
var import_function_tool = require("./function_tool.js");
|
|
35
|
+
/**
|
|
36
|
+
* @license
|
|
37
|
+
* Copyright 2026 Google LLC
|
|
38
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
39
|
+
*/
|
|
40
|
+
const ALLOWED_SCHEMES = /* @__PURE__ */ new Set(["http:", "https:"]);
|
|
41
|
+
const DEFAULT_TIMEOUT_MS = 3e4;
|
|
42
|
+
const BLOCKED_IPV4_CIDRS = [
|
|
43
|
+
"0.0.0.0/8",
|
|
44
|
+
// "this host on this network"
|
|
45
|
+
"10.0.0.0/8",
|
|
46
|
+
// private
|
|
47
|
+
"100.64.0.0/10",
|
|
48
|
+
// shared address space / CGNAT
|
|
49
|
+
"127.0.0.0/8",
|
|
50
|
+
// loopback
|
|
51
|
+
"169.254.0.0/16",
|
|
52
|
+
// link-local (includes GCP metadata 169.254.169.254)
|
|
53
|
+
"172.16.0.0/12",
|
|
54
|
+
// private
|
|
55
|
+
"192.0.0.0/24",
|
|
56
|
+
// IETF protocol assignments
|
|
57
|
+
"192.0.2.0/24",
|
|
58
|
+
// TEST-NET-1 (documentation)
|
|
59
|
+
"192.88.99.0/24",
|
|
60
|
+
// 6to4 relay anycast (deprecated)
|
|
61
|
+
"192.168.0.0/16",
|
|
62
|
+
// private
|
|
63
|
+
"198.18.0.0/15",
|
|
64
|
+
// benchmarking
|
|
65
|
+
"198.51.100.0/24",
|
|
66
|
+
// TEST-NET-2 (documentation)
|
|
67
|
+
"203.0.113.0/24",
|
|
68
|
+
// TEST-NET-3 (documentation)
|
|
69
|
+
"224.0.0.0/4",
|
|
70
|
+
// multicast
|
|
71
|
+
"240.0.0.0/4"
|
|
72
|
+
// reserved / future use (includes 255.255.255.255)
|
|
73
|
+
].map(parseIpv4Cidr);
|
|
74
|
+
const BLOCKED_IPV6_CIDRS = [
|
|
75
|
+
"::/128",
|
|
76
|
+
// unspecified
|
|
77
|
+
"::1/128",
|
|
78
|
+
// loopback
|
|
79
|
+
"64:ff9b:1::/48",
|
|
80
|
+
// local NAT64
|
|
81
|
+
"100::/64",
|
|
82
|
+
// discard-only
|
|
83
|
+
"2001:db8::/32",
|
|
84
|
+
// documentation
|
|
85
|
+
"fc00::/7",
|
|
86
|
+
// unique-local (ULA, private)
|
|
87
|
+
"fe80::/10",
|
|
88
|
+
// link-local
|
|
89
|
+
"ff00::/8"
|
|
90
|
+
// multicast
|
|
91
|
+
].map(parseIpv6Cidr);
|
|
92
|
+
function failedToFetchMessage(url) {
|
|
93
|
+
return `Failed to fetch url: ${url}`;
|
|
94
|
+
}
|
|
95
|
+
function isBlockedHostname(hostname) {
|
|
96
|
+
const normalized = hostname.replace(/\.+$/, "").toLowerCase();
|
|
97
|
+
return normalized === "localhost" || normalized.endsWith(".localhost");
|
|
98
|
+
}
|
|
99
|
+
function normalizeHost(hostname) {
|
|
100
|
+
return hostname.startsWith("[") ? hostname.slice(1, -1) : hostname;
|
|
101
|
+
}
|
|
102
|
+
function parseIpv4(address) {
|
|
103
|
+
const match = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(address);
|
|
104
|
+
if (!match) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const octets = match.slice(1).map(Number);
|
|
108
|
+
if (octets.some((octet) => octet > 255)) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return octets;
|
|
112
|
+
}
|
|
113
|
+
function parseIpv6(address) {
|
|
114
|
+
if ((0, import_node_net.isIP)(address) !== 6) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const [head, tail] = address.split("::");
|
|
118
|
+
const highGroups = head ? expandHextets(head) : [];
|
|
119
|
+
const lowGroups = tail ? expandHextets(tail) : [];
|
|
120
|
+
const compressed = address.includes("::") ? new Array(8 - highGroups.length - lowGroups.length).fill(0) : [];
|
|
121
|
+
return [...highGroups, ...compressed, ...lowGroups];
|
|
122
|
+
}
|
|
123
|
+
function expandHextets(fragment) {
|
|
124
|
+
const hextets = [];
|
|
125
|
+
for (const group of fragment.split(":")) {
|
|
126
|
+
if (group.includes(".")) {
|
|
127
|
+
const octets = parseIpv4(group);
|
|
128
|
+
hextets.push(octets[0] << 8 | octets[1], octets[2] << 8 | octets[3]);
|
|
129
|
+
} else {
|
|
130
|
+
hextets.push(parseInt(group, 16));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return hextets;
|
|
134
|
+
}
|
|
135
|
+
function ipv4ToInt(octets) {
|
|
136
|
+
return (octets[0] << 24 | octets[1] << 16 | octets[2] << 8 | octets[3]) >>> 0;
|
|
137
|
+
}
|
|
138
|
+
function hextetsToBigInt(hextets) {
|
|
139
|
+
let value = 0n;
|
|
140
|
+
for (const hextet of hextets) {
|
|
141
|
+
value = value << 16n | BigInt(hextet);
|
|
142
|
+
}
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
function parseIpv4Cidr(cidr) {
|
|
146
|
+
const [address, prefix] = cidr.split("/");
|
|
147
|
+
const mask = 4294967295 << 32 - Number(prefix) >>> 0;
|
|
148
|
+
return { base: (ipv4ToInt(parseIpv4(address)) & mask) >>> 0, mask };
|
|
149
|
+
}
|
|
150
|
+
function parseIpv6Cidr(cidr) {
|
|
151
|
+
const [address, prefix] = cidr.split("/");
|
|
152
|
+
return { base: hextetsToBigInt(parseIpv6(address)), prefix: Number(prefix) };
|
|
153
|
+
}
|
|
154
|
+
function isBlockedIpv4(octets) {
|
|
155
|
+
const value = ipv4ToInt(octets);
|
|
156
|
+
return BLOCKED_IPV4_CIDRS.some(
|
|
157
|
+
({ base, mask }) => (value & mask) >>> 0 === base
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
function isBlockedIpv6(hextets) {
|
|
161
|
+
const value = hextetsToBigInt(hextets);
|
|
162
|
+
if (value >> 32n === 0xffffn) {
|
|
163
|
+
return isBlockedIpv4([
|
|
164
|
+
Number(value >> 24n & 0xffn),
|
|
165
|
+
Number(value >> 16n & 0xffn),
|
|
166
|
+
Number(value >> 8n & 0xffn),
|
|
167
|
+
Number(value & 0xffn)
|
|
168
|
+
]);
|
|
169
|
+
}
|
|
170
|
+
return BLOCKED_IPV6_CIDRS.some(
|
|
171
|
+
({ base, prefix }) => value >> BigInt(128 - prefix) === base >> BigInt(128 - prefix)
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
function isBlockedAddress(address) {
|
|
175
|
+
const octets = parseIpv4(address);
|
|
176
|
+
if (octets) {
|
|
177
|
+
return isBlockedIpv4(octets);
|
|
178
|
+
}
|
|
179
|
+
const hextets = parseIpv6(address);
|
|
180
|
+
if (hextets) {
|
|
181
|
+
return isBlockedIpv6(hextets);
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
async function resolveHostAddresses(hostname) {
|
|
186
|
+
if ((0, import_node_net.isIP)(hostname) !== 0) {
|
|
187
|
+
return [hostname];
|
|
188
|
+
}
|
|
189
|
+
const records = await (0, import_promises.lookup)(hostname, { all: true });
|
|
190
|
+
const addresses = [...new Set(records.map((record) => record.address))];
|
|
191
|
+
if (addresses.length === 0) {
|
|
192
|
+
throw new Error(`Unable to resolve host: ${hostname}`);
|
|
193
|
+
}
|
|
194
|
+
return addresses;
|
|
195
|
+
}
|
|
196
|
+
function assertUrlAllowed(url) {
|
|
197
|
+
const parsed = new URL(url);
|
|
198
|
+
if (!ALLOWED_SCHEMES.has(parsed.protocol)) {
|
|
199
|
+
throw new Error(`Unsupported url scheme: ${url}`);
|
|
200
|
+
}
|
|
201
|
+
if (isBlockedHostname(parsed.hostname)) {
|
|
202
|
+
throw new Error(`Blocked host: ${parsed.hostname}`);
|
|
203
|
+
}
|
|
204
|
+
return parsed;
|
|
205
|
+
}
|
|
206
|
+
async function validateResolvedAddresses(hostname) {
|
|
207
|
+
const addresses = await resolveHostAddresses(hostname);
|
|
208
|
+
if (addresses.some(isBlockedAddress)) {
|
|
209
|
+
throw new Error(`Blocked host: ${hostname}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function decodeHtmlEntities(text) {
|
|
213
|
+
return text.replace(/ /g, " ").replace(/'/g, "'").replace(/'/g, "'").replace(/"/g, '"').replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
214
|
+
}
|
|
215
|
+
function htmlToText(html) {
|
|
216
|
+
const withoutCode = html.replace(/<script[\s\S]*?<\/script>/gi, " ").replace(/<style[\s\S]*?<\/style>/gi, " ").replace(/<!--[\s\S]*?-->/g, " ");
|
|
217
|
+
const text = decodeHtmlEntities(withoutCode.replace(/<[^>]+>/g, "\n"));
|
|
218
|
+
return text.split("\n").map((line) => line.trim()).filter((line) => line.split(/\s+/).filter(Boolean).length > 3).join("\n");
|
|
219
|
+
}
|
|
220
|
+
async function loadWebPage(url, options) {
|
|
221
|
+
var _a;
|
|
222
|
+
const timeoutMs = (_a = options == null ? void 0 : options.timeoutMs) != null ? _a : DEFAULT_TIMEOUT_MS;
|
|
223
|
+
try {
|
|
224
|
+
const parsed = assertUrlAllowed(url);
|
|
225
|
+
await validateResolvedAddresses(normalizeHost(parsed.hostname));
|
|
226
|
+
const response = await fetch(url, {
|
|
227
|
+
redirect: "manual",
|
|
228
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
229
|
+
});
|
|
230
|
+
if (response.status !== 200) {
|
|
231
|
+
return failedToFetchMessage(url);
|
|
232
|
+
}
|
|
233
|
+
return htmlToText(await response.text());
|
|
234
|
+
} catch {
|
|
235
|
+
return failedToFetchMessage(url);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const LOAD_WEB_PAGE = new import_function_tool.FunctionTool({
|
|
239
|
+
name: "load_web_page",
|
|
240
|
+
description: "Fetches the content at the given URL and returns the readable text extracted from the page.",
|
|
241
|
+
parameters: import_zod.z.object({
|
|
242
|
+
url: import_zod.z.string().describe("The URL to fetch and extract text from.")
|
|
243
|
+
}),
|
|
244
|
+
execute: ({ url }) => loadWebPage(url)
|
|
245
|
+
});
|
|
246
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
247
|
+
0 && (module.exports = {
|
|
248
|
+
LOAD_WEB_PAGE,
|
|
249
|
+
loadWebPage
|
|
250
|
+
});
|