@google/adk 1.2.0 → 1.3.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 (190) hide show
  1. package/dist/cjs/agents/base_agent.js +19 -1
  2. package/dist/cjs/agents/instructions.js +81 -33
  3. package/dist/cjs/agents/invocation_context.js +0 -1
  4. package/dist/cjs/agents/llm_agent.js +52 -5
  5. package/dist/cjs/agents/processors/agent_transfer_llm_request_processor.js +7 -0
  6. package/dist/cjs/agents/processors/basic_llm_request_processor.js +8 -1
  7. package/dist/cjs/agents/processors/content_processor_utils.js +37 -24
  8. package/dist/cjs/agents/processors/content_request_processor.js +7 -0
  9. package/dist/cjs/agents/processors/context_compactor_request_processor.js +12 -0
  10. package/dist/cjs/agents/processors/identity_llm_request_processor.js +7 -0
  11. package/dist/cjs/agents/processors/instructions_llm_request_processor.js +5 -0
  12. package/dist/cjs/agents/processors/request_confirmation_llm_request_processor.js +9 -1
  13. package/dist/cjs/agents/processors/tool_filter_request_processor.js +7 -1
  14. package/dist/cjs/auth/auth_preprocessor.js +12 -10
  15. package/dist/cjs/auth/oauth2/oauth2_discovery.js +1 -1
  16. package/dist/cjs/code_executors/code_executor_context.js +7 -7
  17. package/dist/cjs/common.js +39 -0
  18. package/dist/cjs/context/summarizers/llm_summarizer.js +11 -0
  19. package/dist/cjs/context/token_based_context_compactor.js +1 -1
  20. package/dist/cjs/events/event.js +1 -1
  21. package/dist/cjs/integrations/agent_registry/agent_registry_mcp_toolset.js +21 -2
  22. package/dist/cjs/models/gemini_llm_connection.js +62 -19
  23. package/dist/cjs/models/google_llm.js +26 -8
  24. package/dist/cjs/plugins/security_plugin.js +16 -0
  25. package/dist/cjs/sessions/base_session_service.js +13 -2
  26. package/dist/cjs/sessions/database_session_service.js +2 -2
  27. package/dist/cjs/sessions/db/schema.js +45 -10
  28. package/dist/cjs/sessions/in_memory_session_service.js +2 -1
  29. package/dist/cjs/sessions/vertex_ai_session_service.js +2 -1
  30. package/dist/cjs/skills/gcp_skill_registry.js +104 -0
  31. package/dist/cjs/skills/loader.js +65 -0
  32. package/dist/cjs/skills/skill_registry.js +27 -0
  33. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +232 -0
  34. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/operation_parser.js +224 -0
  35. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +127 -0
  36. package/dist/cjs/tools/openapi_tool/openapi_toolset.js +133 -0
  37. package/dist/cjs/tools/openapi_tool/rest_api_tool.js +256 -0
  38. package/dist/cjs/tools/skill/load_skill_resource_tool.js +25 -3
  39. package/dist/cjs/tools/skill/load_skill_tool.js +12 -1
  40. package/dist/cjs/tools/skill/run_skill_script_tool.js +12 -1
  41. package/dist/cjs/tools/skill/search_skills_tool.js +108 -0
  42. package/dist/cjs/tools/skill/skill_toolset.js +40 -5
  43. package/dist/cjs/utils/async_queue.js +88 -0
  44. package/dist/cjs/utils/case_utils.js +53 -0
  45. package/dist/cjs/utils/env_aware_utils.js +4 -0
  46. package/dist/cjs/utils/live_connection_utils.js +284 -0
  47. package/dist/cjs/utils/model_name.js +9 -0
  48. package/dist/cjs/utils/streaming_utils.js +9 -8
  49. package/dist/cjs/version.js +1 -1
  50. package/dist/esm/agents/base_agent.js +19 -1
  51. package/dist/esm/agents/instructions.js +81 -33
  52. package/dist/esm/agents/invocation_context.js +0 -1
  53. package/dist/esm/agents/llm_agent.js +53 -5
  54. package/dist/esm/agents/processors/agent_transfer_llm_request_processor.js +7 -0
  55. package/dist/esm/agents/processors/basic_llm_request_processor.js +8 -1
  56. package/dist/esm/agents/processors/content_processor_utils.js +35 -23
  57. package/dist/esm/agents/processors/content_request_processor.js +7 -0
  58. package/dist/esm/agents/processors/context_compactor_request_processor.js +12 -0
  59. package/dist/esm/agents/processors/identity_llm_request_processor.js +7 -0
  60. package/dist/esm/agents/processors/instructions_llm_request_processor.js +5 -0
  61. package/dist/esm/agents/processors/request_confirmation_llm_request_processor.js +9 -1
  62. package/dist/esm/agents/processors/tool_filter_request_processor.js +7 -1
  63. package/dist/esm/auth/auth_preprocessor.js +12 -10
  64. package/dist/esm/auth/oauth2/oauth2_discovery.js +1 -1
  65. package/dist/esm/code_executors/code_executor_context.js +7 -7
  66. package/dist/esm/common.js +33 -1
  67. package/dist/esm/context/summarizers/llm_summarizer.js +11 -0
  68. package/dist/esm/context/token_based_context_compactor.js +1 -1
  69. package/dist/esm/events/event.js +1 -1
  70. package/dist/esm/integrations/agent_registry/agent_registry_mcp_toolset.js +21 -2
  71. package/dist/esm/models/gemini_llm_connection.js +62 -19
  72. package/dist/esm/models/google_llm.js +26 -8
  73. package/dist/esm/plugins/security_plugin.js +16 -0
  74. package/dist/esm/sessions/base_session_service.js +11 -1
  75. package/dist/esm/sessions/database_session_service.js +2 -2
  76. package/dist/esm/sessions/db/schema.js +44 -10
  77. package/dist/esm/sessions/in_memory_session_service.js +4 -2
  78. package/dist/esm/sessions/vertex_ai_session_service.js +4 -2
  79. package/dist/esm/skills/gcp_skill_registry.js +78 -0
  80. package/dist/esm/skills/loader.js +64 -0
  81. package/dist/esm/skills/skill_registry.js +7 -0
  82. package/dist/esm/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +206 -0
  83. package/dist/esm/tools/openapi_tool/openapi_spec_parser/operation_parser.js +198 -0
  84. package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +101 -0
  85. package/dist/esm/tools/openapi_tool/openapi_toolset.js +97 -0
  86. package/dist/esm/tools/openapi_tool/rest_api_tool.js +229 -0
  87. package/dist/esm/tools/skill/load_skill_resource_tool.js +25 -3
  88. package/dist/esm/tools/skill/load_skill_tool.js +12 -1
  89. package/dist/esm/tools/skill/run_skill_script_tool.js +12 -1
  90. package/dist/esm/tools/skill/search_skills_tool.js +82 -0
  91. package/dist/esm/tools/skill/skill_toolset.js +40 -5
  92. package/dist/esm/utils/async_queue.js +60 -0
  93. package/dist/esm/utils/case_utils.js +25 -0
  94. package/dist/esm/utils/env_aware_utils.js +4 -0
  95. package/dist/esm/utils/live_connection_utils.js +256 -0
  96. package/dist/esm/utils/model_name.js +8 -0
  97. package/dist/esm/utils/streaming_utils.js +9 -8
  98. package/dist/esm/version.js +1 -1
  99. package/dist/types/a2a/a2a_remote_agent_utils.d.ts +29 -4
  100. package/dist/types/a2a/event_converter_utils.d.ts +14 -1
  101. package/dist/types/a2a/metadata_converter_utils.d.ts +18 -0
  102. package/dist/types/a2a/part_converter_utils.d.ts +51 -6
  103. package/dist/types/agents/invocation_context.d.ts +0 -9
  104. package/dist/types/agents/llm_agent.d.ts +14 -0
  105. package/dist/types/agents/processors/agent_transfer_llm_request_processor.d.ts +14 -0
  106. package/dist/types/agents/processors/basic_llm_request_processor.d.ts +7 -0
  107. package/dist/types/agents/processors/content_processor_utils.d.ts +26 -0
  108. package/dist/types/agents/processors/content_request_processor.d.ts +16 -0
  109. package/dist/types/agents/processors/context_compactor_request_processor.d.ts +12 -0
  110. package/dist/types/agents/processors/identity_llm_request_processor.d.ts +7 -0
  111. package/dist/types/agents/processors/request_confirmation_llm_request_processor.d.ts +9 -1
  112. package/dist/types/agents/processors/tool_filter_request_processor.d.ts +12 -1
  113. package/dist/types/common.d.ts +15 -1
  114. package/dist/types/context/summarizers/llm_summarizer.d.ts +17 -0
  115. package/dist/types/events/event_actions.d.ts +1 -2
  116. package/dist/types/integrations/agent_registry/agent_registry_mcp_toolset.d.ts +21 -2
  117. package/dist/types/models/base_llm_connection.d.ts +10 -0
  118. package/dist/types/models/gemini_llm_connection.d.ts +15 -4
  119. package/dist/types/models/llm_response.d.ts +10 -1
  120. package/dist/types/plugins/security_plugin.d.ts +30 -0
  121. package/dist/types/sessions/base_session_service.d.ts +4 -0
  122. package/dist/types/sessions/db/schema.d.ts +1 -0
  123. package/dist/types/skills/gcp_skill_registry.d.ts +24 -0
  124. package/dist/types/skills/loader.d.ts +7 -0
  125. package/dist/types/skills/skill.d.ts +1 -1
  126. package/dist/types/skills/skill_registry.d.ts +29 -0
  127. package/dist/types/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.d.ts +34 -0
  128. package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +59 -0
  129. package/dist/types/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.d.ts +23 -0
  130. package/dist/types/tools/openapi_tool/openapi_toolset.d.ts +27 -0
  131. package/dist/types/tools/openapi_tool/rest_api_tool.d.ts +50 -0
  132. package/dist/types/tools/skill/load_skill_resource_tool.d.ts +1 -1
  133. package/dist/types/tools/skill/search_skills_tool.d.ts +14 -0
  134. package/dist/types/tools/skill/skill_toolset.d.ts +5 -0
  135. package/dist/types/utils/async_queue.d.ts +18 -0
  136. package/dist/types/utils/case_utils.d.ts +12 -0
  137. package/dist/types/utils/live_connection_utils.d.ts +30 -0
  138. package/dist/types/utils/model_name.d.ts +7 -0
  139. package/dist/types/utils/streaming_utils.d.ts +0 -1
  140. package/dist/types/version.d.ts +1 -1
  141. package/dist/web/agents/base_agent.js +31 -1
  142. package/dist/web/agents/instructions.js +81 -33
  143. package/dist/web/agents/invocation_context.js +0 -1
  144. package/dist/web/agents/llm_agent.js +53 -5
  145. package/dist/web/agents/processors/agent_transfer_llm_request_processor.js +7 -0
  146. package/dist/web/agents/processors/basic_llm_request_processor.js +8 -1
  147. package/dist/web/agents/processors/content_processor_utils.js +53 -23
  148. package/dist/web/agents/processors/content_request_processor.js +7 -0
  149. package/dist/web/agents/processors/context_compactor_request_processor.js +12 -0
  150. package/dist/web/agents/processors/identity_llm_request_processor.js +7 -0
  151. package/dist/web/agents/processors/instructions_llm_request_processor.js +5 -0
  152. package/dist/web/agents/processors/request_confirmation_llm_request_processor.js +9 -1
  153. package/dist/web/agents/processors/tool_filter_request_processor.js +7 -1
  154. package/dist/web/auth/auth_preprocessor.js +12 -10
  155. package/dist/web/auth/oauth2/oauth2_discovery.js +1 -1
  156. package/dist/web/code_executors/code_executor_context.js +7 -7
  157. package/dist/web/common.js +33 -1
  158. package/dist/web/context/summarizers/llm_summarizer.js +11 -0
  159. package/dist/web/context/token_based_context_compactor.js +1 -1
  160. package/dist/web/events/event.js +1 -1
  161. package/dist/web/integrations/agent_registry/agent_registry_mcp_toolset.js +21 -2
  162. package/dist/web/models/gemini_llm_connection.js +75 -19
  163. package/dist/web/models/google_llm.js +26 -8
  164. package/dist/web/plugins/security_plugin.js +16 -0
  165. package/dist/web/sessions/base_session_service.js +11 -1
  166. package/dist/web/sessions/database_session_service.js +2 -2
  167. package/dist/web/sessions/db/schema.js +44 -10
  168. package/dist/web/sessions/in_memory_session_service.js +4 -2
  169. package/dist/web/sessions/vertex_ai_session_service.js +4 -2
  170. package/dist/web/skills/gcp_skill_registry.js +78 -0
  171. package/dist/web/skills/loader.js +64 -0
  172. package/dist/web/skills/skill_registry.js +7 -0
  173. package/dist/web/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +221 -0
  174. package/dist/web/tools/openapi_tool/openapi_spec_parser/operation_parser.js +198 -0
  175. package/dist/web/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +101 -0
  176. package/dist/web/tools/openapi_tool/openapi_toolset.js +97 -0
  177. package/dist/web/tools/openapi_tool/rest_api_tool.js +229 -0
  178. package/dist/web/tools/skill/load_skill_resource_tool.js +25 -3
  179. package/dist/web/tools/skill/load_skill_tool.js +12 -1
  180. package/dist/web/tools/skill/run_skill_script_tool.js +12 -1
  181. package/dist/web/tools/skill/search_skills_tool.js +82 -0
  182. package/dist/web/tools/skill/skill_toolset.js +40 -5
  183. package/dist/web/utils/async_queue.js +60 -0
  184. package/dist/web/utils/case_utils.js +25 -0
  185. package/dist/web/utils/env_aware_utils.js +4 -0
  186. package/dist/web/utils/live_connection_utils.js +254 -0
  187. package/dist/web/utils/model_name.js +8 -0
  188. package/dist/web/utils/streaming_utils.js +9 -8
  189. package/dist/web/version.js +1 -1
  190. package/package.json +3 -1
