@google/adk 2.1.0 → 2.2.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 (143) hide show
  1. package/dist/cjs/a2a/agent_card.js +8 -0
  2. package/dist/cjs/a2a/agent_executor.js +8 -3
  3. package/dist/cjs/agents/llm_agent.js +15 -1
  4. package/dist/cjs/agents/processors/content_processor_utils.js +10 -2
  5. package/dist/cjs/agents/processors/nl_planning_processor.js +114 -0
  6. package/dist/cjs/artifacts/gcs_artifact_service.js +13 -7
  7. package/dist/cjs/auth/auth_credential.js +12 -2
  8. package/dist/cjs/code_executors/code_execution_utils.js +3 -3
  9. package/dist/cjs/common.js +45 -0
  10. package/dist/cjs/examples/example.js +92 -0
  11. package/dist/cjs/examples/example_util.js +28 -4
  12. package/dist/cjs/examples/index.js +39 -0
  13. package/dist/cjs/examples/vertex_ai_example_store.js +39 -0
  14. package/dist/cjs/index.js +46 -0
  15. package/dist/cjs/memory/vertex_ai_memory_bank_service.js +17 -5
  16. package/dist/cjs/models/base_llm.js +1 -6
  17. package/dist/cjs/models/chrome_prompt_llm.js +16 -2
  18. package/dist/cjs/models/chrome_prompt_utils.js +54 -2
  19. package/dist/cjs/models/gemini_llm_connection.js +5 -4
  20. package/dist/cjs/planners/base_planner.js +56 -0
  21. package/dist/cjs/planners/built_in_planner.js +85 -0
  22. package/dist/cjs/planners/plan_re_act_planner.js +172 -0
  23. package/dist/cjs/plugins/base_plugin.js +46 -61
  24. package/dist/cjs/tools/example_tool.js +1 -1
  25. package/dist/cjs/tools/mcp/mcp_session_manager.js +14 -8
  26. package/dist/cjs/tools/openapi_tool/auth/auth_helpers.js +281 -2
  27. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +15 -1
  28. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/base_auth_credential_exchanger.js +70 -0
  29. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +120 -0
  30. package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +10 -10
  31. package/dist/cjs/tools/openapi_tool/common/common.js +139 -0
  32. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +11 -6
  33. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/operation_parser.js +73 -13
  34. package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +146 -34
  35. package/dist/cjs/tools/openapi_tool/openapi_toolset.js +14 -2
  36. package/dist/cjs/tools/openapi_tool/rest_api_tool.js +90 -28
  37. package/dist/cjs/tools/skill/skill_toolset.js +2 -0
  38. package/dist/cjs/tools/tool_context.js +41 -0
  39. package/dist/cjs/tools/webmcp/index.js +37 -0
  40. package/dist/cjs/tools/webmcp/webmcp_tool.js +156 -0
  41. package/dist/cjs/tools/webmcp/webmcp_toolset.js +116 -0
  42. package/dist/cjs/tools/webmcp/webmcp_types.js +50 -0
  43. package/dist/cjs/utils/case_utils.js +52 -2
  44. package/dist/cjs/utils/client_labels.js +67 -0
  45. package/dist/cjs/utils/gemini_schema_util.js +103 -3
  46. package/dist/cjs/utils/hash_utils.js +73 -0
  47. package/dist/cjs/utils/live_connection_utils.js +10 -9
  48. package/dist/cjs/utils/model_name.js +17 -2
  49. package/dist/cjs/utils/simple_zod_to_json.js +5 -0
  50. package/dist/cjs/version.js +1 -1
  51. package/dist/esm/a2a/agent_card.js +8 -0
  52. package/dist/esm/a2a/agent_executor.js +8 -3
  53. package/dist/esm/agents/llm_agent.js +18 -1
  54. package/dist/esm/agents/processors/content_processor_utils.js +10 -2
  55. package/dist/esm/agents/processors/nl_planning_processor.js +87 -0
  56. package/dist/esm/artifacts/gcs_artifact_service.js +13 -7
  57. package/dist/esm/auth/auth_credential.js +11 -1
  58. package/dist/esm/code_executors/code_execution_utils.js +3 -3
  59. package/dist/esm/common.js +38 -2
  60. package/dist/esm/examples/example.js +85 -0
  61. package/dist/esm/examples/example_util.js +25 -3
  62. package/dist/esm/examples/index.js +11 -0
  63. package/dist/esm/examples/vertex_ai_example_store.js +11 -0
  64. package/dist/esm/index.js +51 -1
  65. package/dist/esm/memory/vertex_ai_memory_bank_service.js +17 -5
  66. package/dist/esm/models/base_llm.js +2 -7
  67. package/dist/esm/models/chrome_prompt_llm.js +20 -3
  68. package/dist/esm/models/chrome_prompt_utils.js +51 -2
  69. package/dist/esm/models/gemini_llm_connection.js +6 -5
  70. package/dist/esm/planners/base_planner.js +28 -0
  71. package/dist/esm/planners/built_in_planner.js +57 -0
  72. package/dist/esm/planners/plan_re_act_planner.js +145 -0
  73. package/dist/esm/plugins/base_plugin.js +46 -61
  74. package/dist/esm/tools/example_tool.js +1 -1
  75. package/dist/esm/tools/mcp/mcp_session_manager.js +14 -8
  76. package/dist/esm/tools/openapi_tool/auth/auth_helpers.js +272 -1
  77. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +15 -1
  78. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/base_auth_credential_exchanger.js +43 -0
  79. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +93 -0
  80. package/dist/esm/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +10 -12
  81. package/dist/esm/tools/openapi_tool/common/common.js +112 -0
  82. package/dist/esm/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +11 -6
  83. package/dist/esm/tools/openapi_tool/openapi_spec_parser/operation_parser.js +80 -13
  84. package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +146 -33
  85. package/dist/esm/tools/openapi_tool/openapi_toolset.js +14 -2
  86. package/dist/esm/tools/openapi_tool/rest_api_tool.js +89 -28
  87. package/dist/esm/tools/skill/skill_toolset.js +2 -0
  88. package/dist/esm/tools/tool_context.js +15 -0
  89. package/dist/esm/tools/webmcp/index.js +10 -0
  90. package/dist/esm/tools/webmcp/webmcp_tool.js +131 -0
  91. package/dist/esm/tools/webmcp/webmcp_toolset.js +89 -0
  92. package/dist/esm/tools/webmcp/webmcp_types.js +22 -0
  93. package/dist/esm/utils/case_utils.js +49 -1
  94. package/dist/esm/utils/client_labels.js +65 -0
  95. package/dist/esm/utils/gemini_schema_util.js +102 -3
  96. package/dist/esm/utils/hash_utils.js +45 -0
  97. package/dist/esm/utils/live_connection_utils.js +11 -10
  98. package/dist/esm/utils/model_name.js +15 -2
  99. package/dist/esm/utils/simple_zod_to_json.js +5 -0
  100. package/dist/esm/version.js +1 -1
  101. package/dist/types/agents/llm_agent.d.ts +12 -1
  102. package/dist/types/agents/processors/nl_planning_processor.d.ts +30 -0
  103. package/dist/types/auth/auth_credential.d.ts +9 -0
  104. package/dist/types/common.d.ts +16 -4
  105. package/dist/types/examples/base_example_provider.d.ts +2 -2
  106. package/dist/types/examples/example.d.ts +75 -0
  107. package/dist/types/examples/example_util.d.ts +13 -2
  108. package/dist/types/examples/index.d.ts +18 -0
  109. package/dist/types/examples/vertex_ai_example_store.d.ts +7 -0
  110. package/dist/types/index.d.ts +12 -3
  111. package/dist/types/memory/memory_entry.d.ts +15 -0
  112. package/dist/types/memory/vertex_ai_memory_bank_service.d.ts +9 -0
  113. package/dist/types/models/chrome_prompt_utils.d.ts +29 -0
  114. package/dist/types/planners/base_planner.d.ts +50 -0
  115. package/dist/types/planners/built_in_planner.d.ts +53 -0
  116. package/dist/types/planners/plan_re_act_planner.d.ts +21 -0
  117. package/dist/types/plugins/base_plugin.d.ts +52 -52
  118. package/dist/types/skills/skill_registry.d.ts +8 -0
  119. package/dist/types/tools/openapi_tool/auth/auth_helpers.d.ts +110 -1
  120. package/dist/types/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.d.ts +32 -2
  121. package/dist/types/tools/openapi_tool/auth/credential_exchangers/base_auth_credential_exchanger.d.ts +35 -0
  122. package/dist/types/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.d.ts +54 -0
  123. package/dist/types/tools/openapi_tool/common/common.d.ts +60 -0
  124. package/dist/types/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.d.ts +7 -0
  125. package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +56 -2
  126. package/dist/types/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.d.ts +73 -5
  127. package/dist/types/tools/openapi_tool/openapi_toolset.d.ts +11 -0
  128. package/dist/types/tools/openapi_tool/rest_api_tool.d.ts +42 -8
  129. package/dist/types/tools/tool_context.d.ts +19 -0
  130. package/dist/types/tools/webmcp/index.d.ts +12 -0
  131. package/dist/types/tools/webmcp/webmcp_tool.d.ts +47 -0
  132. package/dist/types/tools/webmcp/webmcp_toolset.d.ts +67 -0
  133. package/dist/types/tools/webmcp/webmcp_types.d.ts +69 -0
  134. package/dist/types/utils/case_utils.d.ts +36 -0
  135. package/dist/types/utils/client_labels.d.ts +33 -0
  136. package/dist/types/utils/gemini_schema_util.d.ts +13 -0
  137. package/dist/types/utils/hash_utils.d.ts +25 -0
  138. package/dist/types/utils/logger.d.ts +10 -2
  139. package/dist/types/utils/model_name.d.ts +30 -2
  140. package/dist/types/version.d.ts +1 -1
  141. package/dist/web/index_web.js +112 -79
  142. package/dist/web/index_web.js.map +4 -4
  143. package/package.json +8 -2
