@aws/nx-plugin 0.98.0 → 0.99.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/generators.json +17 -1
- package/package.json +1 -1
- package/src/connection/agent-runtime-config.d.ts +19 -0
- package/src/connection/agent-runtime-config.js +52 -0
- package/src/connection/agent-runtime-config.js.map +1 -0
- package/src/connection/generator.js +15 -5
- package/src/connection/generator.js.map +1 -1
- package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +3 -17
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/py/strands-agent/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/py/strands-agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +29 -0
- package/src/py/strands-agent/a2a-connection/generator.d.ts +10 -0
- package/src/py/strands-agent/a2a-connection/generator.js +164 -0
- package/src/py/strands-agent/a2a-connection/generator.js.map +1 -0
- package/src/py/strands-agent/a2a-connection/schema.d.ts +15 -0
- package/src/py/strands-agent/a2a-connection/schema.json +26 -0
- package/src/py/strands-agent/mcp-connection/__snapshots__/generator.spec.ts.snap +9 -63
- package/src/py/strands-agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +4 -19
- package/src/py/strands-agent/mcp-connection/generator.js +16 -19
- package/src/py/strands-agent/mcp-connection/generator.js.map +1 -1
- package/src/py/strands-agent/react-connection/__snapshots__/generator.spec.ts.snap +3 -17
- package/src/py/strands-agent/react-connection/generator.js +8 -0
- package/src/py/strands-agent/react-connection/generator.js.map +1 -1
- package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +3 -17
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/strands-agent/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/strands-agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +27 -0
- package/src/ts/strands-agent/a2a-connection/generator.d.ts +10 -0
- package/src/ts/strands-agent/a2a-connection/generator.js +119 -0
- package/src/ts/strands-agent/a2a-connection/generator.js.map +1 -0
- package/src/ts/strands-agent/a2a-connection/schema.d.ts +15 -0
- package/src/ts/strands-agent/a2a-connection/schema.json +26 -0
- package/src/ts/strands-agent/mcp-connection/__snapshots__/generator.spec.ts.snap +9 -31
- package/src/ts/strands-agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +2 -9
- package/src/ts/strands-agent/mcp-connection/generator.js +4 -2
- package/src/ts/strands-agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/strands-agent/react-connection/generator.js +8 -0
- package/src/ts/strands-agent/react-connection/generator.js.map +1 -1
- package/src/utils/agent-connection/agent-connection.d.ts +31 -3
- package/src/utils/agent-connection/agent-connection.js +62 -30
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +134 -0
- package/src/utils/agent-connection/files/{core → core-mcp}/agentcore-mcp-client.ts.template +7 -22
- package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +40 -0
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +91 -0
- package/src/utils/agent-connection/files/py-core-auth/auth/__init__.py.template +3 -0
- package/src/utils/agent-connection/files/py-core-auth/auth/sigv4.py.template +48 -0
- package/src/utils/agent-connection/files/{py-core → py-core-mcp}/agentcore_mcp_client.py.template +2 -36
- package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +44 -0
- package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +2 -2
- package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +1 -1
- package/src/utils/ast.d.ts +18 -0
- package/src/utils/ast.js +58 -9
- package/src/utils/ast.js.map +1 -1
- package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +3 -16
- package/src/utils/versions.d.ts +1 -0
- package/src/utils/versions.js +1 -0
- package/src/utils/versions.js.map +1 -1
|
@@ -10,50 +10,12 @@ __all__ = ["InventoryMcpClient"]
|
|
|
10
10
|
`;
|
|
11
11
|
|
|
12
12
|
exports[`py#strands-agent#mcp-connection generator > should match snapshot for generated files > agentcore_mcp_client.py 1`] = `
|
|
13
|
-
"import
|
|
14
|
-
from collections.abc import Generator
|
|
15
|
-
from typing import Any
|
|
16
|
-
|
|
17
|
-
import boto3
|
|
13
|
+
"import boto3
|
|
18
14
|
import httpx
|
|
19
|
-
from botocore.auth import SigV4Auth
|
|
20
|
-
from botocore.awsrequest import AWSRequest
|
|
21
15
|
from mcp.client.streamable_http import streamablehttp_client
|
|
22
16
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
23
17
|
|
|
24
|
-
|
|
25
|
-
class SigV4HTTPXAuth(httpx.Auth):
|
|
26
|
-
"""HTTPX Auth class that signs requests with AWS SigV4."""
|
|
27
|
-
|
|
28
|
-
def __init__(self, credentials: Any, region: str):
|
|
29
|
-
self.credentials = credentials
|
|
30
|
-
self.service = "bedrock-agentcore"
|
|
31
|
-
self.region = region
|
|
32
|
-
self.signer = SigV4Auth(credentials, self.service, region)
|
|
33
|
-
|
|
34
|
-
def auth_flow(
|
|
35
|
-
self, request: httpx.Request
|
|
36
|
-
) -> Generator[httpx.Request, httpx.Response, None]:
|
|
37
|
-
headers = dict(request.headers)
|
|
38
|
-
|
|
39
|
-
headers.pop("connection", None)
|
|
40
|
-
headers["x-amz-content-sha256"] = hashlib.sha256(
|
|
41
|
-
request.content if request.content else b""
|
|
42
|
-
).hexdigest()
|
|
43
|
-
|
|
44
|
-
aws_request = AWSRequest(
|
|
45
|
-
method=request.method,
|
|
46
|
-
url=str(request.url),
|
|
47
|
-
data=request.content,
|
|
48
|
-
headers=headers,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
self.signer.add_auth(aws_request)
|
|
52
|
-
|
|
53
|
-
request.headers.clear()
|
|
54
|
-
request.headers.update(dict(aws_request.headers))
|
|
55
|
-
|
|
56
|
-
yield request
|
|
18
|
+
from .auth import SigV4HTTPXAuth
|
|
57
19
|
|
|
58
20
|
|
|
59
21
|
class AgentCoreMCPClient:
|
|
@@ -104,7 +66,7 @@ class AgentCoreMCPClient:
|
|
|
104
66
|
return AgentCoreMCPClient._create(
|
|
105
67
|
agent_runtime_arn=agent_runtime_arn,
|
|
106
68
|
session_id=session_id,
|
|
107
|
-
auth_handler=SigV4HTTPXAuth(credentials, region),
|
|
69
|
+
auth_handler=SigV4HTTPXAuth(credentials, "bedrock-agentcore", region),
|
|
108
70
|
)
|
|
109
71
|
|
|
110
72
|
@staticmethod
|
|
@@ -132,12 +94,13 @@ class AgentCoreMCPClient:
|
|
|
132
94
|
exports[`py#strands-agent#mcp-connection generator > should match snapshot for generated files > inventory_mcp_client.py 1`] = `
|
|
133
95
|
"import os
|
|
134
96
|
|
|
135
|
-
from aws_lambda_powertools.utilities import parameters
|
|
136
|
-
from botocore.config import Config
|
|
137
97
|
from mcp.client.streamable_http import streamablehttp_client
|
|
138
98
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
139
99
|
|
|
140
100
|
from proj_agent_connection.core.agentcore_mcp_client import AgentCoreMCPClient
|
|
101
|
+
from proj_agent_connection.core.runtime_config import (
|
|
102
|
+
get_connected_agent_runtime_arn,
|
|
103
|
+
)
|
|
141
104
|
|
|
142
105
|
|
|
143
106
|
class InventoryMcpClient:
|
|
@@ -155,33 +118,16 @@ class InventoryMcpClient:
|
|
|
155
118
|
if os.environ.get("SERVE_LOCAL") == "true":
|
|
156
119
|
return MCPClient(lambda: streamablehttp_client("http://localhost:8082/mcp"))
|
|
157
120
|
|
|
158
|
-
arn = InventoryMcpClient._get_arn()
|
|
159
121
|
return AgentCoreMCPClient.with_iam_auth(
|
|
160
|
-
agent_runtime_arn=
|
|
122
|
+
agent_runtime_arn=get_connected_agent_runtime_arn("InventoryMcp"),
|
|
161
123
|
session_id=session_id,
|
|
162
124
|
)
|
|
163
|
-
|
|
164
|
-
@staticmethod
|
|
165
|
-
def _get_arn() -> str:
|
|
166
|
-
"""Resolve the InventoryMcp ARN from runtime config (AppConfig)."""
|
|
167
|
-
region = os.environ.get("AWS_REGION", os.environ.get("AWS_DEFAULT_REGION"))
|
|
168
|
-
provider_kwargs = {}
|
|
169
|
-
if region:
|
|
170
|
-
provider_kwargs["config"] = Config(region_name=region)
|
|
171
|
-
provider = parameters.AppConfigProvider(
|
|
172
|
-
environment="default",
|
|
173
|
-
application=os.environ["RUNTIME_CONFIG_APP_ID"],
|
|
174
|
-
**provider_kwargs,
|
|
175
|
-
)
|
|
176
|
-
config = provider.get("connection", transform="json")
|
|
177
|
-
return config["agentRuntimes"]["InventoryMcp"]
|
|
178
125
|
"
|
|
179
126
|
`;
|
|
180
127
|
|
|
181
128
|
exports[`py#strands-agent#mcp-connection generator > should match snapshot for generated files > transformed-agent.py 1`] = `
|
|
182
|
-
"from
|
|
183
|
-
|
|
184
|
-
from proj_agent_connection import InventoryMcpClient
|
|
129
|
+
"from proj_agent_connection import InventoryMcpClient
|
|
130
|
+
from contextlib import contextmanager
|
|
185
131
|
|
|
186
132
|
from strands import Agent, tool
|
|
187
133
|
from strands_tools import current_time
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
|
-
from aws_lambda_powertools.utilities import parameters
|
|
4
|
-
from botocore.config import Config
|
|
5
3
|
from mcp.client.streamable_http import streamablehttp_client
|
|
6
4
|
from strands.tools.mcp.mcp_client import MCPClient
|
|
7
5
|
|
|
8
6
|
from <%- agentConnectionModuleName %>.core.agentcore_mcp_client import AgentCoreMCPClient
|
|
7
|
+
from <%- agentConnectionModuleName %>.core.runtime_config import (
|
|
8
|
+
get_connected_agent_runtime_arn,
|
|
9
|
+
)
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class <%- mcpServerClassName %>Client:
|
|
@@ -23,23 +24,7 @@ class <%- mcpServerClassName %>Client:
|
|
|
23
24
|
if os.environ.get("SERVE_LOCAL") == "true":
|
|
24
25
|
return MCPClient(lambda: streamablehttp_client("http://localhost:<%- mcpServerPort %>/mcp"))
|
|
25
26
|
|
|
26
|
-
arn = <%- mcpServerClassName %>Client._get_arn()
|
|
27
27
|
return AgentCoreMCPClient.with_iam_auth(
|
|
28
|
-
agent_runtime_arn=
|
|
28
|
+
agent_runtime_arn=get_connected_agent_runtime_arn("<%- mcpServerClassName %>"),
|
|
29
29
|
session_id=session_id,
|
|
30
30
|
)
|
|
31
|
-
|
|
32
|
-
@staticmethod
|
|
33
|
-
def _get_arn() -> str:
|
|
34
|
-
"""Resolve the <%- mcpServerClassName %> ARN from runtime config (AppConfig)."""
|
|
35
|
-
region = os.environ.get("AWS_REGION", os.environ.get("AWS_DEFAULT_REGION"))
|
|
36
|
-
provider_kwargs = {}
|
|
37
|
-
if region:
|
|
38
|
-
provider_kwargs["config"] = Config(region_name=region)
|
|
39
|
-
provider = parameters.AppConfigProvider(
|
|
40
|
-
environment="default",
|
|
41
|
-
application=os.environ["RUNTIME_CONFIG_APP_ID"],
|
|
42
|
-
**provider_kwargs,
|
|
43
|
-
)
|
|
44
|
-
config = provider.get("connection", transform="json")
|
|
45
|
-
return config["agentRuntimes"]["<%- mcpServerClassName %>"]
|
|
@@ -31,11 +31,21 @@ const pyStrandsAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
31
31
|
const mcpServerClassName = mcpComponent.rc;
|
|
32
32
|
const mcpServerSnakeCase = (0, names_1.snakeCase)(mcpServerClassName);
|
|
33
33
|
const mcpServerPort = mcpComponent.port ?? 8000;
|
|
34
|
-
// 1. Ensure the shared Python agent-connection project exists
|
|
34
|
+
// 1. Ensure the shared Python agent-connection project exists + has the
|
|
35
|
+
// MCP core client and its shared SigV4 auth helper.
|
|
35
36
|
await (0, agent_connection_1.ensurePythonAgentConnectionProject)(tree);
|
|
37
|
+
(0, agent_connection_1.addPythonCoreClient)(tree, 'auth');
|
|
38
|
+
(0, agent_connection_1.addPythonCoreClient)(tree, 'mcp');
|
|
36
39
|
const agentConnectionProjectDir = (0, agent_connection_1.getPythonAgentConnectionProjectDir)(tree);
|
|
37
40
|
const agentConnectionModuleName = (0, agent_connection_1.getPythonAgentConnectionModuleName)(tree);
|
|
38
41
|
const agentConnectionPackageName = (0, agent_connection_1.getPythonAgentConnectionPackageName)(tree);
|
|
42
|
+
// Python deps required by the MCP core client + shared auth helper.
|
|
43
|
+
(0, py_1.addDependenciesToPyProjectToml)(tree, agentConnectionProjectDir, [
|
|
44
|
+
'boto3',
|
|
45
|
+
'httpx',
|
|
46
|
+
'mcp',
|
|
47
|
+
'strands-agents',
|
|
48
|
+
]);
|
|
39
49
|
// 2. Generate the per-connection client into the shared agent-connection project
|
|
40
50
|
const appDir = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, 'app');
|
|
41
51
|
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'agent-connection', 'app'), appDir, {
|
|
@@ -52,10 +62,6 @@ const pyStrandsAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
52
62
|
// Add re-export to module __init__.py
|
|
53
63
|
const moduleInitPath = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, '__init__.py');
|
|
54
64
|
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${mcpServerSnakeCase}_client`, `${mcpServerClassName}Client`);
|
|
55
|
-
// Add aws-lambda-powertools dependency to the agent-connection project
|
|
56
|
-
(0, py_1.addDependenciesToPyProjectToml)(tree, agentConnectionProjectDir, [
|
|
57
|
-
'aws-lambda-powertools',
|
|
58
|
-
]);
|
|
59
65
|
// 3. Transform agent.py to add MCP client import and usage
|
|
60
66
|
const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, agentComponent.path ?? 'src');
|
|
61
67
|
const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.py');
|
|
@@ -93,23 +99,14 @@ const pyStrandsAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
93
99
|
};
|
|
94
100
|
exports.pyStrandsAgentMcpConnectionGenerator = pyStrandsAgentMcpConnectionGenerator;
|
|
95
101
|
/**
|
|
96
|
-
* Add an import for the MCP client class to agent.py
|
|
102
|
+
* Add an import for the MCP client class to agent.py.
|
|
97
103
|
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
104
|
+
* Delegates to the shared `addPythonDestructuredImport` helper which either
|
|
105
|
+
* appends to an existing `from <module> import ...` line or prepends a new
|
|
106
|
+
* import statement (ruff sorts imports on the next format pass).
|
|
101
107
|
*/
|
|
102
108
|
const addImportToAgentFile = async (tree, filePath, agentConnectionModuleName, clientClassName) => {
|
|
103
|
-
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// Try to append to existing import from the same module using +=
|
|
107
|
-
const appended = await (0, ast_1.applyGritQL)(tree, filePath, py(`\`from ${agentConnectionModuleName} import $names\` where { $names += \`, ${clientClassName}\` }`));
|
|
108
|
-
if (!appended) {
|
|
109
|
-
// No existing import — add a new one after the first import.
|
|
110
|
-
// Ruff will sort it into the correct position.
|
|
111
|
-
await (0, ast_1.applyGritQL)(tree, filePath, py(`\`from contextlib import contextmanager\` as $imp => \`$imp\nfrom ${agentConnectionModuleName} import ${clientClassName}\``));
|
|
112
|
-
}
|
|
109
|
+
await (0, ast_1.addPythonDestructuredImport)(tree, filePath, [clientClassName], agentConnectionModuleName);
|
|
113
110
|
};
|
|
114
111
|
/**
|
|
115
112
|
* Add MCP tools to the Agent's tools array using GritQL.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/strands-agent/mcp-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCAQoB;AAEpB,0CAI2B;AAC3B,oDAAyE;AACzE,kDAA6D;AAC7D,gDAAiD;AACjD,0CAG2B;AAC3B,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/strands-agent/mcp-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,23 +104,9 @@ const useCreateTestAgentClient = (): TestAgent => {
|
|
|
104
104
|
const auth = useAuth();
|
|
105
105
|
const user = auth?.user;
|
|
106
106
|
const cognitoClient: typeof fetch = (url, init) => {
|
|
107
|
-
const headers =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return fetch(url, {
|
|
111
|
-
...init,
|
|
112
|
-
headers: !existingHeaders
|
|
113
|
-
? headers
|
|
114
|
-
: existingHeaders instanceof Headers
|
|
115
|
-
? (() => {
|
|
116
|
-
const h = new Headers(existingHeaders);
|
|
117
|
-
Object.entries(headers).forEach(([k, v]) => h.append(k, v));
|
|
118
|
-
return h;
|
|
119
|
-
})()
|
|
120
|
-
: Array.isArray(existingHeaders)
|
|
121
|
-
? [...existingHeaders, ...Object.entries(headers)]
|
|
122
|
-
: { ...existingHeaders, ...headers },
|
|
123
|
-
});
|
|
107
|
+
const headers = new Headers(init?.headers);
|
|
108
|
+
headers.set('Authorization', \`Bearer \${user?.id_token}\`);
|
|
109
|
+
return fetch(url, { ...init, headers });
|
|
124
110
|
};
|
|
125
111
|
return useMemo(
|
|
126
112
|
() =>
|
|
@@ -10,6 +10,7 @@ const format_1 = require("../../../utils/format");
|
|
|
10
10
|
const nx_1 = require("../../../utils/nx");
|
|
11
11
|
const metrics_1 = require("../../../utils/metrics");
|
|
12
12
|
const react_1 = require("../../../utils/connection/open-api/react");
|
|
13
|
+
const agent_runtime_config_1 = require("../../../connection/agent-runtime-config");
|
|
13
14
|
const names_1 = require("../../../utils/names");
|
|
14
15
|
const object_1 = require("../../../utils/object");
|
|
15
16
|
const serve_local_1 = require("./serve-local");
|
|
@@ -83,6 +84,13 @@ const pyStrandsAgentReactConnectionGenerator = async (tree, options) => {
|
|
|
83
84
|
port: agentPort,
|
|
84
85
|
targetComponent,
|
|
85
86
|
});
|
|
87
|
+
// Expose the agent's runtime ARN to the frontend via the 'connection'
|
|
88
|
+
// namespace (which is published to runtime-config.json). The agent construct
|
|
89
|
+
// itself only registers to the 'agentcore' namespace by default.
|
|
90
|
+
await (0, agent_runtime_config_1.addAgentRuntimeToConnectionNamespace)(tree, {
|
|
91
|
+
agentNameKebabCase: (0, names_1.kebabCase)(agentNameClassName),
|
|
92
|
+
agentNameClassName,
|
|
93
|
+
});
|
|
86
94
|
await (0, metrics_1.addGeneratorMetricsIfApplicable)(tree, [
|
|
87
95
|
exports.PY_STRANDS_AGENT_REACT_CONNECTION_GENERATOR_INFO,
|
|
88
96
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/strands-agent/react-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCAOoB;AACpB,kDAA6D;AAC7D,0CAK2B;AAC3B,oDAAyE;AACzE,oEAAiF;AAEjF,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/strands-agent/react-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,23 +104,9 @@ const useCreateTestApiClient = (): TestApi => {
|
|
|
104
104
|
const auth = useAuth();
|
|
105
105
|
const user = auth?.user;
|
|
106
106
|
const cognitoClient: typeof fetch = (url, init) => {
|
|
107
|
-
const headers =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return fetch(url, {
|
|
111
|
-
...init,
|
|
112
|
-
headers: !existingHeaders
|
|
113
|
-
? headers
|
|
114
|
-
: existingHeaders instanceof Headers
|
|
115
|
-
? (() => {
|
|
116
|
-
const h = new Headers(existingHeaders);
|
|
117
|
-
Object.entries(headers).forEach(([k, v]) => h.append(k, v));
|
|
118
|
-
return h;
|
|
119
|
-
})()
|
|
120
|
-
: Array.isArray(existingHeaders)
|
|
121
|
-
? [...existingHeaders, ...Object.entries(headers)]
|
|
122
|
-
: { ...existingHeaders, ...headers },
|
|
123
|
-
});
|
|
107
|
+
const headers = new Headers(init?.headers);
|
|
108
|
+
headers.set('Authorization', \`Bearer \${user?.id_token}\`);
|
|
109
|
+
return fetch(url, { ...init, headers });
|
|
124
110
|
};
|
|
125
111
|
return useMemo(
|
|
126
112
|
() =>
|
|
@@ -76,8 +76,8 @@ export class SnapshotBedrockServer extends Construct implements IGrantable {
|
|
|
76
76
|
|
|
77
77
|
rc.grantReadAppConfig(this.agentCoreRuntime);
|
|
78
78
|
|
|
79
|
-
rc.set('
|
|
80
|
-
...rc.get('
|
|
79
|
+
rc.set('agentcore', 'agentRuntimes', {
|
|
80
|
+
...rc.get('agentcore').agentRuntimes,
|
|
81
81
|
SnapshotBedrockServer: this.agentCoreRuntime.agentRuntimeArn,
|
|
82
82
|
});
|
|
83
83
|
}
|
|
@@ -543,7 +543,7 @@ module "agent_core_runtime" {
|
|
|
543
543
|
module "add_agent_runtime_to_runtime_config" {
|
|
544
544
|
source = "../../../core/runtime-config/entry"
|
|
545
545
|
|
|
546
|
-
namespace = "
|
|
546
|
+
namespace = "agentcore"
|
|
547
547
|
key = "agentRuntimes"
|
|
548
548
|
value = { "TerraformSnapshotServer" = module.agent_core_runtime.agent_core_runtime_arn }
|
|
549
549
|
|
|
@@ -80,8 +80,8 @@ export class SnapshotBedrockAgent extends Construct implements IGrantable {
|
|
|
80
80
|
|
|
81
81
|
rc.grantReadAppConfig(this.agentCoreRuntime);
|
|
82
82
|
|
|
83
|
-
rc.set('
|
|
84
|
-
...rc.get('
|
|
83
|
+
rc.set('agentcore', 'agentRuntimes', {
|
|
84
|
+
...rc.get('agentcore').agentRuntimes,
|
|
85
85
|
SnapshotBedrockAgent: this.agentCoreRuntime.agentRuntimeArn,
|
|
86
86
|
});
|
|
87
87
|
}
|
|
@@ -188,7 +188,7 @@ module "agent_core_runtime" {
|
|
|
188
188
|
module "add_agent_runtime_to_runtime_config" {
|
|
189
189
|
source = "../../../core/runtime-config/entry"
|
|
190
190
|
|
|
191
|
-
namespace = "
|
|
191
|
+
namespace = "agentcore"
|
|
192
192
|
key = "agentRuntimes"
|
|
193
193
|
value = { "TerraformSnapshotAgent" = module.agent_core_runtime.agent_core_runtime_arn }
|
|
194
194
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { A2AAgent } from '@strands-agents/sdk/a2a';
|
|
2
|
+
import { AgentCoreA2aClient } from '../core/agentcore-a2a-client.js';
|
|
3
|
+
import { getConnectedAgentRuntimeArn } from '../core/runtime-config.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Client for connecting to the <%- targetAgentClassName %> A2A agent.
|
|
7
|
+
*
|
|
8
|
+
* In deployed mode: resolves the AgentCore runtime ARN from runtime config
|
|
9
|
+
* and uses a SigV4-authenticated A2A transport.
|
|
10
|
+
*
|
|
11
|
+
* In local mode (SERVE_LOCAL env var set): connects directly to the local
|
|
12
|
+
* A2A server over plain HTTP.
|
|
13
|
+
*/
|
|
14
|
+
export class <%- targetAgentClassName %>Client {
|
|
15
|
+
static async create(sessionId: string): Promise<A2AAgent> {
|
|
16
|
+
if (process.env.SERVE_LOCAL === 'true') {
|
|
17
|
+
return new A2AAgent({
|
|
18
|
+
url: 'http://localhost:<%- targetAgentPort %>/',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return AgentCoreA2aClient.withIamAuth({
|
|
23
|
+
agentRuntimeArn: await getConnectedAgentRuntimeArn('<%- targetAgentClassName %>'),
|
|
24
|
+
sessionId,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { GeneratorCallback, Tree } from '@nx/devkit';
|
|
6
|
+
import { TsStrandsAgentA2aConnectionGeneratorSchema } from './schema';
|
|
7
|
+
import { NxGeneratorInfo } from '../../../utils/nx';
|
|
8
|
+
export declare const TS_STRANDS_AGENT_A2A_CONNECTION_GENERATOR_INFO: NxGeneratorInfo;
|
|
9
|
+
export declare const tsStrandsAgentA2aConnectionGenerator: (tree: Tree, options: TsStrandsAgentA2aConnectionGeneratorSchema) => Promise<GeneratorCallback>;
|
|
10
|
+
export default tsStrandsAgentA2aConnectionGenerator;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tsStrandsAgentA2aConnectionGenerator = exports.TS_STRANDS_AGENT_A2A_CONNECTION_GENERATOR_INFO = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
const devkit_1 = require("@nx/devkit");
|
|
9
|
+
const nx_1 = require("../../../utils/nx");
|
|
10
|
+
const metrics_1 = require("../../../utils/metrics");
|
|
11
|
+
const format_1 = require("../../../utils/format");
|
|
12
|
+
const names_1 = require("../../../utils/names");
|
|
13
|
+
const versions_1 = require("../../../utils/versions");
|
|
14
|
+
const npm_scope_1 = require("../../../utils/npm-scope");
|
|
15
|
+
const ast_1 = require("../../../utils/ast");
|
|
16
|
+
const agent_connection_1 = require("../../../utils/agent-connection/agent-connection");
|
|
17
|
+
exports.TS_STRANDS_AGENT_A2A_CONNECTION_GENERATOR_INFO = (0, nx_1.getGeneratorInfo)(__filename);
|
|
18
|
+
const tsStrandsAgentA2aConnectionGenerator = async (tree, options) => {
|
|
19
|
+
const sourceProject = (0, nx_1.readProjectConfigurationUnqualified)(tree, options.sourceProject);
|
|
20
|
+
const targetProject = (0, nx_1.readProjectConfigurationUnqualified)(tree, options.targetProject);
|
|
21
|
+
const agentComponent = options.sourceComponent;
|
|
22
|
+
const targetAgentComponent = options.targetComponent;
|
|
23
|
+
if (!agentComponent || !targetAgentComponent) {
|
|
24
|
+
throw new Error('Both sourceComponent and targetComponent must be provided for ts#strands-agent -> a2a connections');
|
|
25
|
+
}
|
|
26
|
+
if (targetAgentComponent.protocol !== 'A2A') {
|
|
27
|
+
throw new Error(`Target agent '${targetAgentComponent.name}' uses the ${targetAgentComponent.protocol ?? 'HTTP'} protocol — only A2A agents can be connected as tools.`);
|
|
28
|
+
}
|
|
29
|
+
if (targetAgentComponent.auth && targetAgentComponent.auth !== 'IAM') {
|
|
30
|
+
throw new Error(`A2A agent connection currently only supports IAM authentication, but '${targetAgentComponent.name}' uses '${targetAgentComponent.auth}' authentication.`);
|
|
31
|
+
}
|
|
32
|
+
const targetAgentComponentName = targetAgentComponent.name ?? 'agent';
|
|
33
|
+
const targetAgentClassName = targetAgentComponent.rc;
|
|
34
|
+
const targetAgentKebabCase = (0, names_1.kebabCase)(targetAgentClassName);
|
|
35
|
+
const targetAgentPort = targetAgentComponent.port ?? 9000;
|
|
36
|
+
const npmScope = (0, npm_scope_1.getNpmScope)(tree);
|
|
37
|
+
// 1. Ensure the shared agent-connection project exists + has the A2A core client
|
|
38
|
+
await (0, agent_connection_1.ensureTypeScriptAgentConnectionProject)(tree);
|
|
39
|
+
(0, agent_connection_1.addTypeScriptCoreClient)(tree, 'a2a');
|
|
40
|
+
// 2. Generate the per-connection <Name>Client into app/
|
|
41
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'agent-connection', 'app'), (0, devkit_1.joinPathFragments)(agent_connection_1.AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'), {
|
|
42
|
+
targetAgentKebabCase,
|
|
43
|
+
targetAgentClassName,
|
|
44
|
+
targetAgentPort,
|
|
45
|
+
}, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
46
|
+
// Add re-export to index.ts
|
|
47
|
+
await (0, ast_1.addStarExport)(tree, (0, devkit_1.joinPathFragments)(agent_connection_1.AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'), `./app/${targetAgentKebabCase}-client.js`);
|
|
48
|
+
// 3. AST transform agent.ts to add the remote A2A agent as a tool
|
|
49
|
+
const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, agentComponent.path ?? 'src');
|
|
50
|
+
const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.ts');
|
|
51
|
+
if (tree.exists(agentFilePath)) {
|
|
52
|
+
const clientClassName = `${targetAgentClassName}Client`;
|
|
53
|
+
const clientVarName = targetAgentClassName.charAt(0).toLowerCase() +
|
|
54
|
+
targetAgentClassName.slice(1);
|
|
55
|
+
const toolName = `ask${targetAgentClassName}`;
|
|
56
|
+
const toolVarName = `${clientVarName}Tool`;
|
|
57
|
+
// Ensure tool + z imports are available
|
|
58
|
+
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, ['tool'], '@strands-agents/sdk');
|
|
59
|
+
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, ['z'], 'zod');
|
|
60
|
+
await (0, ast_1.addDestructuredImport)(tree, agentFilePath, [clientClassName], `:${npmScope}/agent-connection`);
|
|
61
|
+
// Build the tool creation + Agent wiring. We wrap the getAgent body so
|
|
62
|
+
// the client can be created per-invocation (passing through sessionId).
|
|
63
|
+
const toolCreationBlock = `const ${clientVarName} = await ${clientClassName}.create(sessionId);
|
|
64
|
+
const ${toolVarName} = tool({
|
|
65
|
+
name: '${toolName}',
|
|
66
|
+
description: 'Delegate a question to the remote ${targetAgentClassName} A2A agent and return its reply.',
|
|
67
|
+
inputSchema: z.object({ prompt: z.string() }),
|
|
68
|
+
callback: async ({ prompt }) => (await ${clientVarName}.invoke(prompt)).toString(),
|
|
69
|
+
});`;
|
|
70
|
+
// Transform the arrow function that contains `new Agent`:
|
|
71
|
+
// - Expression body: wrap in block with tool creation and return
|
|
72
|
+
// - Block body: prepend tool creation statement
|
|
73
|
+
await (0, ast_1.applyGritQL)(tree, agentFilePath, `or { \`async ($p) => new Agent($args)\` => raw\`async ($p) => {
|
|
74
|
+
${toolCreationBlock}
|
|
75
|
+
return new Agent($args);
|
|
76
|
+
}\` where { $program <: not contains \`${clientClassName}.create\` }, \`async ($p) => { $body }\` => raw\`async ($p) => {
|
|
77
|
+
${toolCreationBlock}
|
|
78
|
+
$body
|
|
79
|
+
}\` where { $body <: contains \`new Agent($_)\`, $program <: not contains \`${clientClassName}.create\` } }`);
|
|
80
|
+
// Append the tool to the tools array (after existing items)
|
|
81
|
+
await (0, ast_1.applyGritQL)(tree, agentFilePath, `\`tools: [$items]\` => \`tools: [$items, ${toolVarName}]\` where { $items <: within \`new Agent($_)\`, $items <: not contains \`${toolVarName}\` }`);
|
|
82
|
+
}
|
|
83
|
+
// 4. Set up serve-local target — depend on the target agent's serve-local
|
|
84
|
+
// so running the host's serve-local also spins up the remote A2A agent.
|
|
85
|
+
const agentName = agentComponent.name ?? 'agent';
|
|
86
|
+
const serveLocalTargetName = `${agentName}-serve-local`;
|
|
87
|
+
const targetServeLocalTargetName = `${targetAgentComponentName}-serve-local`;
|
|
88
|
+
if (sourceProject.targets?.[serveLocalTargetName]) {
|
|
89
|
+
const target = sourceProject.targets[serveLocalTargetName];
|
|
90
|
+
target.dependsOn = [
|
|
91
|
+
...(target.dependsOn ?? []),
|
|
92
|
+
{
|
|
93
|
+
projects: [targetProject.name],
|
|
94
|
+
target: targetServeLocalTargetName,
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
(0, devkit_1.updateProjectConfiguration)(tree, sourceProject.name, sourceProject);
|
|
98
|
+
}
|
|
99
|
+
// 5. Add dependencies
|
|
100
|
+
(0, devkit_1.addDependenciesToPackageJson)(tree, (0, versions_1.withVersions)([
|
|
101
|
+
'@a2a-js/sdk',
|
|
102
|
+
'@strands-agents/sdk',
|
|
103
|
+
'@aws-lambda-powertools/parameters',
|
|
104
|
+
'@aws-sdk/client-appconfigdata',
|
|
105
|
+
'aws4fetch',
|
|
106
|
+
'@aws-sdk/credential-providers',
|
|
107
|
+
'zod',
|
|
108
|
+
]), {});
|
|
109
|
+
await (0, metrics_1.addGeneratorMetricsIfApplicable)(tree, [
|
|
110
|
+
exports.TS_STRANDS_AGENT_A2A_CONNECTION_GENERATOR_INFO,
|
|
111
|
+
]);
|
|
112
|
+
await (0, format_1.formatFilesInSubtree)(tree);
|
|
113
|
+
return () => {
|
|
114
|
+
(0, devkit_1.installPackagesTask)(tree);
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
exports.tsStrandsAgentA2aConnectionGenerator = tsStrandsAgentA2aConnectionGenerator;
|
|
118
|
+
exports.default = exports.tsStrandsAgentA2aConnectionGenerator;
|
|
119
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/ts/strands-agent/a2a-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCASoB;AAEpB,0CAI2B;AAC3B,oDAAyE;AACzE,kDAA6D;AAC7D,gDAAiD;AACjD,sDAAuD;AACvD,wDAAuD;AACvD,4CAI4B;AAC5B,uFAI0D;AAE7C,QAAA,8CAA8C,GACzD,IAAA,qBAAgB,EAAC,UAAU,CAAC,CAAC;AAExB,MAAM,oCAAoC,GAAG,KAAK,EACvD,IAAU,EACV,OAAmD,EACvB,EAAE;IAC9B,MAAM,aAAa,GAAG,IAAA,wCAAmC,EACvD,IAAI,EACJ,OAAO,CAAC,aAAa,CACtB,CAAC;IACF,MAAM,aAAa,GAAG,IAAA,wCAAmC,EACvD,IAAI,EACJ,OAAO,CAAC,aAAa,CACtB,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAC/C,MAAM,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC;IAErD,IAAI,CAAC,cAAc,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,iBAAiB,oBAAoB,CAAC,IAAI,cAAc,oBAAoB,CAAC,QAAQ,IAAI,MAAM,wDAAwD,CACxJ,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,CAAC,IAAI,IAAI,oBAAoB,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,yEAAyE,oBAAoB,CAAC,IAAI,WAAW,oBAAoB,CAAC,IAAI,mBAAmB,CAC1J,CAAC;IACJ,CAAC;IAED,MAAM,wBAAwB,GAAG,oBAAoB,CAAC,IAAI,IAAI,OAAO,CAAC;IACtE,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,EAAY,CAAC;IAC/D,MAAM,oBAAoB,GAAG,IAAA,iBAAS,EAAC,oBAAoB,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,IAAI,IAAI,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAA,uBAAW,EAAC,IAAI,CAAC,CAAC;IAEnC,iFAAiF;IACjF,MAAM,IAAA,yDAAsC,EAAC,IAAI,CAAC,CAAC;IACnD,IAAA,0CAAuB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAErC,wDAAwD;IACxD,IAAA,sBAAa,EACX,IAAI,EACJ,IAAA,0BAAiB,EAAC,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,EAChE,IAAA,0BAAiB,EAAC,+CAA4B,EAAE,KAAK,EAAE,KAAK,CAAC,EAC7D;QACE,oBAAoB;QACpB,oBAAoB;QACpB,eAAe;KAChB,EACD,EAAE,iBAAiB,EAAE,0BAAiB,CAAC,YAAY,EAAE,CACtD,CAAC;IAEF,4BAA4B;IAC5B,MAAM,IAAA,mBAAa,EACjB,IAAI,EACJ,IAAA,0BAAiB,EAAC,+CAA4B,EAAE,KAAK,EAAE,UAAU,CAAC,EAClE,SAAS,oBAAoB,YAAY,CAC1C,CAAC;IAEF,kEAAkE;IAClE,MAAM,cAAc,GAAG,IAAA,0BAAiB,EACtC,aAAa,CAAC,IAAI,EAClB,cAAc,CAAC,IAAI,IAAI,KAAK,CAC7B,CAAC;IACF,MAAM,aAAa,GAAG,IAAA,0BAAiB,EAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAEpE,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,GAAG,oBAAoB,QAAQ,CAAC;QACxD,MAAM,aAAa,GACjB,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAC5C,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,GAAG,aAAa,MAAM,CAAC;QAE3C,wCAAwC;QACxC,MAAM,IAAA,2BAAqB,EACzB,IAAI,EACJ,aAAa,EACb,CAAC,MAAM,CAAC,EACR,qBAAqB,CACtB,CAAC;QACF,MAAM,IAAA,2BAAqB,EAAC,IAAI,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,IAAA,2BAAqB,EACzB,IAAI,EACJ,aAAa,EACb,CAAC,eAAe,CAAC,EACjB,IAAI,QAAQ,mBAAmB,CAChC,CAAC;QAEF,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,iBAAiB,GAAG,SAAS,aAAa,YAAY,eAAe;UACrE,WAAW;aACR,QAAQ;sDACiC,oBAAoB;;6CAE7B,aAAa;MACpD,CAAC;QAEH,0DAA0D;QAC1D,iEAAiE;QACjE,gDAAgD;QAChD,MAAM,IAAA,iBAAW,EACf,IAAI,EACJ,aAAa,EACb;IACF,iBAAiB;;yCAEoB,eAAe;IACpD,iBAAiB;;8EAEyD,eAAe,eAAe,CACvG,CAAC;QAEF,4DAA4D;QAC5D,MAAM,IAAA,iBAAW,EACf,IAAI,EACJ,aAAa,EACb,4CAA4C,WAAW,4EAA4E,WAAW,MAAM,CACrJ,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,IAAI,OAAO,CAAC;IACjD,MAAM,oBAAoB,GAAG,GAAG,SAAS,cAAc,CAAC;IACxD,MAAM,0BAA0B,GAAG,GAAG,wBAAwB,cAAc,CAAC;IAE7E,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAC3D,MAAM,CAAC,SAAS,GAAG;YACjB,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;YAC3B;gBACE,QAAQ,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC9B,MAAM,EAAE,0BAA0B;aACnC;SACF,CAAC;QACF,IAAA,mCAA0B,EAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC;IAED,sBAAsB;IACtB,IAAA,qCAA4B,EAC1B,IAAI,EACJ,IAAA,uBAAY,EAAC;QACX,aAAa;QACb,qBAAqB;QACrB,mCAAmC;QACnC,+BAA+B;QAC/B,WAAW;QACX,+BAA+B;QAC/B,KAAK;KACN,CAAC,EACF,EAAE,CACH,CAAC;IAEF,MAAM,IAAA,yCAA+B,EAAC,IAAI,EAAE;QAC1C,sDAA8C;KAC/C,CAAC,CAAC;IAEH,MAAM,IAAA,6BAAoB,EAAC,IAAI,CAAC,CAAC;IACjC,OAAO,GAAG,EAAE;QACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC,CAAC;AAzKW,QAAA,oCAAoC,wCAyK/C;AAEF,kBAAe,4CAAoC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import { ComponentMetadata } from '../../../utils/nx';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* TypeScript types for options defined in schema.json
|
|
9
|
+
*/
|
|
10
|
+
export interface TsStrandsAgentA2aConnectionGeneratorSchema {
|
|
11
|
+
sourceProject: string;
|
|
12
|
+
targetProject: string;
|
|
13
|
+
sourceComponent?: ComponentMetadata;
|
|
14
|
+
targetComponent?: ComponentMetadata;
|
|
15
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/schema",
|
|
3
|
+
"$id": "ts#strands-agent#a2a-connection",
|
|
4
|
+
"title": "ts#strands-agent#a2a-connection",
|
|
5
|
+
"description": "Connect a TypeScript Strands Agent to an A2A agent",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"sourceProject": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "The project containing the host Strands Agent"
|
|
11
|
+
},
|
|
12
|
+
"targetProject": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "The project containing the target A2A Strands Agent"
|
|
15
|
+
},
|
|
16
|
+
"sourceComponent": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "The host agent component name"
|
|
19
|
+
},
|
|
20
|
+
"targetComponent": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "The target A2A agent component name"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"required": ["sourceProject", "targetProject"]
|
|
26
|
+
}
|