@@ -0,0 +1,256 @@
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 __decorateClass = (decorators, target, key, kind) => {
26
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
27
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
28
+ if (decorator = decorators[i])
29
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
30
+ if (kind && result) __defProp(target, key, result);
31
+ return result;
32
+ };
33
+ var rest_api_tool_exports = {};
34
+ __export(rest_api_tool_exports, {
35
+ RestApiTool: () => RestApiTool,
36
+ createRestApiTool: () => createRestApiTool,
37
+ prepareRequestBody: () => prepareRequestBody,
38
+ prepareRequestParams: () => prepareRequestParams
39
+ });
40
+ module.exports = __toCommonJS(rest_api_tool_exports);
41
+ var import_experimental = require("../../utils/experimental.js");
42
+ var import_base_tool = require("../base_tool.js");
43
+ var import_auth_helpers = require("./auth/auth_helpers.js");
44
+ var import_operation_parser = require("./openapi_spec_parser/operation_parser.js");
45
+ var import_tool_auth_handler = require("./openapi_spec_parser/tool_auth_handler.js");
46
+ /**
47
+ * @license
48
+ * Copyright 2026 Google LLC
49
+ * SPDX-License-Identifier: Apache-2.0
50
+ */
51
+ let RestApiTool = class extends import_base_tool.BaseTool {
52
+ constructor(name, description, endpoint, operation, authScheme, authCredential, options = {}) {
53
+ super({ name, description });
54
+ this.endpoint = endpoint;
55
+ this.operation = operation;
56
+ this.authScheme = authScheme;
57
+ this.authCredential = authCredential;
58
+ this.authScheme = authScheme;
59
+ this.authCredential = authCredential;
60
+ this.headerProvider = options.headerProvider;
61
+ this.credentialKey = options.credentialKey;
62
+ this.operationParser = new import_operation_parser.OperationParser(operation, options);
63
+ }
64
+ configureAuthScheme(authScheme) {
65
+ this.authScheme = authScheme;
66
+ }
67
+ configureAuthCredential(authCredential) {
68
+ this.authCredential = authCredential;
69
+ }
70
+ configureCredentialKey(credentialKey) {
71
+ this.credentialKey = credentialKey;
72
+ }
73
+ _getDeclaration() {
74
+ const schema = this.operationParser.getJsonSchema();
75
+ return {
76
+ name: this.name,
77
+ description: this.description,
78
+ parameters: schema
79
+ };
80
+ }
81
+ async runAsync(request) {
82
+ const context = request.toolContext;
83
+ const args = request.args;
84
+ const authHandler = import_tool_auth_handler.ToolAuthHandler.fromToolContext(
85
+ context,
86
+ this.authScheme,
87
+ this.authCredential,
88
+ { credentialKey: this.credentialKey }
89
+ );
90
+ const authResult = await authHandler.prepareAuthCredentials();
91
+ if (authResult.state === "pending") {
92
+ return {
93
+ pending: true,
94
+ message: "Needs your authorization to access your data."
95
+ };
96
+ }
97
+ const credential = authResult.authCredential;
98
+ const method = this.endpoint.method.toUpperCase();
99
+ const {
100
+ url: initialUrl,
101
+ headers,
102
+ body: parsedBody,
103
+ bodyData
104
+ } = prepareRequestParams(
105
+ this.endpoint,
106
+ this.operationParser.getParameters(),
107
+ args
108
+ );
109
+ const body = prepareRequestBody(
110
+ this.operation.requestBody,
111
+ parsedBody,
112
+ bodyData,
113
+ headers
114
+ );
115
+ const url = (0, import_auth_helpers.applyCredential)(
116
+ initialUrl,
117
+ headers,
118
+ credential,
119
+ this.authScheme
120
+ );
121
+ if (this.headerProvider) {
122
+ const providerHeaders = this.headerProvider(context);
123
+ Object.assign(headers, providerHeaders);
124
+ }
125
+ try {
126
+ const response = await globalThis.fetch(url, {
127
+ method,
128
+ headers,
129
+ // eslint-disable-next-line no-undef
130
+ body
131
+ });
132
+ const contentType = response.headers.get("content-type");
133
+ if (contentType && contentType.includes("application/json")) {
134
+ return await response.json();
135
+ } else {
136
+ return await response.text();
137
+ }
138
+ } catch (error) {
139
+ return {
140
+ error: `Failed to execute API call: ${error.message}`
141
+ };
142
+ }
143
+ }
144
+ };
145
+ __decorateClass([
146
+ import_experimental.experimental
147
+ ], RestApiTool.prototype, "configureAuthScheme", 1);
148
+ __decorateClass([
149
+ import_experimental.experimental
150
+ ], RestApiTool.prototype, "configureAuthCredential", 1);
151
+ __decorateClass([
152
+ import_experimental.experimental
153
+ ], RestApiTool.prototype, "configureCredentialKey", 1);
154
+ __decorateClass([
155
+ import_experimental.experimental
156
+ ], RestApiTool.prototype, "_getDeclaration", 1);
157
+ __decorateClass([
158
+ import_experimental.experimental
159
+ ], RestApiTool.prototype, "runAsync", 1);
160
+ RestApiTool = __decorateClass([
161
+ import_experimental.experimental
162
+ ], RestApiTool);
163
+ function prepareRequestParams(endpoint, parameters, args) {
164
+ const headers = {};
165
+ const queryParams = new URLSearchParams();
166
+ let body = void 0;
167
+ const paramsMap = new Map(parameters.map((p) => [p.name, p]));
168
+ const pathParams = {};
169
+ const bodyData = {};
170
+ for (const [argName, argValue] of Object.entries(args)) {
171
+ const param = paramsMap.get(argName);
172
+ if (!param) continue;
173
+ const originalName = param.originalName;
174
+ const location = param.paramLocation;
175
+ if (location === "path") {
176
+ pathParams[originalName] = String(argValue);
177
+ } else if (location === "query") {
178
+ queryParams.append(originalName, String(argValue));
179
+ } else if (location === "header") {
180
+ headers[originalName] = String(argValue);
181
+ } else if (location === "body") {
182
+ if (originalName === "body" || originalName === "array" || originalName === "") {
183
+ body = argValue;
184
+ } else {
185
+ bodyData[originalName] = argValue;
186
+ }
187
+ }
188
+ }
189
+ let url = `${endpoint.baseUrl}${endpoint.path}`;
190
+ for (const [key, value] of Object.entries(pathParams)) {
191
+ url = url.replace(`{${key}}`, value);
192
+ }
193
+ const urlParts = url.split("?");
194
+ if (urlParts.length > 1) {
195
+ const pathQueryParams = new URLSearchParams(urlParts[1]);
196
+ for (const [key, value] of pathQueryParams.entries()) {
197
+ queryParams.append(key, value);
198
+ }
199
+ url = urlParts[0];
200
+ }
201
+ const queryString = queryParams.toString();
202
+ if (queryString) {
203
+ url += `?${queryString}`;
204
+ }
205
+ return { url, headers, body, bodyData };
206
+ }
207
+ function prepareRequestBody(requestBody, body, bodyData, headers) {
208
+ const finalData = body !== void 0 ? body : Object.keys(bodyData).length > 0 ? bodyData : void 0;
209
+ if (requestBody && "content" in requestBody) {
210
+ const content = requestBody.content;
211
+ for (const [mimeType, _mediaTypeObject] of Object.entries(content)) {
212
+ if (finalData !== void 0) {
213
+ if (mimeType === "application/json" || mimeType.endsWith("+json")) {
214
+ headers["Content-Type"] = mimeType;
215
+ return typeof finalData === "string" ? finalData : JSON.stringify(finalData);
216
+ } else if (mimeType === "application/x-www-form-urlencoded") {
217
+ return new URLSearchParams(finalData);
218
+ } else if (mimeType === "multipart/form-data") {
219
+ const formData = new FormData();
220
+ if (typeof finalData === "object" && finalData !== null) {
221
+ for (const [key, value] of Object.entries(finalData)) {
222
+ formData.append(key, String(value));
223
+ }
224
+ }
225
+ return formData;
226
+ } else if (mimeType === "text/plain") {
227
+ headers["Content-Type"] = mimeType;
228
+ return String(finalData);
229
+ }
230
+ }
231
+ break;
232
+ }
233
+ } else if (finalData !== void 0) {
234
+ headers["Content-Type"] = "application/json";
235
+ return typeof finalData === "string" ? finalData : JSON.stringify(finalData);
236
+ }
237
+ return void 0;
238
+ }
239
+ function createRestApiTool(parsed, options = {}) {
240
+ return new RestApiTool(
241
+ parsed.name,
242
+ parsed.description,
243
+ parsed.endpoint,
244
+ parsed.operation,
245
+ parsed.authScheme,
246
+ void 0,
247
+ options
248
+ );
249
+ }
250
+ // Annotate the CommonJS export names for ESM import in node:
251
+ 0 && (module.exports = {
252
+ RestApiTool,
253
+ createRestApiTool,
254
+ prepareRequestBody,
255
+ prepareRequestParams
256
+ });
@@ -84,7 +84,10 @@ let LoadSkillResourceTool = class extends import_base_tool.BaseTool {
84
84
  }
