@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.
- package/dist/cjs/a2a/agent_card.js +8 -0
- package/dist/cjs/a2a/agent_executor.js +8 -3
- package/dist/cjs/agents/llm_agent.js +15 -1
- package/dist/cjs/agents/processors/content_processor_utils.js +10 -2
- package/dist/cjs/agents/processors/nl_planning_processor.js +114 -0
- package/dist/cjs/artifacts/gcs_artifact_service.js +13 -7
- package/dist/cjs/auth/auth_credential.js +12 -2
- package/dist/cjs/code_executors/code_execution_utils.js +3 -3
- package/dist/cjs/common.js +45 -0
- package/dist/cjs/examples/example.js +92 -0
- package/dist/cjs/examples/example_util.js +28 -4
- package/dist/cjs/examples/index.js +39 -0
- package/dist/cjs/examples/vertex_ai_example_store.js +39 -0
- package/dist/cjs/index.js +46 -0
- package/dist/cjs/memory/vertex_ai_memory_bank_service.js +17 -5
- package/dist/cjs/models/base_llm.js +1 -6
- package/dist/cjs/models/chrome_prompt_llm.js +16 -2
- package/dist/cjs/models/chrome_prompt_utils.js +54 -2
- package/dist/cjs/models/gemini_llm_connection.js +5 -4
- package/dist/cjs/planners/base_planner.js +56 -0
- package/dist/cjs/planners/built_in_planner.js +85 -0
- package/dist/cjs/planners/plan_re_act_planner.js +172 -0
- package/dist/cjs/plugins/base_plugin.js +46 -61
- package/dist/cjs/tools/example_tool.js +1 -1
- package/dist/cjs/tools/mcp/mcp_session_manager.js +14 -8
- package/dist/cjs/tools/openapi_tool/auth/auth_helpers.js +281 -2
- package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +15 -1
- package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/base_auth_credential_exchanger.js +70 -0
- package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +120 -0
- package/dist/cjs/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +10 -10
- package/dist/cjs/tools/openapi_tool/common/common.js +139 -0
- package/dist/cjs/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +11 -6
- package/dist/cjs/tools/openapi_tool/openapi_spec_parser/operation_parser.js +73 -13
- package/dist/cjs/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +146 -34
- package/dist/cjs/tools/openapi_tool/openapi_toolset.js +14 -2
- package/dist/cjs/tools/openapi_tool/rest_api_tool.js +90 -28
- package/dist/cjs/tools/skill/skill_toolset.js +2 -0
- package/dist/cjs/tools/tool_context.js +41 -0
- package/dist/cjs/tools/webmcp/index.js +37 -0
- package/dist/cjs/tools/webmcp/webmcp_tool.js +156 -0
- package/dist/cjs/tools/webmcp/webmcp_toolset.js +116 -0
- package/dist/cjs/tools/webmcp/webmcp_types.js +50 -0
- package/dist/cjs/utils/case_utils.js +52 -2
- package/dist/cjs/utils/client_labels.js +67 -0
- package/dist/cjs/utils/gemini_schema_util.js +103 -3
- package/dist/cjs/utils/hash_utils.js +73 -0
- package/dist/cjs/utils/live_connection_utils.js +10 -9
- package/dist/cjs/utils/model_name.js +17 -2
- package/dist/cjs/utils/simple_zod_to_json.js +5 -0
- package/dist/cjs/version.js +1 -1
- package/dist/esm/a2a/agent_card.js +8 -0
- package/dist/esm/a2a/agent_executor.js +8 -3
- package/dist/esm/agents/llm_agent.js +18 -1
- package/dist/esm/agents/processors/content_processor_utils.js +10 -2
- package/dist/esm/agents/processors/nl_planning_processor.js +87 -0
- package/dist/esm/artifacts/gcs_artifact_service.js +13 -7
- package/dist/esm/auth/auth_credential.js +11 -1
- package/dist/esm/code_executors/code_execution_utils.js +3 -3
- package/dist/esm/common.js +38 -2
- package/dist/esm/examples/example.js +85 -0
- package/dist/esm/examples/example_util.js +25 -3
- package/dist/esm/examples/index.js +11 -0
- package/dist/esm/examples/vertex_ai_example_store.js +11 -0
- package/dist/esm/index.js +51 -1
- package/dist/esm/memory/vertex_ai_memory_bank_service.js +17 -5
- package/dist/esm/models/base_llm.js +2 -7
- package/dist/esm/models/chrome_prompt_llm.js +20 -3
- package/dist/esm/models/chrome_prompt_utils.js +51 -2
- package/dist/esm/models/gemini_llm_connection.js +6 -5
- package/dist/esm/planners/base_planner.js +28 -0
- package/dist/esm/planners/built_in_planner.js +57 -0
- package/dist/esm/planners/plan_re_act_planner.js +145 -0
- package/dist/esm/plugins/base_plugin.js +46 -61
- package/dist/esm/tools/example_tool.js +1 -1
- package/dist/esm/tools/mcp/mcp_session_manager.js +14 -8
- package/dist/esm/tools/openapi_tool/auth/auth_helpers.js +272 -1
- package/dist/esm/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.js +15 -1
- package/dist/esm/tools/openapi_tool/auth/credential_exchangers/base_auth_credential_exchanger.js +43 -0
- package/dist/esm/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.js +93 -0
- package/dist/esm/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.js +10 -12
- package/dist/esm/tools/openapi_tool/common/common.js +112 -0
- package/dist/esm/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.js +11 -6
- package/dist/esm/tools/openapi_tool/openapi_spec_parser/operation_parser.js +80 -13
- package/dist/esm/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.js +146 -33
- package/dist/esm/tools/openapi_tool/openapi_toolset.js +14 -2
- package/dist/esm/tools/openapi_tool/rest_api_tool.js +89 -28
- package/dist/esm/tools/skill/skill_toolset.js +2 -0
- package/dist/esm/tools/tool_context.js +15 -0
- package/dist/esm/tools/webmcp/index.js +10 -0
- package/dist/esm/tools/webmcp/webmcp_tool.js +131 -0
- package/dist/esm/tools/webmcp/webmcp_toolset.js +89 -0
- package/dist/esm/tools/webmcp/webmcp_types.js +22 -0
- package/dist/esm/utils/case_utils.js +49 -1
- package/dist/esm/utils/client_labels.js +65 -0
- package/dist/esm/utils/gemini_schema_util.js +102 -3
- package/dist/esm/utils/hash_utils.js +45 -0
- package/dist/esm/utils/live_connection_utils.js +11 -10
- package/dist/esm/utils/model_name.js +15 -2
- package/dist/esm/utils/simple_zod_to_json.js +5 -0
- package/dist/esm/version.js +1 -1
- package/dist/types/agents/llm_agent.d.ts +12 -1
- package/dist/types/agents/processors/nl_planning_processor.d.ts +30 -0
- package/dist/types/auth/auth_credential.d.ts +9 -0
- package/dist/types/common.d.ts +16 -4
- package/dist/types/examples/base_example_provider.d.ts +2 -2
- package/dist/types/examples/example.d.ts +75 -0
- package/dist/types/examples/example_util.d.ts +13 -2
- package/dist/types/examples/index.d.ts +18 -0
- package/dist/types/examples/vertex_ai_example_store.d.ts +7 -0
- package/dist/types/index.d.ts +12 -3
- package/dist/types/memory/memory_entry.d.ts +15 -0
- package/dist/types/memory/vertex_ai_memory_bank_service.d.ts +9 -0
- package/dist/types/models/chrome_prompt_utils.d.ts +29 -0
- package/dist/types/planners/base_planner.d.ts +50 -0
- package/dist/types/planners/built_in_planner.d.ts +53 -0
- package/dist/types/planners/plan_re_act_planner.d.ts +21 -0
- package/dist/types/plugins/base_plugin.d.ts +52 -52
- package/dist/types/skills/skill_registry.d.ts +8 -0
- package/dist/types/tools/openapi_tool/auth/auth_helpers.d.ts +110 -1
- package/dist/types/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.d.ts +32 -2
- package/dist/types/tools/openapi_tool/auth/credential_exchangers/base_auth_credential_exchanger.d.ts +35 -0
- package/dist/types/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.d.ts +54 -0
- package/dist/types/tools/openapi_tool/common/common.d.ts +60 -0
- package/dist/types/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.d.ts +7 -0
- package/dist/types/tools/openapi_tool/openapi_spec_parser/operation_parser.d.ts +56 -2
- package/dist/types/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.d.ts +73 -5
- package/dist/types/tools/openapi_tool/openapi_toolset.d.ts +11 -0
- package/dist/types/tools/openapi_tool/rest_api_tool.d.ts +42 -8
- package/dist/types/tools/tool_context.d.ts +19 -0
- package/dist/types/tools/webmcp/index.d.ts +12 -0
- package/dist/types/tools/webmcp/webmcp_tool.d.ts +47 -0
- package/dist/types/tools/webmcp/webmcp_toolset.d.ts +67 -0
- package/dist/types/tools/webmcp/webmcp_types.d.ts +69 -0
- package/dist/types/utils/case_utils.d.ts +36 -0
- package/dist/types/utils/client_labels.d.ts +33 -0
- package/dist/types/utils/gemini_schema_util.d.ts +13 -0
- package/dist/types/utils/hash_utils.d.ts +25 -0
- package/dist/types/utils/logger.d.ts +10 -2
- package/dist/types/utils/model_name.d.ts +30 -2
- package/dist/types/version.d.ts +1 -1
- package/dist/web/index_web.js +112 -79
- package/dist/web/index_web.js.map +4 -4
- 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 =
|
|
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(
|
|
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 = `${
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
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 (
|
|
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
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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,
|
|
111
|
+
constructor(context, authScheme, authCredential, options = {}) {
|
|
66
112
|
this.context = context;
|
|
67
|
-
|
|
68
|
-
this.
|
|
69
|
-
this.
|
|
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
|
|
84
|
-
|
|
127
|
+
const existingCredential = this.credentialStore.getCredential(
|
|
128
|
+
this.authScheme,
|
|
129
|
+
this.authCredential
|
|
130
|
+
);
|
|
85
131
|
if (existingCredential) {
|
|
86
|
-
return {
|
|
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 ||
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
100
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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);
|