@@ -0,0 +1,139 @@
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 __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ var __export = (target, all) => {
14
+ for (var name in all)
15
+ __defProp(target, name, { get: all[name], enumerable: true });
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") {
19
+ for (let key of __getOwnPropNames(from))
20
+ if (!__hasOwnProp.call(to, key) && key !== except)
21
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
+ }
23
+ return to;
24
+ };
25
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
+ var common_exports = {};
27
+ __export(common_exports, {
28
+ createApiParameter: () => createApiParameter,
29
+ generateParamDoc: () => generateParamDoc,
30
+ generateReturnDoc: () => generateReturnDoc,
31
+ getTypeHint: () => getTypeHint
32
+ });
33
+ module.exports = __toCommonJS(common_exports);
34
+ var import_case_utils = require("../../../utils/case_utils.js");
35
+ /**
36
+ * @license
37
+ * Copyright 2026 Google LLC
38
+ * SPDX-License-Identifier: Apache-2.0
39
+ */
40
+ const ANY_TYPE_HINT = "Any";
41
+ const PARAM_PROPERTY_INDENT = " ";
42
+ const RETURN_PROPERTY_INDENT = " ";
43
+ const TYPE_HINTS = {
44
+ integer: "int",
45
+ number: "float",
46
+ boolean: "bool",
47
+ string: "str",
48
+ object: "Dict[str, Any]"
49
+ };
50
+ function getTypeHint(schema) {
51
+ var _a;
52
+ if (!(schema == null ? void 0 : schema.type)) {
53
+ return ANY_TYPE_HINT;
54
+ }
55
+ if (schema.type === "array") {
56
+ return `List[${getArrayItemTypeHint(schema.items)}]`;
57
+ }
58
+ return (_a = TYPE_HINTS[schema.type]) != null ? _a : ANY_TYPE_HINT;
59
+ }
60
+ __name(getTypeHint, "getTypeHint");
61
+ function getArrayItemTypeHint(items) {
62
+ var _a, _b;
63
+ const itemType = (_a = resolveSchema(items)) == null ? void 0 : _a.type;
64
+ if (!itemType || itemType === "array") {
65
+ return ANY_TYPE_HINT;
66
+ }
67
+ return (_b = TYPE_HINTS[itemType]) != null ? _b : ANY_TYPE_HINT;
68
+ }
69
+ __name(getArrayItemTypeHint, "getArrayItemTypeHint");
70
+ function generateParamDoc(param) {
71
+ var _a, _b;
72
+ const description = (_b = (_a = param.description) == null ? void 0 : _a.trim()) != null ? _b : "";
73
+ const typeHint = getTypeHint(param.paramSchema);
74
+ return `${param.name} (${typeHint}): ${description}` + describeProperties(param.paramSchema, PARAM_PROPERTY_INDENT);
75
+ }
76
+ __name(generateParamDoc, "generateParamDoc");
77
+ function generateReturnDoc(responses) {
78
+ var _a;
79
+ const response = Object.entries(responses).filter(([code]) => /^2(\d\d|XX)$/i.test(code)).sort(([a], [b]) => {
80
+ const numeric = /* @__PURE__ */ __name((c) => /^\d+$/.test(c) ? Number(c) : Infinity, "numeric");
81
+ return numeric(a) - numeric(b);
82
+ }).map(([, value]) => value).find(hasContent);
83
+ if (!response) {
84
+ return "";
85
+ }
86
+ const description = (response.description || "").trim();
87
+ const firstMimeType = Object.keys(response.content)[0];
88
+ const schema = resolveSchema((_a = response.content[firstMimeType]) == null ? void 0 : _a.schema);
89
+ return `Returns (${getTypeHint(schema)}): ${description}` + describeProperties(schema, RETURN_PROPERTY_INDENT);
90
+ }
91
+ __name(generateReturnDoc, "generateReturnDoc");
92
+ function hasContent(response) {
93
+ return !("$ref" in response) && response.content !== void 0 && Object.keys(response.content).length > 0;
94
+ }
95
+ __name(hasContent, "hasContent");
96
+ function resolveSchema(schema) {
97
+ return schema && !("$ref" in schema) ? schema : void 0;
98
+ }
99
+ __name(resolveSchema, "resolveSchema");
100
+ function describeProperties(schema, indent) {
101
+ var _a;
102
+ if ((schema == null ? void 0 : schema.type) !== "object") {
103
+ return "";
104
+ }
105
+ const properties = Object.entries((_a = schema.properties) != null ? _a : {});
106
+ if (properties.length === 0) {
107
+ return "";
108
+ }
109
+ return properties.reduce((doc, [propName, propDetails]) => {
110
+ var _a2;
111
+ const propSchema = resolveSchema(propDetails);
112
+ if (!propSchema) {
113
+ return doc;
114
+ }
115
+ const propDesc = (_a2 = propSchema.description) != null ? _a2 : "";
116
+ return `${doc}${indent}${propName} (${getTypeHint(propSchema)}): ${propDesc}
117
+ `;
118
+ }, " Object properties:\n");
119
+ }
120
+ __name(describeProperties, "describeProperties");
121
+ function createApiParameter(init) {
122
+ var _a;
123
+ return {
124
+ originalName: init.originalName,
125
+ paramLocation: init.paramLocation,
126
+ paramSchema: init.paramSchema,
127
+ description: init.description || init.paramSchema.description || "",
128
+ name: init.name || (0, import_case_utils.renameReservedKeywords)((0, import_case_utils.toSnakeCaseName)(init.originalName)),
129
+ required: (_a = init.required) != null ? _a : false
130
+ };
131
+ }
132
+ __name(createApiParameter, "createApiParameter");
133
+ // Annotate the CommonJS export names for ESM import in node:
134
+ 0 && (module.exports = {
135
+ createApiParameter,
136
+ generateParamDoc,
137
+ generateReturnDoc,
138
+ getTypeHint
139
+ });
@@ -36,6 +36,7 @@ __export(openapi_spec_parser_exports, {
36
36
  OpenApiSpecParser: () => OpenApiSpecParser
37
37
  });
