@aws/nx-plugin 1.0.0-rc.21 → 1.0.0-rc.23
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/package.json +1 -1
- package/src/license/generator.js +22 -8
- package/src/license/generator.js.map +1 -1
- package/src/license/known-exceptions.d.ts +1 -0
- package/src/license/known-exceptions.js +13 -1
- package/src/license/known-exceptions.js.map +1 -1
- package/src/py/agent/__snapshots__/generator.spec.ts.snap +167 -3
- package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +28 -0
- package/src/py/agent/a2a-connection/generator.js +59 -31
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
- package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
- package/src/py/agent/files/common-langchain/agent.py.template +30 -0
- package/src/py/agent/files/http-langchain/main.py.template +84 -0
- package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
- package/src/py/agent/gateway-connection/generator.js +15 -9
- package/src/py/agent/gateway-connection/generator.js.map +1 -1
- package/src/py/agent/generator.js +69 -14
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +30 -0
- package/src/py/agent/mcp-connection/generator.js +15 -11
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/serve-local.js +9 -1
- package/src/py/agent/react-connection/serve-local.js.map +1 -1
- package/src/py/agent/schema.d.ts +1 -1
- package/src/py/agent/schema.json +1 -1
- package/src/py/dynamodb/agent-connection/generator.js +1 -1
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/py/dynamodb/fast-api-connection/generator.js +1 -1
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -1
- package/src/py/dynamodb/mcp-server-connection/generator.js +1 -1
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/py/project/generator.d.ts +14 -1
- package/src/py/project/generator.js +12 -2
- package/src/py/project/generator.js.map +1 -1
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +4 -0
- package/src/ts/rdb/files/src/utils.ts.template +2 -0
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +25 -72
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +17 -4
- package/src/utils/agent-connection/agent-connection.d.ts +58 -9
- package/src/utils/agent-connection/agent-connection.js +146 -13
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
- package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
- package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +1 -1
- package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +17 -4
- package/src/utils/names.d.ts +16 -0
- package/src/utils/names.js +18 -1
- package/src/utils/names.js.map +1 -1
- package/src/utils/py.d.ts +14 -1
- package/src/utils/py.js +34 -7
- package/src/utils/py.js.map +1 -1
- package/src/utils/versions.d.ts +6 -0
- package/src/utils/versions.js +6 -0
- package/src/utils/versions.js.map +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import time
|
|
3
|
+
import uuid
|
|
4
|
+
|
|
5
|
+
from ag_ui.core import EventType, RunAgentInput, RunErrorEvent
|
|
6
|
+
from ag_ui.encoder import EventEncoder
|
|
7
|
+
from ag_ui_langgraph import LangGraphAgent
|
|
8
|
+
from fastapi import FastAPI, Request
|
|
9
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
10
|
+
from fastapi.responses import JSONResponse, StreamingResponse
|
|
11
|
+
from <%- agentConnectionModuleName %> import get_current_session_id, session_id_context
|
|
12
|
+
from starlette.middleware.base import BaseHTTPMiddleware
|
|
13
|
+
|
|
14
|
+
from .agent import get_agent
|
|
15
|
+
|
|
16
|
+
logging.basicConfig(level=logging.INFO)
|
|
17
|
+
|
|
18
|
+
SESSION_ID_HEADER = "x-amzn-bedrock-agentcore-runtime-session-id"
|
|
19
|
+
|
|
20
|
+
_graph = get_agent()
|
|
21
|
+
|
|
22
|
+
agui_agent = LangGraphAgent(
|
|
23
|
+
name="<%= agentNameClassName %>",
|
|
24
|
+
graph=_graph,
|
|
25
|
+
description="A LangChain/LangGraph Agent exposed via the AG-UI protocol.",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class _SessionIdMiddleware(BaseHTTPMiddleware):
|
|
30
|
+
"""Bind the session ID for this request so downstream MCP / A2A clients forward it on outbound calls."""
|
|
31
|
+
|
|
32
|
+
async def dispatch(self, request: Request, call_next):
|
|
33
|
+
session_id = request.headers.get(SESSION_ID_HEADER) or str(uuid.uuid4())
|
|
34
|
+
with session_id_context(session_id):
|
|
35
|
+
return await call_next(request)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
app = FastAPI(title="<%= agentNameClassName %>")
|
|
39
|
+
# Allow browser-based AG-UI clients (e.g. a connected React website) to call
|
|
40
|
+
# this agent cross-origin, including the CORS preflight.
|
|
41
|
+
app.add_middleware(
|
|
42
|
+
CORSMiddleware,
|
|
43
|
+
allow_origins=["*"],
|
|
44
|
+
allow_credentials=True,
|
|
45
|
+
allow_methods=["*"],
|
|
46
|
+
allow_headers=["*"],
|
|
47
|
+
)
|
|
48
|
+
app.add_middleware(_SessionIdMiddleware)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@app.post("/invocations")
|
|
52
|
+
async def invocations(request: Request):
|
|
53
|
+
# Validate the body manually since AgentCore may omit Content-Type.
|
|
54
|
+
accept = request.headers.get("accept") or ""
|
|
55
|
+
encoder = EventEncoder(accept=accept)
|
|
56
|
+
raw = await request.body()
|
|
57
|
+
try:
|
|
58
|
+
input_data = RunAgentInput.model_validate_json(raw)
|
|
59
|
+
except Exception as exc:
|
|
60
|
+
message = f"Invalid RunAgentInput: {str(exc)[:200]}"
|
|
61
|
+
|
|
62
|
+
async def _bad():
|
|
63
|
+
yield encoder.encode(RunErrorEvent(type=EventType.RUN_ERROR, message=message, code="BAD_REQUEST"))
|
|
64
|
+
|
|
65
|
+
return StreamingResponse(_bad(), media_type=encoder.get_content_type())
|
|
66
|
+
|
|
67
|
+
session_id = request.headers.get(SESSION_ID_HEADER) or get_current_session_id()
|
|
68
|
+
|
|
69
|
+
async def event_generator():
|
|
70
|
+
# Re-bind the session: the streaming body runs outside the middleware.
|
|
71
|
+
with session_id_context(session_id or str(uuid.uuid4())):
|
|
72
|
+
try:
|
|
73
|
+
async for event in agui_agent.run(input_data):
|
|
74
|
+
yield encoder.encode(event)
|
|
75
|
+
except Exception as e:
|
|
76
|
+
yield encoder.encode(RunErrorEvent(type=EventType.RUN_ERROR, message=str(e)[:300], code="AGENT_ERROR"))
|
|
77
|
+
|
|
78
|
+
return StreamingResponse(event_generator(), media_type=encoder.get_content_type())
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@app.get("/ping")
|
|
82
|
+
async def ping():
|
|
83
|
+
return JSONResponse({"status": "Healthy", "time_of_last_update": int(time.time())})
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from langchain.agents import create_agent
|
|
4
|
+
from langchain_aws import ChatBedrockConverse
|
|
5
|
+
from langchain_core.tools import tool
|
|
6
|
+
from langgraph.checkpoint.memory import InMemorySaver
|
|
7
|
+
|
|
8
|
+
REGION = os.environ.get("AWS_REGION", "us-east-1")
|
|
9
|
+
MODEL_ID = os.environ.get("MODEL_ID", "global.anthropic.claude-haiku-4-5-20251001-v1:0")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@tool
|
|
13
|
+
def subtract(a: int, b: int) -> int:
|
|
14
|
+
"""Subtract b from a."""
|
|
15
|
+
return a - b
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_agent():
|
|
19
|
+
model = ChatBedrockConverse(model=MODEL_ID, region_name=REGION)
|
|
20
|
+
# Swap InMemorySaver for a durable checkpointer in a multi-replica deployment.
|
|
21
|
+
return create_agent(
|
|
22
|
+
model=model,
|
|
23
|
+
tools=[subtract],
|
|
24
|
+
system_prompt="""
|
|
25
|
+
You are a mathematical wizard.
|
|
26
|
+
Use your tools for mathematical tasks.
|
|
27
|
+
Refer to tools as your 'spellbook'.
|
|
28
|
+
""",
|
|
29
|
+
checkpointer=InMemorySaver(),
|
|
30
|
+
)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
|
|
3
|
+
import uvicorn
|
|
4
|
+
from bedrock_agentcore.runtime.models import PingStatus
|
|
5
|
+
from fastapi import Request
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from starlette.middleware.base import BaseHTTPMiddleware
|
|
8
|
+
from <%- agentConnectionModuleName %> import get_current_session_id, session_id_context
|
|
9
|
+
|
|
10
|
+
from .agent import get_agent
|
|
11
|
+
from .init import JsonStreamingResponse, app
|
|
12
|
+
|
|
13
|
+
SESSION_ID_HEADER = "x-amzn-bedrock-agentcore-runtime-session-id"
|
|
14
|
+
|
|
15
|
+
_graph = get_agent()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InvokeInput(BaseModel):
|
|
19
|
+
message: str = Field(max_length=100000)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class StreamChunk(BaseModel):
|
|
23
|
+
content: str
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _text(content) -> str:
|
|
27
|
+
# ChatBedrockConverse streams content as a list of blocks, not a plain string.
|
|
28
|
+
if isinstance(content, str):
|
|
29
|
+
return content
|
|
30
|
+
return "".join(
|
|
31
|
+
block.get("text", "")
|
|
32
|
+
for block in content
|
|
33
|
+
if isinstance(block, dict) and block.get("type") == "text"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def handle_invoke(input: InvokeInput, session_id: str):
|
|
38
|
+
"""Streaming handler for agent invocation"""
|
|
39
|
+
# The session id is the LangGraph thread id, so the checkpointer keeps memory per session.
|
|
40
|
+
config = {"configurable": {"thread_id": session_id}}
|
|
41
|
+
# Re-bind the session: the streaming body runs outside the middleware scope.
|
|
42
|
+
with session_id_context(session_id):
|
|
43
|
+
stream = _graph.astream(
|
|
44
|
+
{"messages": [{"role": "user", "content": input.message}]},
|
|
45
|
+
config,
|
|
46
|
+
stream_mode="messages",
|
|
47
|
+
)
|
|
48
|
+
async for message_chunk, _metadata in stream:
|
|
49
|
+
text = _text(message_chunk.content)
|
|
50
|
+
if text:
|
|
51
|
+
yield StreamChunk(content=text)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@app.post(
|
|
55
|
+
"/invocations",
|
|
56
|
+
response_class=JsonStreamingResponse,
|
|
57
|
+
responses={200: JsonStreamingResponse.openapi_response(StreamChunk, "Stream of agent response chunks")},
|
|
58
|
+
)
|
|
59
|
+
async def invoke(input: InvokeInput) -> JsonStreamingResponse:
|
|
60
|
+
"""Entry point for agent invocation"""
|
|
61
|
+
session_id = get_current_session_id() or str(uuid.uuid4())
|
|
62
|
+
return JsonStreamingResponse(handle_invoke(input, session_id))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class _SessionIdMiddleware(BaseHTTPMiddleware):
|
|
66
|
+
"""Bind the inbound session (or a fresh UUID) to async context."""
|
|
67
|
+
|
|
68
|
+
async def dispatch(self, request: Request, call_next):
|
|
69
|
+
session_id = request.headers.get(SESSION_ID_HEADER) or str(uuid.uuid4())
|
|
70
|
+
with session_id_context(session_id):
|
|
71
|
+
return await call_next(request)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
app.add_middleware(_SessionIdMiddleware)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@app.get("/ping")
|
|
78
|
+
def ping() -> str:
|
|
79
|
+
# TODO: if running an async task, return PingStatus.HEALTHY_BUSY
|
|
80
|
+
return PingStatus.HEALTHY
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
if __name__ == "__main__":
|
|
84
|
+
uvicorn.run("<%- moduleName %>.<%- agentNameSnakeCase %>.main:app", port=8080)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from langchain_core.tools import BaseTool
|
|
4
|
+
|
|
5
|
+
from <%- agentConnectionModuleName %>.core.agentcore_gateway_mcp_client_langchain import (
|
|
6
|
+
AgentCoreGatewayMCPClientLangChain,
|
|
7
|
+
)
|
|
8
|
+
from <%- agentConnectionModuleName %>.core.runtime_config import (
|
|
9
|
+
get_agentcore_runtime_config,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class <%- gatewayClassName %>ClientLangChain:
|
|
14
|
+
"""Loads LangChain tools from the <%- gatewayClassName %> AgentCore Gateway.
|
|
15
|
+
|
|
16
|
+
Deployed: SigV4-signed tools pointing at the gateway URL. Local
|
|
17
|
+
(``SERVE_LOCAL=true``): plain-HTTP tools pointing at the local gateway
|
|
18
|
+
started by the gateway project's serve-local target. The local gateway
|
|
19
|
+
aggregates every attached MCP server but does not evaluate Cedar policies.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@staticmethod
|
|
23
|
+
def create() -> list[BaseTool]:
|
|
24
|
+
if os.environ.get("SERVE_LOCAL") == "true":
|
|
25
|
+
return AgentCoreGatewayMCPClientLangChain.without_auth(
|
|
26
|
+
gateway_url="http://localhost:<%- gatewayPort %>/mcp"
|
|
27
|
+
)
|
|
28
|
+
config = get_agentcore_runtime_config()
|
|
29
|
+
gateway_url = config.get("gateways", {}).get("<%- gatewayClassName %>")
|
|
30
|
+
if not gateway_url:
|
|
31
|
+
raise RuntimeError(
|
|
32
|
+
"No connected gateway named '<%- gatewayClassName %>' found in runtime configuration."
|
|
33
|
+
)
|
|
34
|
+
return AgentCoreGatewayMCPClientLangChain.with_iam_auth(gateway_url=gateway_url)
|
|
@@ -37,21 +37,27 @@ const pyAgentGatewayConnectionGenerator = async (tree, options) => {
|
|
|
37
37
|
const gatewayKebabCase = gatewaySnakeCase.replace(/_/g, '-');
|
|
38
38
|
const gatewayServeTargetName = `${gatewayKebabCase}-serve`;
|
|
39
39
|
const gatewayServeLocalTargetName = `${gatewayKebabCase}-serve-local`;
|
|
40
|
+
// The source agent's framework selects the client shape, dependencies and the
|
|
41
|
+
// agent.py transform — see PY_MCP_FAMILY_CONNECTIONS (keyed by framework, not a
|
|
42
|
+
// boolean, so a third framework is an additive entry there). A Gateway exposes
|
|
43
|
+
// its tools over MCP, so it reuses the same wiring as an MCP server connection.
|
|
44
|
+
const framework = (0, agent_connection_1.resolveAgentFramework)(agentComponent.framework);
|
|
45
|
+
const connection = agent_connection_1.PY_MCP_FAMILY_CONNECTIONS[framework];
|
|
40
46
|
await (0, agent_connection_1.ensurePythonAgentConnectionProject)(tree);
|
|
41
|
-
await (0, agent_connection_1.addPythonCoreClient)(tree, 'gateway');
|
|
47
|
+
await (0, agent_connection_1.addPythonCoreClient)(tree, 'gateway', framework);
|
|
42
48
|
const agentConnectionProjectDir = (0, agent_connection_1.getPythonAgentConnectionProjectDir)(tree);
|
|
43
49
|
const agentConnectionModuleName = (0, agent_connection_1.getPythonAgentConnectionModuleName)(tree);
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
// own dependency (strands-agents) is added by addPythonCoreClient.
|
|
50
|
+
// Shared MCP transport + signed httpx auth deps, plus whatever extra deps the
|
|
51
|
+
// framework's MCP client needs (e.g. langchain-mcp-adapters for LangChain).
|
|
47
52
|
(0, py_1.addDependenciesToPyProjectToml)(tree, agentConnectionProjectDir, [
|
|
48
53
|
'boto3',
|
|
49
54
|
'httpx',
|
|
50
55
|
'mcp',
|
|
56
|
+
...connection.deps,
|
|
51
57
|
]);
|
|
52
58
|
const appDir = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, 'app');
|
|
53
59
|
// Local mode points at the gateway project's local gateway port.
|
|
54
|
-
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files',
|
|
60
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', connection.appTemplateSubdir), appDir, {
|
|
55
61
|
gatewaySnakeCase,
|
|
56
62
|
gatewayClassName,
|
|
57
63
|
agentConnectionModuleName,
|
|
@@ -62,16 +68,16 @@ const pyAgentGatewayConnectionGenerator = async (tree, options) => {
|
|
|
62
68
|
tree.write(appInitPath, '');
|
|
63
69
|
}
|
|
64
70
|
const moduleInitPath = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, '__init__.py');
|
|
65
|
-
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${gatewaySnakeCase}
|
|
71
|
+
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${gatewaySnakeCase}_client_${connection.clientModuleSuffix}`, `${gatewayClassName}Client${connection.clientClassSuffix}`);
|
|
66
72
|
const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, agentComponent.path ?? 'src');
|
|
67
73
|
const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.py');
|
|
68
74
|
if (tree.exists(agentFilePath)) {
|
|
69
|
-
const clientClassName = `${gatewayClassName}
|
|
75
|
+
const clientClassName = `${gatewayClassName}Client${connection.clientClassSuffix}`;
|
|
70
76
|
const clientVarName = gatewaySnakeCase;
|
|
71
77
|
await (0, ast_1.addPythonDestructuredImport)(tree, agentFilePath, [clientClassName], agentConnectionModuleName);
|
|
72
|
-
await
|
|
78
|
+
await connection.wireClientIntoAgent(tree, agentFilePath, clientClassName, clientVarName);
|
|
73
79
|
}
|
|
74
|
-
(0, py_1.addWorkspaceDependencyToPyProject)(tree, sourceProject
|
|
80
|
+
(0, py_1.addWorkspaceDependencyToPyProject)(tree, sourceProject, (0, agent_connection_1.getPythonAgentConnectionProject)(tree));
|
|
75
81
|
const agentName = agentComponent.name ?? 'agent';
|
|
76
82
|
const serveTargetName = `${agentName}-serve`;
|
|
77
83
|
const serveLocalTargetName = `${agentName}-serve-local`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/gateway-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCAQoB;AACpB,oEAAoF;AACpF,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/gateway-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ exports.pyAgentGenerator = exports.PY_AGENT_GENERATOR_INFO = void 0;
|
|
|
6
6
|
* SPDX-License-Identifier: Apache-2.0
|
|
7
7
|
*/
|
|
8
8
|
const devkit_1 = require("@nx/devkit");
|
|
9
|
+
const config_1 = require("../../license/config");
|
|
10
|
+
const known_exceptions_1 = require("../../license/known-exceptions");
|
|
9
11
|
const agent_chat_1 = require("../../utils/agent-chat/agent-chat");
|
|
10
12
|
const agent_connection_1 = require("../../utils/agent-connection/agent-connection");
|
|
11
13
|
const agent_core_constructs_1 = require("../../utils/agent-core-constructs/agent-core-constructs");
|
|
@@ -47,6 +49,7 @@ const pyAgentGenerator = async (tree, options) => {
|
|
|
47
49
|
const targetSourceDir = (0, devkit_1.joinPathFragments)(project.sourceRoot, agentNameSnakeCase);
|
|
48
50
|
const infra = options.infra ?? 'agentcore';
|
|
49
51
|
const protocol = options.protocol ?? 'http';
|
|
52
|
+
const framework = options.framework ?? 'strands';
|
|
50
53
|
if (infra === 'none' && options.auth && options.auth !== 'iam') {
|
|
51
54
|
console.warn('Warning: auth is ignored when no infrastructure is configured (no infrastructure is generated)');
|
|
52
55
|
}
|
|
@@ -57,22 +60,45 @@ const pyAgentGenerator = async (tree, options) => {
|
|
|
57
60
|
// generator wires into this agent.
|
|
58
61
|
await (0, agent_connection_1.ensurePythonAgentConnectionProject)(tree);
|
|
59
62
|
// The agent server imports the framework base helpers (session cache + model
|
|
60
|
-
// error logging) regardless of whether a connection client is wired in.
|
|
61
|
-
|
|
63
|
+
// error logging) regardless of whether a connection client is wired in. The
|
|
64
|
+
// langchain framework has no base layer (its AG-UI foundation reuses only the
|
|
65
|
+
// framework-agnostic session context), so this is a no-op for langchain.
|
|
66
|
+
await (0, agent_connection_1.addPythonFrameworkBase)(tree, framework);
|
|
62
67
|
const agentConnectionModuleName = (0, agent_connection_1.getPythonAgentConnectionModuleName)(tree);
|
|
63
|
-
|
|
64
|
-
(0, py_1.addWorkspaceDependencyToPyProject)(tree, project.root, agentConnectionPackageName);
|
|
68
|
+
(0, py_1.addWorkspaceDependencyToPyProject)(tree, project, (0, agent_connection_1.getPythonAgentConnectionProject)(tree));
|
|
65
69
|
const templateContext = {
|
|
66
70
|
name,
|
|
67
71
|
agentNameSnakeCase,
|
|
68
72
|
agentNameClassName,
|
|
69
73
|
moduleName,
|
|
70
74
|
agentConnectionModuleName,
|
|
75
|
+
framework,
|
|
71
76
|
};
|
|
72
|
-
// Generate common files shared by both protocols
|
|
73
|
-
|
|
74
|
-
//
|
|
75
|
-
|
|
77
|
+
// Generate common files shared by both protocols. The agent module (agent.py)
|
|
78
|
+
// is framework-specific (Strands yields a contextmanaged Agent; LangChain
|
|
79
|
+
// returns a compiled create_agent graph), so it comes from a per-framework
|
|
80
|
+
// dir. The package __init__.py is framework-agnostic (it stays in `common`).
|
|
81
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', framework === 'langchain' ? 'common-langchain' : 'common'), targetSourceDir, templateContext, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
82
|
+
if (framework === 'langchain') {
|
|
83
|
+
// common-langchain only carries agent.py; the empty package __init__.py is
|
|
84
|
+
// framework-agnostic, so emit it from the shared `common` dir.
|
|
85
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'common'), targetSourceDir, templateContext, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
86
|
+
}
|
|
87
|
+
// Generate protocol-specific files. Each protocol's server entry point is
|
|
88
|
+
// framework-specific (Strands yields a contextmanaged Agent; LangChain drives
|
|
89
|
+
// a compiled create_agent graph), so it comes from a per-framework dir
|
|
90
|
+
// `<protocol>-langchain` for LangChain, or `<protocol>` for Strands.
|
|
91
|
+
const protocolLower = protocol.toLowerCase();
|
|
92
|
+
const protocolTemplateDir = framework === 'langchain' ? `${protocolLower}-langchain` : protocolLower;
|
|
93
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', protocolTemplateDir), targetSourceDir, templateContext, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
94
|
+
// The HTTP server's init.py (the FastAPI app + JsonStreamingResponse) is
|
|
95
|
+
// framework-agnostic and the LangChain http main.py reuses it, so emit it
|
|
96
|
+
// from the shared `http` dir. Emitted after the langchain main.py above so
|
|
97
|
+
// KeepExisting preserves that main.py and only adds init.py (the shared dir's
|
|
98
|
+
// own Strands main.py is skipped).
|
|
99
|
+
if (protocolLower === 'http' && framework === 'langchain') {
|
|
100
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', 'http'), targetSourceDir, templateContext, { overwriteStrategy: devkit_1.OverwriteStrategy.KeepExisting });
|
|
101
|
+
}
|
|
76
102
|
(0, py_1.addDependenciesToPyProjectToml)(tree, project.root, [
|
|
77
103
|
'aws-lambda-powertools',
|
|
78
104
|
'aws-opentelemetry-distro',
|
|
@@ -80,12 +106,31 @@ const pyAgentGenerator = async (tree, options) => {
|
|
|
80
106
|
'boto3',
|
|
81
107
|
'fastapi',
|
|
82
108
|
'mcp',
|
|
83
|
-
...(
|
|
84
|
-
?
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
109
|
+
...(framework === 'langchain'
|
|
110
|
+
? // langchain pulls no Strands dependencies — the langchain model binding
|
|
111
|
+
// (langchain, langchain-aws, langgraph) plus the per-protocol server
|
|
112
|
+
// adapter: ag-ui-langgraph for AG-UI, a2a-sdk for A2A, nothing extra for
|
|
113
|
+
// HTTP (FastAPI is added above for every agent).
|
|
114
|
+
[
|
|
115
|
+
'langchain',
|
|
116
|
+
'langchain-aws',
|
|
117
|
+
'langgraph',
|
|
118
|
+
...(protocol === 'ag-ui'
|
|
119
|
+
? ['ag-ui-protocol', 'ag-ui-langgraph']
|
|
120
|
+
: protocol === 'a2a'
|
|
121
|
+
? ['a2a-sdk']
|
|
122
|
+
: []),
|
|
123
|
+
]
|
|
124
|
+
: protocol === 'a2a'
|
|
125
|
+
? ['strands-agents[a2a]', 'strands-agents-tools']
|
|
126
|
+
: protocol === 'ag-ui'
|
|
127
|
+
? [
|
|
128
|
+
'strands-agents',
|
|
129
|
+
'strands-agents-tools',
|
|
130
|
+
'ag-ui-protocol',
|
|
131
|
+
'ag-ui-strands',
|
|
132
|
+
]
|
|
133
|
+
: ['strands-agents', 'strands-agents-tools']),
|
|
89
134
|
'uvicorn',
|
|
90
135
|
]);
|
|
91
136
|
(0, py_1.addDependenciesToDependencyGroupInPyProjectToml)(tree, project.root, 'dev', [
|
|
@@ -283,8 +328,18 @@ const pyAgentGenerator = async (tree, options) => {
|
|
|
283
328
|
rc: agentNameClassName,
|
|
284
329
|
auth,
|
|
285
330
|
protocol,
|
|
331
|
+
// The mcp / gateway connection generators dispatch on this field to pick
|
|
332
|
+
// the Strands vs LangChain Layer-2 client + agent.py transform.
|
|
333
|
+
framework,
|
|
286
334
|
});
|
|
287
335
|
await (0, metrics_1.addGeneratorMetricsIfApplicable)(tree, [exports.PY_AGENT_GENERATOR_INFO]);
|
|
336
|
+
// langchain-core (pulled by every langchain agent regardless of protocol)
|
|
337
|
+
// brings jsonpatch/jsonpointer, whose wheels ship without resolvable SPDX
|
|
338
|
+
// license metadata, so register those exceptions so the workspace license
|
|
339
|
+
// check still passes.
|
|
340
|
+
if (framework === 'langchain') {
|
|
341
|
+
await (0, config_1.ensureLicenseExceptions)(tree, known_exceptions_1.AG_UI_LANGGRAPH_EXCEPTIONS);
|
|
342
|
+
}
|
|
288
343
|
await (0, format_1.formatFilesInSubtree)(tree);
|
|
289
344
|
return async () => {
|
|
290
345
|
(0, devkit_1.installPackagesTask)(tree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/py/agent/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCASoB;AACpB,kEAAwE;AACxE,oFAKuD;AACvD,mGAAwF;AACxF,sDAAkE;AAClE,uDAA2D;AAC3D,+CAA0D;AAC1D,uCAA4C;AAC5C,yCAAkD;AAClD,yCAA6C;AAC7C,iDAAsE;AACtE,6CAAwE;AACxE,qDAAoD;AACpD,uCAMwB;AACxB,yDAA6D;AAC7D,+CAAoD;AACpD,6CAA0D;AAC1D,2CAA8C;AAC9C,uCAIwB;AACxB,qEAA0E;AAC1E,mDAAoD;AAGvC,QAAA,uBAAuB,GAClC,IAAA,qBAAgB,EAAC,UAAU,CAAC,CAAC;AAExB,MAAM,gBAAgB,GAAG,KAAK,EACnC,IAAU,EACV,OAA+B,EACH,EAAE;IAC9B,MAAM,OAAO,GAAG,IAAA,wCAAmC,EAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3E,MAAM,aAAa,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAExE,iDAAiD;IACjD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,CAAC,OAAO,qDAAqD,CAC5F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,gIAAgI,CACjI,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,IAAA,iBAAS,EACpB,OAAO,CAAC,IAAI,IAAI,GAAG,IAAA,iBAAS,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CACpE,CAAC;IACF,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAExD,MAAM,kBAAkB,GAAG,IAAA,mBAAW,EAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC;IAE7C,MAAM,eAAe,GAAG,IAAA,0BAAiB,EACvC,OAAO,CAAC,UAAU,EAClB,kBAAkB,CACnB,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/py/agent/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from langchain_core.tools import BaseTool
|
|
4
|
+
|
|
5
|
+
from <%- agentConnectionModuleName %>.core.agentcore_mcp_client_langchain import (
|
|
6
|
+
AgentCoreMCPClientLangChain,
|
|
7
|
+
)
|
|
8
|
+
from <%- agentConnectionModuleName %>.core.runtime_config import (
|
|
9
|
+
get_agentcore_runtime_config,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class <%- mcpServerClassName %>ClientLangChain:
|
|
14
|
+
"""Loads LangChain tools from the <%- mcpServerClassName %> MCP server."""
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def create() -> list[BaseTool]:
|
|
18
|
+
if os.environ.get("SERVE_LOCAL") == "true":
|
|
19
|
+
return AgentCoreMCPClientLangChain.without_auth(
|
|
20
|
+
"http://localhost:<%- mcpServerPort %>/mcp"
|
|
21
|
+
)
|
|
22
|
+
config = get_agentcore_runtime_config()
|
|
23
|
+
agent_runtime_arn = config.get("agentRuntimes", {}).get(
|
|
24
|
+
"<%- mcpServerClassName %>"
|
|
25
|
+
)
|
|
26
|
+
if not agent_runtime_arn:
|
|
27
|
+
raise RuntimeError(
|
|
28
|
+
"No connected MCP server runtime named '<%- mcpServerClassName %>' found in runtime configuration."
|
|
29
|
+
)
|
|
30
|
+
return AgentCoreMCPClientLangChain.with_iam_auth(agent_runtime_arn)
|
|
@@ -29,24 +29,28 @@ const pyAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
29
29
|
const mcpServerClassName = mcpComponent.rc;
|
|
30
30
|
const mcpServerSnakeCase = (0, names_1.snakeCase)(mcpServerClassName);
|
|
31
31
|
const mcpServerPort = mcpComponent.port ?? 8000;
|
|
32
|
+
// The source agent's framework selects the client shape, dependencies and the
|
|
33
|
+
// agent.py transform — see PY_MCP_FAMILY_CONNECTIONS (keyed by framework, not a
|
|
34
|
+
// boolean, so a third framework is an additive entry there).
|
|
35
|
+
const framework = (0, agent_connection_1.resolveAgentFramework)(agentComponent.framework);
|
|
36
|
+
const connection = agent_connection_1.PY_MCP_FAMILY_CONNECTIONS[framework];
|
|
32
37
|
// 1. Ensure the shared Python agent-connection project exists + has the
|
|
33
|
-
// MCP core client and its shared SigV4 auth helper.
|
|
38
|
+
// MCP core client (framework Layer-2) and its shared SigV4 auth helper.
|
|
34
39
|
await (0, agent_connection_1.ensurePythonAgentConnectionProject)(tree);
|
|
35
|
-
await (0, agent_connection_1.addPythonCoreClient)(tree, 'mcp');
|
|
40
|
+
await (0, agent_connection_1.addPythonCoreClient)(tree, 'mcp', framework);
|
|
36
41
|
const agentConnectionProjectDir = (0, agent_connection_1.getPythonAgentConnectionProjectDir)(tree);
|
|
37
42
|
const agentConnectionModuleName = (0, agent_connection_1.getPythonAgentConnectionModuleName)(tree);
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
// Layer 0/1 deps for the MCP transport + signed httpx auth. The framework's
|
|
41
|
-
// own dependency (strands-agents) is added by addPythonCoreClient.
|
|
43
|
+
// Shared MCP transport + signed httpx auth deps, plus whatever extra deps the
|
|
44
|
+
// framework's MCP client needs (e.g. langchain-mcp-adapters for LangChain).
|
|
42
45
|
(0, py_1.addDependenciesToPyProjectToml)(tree, agentConnectionProjectDir, [
|
|
43
46
|
'boto3',
|
|
44
47
|
'httpx',
|
|
45
48
|
'mcp',
|
|
49
|
+
...connection.deps,
|
|
46
50
|
]);
|
|
47
51
|
// 2. Generate the per-connection client into the shared agent-connection project
|
|
48
52
|
const appDir = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, 'app');
|
|
49
|
-
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files',
|
|
53
|
+
(0, devkit_1.generateFiles)(tree, (0, devkit_1.joinPathFragments)(__dirname, 'files', connection.appTemplateSubdir), appDir, {
|
|
50
54
|
mcpServerSnakeCase,
|
|
51
55
|
mcpServerClassName,
|
|
52
56
|
mcpServerPort,
|
|
@@ -59,18 +63,18 @@ const pyAgentMcpConnectionGenerator = async (tree, options) => {
|
|
|
59
63
|
}
|
|
60
64
|
// Add re-export to module __init__.py
|
|
61
65
|
const moduleInitPath = (0, devkit_1.joinPathFragments)(agentConnectionProjectDir, agentConnectionModuleName, '__init__.py');
|
|
62
|
-
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${mcpServerSnakeCase}
|
|
66
|
+
await (0, agent_connection_1.addPythonReExport)(tree, moduleInitPath, `.app.${mcpServerSnakeCase}_client_${connection.clientModuleSuffix}`, `${mcpServerClassName}Client${connection.clientClassSuffix}`);
|
|
63
67
|
// 3. Transform agent.py to add MCP client import and usage
|
|
64
68
|
const agentSourceDir = (0, devkit_1.joinPathFragments)(sourceProject.root, agentComponent.path ?? 'src');
|
|
65
69
|
const agentFilePath = (0, devkit_1.joinPathFragments)(agentSourceDir, 'agent.py');
|
|
66
70
|
if (tree.exists(agentFilePath)) {
|
|
67
|
-
const clientClassName = `${mcpServerClassName}
|
|
71
|
+
const clientClassName = `${mcpServerClassName}Client${connection.clientClassSuffix}`;
|
|
68
72
|
const clientVarName = mcpServerSnakeCase;
|
|
69
73
|
await (0, ast_1.addPythonDestructuredImport)(tree, agentFilePath, [clientClassName], agentConnectionModuleName);
|
|
70
|
-
await
|
|
74
|
+
await connection.wireClientIntoAgent(tree, agentFilePath, clientClassName, clientVarName);
|
|
71
75
|
}
|
|
72
76
|
// 4. Add workspace dependency from agent project to agent-connection project
|
|
73
|
-
(0, py_1.addWorkspaceDependencyToPyProject)(tree, sourceProject
|
|
77
|
+
(0, py_1.addWorkspaceDependencyToPyProject)(tree, sourceProject, (0, agent_connection_1.getPythonAgentConnectionProject)(tree));
|
|
74
78
|
// 5. Set up serve-local target dependencies
|
|
75
79
|
const agentName = agentComponent.name ?? 'agent';
|
|
76
80
|
const serveLocalTargetName = `${agentName}-serve-local`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/mcp-connection/generator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uCAQoB;AACpB,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/mcp-connection/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,20 @@ const names_1 = require("../../../utils/names");
|
|
|
8
8
|
* Updates the runtime config provider (if it exists) to point to the local HTTP URL.
|
|
9
9
|
*/
|
|
10
10
|
const addPyAgentTargetToServeLocal = async (tree, sourceProjectName, targetProjectName, options) => {
|
|
11
|
+
// AG-UI clients POST to the runtime config URL directly, so it must point at
|
|
12
|
+
// the agent's `/invocations` endpoint. HTTP agents go through the generated
|
|
13
|
+
// OpenAPI client, which appends the `/invocations` operation path itself, so
|
|
14
|
+
// its base URL must omit it (otherwise the request hits `/invocations/invocations`).
|
|
15
|
+
const protocol = (options.targetComponent?.protocol ?? 'http').toLowerCase();
|
|
16
|
+
const localUrl = protocol === 'ag-ui'
|
|
17
|
+
? `http://localhost:${options.port}/invocations`
|
|
18
|
+
: `http://localhost:${options.port}`;
|
|
11
19
|
await (0, agent_serve_local_1.addAgentTargetToServeLocal)(tree, sourceProjectName, targetProjectName, {
|
|
12
20
|
agentNameClassName: options.agentNameClassName,
|
|
13
21
|
port: options.port,
|
|
14
22
|
targetComponent: options.targetComponent,
|
|
15
23
|
runtimeConfigNamespace: 'agentRuntimes',
|
|
16
|
-
localUrl
|
|
24
|
+
localUrl,
|
|
17
25
|
additionalDependencyTargets: options.additionalDependencyTargets,
|
|
18
26
|
});
|
|
19
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-local.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/react-connection/serve-local.ts"],"names":[],"mappings":";;;AAKA,6EAAmF;AACnF,gDAAiD;AAWjD;;;GAGG;AACI,MAAM,4BAA4B,GAAG,KAAK,EAC/C,IAAU,EACV,iBAAyB,EACzB,iBAAyB,EACzB,OAAiC,EACjC,EAAE;IACF,MAAM,IAAA,8CAA0B,EAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE;QAC3E,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,sBAAsB,EAAE,eAAe;QACvC,QAAQ
|
|
1
|
+
{"version":3,"file":"serve-local.js","sourceRoot":"","sources":["../../../../../../../packages/nx-plugin/src/py/agent/react-connection/serve-local.ts"],"names":[],"mappings":";;;AAKA,6EAAmF;AACnF,gDAAiD;AAWjD;;;GAGG;AACI,MAAM,4BAA4B,GAAG,KAAK,EAC/C,IAAU,EACV,iBAAyB,EACzB,iBAAyB,EACzB,OAAiC,EACjC,EAAE;IACF,6EAA6E;IAC7E,4EAA4E;IAC5E,6EAA6E;IAC7E,qFAAqF;IACrF,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,MAAM,QAAQ,GACZ,QAAQ,KAAK,OAAO;QAClB,CAAC,CAAC,oBAAoB,OAAO,CAAC,IAAI,cAAc;QAChD,CAAC,CAAC,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzC,MAAM,IAAA,8CAA0B,EAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE;QAC3E,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,sBAAsB,EAAE,eAAe;QACvC,QAAQ;QACR,2BAA2B,EAAE,OAAO,CAAC,2BAA2B;KACjE,CAAC,CAAC;AACL,CAAC,CAAC;AAxBW,QAAA,4BAA4B,gCAwBvC;AAEF;;;GAGG;AACI,MAAM,2BAA2B,GAAG,CACzC,kBAA0B,EAChB,EAAE;IACZ,MAAM,eAAe,GAAG,YAAY,IAAA,iBAAS,EAAC,kBAAkB,CAAC,SAAS,CAAC;IAC3E,OAAO,CAAC,eAAe,EAAE,SAAS,eAAe,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AALW,QAAA,2BAA2B,+BAKtC"}
|