85
85
  };
86
86
  }
87
- async runAsync({ args }) {
87
+ async runAsync({
88
+ args,
89
+ toolContext
90
+ }) {
88
91
  var _a, _b, _c;
89
92
  const skillName = args["skill_name"];
90
93
  let resourcePath = args["path"];
@@ -101,7 +104,18 @@ let LoadSkillResourceTool = class extends import_base_tool.BaseTool {
101
104
  };
102
105
  }
103
106
  resourcePath = import_node_path.default.posix.normalize(resourcePath);
104
- const skill = this.toolset.getSkill(skillName);
107
+ let skill;
108
+ try {
109
+ skill = await this.toolset.getOrFetchSkill(
110
+ skillName,
111
+ toolContext.invocationId
112
+ );
113
+ } catch (e) {
114
+ return {
115
+ error: `Failed to fetch skill '${skillName}' from registry: ${e.message || e}`,
116
+ error_code: "REGISTRY_ERROR"
117
+ };
118
+ }
105
119
  if (!skill) {
106
120
  return {
107
121
  error: `Skill '${skillName}' not found.`,
@@ -164,7 +178,15 @@ let LoadSkillResourceTool = class extends import_base_tool.BaseTool {
164
178
  if (response["status"] === BINARY_FILE_DETECTED_MSG) {
165
179
  const skillName = response["skill_name"];
166
180
  const resourcePath = response["path"];
167
- const skill = this.toolset.getSkill(skillName);
181
+ let skill;
182
+ try {
183
+ skill = await this.toolset.getOrFetchSkill(
184
+ skillName,
185
+ request.toolContext.invocationId
186
+ );
187
+ } catch (_e) {
188
+ continue;
189
+ }
168
190
  if (!skill) continue;
169
191
  const skillResources = skill.resources || {};
170
192
  let content;
@@ -78,7 +78,18 @@ let LoadSkillTool = class extends import_base_tool.BaseTool {
78
78
  error_code: "MISSING_SKILL_NAME"
79
79
  };
80
80
  }
81
- const skill = this.toolset.getSkill(skillName);
81
+ let skill;
82
+ try {
83
+ skill = await this.toolset.getOrFetchSkill(
84
+ skillName,
85
+ toolContext.invocationId
86
+ );
87
+ } catch (e) {
88
+ return {
89
+ error: `Failed to fetch skill '${skillName}' from registry: ${e.message || e}`,
90
+ error_code: "REGISTRY_ERROR"
91
+ };
92
+ }
82
93
  if (!skill) {
83
94
  return {
84
95
  error: `Skill '${skillName}' not found.`,
@@ -111,7 +111,18 @@ let RunSkillScriptTool = class extends import_base_tool.BaseTool {
111
111
  errorCode: "MISSING_SCRIPT_PATH"
112
112
  };
113
113
  }
114
- const skill = this.toolset.getSkill(skillName);
114
+ let skill;
115
+ try {
116
+ skill = await this.toolset.getOrFetchSkill(
117
+ skillName,
118
+ toolContext.invocationId
119
+ );
120
+ } catch (e) {
121
+ return {
122
+ error: `Failed to fetch skill '${skillName}' from registry: ${e.message || e}`,
123
+ errorCode: "REGISTRY_ERROR"
124
+ };
125
+ }
115
126
  if (!skill) {
116
127
  return {
117
128
  error: `Skill '${skillName}' not found.`,
@@ -0,0 +1,108 @@
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 __decorateClass = (decorators, target, key, kind) => {
26
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
27
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
28
+ if (decorator = decorators[i])
29
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
30
+ if (kind && result) __defProp(target, key, result);
31
+ return result;
32
+ };
33
+ var search_skills_tool_exports = {};
34
+ __export(search_skills_tool_exports, {
35
+ SearchSkillsTool: () => SearchSkillsTool
36
+ });
37
+ module.exports = __toCommonJS(search_skills_tool_exports);
38
+ var import_genai = require("@google/genai");
39
+ var import_experimental = require("../../utils/experimental.js");
40
+ var import_logger = require("../../utils/logger.js");
41
+ var import_base_tool = require("../base_tool.js");
42
+ /**
43
+ * @license
44
+ * Copyright 2026 Google LLC
45
+ * SPDX-License-Identifier: Apache-2.0
46
+ */
47
+ let SearchSkillsTool = class extends import_base_tool.BaseTool {
48
+ constructor(toolset) {
49
+ var _a, _b;
50
+ if (!toolset.registry) {
51
+ throw new Error("SearchSkillsTool requires a configured skill registry.");
52
+ }
53
+ super({
54
+ name: "search_skills",
55
+ description: ((_b = (_a = toolset.registry).searchToolDescription) == null ? void 0 : _b.call(_a)) || "Searches for relevant skills in the registry based on a semantic or keyword query."
56
+ });
57
+ this.toolset = toolset;
58
+ }
59
+ _getDeclaration() {
60
+ return {
61
+ name: this.name,
62
+ description: this.description,
63
+ parameters: {
64
+ type: import_genai.Type.OBJECT,
65
+ properties: {
66
+ query: {
67
+ type: import_genai.Type.STRING,
68
+ description: "Semantic or keyword search query."
69
+ }
70
+ },
71
+ required: ["query"]
72
+ }
73
+ };
74
+ }
75
+ async runAsync({ args }) {
76
+ const query = args["query"];
77
+ if (!query) {
78
+ return {
79
+ error: "Argument 'query' is required.",
80
+ error_code: "INVALID_ARGUMENTS"
81
+ };
82
+ }
83
+ try {
84
+ const results = await this.toolset.registry.searchSkills(query);
85
+ return results.filter((r) => {
86
+ if (this.toolset.skills[r.name]) {
87
+ import_logger.logger.warn(
88
+ `Skill naming conflict: skill '${r.name}' already exists locally. Registry skill is filtered.`
89
+ );
90
+ return false;
91
+ }
92
+ return true;
93
+ });
94
+ } catch (e) {
95
+ return {
96
+ error: `Failed to search skills from registry: ${e.message || e}`,
97
+ error_code: "REGISTRY_ERROR"
98
+ };
99
+ }
100
+ }
101
+ };
102
+ SearchSkillsTool = __decorateClass([
103
+ import_experimental.experimental
104
+ ], SearchSkillsTool);
105
+ // Annotate the CommonJS export names for ESM import in node:
106
+ 0 && (module.exports = {
107
+ SearchSkillsTool
108
+ });
@@ -38,6 +38,7 @@ module.exports = __toCommonJS(skill_toolset_exports);
38
38
  var import_llm_request = require("../../models/llm_request.js");
39
39
  var import_prompt = require("../../skills/prompt.js");
40
40
  var import_experimental = require("../../utils/experimental.js");
41
+ var import_logger = require("../../utils/logger.js");
41
42
  var import_base_tool = require("../base_tool.js");
42
43
  var import_base_toolset = require("../base_toolset.js");
43
44
  var import_list_skills_tool = require("./list_skills_tool.js");
@@ -45,6 +46,7 @@ var import_load_skill_resource_tool = require("./load_skill_resource_tool.js");
45
46
  var import_load_skill_tool = require("./load_skill_tool.js");
46
47
  var import_run_skill_inline_script_tool = require("./run_skill_inline_script_tool.js");
47
48
  var import_run_skill_script_tool = require("./run_skill_script_tool.js");
49
+ var import_search_skills_tool = require("./search_skills_tool.js");
48
50
  /**
49
51
  * @license
50
52
  * Copyright 2026 Google LLC
@@ -69,9 +71,11 @@ let SkillToolset = class extends import_base_toolset.BaseToolset {
69
71
  constructor(skills, options = {}) {
70
72
  super([], "adk_skill_toolset");
71
73
  this.toolCache = /* @__PURE__ */ new Map();
74
+ this.fetchedSkillCache = /* @__PURE__ */ new Map();
72
75
  this.skills = Array.isArray(skills) ? Object.fromEntries(skills.map((s) => [s.frontmatter.name, s])) : skills;
73
76
  this.codeExecutor = options.codeExecutor;
74
77
  this.additionalTools = options.additionalTools || [];
78
+ this.registry = options.registry;
75
79
  this.tools = [
76
80
  new import_list_skills_tool.ListSkillsTool(this),
77
81
  new import_load_skill_tool.LoadSkillTool(this),
@@ -79,24 +83,55 @@ let SkillToolset = class extends import_base_toolset.BaseToolset {
79
83
  new import_run_skill_script_tool.RunSkillScriptTool(this),
80
84
  new import_run_skill_inline_script_tool.RunSkillInlineScriptTool(this)
81
85
  ];
86
+ if (this.registry) {
87
+ this.tools.push(new import_search_skills_tool.SearchSkillsTool(this));
88
+ }
82
89
  }
83
90
  async getTools(context) {
84
91
  const dynamicTools = await this.resolveAdditionalTools(context);
85
92
  return [...this.tools, ...dynamicTools];
86
93
  }
87
94
  async close() {
95
+ this.fetchedSkillCache.clear();
88
96
  }
89
97
  getSkill(name) {
90
98
  return this.skills[name];
91
99
  }
100
+ async getOrFetchSkill(name, invocationId) {
101
+ if (this.skills[name]) {
102
+ return this.skills[name];
103
+ }
104
+ if (!this.registry) {
105
+ return void 0;
106
+ }
107
+ const contextKey = invocationId || "default";
108
+ if (!this.fetchedSkillCache.has(contextKey)) {
109
+ this.fetchedSkillCache.set(contextKey, /* @__PURE__ */ new Map());
110
+ }
111
+ const cache = this.fetchedSkillCache.get(contextKey);
112
+ if (cache.has(name)) {
113
+ return cache.get(name);
114
+ }
115
+ try {
116
+ const skill = await this.registry.getSkill(name);
117
+ cache.set(name, skill);
118
+ return skill;
119
+ } catch (e) {
120
+ import_logger.logger.warn(`Failed to fetch skill '${name}' from registry: ${e}`);
121
+ throw e;
122
+ }
123
+ }
92
124
  async processLlmRequest(toolContext, llmRequest) {
93
125
  await super.processLlmRequest(toolContext, llmRequest);
94
126
  const skills = Object.values(this.skills);
95
127
  const skillsXml = (0, import_prompt.formatSkillsAsXml)(skills);
96
- (0, import_llm_request.appendInstructions)(llmRequest, [
97
- DEFAULT_SKILL_SYSTEM_INSTRUCTION,
98
- skillsXml
99
- ]);
128
+ const instructions = [DEFAULT_SKILL_SYSTEM_INSTRUCTION, skillsXml];
129
+ if (this.registry) {
130
+ instructions.push(
131
+ "\nIf the locally available skills are not sufficient to complete your task, you can use the `search_skills` tool to discover additional skills from the registry."
132
+ );
133
+ }
134
+ (0, import_llm_request.appendInstructions)(llmRequest, instructions);
100
135
  }
101
136
  async resolveAdditionalTools(context) {
102
137
  if (!context) return [];
@@ -110,7 +145,7 @@ let SkillToolset = class extends import_base_toolset.BaseToolset {
110
145
  }
111
146
  const additionalToolNames = /* @__PURE__ */ new Set();
112
147
  for (const skillName of activatedSkills) {
113
- const skill = this.skills[skillName];
148
+ const skill = await this.getOrFetchSkill(skillName, context.invocationId);
114
149
  if (skill && skill.frontmatter.metadata) {
115
150
  const tools = skill.frontmatter.metadata["adk_additional_tools"];
116
151
  if (tools) {
@@ -0,0 +1,88 @@
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 async_queue_exports = {};
26
+ __export(async_queue_exports, {
27
+ AsyncQueue: () => AsyncQueue
28
+ });
29
+ module.exports = __toCommonJS(async_queue_exports);
30
+ /**
31
+ * @license
32
+ * Copyright 2026 Google LLC
33
+ * SPDX-License-Identifier: Apache-2.0
34
+ */
35
+ class AsyncQueue {
36
+ constructor() {
37
+ this.queue = [];
38
+ this.resolvers = [];
39
+ this.closed = false;
40
+ }
41
+ push(value) {
42
+ if (this.closed) return;
43
+ if (this.resolvers.length > 0) {
44
+ const { resolve } = this.resolvers.shift();
45
+ resolve({ value, done: false });
46
+ } else {
47
+ this.queue.push(value);
48
+ }
49
+ }
50
+ error(err) {
51
+ this.errorVal = err;
52
+ while (this.resolvers.length > 0) {
53
+ const { reject } = this.resolvers.shift();
54
+ reject(err);
55
+ }
56
+ }
57
+ close() {
58
+ this.closed = true;
59
+ while (this.resolvers.length > 0) {
60
+ const { resolve } = this.resolvers.shift();
61
+ resolve({ value: void 0, done: true });
62
+ }
63
+ }
64
+ [Symbol.asyncIterator]() {
65
+ return {
66
+ next: () => {
67
+ if (this.errorVal) {
68
+ const err = this.errorVal;
69
+ this.errorVal = void 0;
70
+ return Promise.reject(err);
71
+ }
72
+ if (this.queue.length > 0) {
73
+ return Promise.resolve({ value: this.queue.shift(), done: false });
74
+ }
75
+ if (this.closed) {
76
+ return Promise.resolve({ value: void 0, done: true });
77
+ }
78
+ return new Promise((resolve, reject) => {
79
+ this.resolvers.push({ resolve, reject });
80
+ });
81
+ }
82
+ };
83
+ }
84
+ }
85
+ // Annotate the CommonJS export names for ESM import in node:
86
+ 0 && (module.exports = {
87
+ AsyncQueue
88
+ });
@@ -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 case_utils_exports = {};
26
+ __export(case_utils_exports, {
27
+ camelCaseKeys: () => camelCaseKeys
28
+ });
29
+ module.exports = __toCommonJS(case_utils_exports);
30
+ /**
31
+ * @license
32
+ * Copyright 2026 Google LLC
33
+ * SPDX-License-Identifier: Apache-2.0
34
+ */
35
+ function camelCaseKeys(val) {
36
+ if (Array.isArray(val)) {
37
+ return val.map(camelCaseKeys);
38
+ }
39
+ if (val !== null && typeof val === "object" && val.constructor === Object) {
40
+ const obj = val;
41
+ const newObj = {};
42
+ for (const key of Object.keys(obj)) {
43
+ const camelKey = key.replace(/_([a-z])/g, (_, g) => g.toUpperCase());
44
+ newObj[camelKey] = camelCaseKeys(obj[key]);
45
+ }
46
+ return newObj;
47
+ }
48
+ return val;
49
+ }
50
+ // Annotate the CommonJS export names for ESM import in node:
51
+ 0 && (module.exports = {
52
+ camelCaseKeys
53
+ });