38
38
  module.exports = __toCommonJS(openapi_spec_parser_exports);
39
+ var import_case_utils = require("../../../utils/case_utils.js");
39
40
  var import_experimental = require("../../../utils/experimental.js");
40
41
  var import_operation_parser = require("./operation_parser.js");
41
42
  /**
@@ -72,9 +73,13 @@ __decorateClass([
72
73
  OpenApiSpecParser = __decorateClass([
73
74
  import_experimental.experimental
74
75
  ], OpenApiSpecParser);
76
+ function deepCopy(value) {
77
+ return JSON.parse(JSON.stringify(value));
78
+ }
79
+ __name(deepCopy, "deepCopy");
75
80
  function resolveReferences(spec) {
76
81
  const resolvedCache = /* @__PURE__ */ new Map();
77
- const specCopy = JSON.parse(JSON.stringify(spec));
82
+ const specCopy = deepCopy(spec);
78
83
  const recursiveResolve = /* @__PURE__ */ __name((obj, currentDoc, seenRefs = /* @__PURE__ */ new Set()) => {
79
84
  if (typeof obj !== "object" || obj === null) {
80
85
  return obj;
@@ -92,13 +97,13 @@ function resolveReferences(spec) {
92
97
  }
93
98
  seenRefs.add(refString);
94
99
  if (resolvedCache.has(refString)) {
95
- return resolvedCache.get(refString);
100
+ return deepCopy(resolvedCache.get(refString));
96
101
  }
97
102
  let resolvedValue = resolveRef(refString, currentDoc);
98
103
  if (resolvedValue !== void 0) {
99
104
  resolvedValue = recursiveResolve(resolvedValue, currentDoc, seenRefs);
100
105
  resolvedCache.set(refString, resolvedValue);
101
- return resolvedValue;
106
+ return deepCopy(resolvedValue);
102
107
  } else {
103
108
  return obj;
104
109
  }
@@ -129,7 +134,6 @@ function resolveRef(refString, currentDoc) {
129
134
  }
130
135
  __name(resolveRef, "resolveRef");
131
136
  function sanitizeSchemaTypes(openapiSpec) {
132
- const specCopy = JSON.parse(JSON.stringify(openapiSpec));
133
137
  const sanitizeTypeField = /* @__PURE__ */ __name((schemaDict) => {
134
138
  if (!("type" in schemaDict)) return;
135
139
  const typeValue = schemaDict["type"];
@@ -175,7 +179,7 @@ function sanitizeSchemaTypes(openapiSpec) {
175
179
  }
176
180
  return objRecord;
177
181
  }, "sanitizeRecursive");
178
- return sanitizeRecursive(specCopy, false);
182
+ return sanitizeRecursive(openapiSpec, false);
179
183
  }
180
184
  __name(sanitizeSchemaTypes, "sanitizeSchemaTypes");
181
185
  function resolveServerUrl(server) {
@@ -223,7 +227,7 @@ function collectOperations(spec, options = {}) {
223
227
  const opParams = operation.parameters || [];
224
228
  operation.parameters = [...opParams, ...pathParams];
225
229
  if (!operation.operationId) {
226
- operation.operationId = `${method}_${path.replace(/[^a-zA-Z0-9]/g, "_")}`;
230
+ operation.operationId = (0, import_case_utils.toSnakeCaseName)(`${path}_${method}`);
227
231
  }
228
232
  const parser = new import_operation_parser.OperationParser(operation, {
229
233
  preservePropertyNames
@@ -240,6 +244,7 @@ function collectOperations(spec, options = {}) {
240
244
  endpoint: { baseUrl, path, method },
241
245
  operation,
242
246
  parameters: parser.getParameters(),
247
+ returnValue: parser.getReturnValue(),
243
248
  authScheme
244
249
  });
245
250
  }
@@ -36,28 +36,46 @@ __export(operation_parser_exports, {
36
36
  OperationParser: () => OperationParser
37
37
  });
38
38
  module.exports = __toCommonJS(operation_parser_exports);
39
+ var import_case_utils = require("../../../utils/case_utils.js");
39
40
  var import_experimental = require("../../../utils/experimental.js");
41
+ var import_common = require("../common/common.js");
40
42
  /**
41
43
  * @license
42
44
  * Copyright 2026 Google LLC
43
45
  * SPDX-License-Identifier: Apache-2.0
44
46
  */
45
47
  let OperationParser = class {
48
+ /**
49
+ * @param operation The operation to parse. A string is parsed as JSON, and a
50
+ * plain object is used as given.
51
+ * @param options.preservePropertyNames Keeps the original parameter and
52
+ * function names instead of converting them to snake_case.
53
+ * @param options.shouldParse Whether to parse the operation during
54
+ * construction. Defaults to `true`.
55
+ */
46
56
  constructor(operation, options = {}) {
47
- this.operation = operation;
48
57
  this.params = [];
49
- var _a;
58
+ var _a, _b;
59
+ this.operation = typeof operation === "string" ? JSON.parse(operation) : operation;
50
60
  this.preservePropertyNames = (_a = options.preservePropertyNames) != null ? _a : false;
51
- this.processOperationParameters();
52
- this.processRequestBody();
53
- this.processReturnValue();
54
- this.dedupeParamNames();
61
+ if ((_b = options.shouldParse) != null ? _b : true) {
62
+ this.processOperationParameters();
63
+ this.processRequestBody();
64
+ this.returnValue = this.processReturnValue();
65
+ this.dedupeParamNames();
66
+ }
67
+ }
68
+ static load(operation, params, returnValue) {
69
+ const parser = new this(operation, { shouldParse: false });
70
+ parser.params = params;
71
+ parser.returnValue = returnValue;
72
+ return parser;
55
73
  }
56
74
  getParamName(originalName) {
57
75
  if (this.preservePropertyNames) {
58
76
  return originalName;
59
77
  }
60
- return originalName.replace(/[A-Z]/g, (g) => "_" + g.toLowerCase()).replace(/^_/, "");
78
+ return (0, import_case_utils.renameReservedKeywords)((0, import_case_utils.toSnakeCaseName)(originalName));
61
79
  }
62
80
  processOperationParameters() {
63
81
  const parameters = this.operation.parameters || [];
@@ -79,6 +97,7 @@ let OperationParser = class {
79
97
  }
80
98
  }
81
99
  processRequestBody() {
100
+ var _a;
82
101
  const requestBody = this.operation.requestBody;
83
102
  if (!requestBody || "$ref" in requestBody) {
84
103
  return;
@@ -89,9 +108,9 @@ let OperationParser = class {
89
108
  return;
90
109
  }
91
110
  const mediaTypeObject = content[firstMimeType];
92
- const schema = mediaTypeObject.schema;
111
+ const schema = (_a = mediaTypeObject.schema) != null ? _a : {};
93
112
  const description = requestBody.description || "";
94
- if (schema && !("$ref" in schema)) {
113
+ if (!("$ref" in schema)) {
95
114
  if (schema.type === "object") {
96
115
  const properties = schema.properties || {};
97
116
  if (Object.keys(properties).length > 0) {
@@ -146,16 +165,16 @@ let OperationParser = class {
146
165
  if (min20x) {
147
166
  const response = responses[min20x];
148
167
  if (!("$ref" in response) && response.content) {
149
- const firstMimeType = Object.keys(response.content)[0];
150
- if (firstMimeType) {
151
- const schema = response.content[firstMimeType].schema;
168
+ for (const mediaType of Object.values(response.content)) {
169
+ const schema = mediaType.schema;
152
170
  if (schema && !("$ref" in schema)) {
153
171
  returnSchema = schema;
172
+ break;
154
173
  }
155
174
  }
156
175
  }
157
176
  }
158
- this.returnValue = {
177
+ return {
159
178
  originalName: "",
160
179
  paramLocation: "",
161
180
  paramSchema: returnSchema,
@@ -203,6 +222,32 @@ let OperationParser = class {
203
222
  getDescription() {
204
223
  return this.operation.description || this.operation.summary || "";
205
224
  }
225
+ getAuthSchemeName() {
226
+ var _a, _b;
227
+ const security = (_a = this.operation.security) != null ? _a : [];
228
+ return security.length > 0 ? (_b = Object.keys(security[0])[0]) != null ? _b : "" : "";
229
+ }
230
+ getReturnValue() {
231
+ return this.returnValue;
232
+ }
233
+ getReturnTypeHint() {
234
+ var _a;
235
+ return (0, import_common.getTypeHint)((_a = this.returnValue) == null ? void 0 : _a.paramSchema);
236
+ }
237
+ getPydocString() {
238
+ var _a;
239
+ const description = this.operation.summary || this.operation.description || "";
240
+ const argLines = this.params.map((param) => ` ${(0, import_common.generateParamDoc)(param)}`).join("\n");
241
+ const returnDoc = (0, import_common.generateReturnDoc)((_a = this.operation.responses) != null ? _a : {});
242
+ const returnBlock = returnDoc ? `
243
+
244
+ ${returnDoc}` : "";
245
+ return `"""${description}
246
+
247
+ Args:
248
+ ${argLines}${returnBlock}
249
+ """`;
250
+ }
206
251
  };
207
252
  __name(OperationParser, "OperationParser");
208
253
  __decorateClass([
@@ -217,6 +262,21 @@ __decorateClass([
217
262
  __decorateClass([
218
263
  import_experimental.experimental
219
264
  ], OperationParser.prototype, "getDescription", 1);
265
+ __decorateClass([
266
+ import_experimental.experimental
267
+ ], OperationParser.prototype, "getAuthSchemeName", 1);
268
+ __decorateClass([
269
+ import_experimental.experimental
270
+ ], OperationParser.prototype, "getReturnValue", 1);
271
+ __decorateClass([
272
+ import_experimental.experimental
273
+ ], OperationParser.prototype, "getReturnTypeHint", 1);
274
+ __decorateClass([
275
+ import_experimental.experimental
276
+ ], OperationParser.prototype, "getPydocString", 1);
277
+ __decorateClass([
278
+ import_experimental.experimental
279
+ ], OperationParser, "load", 1);
220
280
  OperationParser = __decorateClass([
221
281
  import_experimental.experimental
222
282
  ], OperationParser);
@@ -33,79 +33,190 @@ var __decorateClass = (decorators, target, key, kind) => {
33
33
  };
34
34
  var tool_auth_handler_exports = {};
35
35
  __export(tool_auth_handler_exports, {
36
- ToolAuthHandler: () => ToolAuthHandler
36
+ ToolAuthHandler: () => ToolAuthHandler,
37
+ ToolContextCredentialStore: () => ToolContextCredentialStore
37
38
  });
38
39
  module.exports = __toCommonJS(tool_auth_handler_exports);
40
+ var import_lodash_es = require("lodash-es");
41
+ var import_auth_credential = require("../../../auth/auth_credential.js");
39
42
  var import_experimental = require("../../../utils/experimental.js");
43
+ var import_hash_utils = require("../../../utils/hash_utils.js");
44
+ var import_logger = require("../../../utils/logger.js");
40
45
  var import_auto_auth_credential_exchanger = require("../auth/credential_exchangers/auto_auth_credential_exchanger.js");
46
+ var import_base_auth_credential_exchanger = require("../auth/credential_exchangers/base_auth_credential_exchanger.js");
41
47
  /**
42
48
  * @license
43
49
  * Copyright 2026 Google LLC
44
50
  * SPDX-License-Identifier: Apache-2.0
45
51
  */
52
+ const DEFAULT_CREDENTIAL_KEY = "default_openapi_key";
46
53
  const _ToolContextCredentialStore = class _ToolContextCredentialStore {
47
54
  constructor(context) {
48
55
  this.context = context;
49
56
  }
50
- getCredentialKey(authScheme) {
51
- const schemeName = (authScheme == null ? void 0 : authScheme.type) || "default";
52
- return `${schemeName}_existing_exchanged_credential`;
57
+ /**
58
+ * Returns the state key that holds the credential exchanged for this scheme
59
+ * and credential pair.
60
+ *
61
+ * Both operands are hashed into the key, so two tools configured with
62
+ * different schemes, or with different credentials under one scheme, never
63
+ * share a slot.
64
+ *
65
+ * The key deliberately carries no `temp:` prefix. Session state is a copy and
66
+ * only the delta is persisted, and `temp:` is cleared at the end of a run,
67
+ * while an exchanged token has to stay readable across runs.
68
+ */
69
+ getCredentialKey(authScheme, authCredential) {
70
+ const schemeName = authScheme ? `${authScheme.type}_${(0, import_hash_utils.stableHash)(authScheme)}` : "";
71
+ const credentialName = authCredential ? `${authCredential.authType}_${(0, import_hash_utils.stableHash)(authCredential)}` : "";
72
+ return `${schemeName}_${credentialName}_existing_exchanged_credential`;
53
73
  }
54
- getCredential(authScheme) {
55
- const key = this.getCredentialKey(authScheme);
56
- return this.context.state.get(key);
74
+ /**
75
+ * Returns the credential stored for this scheme and credential pair, or
76
+ * `undefined` when there is none.
77
+ *
78
+ * @throws Error if the state entry under the key is not an
79
+ * {@link AuthCredential}, which means something else wrote to the key.
80
+ */
81
+ getCredential(authScheme, authCredential) {
82
+ const key = this.getCredentialKey(authScheme, authCredential);
83
+ const stored = this.context.state.get(key);
84
+ if (stored === void 0 || stored === null) {
85
+ return void 0;
86
+ }
87
+ if (!(0, import_auth_credential.isAuthCredential)(stored)) {
88
+ throw new Error(
89
+ `State entry '${key}' is not an AuthCredential. Another writer has taken this key.`
90
+ );
91
+ }
92
+ return stored;
57
93
  }
58
94
  storeCredential(key, credential) {
59
- this.context.state.set(key, credential);
95
+ this.context.state.set(key, JSON.parse(JSON.stringify(credential)));
96
+ }
97
+ /**
98
+ * Makes the credential under `key` unreadable again.
99
+ *
100
+ * adk-python deletes the state entry. `State` has no delete, so this writes
101
+ * `undefined`, which `State.get` returns for a missing key as well, and
102
+ * {@link getCredential} therefore misses exactly as a delete would make it.
103
+ */
104
+ removeCredential(key) {
105
+ this.context.state.set(key, void 0);
60
106
  }
61
107
  };
62
108
  __name(_ToolContextCredentialStore, "ToolContextCredentialStore");
63
109
  let ToolContextCredentialStore = _ToolContextCredentialStore;
64
110
  let ToolAuthHandler = class {
65
- constructor(context, authScheme, authCredential, credentialKey) {
111
+ constructor(context, authScheme, authCredential, options = {}) {
66
112
  this.context = context;
67
- this.authScheme = authScheme;
68
- this.authCredential = authCredential;
69
- this.credentialKey = credentialKey;
113
+ var _a;
114
+ this.authScheme = authScheme ? (0, import_lodash_es.cloneDeep)(authScheme) : void 0;
115
+ this.authCredential = authCredential ? (0, import_lodash_es.cloneDeep)(authCredential) : void 0;
116
+ this.credentialKey = options.credentialKey;
117
+ this.credentialExchanger = options.credentialExchanger;
118
+ this.credentialStore = (_a = options.credentialStore) != null ? _a : new ToolContextCredentialStore(context);
70
119
  }
71
120
  static fromToolContext(context, authScheme, authCredential, options = {}) {
72
- return new ToolAuthHandler(
73
- context,
74
- authScheme,
75
- authCredential,
76
- options.credentialKey
77
- );
121
+ return new ToolAuthHandler(context, authScheme, authCredential, options);
78
122
  }
79
123
  async prepareAuthCredentials() {
80
124
  if (!this.authScheme) {
81
125
  return { state: "done" };
82
126
  }
83
- const store = new ToolContextCredentialStore(this.context);
84
- const existingCredential = store.getCredential(this.authScheme);
127
+ const existingCredential = this.credentialStore.getCredential(
128
+ this.authScheme,
129
+ this.authCredential
130
+ );
85
131
  if (existingCredential) {
86
- return { state: "done", authCredential: existingCredential };
132
+ return {
133
+ state: "done",
134
+ authScheme: this.authScheme,
135
+ authCredential: existingCredential
136
+ };
87
137
  }
88
138
  const authConfig = {
89
139
  authScheme: this.authScheme,
90
140
  rawAuthCredential: this.authCredential,
91
- credentialKey: this.credentialKey || "default_openapi_key"
141
+ credentialKey: this.credentialKey || DEFAULT_CREDENTIAL_KEY
92
142
  };
93
143
  const authResponseCredential = this.context.getAuthResponse(authConfig);
94
144
  const credential = authResponseCredential != null ? authResponseCredential : this.authCredential;
95
- if (!credential) {
96
- this.context.requestCredential(authConfig);
97
- return { state: "pending" };
145
+ const exchanged = credential ? await this.tryExchange(credential) : void 0;
146
+ if (!exchanged) {
147
+ this.requestCredential(authConfig);
148
+ return {
149
+ state: "pending",
150
+ authScheme: this.authScheme,
151
+ authCredential: this.authCredential
152
+ };
98
153
  }
99
- const exchanger = new import_auto_auth_credential_exchanger.AutoAuthCredentialExchanger();
100
- const result = await exchanger.exchange({
154
+ if (authResponseCredential || exchanged.wasExchanged) {
155
+ const key = this.credentialStore.getCredentialKey(
156
+ this.authScheme,
157
+ this.authCredential
158
+ );
159
+ this.credentialStore.storeCredential(key, exchanged.credential);
160
+ }
161
+ return {
162
+ state: "done",
101
163
  authScheme: this.authScheme,
102
- authCredential: credential
103
- });
104
- if (authResponseCredential || result.wasExchanged) {
105
- const key = store.getCredentialKey(this.authScheme);
106
- store.storeCredential(key, result.credential);
164
+ authCredential: exchanged.credential
165
+ };
166
+ }
167
+ /**
168
+ * Exchanges `credential`, or returns `undefined` when the exchange failed.
169
+ *
170
+ * An exchange failure is transient far more often than it is fatal, so it
171
+ * becomes a `pending` result the client can resume from rather than an
172
+ * exception that fails the whole tool call.
173
+ */
174
+ async tryExchange(credential) {
175
+ var _a;
176
+ const exchanger = (_a = this.credentialExchanger) != null ? _a : new import_auto_auth_credential_exchanger.AutoAuthCredentialExchanger();
177
+ try {
178
+ return await exchanger.exchange({
179
+ authScheme: this.authScheme,
180
+ authCredential: credential
181
+ });
182
+ } catch (e) {
183
+ import_logger.logger.error(
184
+ `Failed to exchange credential: ${e instanceof Error ? e.message : e}`
185
+ );
186
+ return void 0;
187
+ }
188
+ }
189
+ /**
190
+ * Asks the client for a credential, after checking that an interactive
191
+ * scheme has the OAuth2 client configuration it cannot proceed without.
192
+ *
193
+ * @throws Error if an `oauth2` or `openIdConnect` scheme has no OAuth2
194
+ * credential.
195
+ * @throws AuthCredentialMissingError if that credential omits `clientId` or
196
+ * `clientSecret`.
197
+ */
198
+ requestCredential(authConfig) {
199
+ var _a, _b;
200
+ const schemeType = (_a = this.authScheme) == null ? void 0 : _a.type;
201
+ if (schemeType === "oauth2" || schemeType === "openIdConnect") {
202
+ const oauth2 = (_b = this.authCredential) == null ? void 0 : _b.oauth2;
203
+ if (!oauth2) {
204
+ throw new Error(
205
+ `authCredential is empty for scheme ${schemeType}. Please create AuthCredential using OAuth2Auth.`
206
+ );
207
+ }
208
+ if (!oauth2.clientId) {
209
+ throw new import_base_auth_credential_exchanger.AuthCredentialMissingError(
210
+ "OAuth2 credentials clientId is missing."
211
+ );
212
+ }
213
+ if (!oauth2.clientSecret) {
214
+ throw new import_base_auth_credential_exchanger.AuthCredentialMissingError(
215
+ "OAuth2 credentials clientSecret is missing."
216
+ );
217
+ }
107
218
  }
108
- return { state: "done", authCredential: result.credential };
219
+ this.context.requestCredential(authConfig);
109
220
  }
110
221
  };
111
222
  __name(ToolAuthHandler, "ToolAuthHandler");
@@ -120,5 +231,6 @@ ToolAuthHandler = __decorateClass([
120
231
  ], ToolAuthHandler);
121
232
  // Annotate the CommonJS export names for ESM import in node:
122
233
  0 && (module.exports = {
123
- ToolAuthHandler
234
+ ToolAuthHandler,
235
+ ToolContextCredentialStore
124
236
  });
@@ -48,6 +48,7 @@ __export(openapi_toolset_exports, {
48
48
  module.exports = __toCommonJS(openapi_toolset_exports);
49
49
  var import_js_yaml = __toESM(require("js-yaml"), 1);
50
50
  var import_experimental = require("../../utils/experimental.js");
51
+ var import_logger = require("../../utils/logger.js");
51
52
  var import_base_toolset = require("../base_toolset.js");
52
53
  var import_openapi_spec_parser = require("./openapi_spec_parser/openapi_spec_parser.js");
53
54
  var import_rest_api_tool = require("./rest_api_tool.js");
@@ -64,8 +65,10 @@ let OpenAPIToolset = class extends import_base_toolset.BaseToolset {
64
65
  if (!spec && options.specStr) {
65
66
  if (options.specType === "yaml" || !options.specType && options.specStr.trim().startsWith("---")) {
66
67
  spec = import_js_yaml.default.load(options.specStr);
67
- } else {
68
+ } else if (options.specType === "json" || !options.specType) {
68
69
  spec = JSON.parse(options.specStr);
70
+ } else {
71
+ throw new Error(`Unsupported spec type: ${options.specType}`);
69
72
  }
70
73
  }
71
74
  if (!spec) {
@@ -86,7 +89,9 @@ let OpenAPIToolset = class extends import_base_toolset.BaseToolset {
86
89
  description: op.description,
87
90
  endpoint: op.endpoint,
88
91
  operation: op.operation,
89
- authScheme: op.authScheme
92
+ authScheme: op.authScheme,
93
+ parameters: op.parameters,
94
+ authCredential: op.authCredential
90
95
  },
91
96
  {
92
97
  preservePropertyNames: options.preservePropertyNames,
@@ -95,6 +100,7 @@ let OpenAPIToolset = class extends import_base_toolset.BaseToolset {
95
100
  }
96
101
  );
97
102
  this.tools.push(tool);
103
+ import_logger.logger.info(`Parsed tool: ${tool.name}`);
98
104
  }
99
105
  if (options.authScheme || options.authCredential) {
100
106
  for (const tool of this.tools) {
@@ -115,6 +121,9 @@ let OpenAPIToolset = class extends import_base_toolset.BaseToolset {
115
121
  return true;
116
122
  });
117
123
  }
124
+ getTool(toolName) {
125
+ return this.tools.find((tool) => tool.name === toolName);
126
+ }
118
127
  async close() {
119
128
  return Promise.resolve();
120
129
  }
@@ -123,6 +132,9 @@ __name(OpenAPIToolset, "OpenAPIToolset");
123
132
  __decorateClass([
124
133
  import_experimental.experimental
125
134
  ], OpenAPIToolset.prototype, "getTools", 1);
135
+ __decorateClass([
136
+ import_experimental.experimental
137
+ ], OpenAPIToolset.prototype, "getTool", 1);
126
138
  __decorateClass([
127
139
  import_experimental.experimental
128
140
  ], OpenAPIToolset.prototype, "close", 1);