@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.
Files changed (213) hide show
  1. package/dist/cjs/a2a/a2a_remote_agent.js +12 -2
  2. package/dist/cjs/a2a/agent_to_a2a.js +18 -3
  3. package/dist/cjs/a2a/auth.js +65 -0
  4. package/dist/cjs/a2a/event_converter_utils.js +47 -18
  5. package/dist/cjs/a2a/metadata_converter_utils.js +1 -1
  6. package/dist/cjs/agents/base_agent.js +39 -0
  7. package/dist/cjs/agents/functions.js +26 -28
  8. package/dist/cjs/agents/llm_agent.js +4 -2
  9. package/dist/cjs/agents/loop_agent.js +15 -3
  10. package/dist/cjs/agents/processors/basic_llm_request_processor.js +3 -2
  11. package/dist/cjs/agents/processors/content_processor_utils.js +2 -1
  12. package/dist/cjs/agents/processors/content_request_processor.js +2 -21
  13. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +3 -1
  14. package/dist/cjs/agents/routed_agent.js +31 -0
  15. package/dist/cjs/agents/run_config.js +3 -2
  16. package/dist/cjs/artifacts/in_memory_artifact_service.js +17 -9
  17. package/dist/cjs/auth/credential_service/in_memory_credential_service.js +14 -3
  18. package/dist/cjs/code_executors/unsafe_local_code_executor.js +23 -12
  19. package/dist/cjs/common.js +35 -0
  20. package/dist/cjs/context/agent_controlled_context_compactor.js +2 -11
  21. package/dist/cjs/context/anchored_context_compactor.js +127 -0
  22. package/dist/cjs/context/compaction_utils.js +64 -0
  23. package/dist/cjs/context/token_based_context_compactor.js +13 -44
  24. package/dist/cjs/events/compacted_event.js +9 -3
  25. package/dist/cjs/events/event.js +28 -0
  26. package/dist/cjs/index.js +7 -0
  27. package/dist/cjs/integrations/agent_registry/agent_registry_mcp_toolset.js +9 -1
  28. package/dist/cjs/memory/in_memory_memory_service.js +13 -2
  29. package/dist/cjs/memory/vertex_ai_memory_bank_service.js +3 -0
  30. package/dist/cjs/plugins/base_plugin.js +4 -2
  31. package/dist/cjs/plugins/global_instruction_plugin.js +97 -0
  32. package/dist/cjs/runner/runner.js +69 -23
  33. package/dist/cjs/sessions/base_session_service.js +8 -3
  34. package/dist/cjs/sessions/in_memory_session_service.js +8 -8
  35. package/dist/cjs/sessions/vertex_ai_session_service.js +22 -10
  36. package/dist/cjs/skills/loader.js +40 -6
  37. package/dist/cjs/tools/enterprise_web_search_tool.js +81 -0
  38. package/dist/cjs/tools/example_tool.js +68 -0
  39. package/dist/cjs/tools/get_user_choice_tool.js +53 -0
  40. package/dist/cjs/tools/load_web_page.js +250 -0
  41. package/dist/cjs/tools/mcp/load_mcp_resource_tool.js +140 -0
  42. package/dist/cjs/tools/mcp/mcp_session_manager.js +35 -21
  43. package/dist/cjs/tools/mcp/mcp_toolset.js +63 -0
  44. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +13 -10
  45. package/dist/cjs/tools/request_input_tool.js +54 -0
  46. package/dist/cjs/tools/skill/run_skill_inline_script_tool.js +54 -4
  47. package/dist/cjs/tools/skill/skill_toolset.js +4 -2
  48. package/dist/cjs/utils/branch_trie.js +41 -0
  49. package/dist/cjs/utils/crypto_shim.js +43 -0
  50. package/dist/cjs/utils/env_aware_utils.js +15 -13
  51. package/dist/cjs/utils/error_utils.js +120 -0
  52. package/dist/cjs/utils/file_utils.js +5 -2
  53. package/dist/cjs/utils/output_schema_utils.js +43 -0
  54. package/dist/cjs/utils/streaming_utils.js +5 -5
  55. package/dist/cjs/utils/vertex_ai_utils.js +3 -0
  56. package/dist/cjs/version.js +1 -1
  57. package/dist/esm/a2a/a2a_remote_agent.js +12 -2
  58. package/dist/esm/a2a/agent_to_a2a.js +18 -3
  59. package/dist/esm/a2a/auth.js +37 -0
  60. package/dist/esm/a2a/event_converter_utils.js +47 -18
  61. package/dist/esm/a2a/metadata_converter_utils.js +1 -1
  62. package/dist/esm/agents/base_agent.js +39 -0
  63. package/dist/esm/agents/functions.js +27 -24
  64. package/dist/esm/agents/llm_agent.js +6 -4
  65. package/dist/esm/agents/loop_agent.js +15 -3
  66. package/dist/esm/agents/processors/basic_llm_request_processor.js +3 -2
  67. package/dist/esm/agents/processors/content_processor_utils.js +2 -1
  68. package/dist/esm/agents/processors/content_request_processor.js +2 -21
  69. package/dist/esm/agents/processors/instructions_llm_request_processor.js +3 -1
  70. package/dist/esm/agents/routed_agent.js +31 -0
  71. package/dist/esm/agents/run_config.js +3 -2
  72. package/dist/esm/artifacts/in_memory_artifact_service.js +17 -9
  73. package/dist/esm/auth/credential_service/in_memory_credential_service.js +14 -3
  74. package/dist/esm/code_executors/unsafe_local_code_executor.js +22 -11
  75. package/dist/esm/common.js +29 -1
  76. package/dist/esm/context/agent_controlled_context_compactor.js +2 -11
  77. package/dist/esm/context/anchored_context_compactor.js +99 -0
  78. package/dist/esm/context/compaction_utils.js +38 -0
  79. package/dist/esm/context/token_based_context_compactor.js +16 -44
  80. package/dist/esm/events/compacted_event.js +7 -2
  81. package/dist/esm/events/event.js +24 -0
  82. package/dist/esm/index.js +8 -1
  83. package/dist/esm/integrations/agent_registry/agent_registry_mcp_toolset.js +9 -1
  84. package/dist/esm/memory/in_memory_memory_service.js +13 -2
  85. package/dist/esm/memory/vertex_ai_memory_bank_service.js +7 -1
  86. package/dist/esm/plugins/base_plugin.js +4 -2
  87. package/dist/esm/plugins/global_instruction_plugin.js +69 -0
  88. package/dist/esm/runner/runner.js +69 -23
  89. package/dist/esm/sessions/base_session_service.js +8 -3
  90. package/dist/esm/sessions/in_memory_session_service.js +8 -8
  91. package/dist/esm/sessions/vertex_ai_session_service.js +26 -11
  92. package/dist/esm/skills/loader.js +40 -6
  93. package/dist/esm/tools/enterprise_web_search_tool.js +55 -0
  94. package/dist/esm/tools/example_tool.js +42 -0
  95. package/dist/esm/tools/get_user_choice_tool.js +25 -0
  96. package/dist/esm/tools/load_web_page.js +221 -0
  97. package/dist/esm/tools/mcp/load_mcp_resource_tool.js +114 -0
  98. package/dist/esm/tools/mcp/mcp_session_manager.js +35 -21
  99. package/dist/esm/tools/mcp/mcp_toolset.js +63 -0
  100. package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +13 -10
  101. package/dist/esm/tools/request_input_tool.js +26 -0
  102. package/dist/esm/tools/skill/run_skill_inline_script_tool.js +53 -4
  103. package/dist/esm/tools/skill/skill_toolset.js +4 -2
  104. package/dist/esm/utils/branch_trie.js +13 -0
  105. package/dist/esm/utils/crypto_shim.js +15 -0
  106. package/dist/esm/utils/env_aware_utils.js +15 -13
  107. package/dist/esm/utils/error_utils.js +92 -0
  108. package/dist/esm/utils/file_utils.js +5 -2
  109. package/dist/esm/utils/output_schema_utils.js +15 -0
  110. package/dist/esm/utils/streaming_utils.js +1 -1
  111. package/dist/esm/utils/vertex_ai_utils.js +2 -0
  112. package/dist/esm/version.js +1 -1
  113. package/dist/types/a2a/a2a_remote_agent.d.ts +5 -1
  114. package/dist/types/a2a/agent_to_a2a.d.ts +38 -0
  115. package/dist/types/a2a/auth.d.ts +30 -0
  116. package/dist/types/a2a/event_converter_utils.d.ts +4 -1
  117. package/dist/types/agents/base_agent.d.ts +29 -1
  118. package/dist/types/agents/functions.d.ts +1 -9
  119. package/dist/types/agents/llm_agent.d.ts +5 -1
  120. package/dist/types/agents/loop_agent.d.ts +2 -2
  121. package/dist/types/agents/routed_agent.d.ts +24 -1
  122. package/dist/types/agents/run_config.d.ts +1 -1
  123. package/dist/types/auth/credential_service/in_memory_credential_service.d.ts +11 -0
  124. package/dist/types/code_executors/unsafe_local_code_executor.d.ts +5 -1
  125. package/dist/types/common.d.ts +11 -2
  126. package/dist/types/context/agent_controlled_context_compactor.d.ts +0 -1
  127. package/dist/types/context/anchored_context_compactor.d.ts +35 -0
  128. package/dist/types/context/compaction_utils.d.ts +23 -0
  129. package/dist/types/context/token_based_context_compactor.d.ts +0 -1
  130. package/dist/types/events/compacted_event.d.ts +10 -0
  131. package/dist/types/events/event.d.ts +13 -0
  132. package/dist/types/index.d.ts +5 -3
  133. package/dist/types/memory/in_memory_memory_service.d.ts +11 -0
  134. package/dist/types/plugins/base_plugin.d.ts +4 -2
  135. package/dist/types/plugins/global_instruction_plugin.d.ts +38 -0
  136. package/dist/types/runner/runner.d.ts +1 -1
  137. package/dist/types/sessions/base_session_service.d.ts +8 -0
  138. package/dist/types/sessions/in_memory_session_service.d.ts +9 -0
  139. package/dist/types/sessions/vertex_ai_session_service.d.ts +19 -1
  140. package/dist/types/skills/loader.d.ts +5 -0
  141. package/dist/types/tools/enterprise_web_search_tool.d.ts +26 -0
  142. package/dist/types/tools/example_tool.d.ts +21 -0
  143. package/dist/types/tools/get_user_choice_tool.d.ts +14 -0
  144. package/dist/types/tools/load_web_page.d.ts +33 -0
  145. package/dist/types/tools/mcp/load_mcp_resource_tool.d.ts +26 -0
  146. package/dist/types/tools/mcp/mcp_toolset.d.ts +27 -0
  147. package/dist/types/tools/request_input_tool.d.ts +15 -0
  148. package/dist/types/tools/skill/run_skill_inline_script_tool.d.ts +25 -0
  149. package/dist/types/tools/skill/skill_toolset.d.ts +9 -0
  150. package/dist/types/utils/branch_trie.d.ts +14 -0
  151. package/dist/types/utils/crypto_shim.d.ts +16 -0
  152. package/dist/types/utils/env_aware_utils.d.ts +23 -0
  153. package/dist/types/utils/error_utils.d.ts +18 -0
  154. package/dist/types/utils/output_schema_utils.d.ts +18 -0
  155. package/dist/types/utils/vertex_ai_utils.d.ts +1 -0
  156. package/dist/types/version.d.ts +1 -1
  157. package/dist/web/a2a/a2a_remote_agent.js +12 -2
  158. package/dist/web/a2a/agent_to_a2a.js +18 -3
  159. package/dist/web/a2a/auth.js +37 -0
  160. package/dist/web/a2a/event_converter_utils.js +47 -18
  161. package/dist/web/a2a/metadata_converter_utils.js +1 -1
  162. package/dist/web/agents/base_agent.js +39 -0
  163. package/dist/web/agents/functions.js +27 -24
  164. package/dist/web/agents/llm_agent.js +6 -4
  165. package/dist/web/agents/loop_agent.js +27 -3
  166. package/dist/web/agents/processors/basic_llm_request_processor.js +3 -2
  167. package/dist/web/agents/processors/content_processor_utils.js +2 -1
  168. package/dist/web/agents/processors/content_request_processor.js +2 -21
  169. package/dist/web/agents/processors/instructions_llm_request_processor.js +3 -1
  170. package/dist/web/agents/routed_agent.js +31 -0
  171. package/dist/web/agents/run_config.js +8 -3
  172. package/dist/web/artifacts/in_memory_artifact_service.js +17 -9
  173. package/dist/web/auth/credential_service/in_memory_credential_service.js +14 -3
  174. package/dist/web/code_executors/unsafe_local_code_executor.js +22 -11
  175. package/dist/web/common.js +29 -1
  176. package/dist/web/context/agent_controlled_context_compactor.js +2 -11
  177. package/dist/web/context/anchored_context_compactor.js +117 -0
  178. package/dist/web/context/compaction_utils.js +38 -0
  179. package/dist/web/context/token_based_context_compactor.js +16 -44
  180. package/dist/web/events/compacted_event.js +7 -2
  181. package/dist/web/events/event.js +24 -0
  182. package/dist/web/index.js +8 -1
  183. package/dist/web/integrations/agent_registry/agent_registry_mcp_toolset.js +9 -1
  184. package/dist/web/memory/in_memory_memory_service.js +13 -2
  185. package/dist/web/memory/vertex_ai_memory_bank_service.js +7 -1
  186. package/dist/web/plugins/base_plugin.js +4 -2
  187. package/dist/web/plugins/global_instruction_plugin.js +67 -0
  188. package/dist/web/runner/runner.js +65 -22
  189. package/dist/web/sessions/base_session_service.js +8 -3
  190. package/dist/web/sessions/in_memory_session_service.js +8 -8
  191. package/dist/web/sessions/vertex_ai_session_service.js +24 -11
  192. package/dist/web/skills/loader.js +40 -6
  193. package/dist/web/tools/enterprise_web_search_tool.js +55 -0
  194. package/dist/web/tools/example_tool.js +42 -0
  195. package/dist/web/tools/get_user_choice_tool.js +25 -0
  196. package/dist/web/tools/load_web_page.js +221 -0
  197. package/dist/web/tools/mcp/load_mcp_resource_tool.js +107 -0
  198. package/dist/web/tools/mcp/mcp_session_manager.js +35 -21
  199. package/dist/web/tools/mcp/mcp_toolset.js +63 -0
  200. package/dist/web/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +13 -10
  201. package/dist/web/tools/request_input_tool.js +26 -0
  202. package/dist/web/tools/skill/run_skill_inline_script_tool.js +51 -4
  203. package/dist/web/tools/skill/skill_toolset.js +4 -2
  204. package/dist/web/utils/branch_trie.js +13 -0
  205. package/dist/web/utils/crypto_shim.js +15 -0
  206. package/dist/web/utils/env_aware_utils.js +15 -13
  207. package/dist/web/utils/error_utils.js +92 -0
  208. package/dist/web/utils/file_utils.js +5 -2
  209. package/dist/web/utils/output_schema_utils.js +15 -0
  210. package/dist/web/utils/streaming_utils.js +1 -1
  211. package/dist/web/utils/vertex_ai_utils.js +2 -0
  212. package/dist/web/version.js +1 -1
  213. 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 parseSkillMdContent(content) {
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
- const frontmatter = import_skill.FrontmatterSchema.parse(parsed);
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 { frontmatter: parsed, body } = parseSkillMdContent(skillMdContent);
294
- const frontmatter = import_skill.FrontmatterSchema.parse(parsed);
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(/&nbsp;/g, " ").replace(/&#39;/g, "'").replace(/&#x27;/g, "'").replace(/&quot;/g, '"').replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/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
+ });