@aws/nx-plugin 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE-THIRD-PARTY +71 -93
  2. package/migrations.json +15 -5
  3. package/package.json +6 -6
  4. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +1 -1
  5. package/src/infra/app/__snapshots__/generator.spec.ts.snap +3 -3
  6. package/src/migrations/latest/pin-strands-express-peer/metadata.json +3 -0
  7. package/src/migrations/latest/pin-strands-express-peer/migration.d.ts +29 -0
  8. package/src/migrations/latest/pin-strands-express-peer/migration.js +58 -0
  9. package/src/migrations/latest/pin-strands-express-peer/migration.js.map +1 -0
  10. package/src/migrations/latest/rdb-drop-lambda-rie/metadata.json +3 -0
  11. package/src/migrations/latest/rdb-drop-lambda-rie/migration.js +105 -0
  12. package/src/migrations/latest/rdb-drop-lambda-rie/migration.js.map +1 -0
  13. package/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.d.ts +6 -0
  14. package/src/migrations/v1.0.5/0001-api-custom-domain-runtime-config/migration.js.map +1 -0
  15. package/src/preset/__snapshots__/generator.spec.ts.snap +2 -2
  16. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +6 -6
  17. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +8 -8
  18. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +4 -4
  19. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  20. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  21. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  22. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +4 -4
  23. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +22 -10
  24. package/src/py/rdb/files/Dockerfile.create-db-user.template +5 -2
  25. package/src/py/rdb/files/Dockerfile.migration.template +5 -2
  26. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +5 -5
  27. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +8 -8
  28. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  29. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +4 -4
  30. package/src/ts/agent/a2a-connection/generator.d.ts +26 -30
  31. package/src/ts/agent/a2a-connection/generator.js +9 -5
  32. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  33. package/src/ts/agent/gateway-connection/generator.d.ts +5 -7
  34. package/src/ts/agent/gateway-connection/generator.js +12 -0
  35. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  36. package/src/ts/agent/generator.d.ts +3 -8
  37. package/src/ts/agent/generator.js +16 -2
  38. package/src/ts/agent/generator.js.map +1 -1
  39. package/src/ts/agent/mcp-connection/generator.d.ts +5 -7
  40. package/src/ts/agent/mcp-connection/generator.js +12 -0
  41. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  42. package/src/ts/astro-docs/generator.d.ts +4 -4
  43. package/src/ts/astro-docs/generator.js +10 -4
  44. package/src/ts/astro-docs/generator.js.map +1 -1
  45. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
  46. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  47. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  48. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
  49. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +10 -8
  50. package/src/ts/rdb/files/Dockerfile.template +4 -2
  51. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +21 -21
  52. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  53. package/src/utils/agent-connection/agent-connection.d.ts +28 -5
  54. package/src/utils/agent-connection/agent-connection.js +39 -14
  55. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  56. package/src/utils/docker.d.ts +1 -1
  57. package/src/utils/versions.d.ts +57 -57
  58. package/src/utils/versions.js +56 -56
  59. package/src/utils/versions.js.map +1 -1
  60. package/src/migrations/latest/api-custom-domain-runtime-config/migration.js.map +0 -1
  61. /package/src/migrations/latest/{api-custom-domain-runtime-config → rdb-drop-lambda-rie}/migration.d.ts +0 -0
  62. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/metadata.json +0 -0
  63. /package/src/migrations/{latest/api-custom-domain-runtime-config → v1.0.5/0001-api-custom-domain-runtime-config}/migration.js +0 -0
@@ -3223,7 +3223,7 @@ terraform {
3223
3223
  required_providers {
3224
3224
  aws = {
3225
3225
  source = "hashicorp/aws"
3226
- version = "6.66.0"
3226
+ version = "6.67.0"
3227
3227
  }
3228
3228
  }
3229
3229
  }
@@ -3474,7 +3474,7 @@ output "api_log_group_arn" {
3474
3474
  }
3475
3475
  aws = {
3476
3476
  source = "hashicorp/aws"
3477
- version = "6.66.0"
3477
+ version = "6.67.0"
3478
3478
  }
3479
3479
  random = {
3480
3480
  source = "hashicorp/random"
@@ -4100,7 +4100,7 @@ terraform {
4100
4100
  required_providers {
4101
4101
  aws = {
4102
4102
  source = "hashicorp/aws"
4103
- version = "6.66.0"
4103
+ version = "6.67.0"
4104
4104
  }
4105
4105
  }
4106
4106
  }
@@ -4351,7 +4351,7 @@ output "api_log_group_arn" {
4351
4351
  }
4352
4352
  aws = {
4353
4353
  source = "hashicorp/aws"
4354
- version = "6.66.0"
4354
+ version = "6.67.0"
4355
4355
  }
4356
4356
  random = {
4357
4357
  source = "hashicorp/random"
@@ -5050,7 +5050,7 @@ terraform {
5050
5050
  required_providers {
5051
5051
  aws = {
5052
5052
  source = "hashicorp/aws"
5053
- version = "6.66.0"
5053
+ version = "6.67.0"
5054
5054
  }
5055
5055
  }
5056
5056
  }
@@ -5301,7 +5301,7 @@ output "api_log_group_arn" {
5301
5301
  }
5302
5302
  aws = {
5303
5303
  source = "hashicorp/aws"
5304
- version = "6.66.0"
5304
+ version = "6.67.0"
5305
5305
  }
5306
5306
  random = {
5307
5307
  source = "hashicorp/random"
@@ -5904,7 +5904,7 @@ terraform {
5904
5904
  required_providers {
5905
5905
  aws = {
5906
5906
  source = "hashicorp/aws"
5907
- version = "6.66.0"
5907
+ version = "6.67.0"
5908
5908
  }
5909
5909
  random = {
5910
5910
  source = "hashicorp/random"
@@ -6217,7 +6217,7 @@ output "waf_web_acl_arn" {
6217
6217
  }
6218
6218
  aws = {
6219
6219
  source = "hashicorp/aws"
6220
- version = "6.66.0"
6220
+ version = "6.67.0"
6221
6221
  }
6222
6222
  random = {
6223
6223
  source = "hashicorp/random"
@@ -7280,7 +7280,7 @@ terraform {
7280
7280
  required_providers {
7281
7281
  aws = {
7282
7282
  source = "hashicorp/aws"
7283
- version = "6.66.0"
7283
+ version = "6.67.0"
7284
7284
  }
7285
7285
  random = {
7286
7286
  source = "hashicorp/random"
@@ -7593,7 +7593,7 @@ output "waf_web_acl_arn" {
7593
7593
  }
7594
7594
  aws = {
7595
7595
  source = "hashicorp/aws"
7596
- version = "6.66.0"
7596
+ version = "6.67.0"
7597
7597
  }
7598
7598
  random = {
7599
7599
  source = "hashicorp/random"
@@ -8645,7 +8645,7 @@ terraform {
8645
8645
  required_providers {
8646
8646
  aws = {
8647
8647
  source = "hashicorp/aws"
8648
- version = "6.66.0"
8648
+ version = "6.67.0"
8649
8649
  }
8650
8650
  random = {
8651
8651
  source = "hashicorp/random"
@@ -8958,7 +8958,7 @@ output "waf_web_acl_arn" {
8958
8958
  }
8959
8959
  aws = {
8960
8960
  source = "hashicorp/aws"
8961
- version = "6.66.0"
8961
+ version = "6.67.0"
8962
8962
  }
8963
8963
  random = {
8964
8964
  source = "hashicorp/random"
@@ -650,7 +650,7 @@ RUN apt-get update && \\
650
650
  rm -rf /var/lib/apt/lists/*
651
651
 
652
652
  # Upgrade npm to a version free of known HIGH/CRITICAL vulnerabilities
653
- RUN npm install -g npm@12.1.0
653
+ RUN npm install -g npm@12.2.0
654
654
 
655
655
  WORKDIR /app
656
656
 
@@ -984,7 +984,7 @@ exports[`ts#agent generator > should match snapshot for Terraform generated file
984
984
  required_providers {
985
985
  aws = {
986
986
  source = "hashicorp/aws"
987
- version = "6.66.0"
987
+ version = "6.67.0"
988
988
  }
989
989
  random = {
990
990
  source = "hashicorp/random"
@@ -1307,7 +1307,7 @@ exports[`ts#agent generator > should match snapshot for Terraform generated file
1307
1307
  required_providers {
1308
1308
  aws = {
1309
1309
  source = "hashicorp/aws"
1310
- version = "6.66.0"
1310
+ version = "6.67.0"
1311
1311
  }
1312
1312
  null = {
1313
1313
  source = "hashicorp/null"
@@ -1666,7 +1666,7 @@ resource "null_resource" "runtime_ready" {
1666
1666
 
1667
1667
  provisioner "local-exec" {
1668
1668
  command = <<-EOT
1669
- uv run --with boto3==1.43.103 python -c "
1669
+ uv run --with boto3==1.43.108 python -c "
1670
1670
  import boto3
1671
1671
  import json
1672
1672
  import os
@@ -8,53 +8,49 @@ import type { TsAgentA2aConnectionGeneratorSchema } from './schema';
8
8
  export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.js").DependencyDeclaration<readonly [{
9
9
  readonly name: "@a2a-js/sdk";
10
10
  readonly root: true;
11
- }, {
12
- readonly name: "@strands-agents/sdk";
13
- readonly root: true;
14
- }, {
15
- readonly name: "@aws-lambda-powertools/parameters";
16
- readonly root: true;
17
- }, {
18
- readonly name: "@aws-sdk/client-appconfigdata";
19
- readonly root: true;
20
- }, {
21
- readonly name: "aws4fetch";
22
- readonly root: true;
23
- }, {
24
- readonly name: "@aws-sdk/credential-providers";
25
- readonly root: true;
26
- }, {
27
- readonly name: "zod";
28
- readonly root: true;
29
- }, {
11
+ }, ...({
12
+ name: "@aws-sdk/client-s3" | "@strands-agents/sdk" | "express";
13
+ root: boolean;
14
+ } | ({
30
15
  readonly name: "@aws-lambda-powertools/parameters";
31
16
  } & {
32
17
  versionOnly: true;
33
- }, {
18
+ }) | ({
34
19
  readonly name: "@aws-sdk/credential-providers";
35
20
  } & {
36
21
  versionOnly: true;
37
- }, {
22
+ }) | ({
38
23
  readonly name: "aws4fetch";
39
24
  } & {
40
25
  versionOnly: true;
41
- }, {
26
+ }) | ({
42
27
  readonly name: "@modelcontextprotocol/sdk";
43
28
  } & {
44
29
  versionOnly: true;
45
- }, {
30
+ }) | ({
46
31
  readonly name: "@a2a-js/sdk";
47
32
  } & {
48
33
  versionOnly: true;
49
- }, {
50
- readonly name: "@strands-agents/sdk";
34
+ }) | ({
35
+ name: "@aws-sdk/client-s3" | "@strands-agents/sdk" | "express";
51
36
  } & {
52
37
  versionOnly: true;
53
- }, {
54
- readonly name: "@aws-sdk/client-s3";
55
- } & {
56
- versionOnly: true;
57
- }], readonly import("../../../utils/declared-dependencies.js").DeclaredPyDependency<"ruff" | "a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aiosqlite" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "langgraph-checkpoint-aws" | "langgraph-checkpoint-sqlite" | "mcp" | "pip-check-updates" | "pip-licenses" | "pydantic" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", Record<string, never>>[]>;
38
+ }) | {
39
+ readonly name: "@aws-lambda-powertools/parameters";
40
+ readonly root: true;
41
+ } | {
42
+ readonly name: "@aws-sdk/client-appconfigdata";
43
+ readonly root: true;
44
+ } | {
45
+ readonly name: "aws4fetch";
46
+ readonly root: true;
47
+ } | {
48
+ readonly name: "@aws-sdk/credential-providers";
49
+ readonly root: true;
50
+ } | {
51
+ readonly name: "zod";
52
+ readonly root: true;
53
+ })[]], readonly import("../../../utils/declared-dependencies.js").DeclaredPyDependency<"ruff" | "a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aiosqlite" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "langgraph-checkpoint-aws" | "langgraph-checkpoint-sqlite" | "mcp" | "pip-check-updates" | "pip-licenses" | "pydantic" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", Record<string, never>>[]>;
58
54
  export declare const TS_AGENT_A2A_CONNECTION_GENERATOR_INFO: NxGeneratorInfo;
59
55
  export declare const tsAgentA2aConnectionGenerator: (tree: Tree, options: TsAgentA2aConnectionGeneratorSchema) => Promise<GeneratorCallback>;
60
56
  export default tsAgentA2aConnectionGenerator;
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
5
5
  import { addTsDependencies } from "../../../utils/add-dependencies.js";
6
- import { AGENT_CONNECTION_DEPENDENCIES, AGENT_CONNECTION_PROJECT_DIR, addTypeScriptCoreClient, ensureTypeScriptAgentConnectionProject } from "../../../utils/agent-connection/agent-connection.js";
6
+ import { AGENT_CONNECTION_DEPENDENCIES, AGENT_CONNECTION_PROJECT_DIR, addTypeScriptCoreClient, ensureTypeScriptAgentConnectionProject, STRANDS_PEER_DEPENDENCY_NAMES } from "../../../utils/agent-connection/agent-connection.js";
7
7
  import { addDestructuredImport, addStarExport, appendToArrayViaGritQL, applyGritQL } from "../../../utils/ast.js";
8
8
  import { declareDependencies, ownedElsewhere } from "../../../utils/declared-dependencies.js";
9
9
  import { formatFilesInSubtree } from "../../../utils/format.js";
@@ -25,10 +25,14 @@ export const DEPENDENCIES = declareDependencies()({
25
25
  name: '@a2a-js/sdk',
26
26
  root: true
27
27
  },
28
- {
29
- name: '@strands-agents/sdk',
30
- root: true
31
- },
28
+ // @strands-agents/sdk and its peers (STRANDS_PEER_DEPENDENCY_NAMES),
29
+ // pinned at the root so the root strands copy resolves the same peers as
30
+ // every other importer (see agent-connection.ts's TS_TEMPLATE_DEPS for
31
+ // the same reasoning).
32
+ ...STRANDS_PEER_DEPENDENCY_NAMES.map((name)=>({
33
+ name,
34
+ root: true
35
+ })),
32
36
  {
33
37
  name: '@aws-lambda-powertools/parameters',
34
38
  root: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/a2a-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n AGENT_CONNECTION_DEPENDENCIES,\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection.js';\nimport {\n addDestructuredImport,\n addStarExport,\n appendToArrayViaGritQL,\n applyGritQL,\n} from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { esmVars } from '../../../utils/module-format.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport { getNpmScope } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport type { TsAgentA2aConnectionGeneratorSchema } from './schema';\n\n// The A2A core client + vended client need these whatever the connection's\n// options, so no entry is conditional.\n// The A2A client the generated agent code imports, plus the AppConfig lookup and\n// sigv4 signing it resolves the remote agent with. Added to the workspace root,\n// where this connection has always put them.\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: '@a2a-js/sdk', root: true },\n { name: '@strands-agents/sdk', root: true },\n { name: '@aws-lambda-powertools/parameters', root: true },\n { name: '@aws-sdk/client-appconfigdata', root: true },\n { name: 'aws4fetch', root: true },\n { name: '@aws-sdk/credential-providers', root: true },\n { name: 'zod', root: true },\n ...ownedElsewhere(AGENT_CONNECTION_DEPENDENCIES),\n ],\n});\n\nexport const TS_AGENT_A2A_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentA2aConnectionGenerator = async (\n tree: Tree,\n options: TsAgentA2aConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n const targetAgentComponent = options.targetComponent;\n\n if (!agentComponent || !targetAgentComponent) {\n throw new Error(\n 'Both sourceComponent and targetComponent must be provided for ts#agent -> a2a connections',\n );\n }\n\n if ((targetAgentComponent.protocol ?? '').toLowerCase() !== 'a2a') {\n throw new Error(\n `Target agent '${targetAgentComponent.name}' uses the ${targetAgentComponent.protocol ?? 'http'} protocol — only A2A agents can be connected as tools.`,\n );\n }\n\n if (\n targetAgentComponent.auth &&\n targetAgentComponent.auth.toLowerCase() !== 'iam'\n ) {\n throw new Error(\n `A2A agent connection currently only supports IAM authentication, but '${targetAgentComponent.name}' uses '${targetAgentComponent.auth}' authentication.`,\n );\n }\n\n const targetAgentComponentName = targetAgentComponent.name ?? 'agent';\n const targetAgentClassName = targetAgentComponent.rc as string;\n const targetAgentKebabCase = kebabCase(targetAgentClassName);\n const targetAgentPort = targetAgentComponent.port ?? 9000;\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the A2A core client\n await ensureTypeScriptAgentConnectionProject(tree, DEPENDENCIES);\n await addTypeScriptCoreClient(tree, 'a2a', DEPENDENCIES);\n\n // 2. Generate the per-connection <Name>Client into app/\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n targetAgentKebabCase,\n targetAgentClassName,\n targetAgentPort,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add re-export to index.ts\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${targetAgentKebabCase}-client-strands.js`,\n );\n\n // 3. AST transform agent.ts to add the remote A2A agent as a tool\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${targetAgentClassName}ClientStrands`;\n const clientVarName =\n targetAgentClassName.charAt(0).toLowerCase() +\n targetAgentClassName.slice(1);\n const toolName = `ask${targetAgentClassName}`;\n const toolVarName = `${clientVarName}Tool`;\n\n // Ensure tool + z imports are available\n await addDestructuredImport(\n tree,\n agentFilePath,\n ['tool'],\n '@strands-agents/sdk',\n );\n await addDestructuredImport(tree, agentFilePath, ['z'], 'zod');\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n\n // Build the tool creation + Agent wiring.\n const toolCreationBlock = `const ${clientVarName} = await ${clientClassName}.create();\n const ${toolVarName} = tool({\n name: '${toolName}',\n description: 'Delegate a question to the remote ${targetAgentClassName} A2A agent and return its reply.',\n inputSchema: z.object({ prompt: z.string() }),\n callback: async ({ prompt }) => (await ${clientVarName}.invoke(prompt)).toString(),\n });`;\n\n // Transform the arrow function that contains `new Agent`:\n // - Expression body: wrap in block with tool creation and return\n // - Block body: prepend tool creation statement\n await applyGritQL(\n tree,\n agentFilePath,\n `or { \\`async ($p) => new Agent($args)\\` => raw\\`async ($p) => {\n ${toolCreationBlock}\n return new Agent($args);\n}\\` where { $program <: not contains \\`${clientClassName}.create\\` }, \\`async ($p) => { $body }\\` => raw\\`async ($p) => {\n ${toolCreationBlock}\n $body\n}\\` where { $body <: contains \\`new Agent($_)\\`, $program <: not contains \\`${clientClassName}.create\\` } }`,\n );\n\n // Append the tool to the tools array (after existing items)\n await appendToArrayViaGritQL(tree, agentFilePath, 'tools:', toolVarName, {\n scope: 'new Agent($_)',\n });\n }\n\n // 4. Set up dev target — depend on the target agent's dev\n // so running the host's dev also spins up the remote A2A agent.\n const agentName = agentComponent.name ?? 'agent';\n const devTargetName = `${agentName}-dev`;\n const targetDevTargetName = `${targetAgentComponentName}-dev`;\n\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: targetDevTargetName,\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Add dependencies to the workspace root manifest\n addTsDependencies(tree, DEPENDENCIES);\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_AGENT_A2A_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(sourceProject, agentFilePath),\n targetAgentClassName,\n // The source component this connection is made from, so the pair is\n // identifiable rather than just the two projects.\n { sourcePath: options.sourceComponent?.path },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_A2A_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentA2aConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","addTsDependencies","AGENT_CONNECTION_DEPENDENCIES","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","appendToArrayViaGritQL","applyGritQL","declareDependencies","ownedElsewhere","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","DEPENDENCIES","ts","name","root","TS_AGENT_A2A_CONNECTION_GENERATOR_INFO","filename","tsAgentA2aConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","targetAgentComponent","targetComponent","Error","protocol","toLowerCase","auth","targetAgentComponentName","targetAgentClassName","rc","targetAgentKebabCase","targetAgentPort","port","npmScope","dirname","overwriteStrategy","KeepExisting","agentSourceDir","path","agentFilePath","exists","clientClassName","clientVarName","charAt","slice","toolName","toolVarName","toolCreationBlock","scope","agentName","devTargetName","targetDevTargetName","targets","projects","target","sourcePath","preferInstallDependencies","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/a2a-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n AGENT_CONNECTION_DEPENDENCIES,\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n STRANDS_PEER_DEPENDENCY_NAMES,\n} from '../../../utils/agent-connection/agent-connection.js';\nimport {\n addDestructuredImport,\n addStarExport,\n appendToArrayViaGritQL,\n applyGritQL,\n} from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { esmVars } from '../../../utils/module-format.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport { getNpmScope } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport type { TsAgentA2aConnectionGeneratorSchema } from './schema';\n\n// The A2A core client + vended client need these whatever the connection's\n// options, so no entry is conditional.\n// The A2A client the generated agent code imports, plus the AppConfig lookup and\n// sigv4 signing it resolves the remote agent with. Added to the workspace root,\n// where this connection has always put them.\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: '@a2a-js/sdk', root: true },\n // @strands-agents/sdk and its peers (STRANDS_PEER_DEPENDENCY_NAMES),\n // pinned at the root so the root strands copy resolves the same peers as\n // every other importer (see agent-connection.ts's TS_TEMPLATE_DEPS for\n // the same reasoning).\n ...STRANDS_PEER_DEPENDENCY_NAMES.map((name) => ({ name, root: true })),\n { name: '@aws-lambda-powertools/parameters', root: true },\n { name: '@aws-sdk/client-appconfigdata', root: true },\n { name: 'aws4fetch', root: true },\n { name: '@aws-sdk/credential-providers', root: true },\n { name: 'zod', root: true },\n ...ownedElsewhere(AGENT_CONNECTION_DEPENDENCIES),\n ],\n});\n\nexport const TS_AGENT_A2A_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentA2aConnectionGenerator = async (\n tree: Tree,\n options: TsAgentA2aConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n const targetAgentComponent = options.targetComponent;\n\n if (!agentComponent || !targetAgentComponent) {\n throw new Error(\n 'Both sourceComponent and targetComponent must be provided for ts#agent -> a2a connections',\n );\n }\n\n if ((targetAgentComponent.protocol ?? '').toLowerCase() !== 'a2a') {\n throw new Error(\n `Target agent '${targetAgentComponent.name}' uses the ${targetAgentComponent.protocol ?? 'http'} protocol — only A2A agents can be connected as tools.`,\n );\n }\n\n if (\n targetAgentComponent.auth &&\n targetAgentComponent.auth.toLowerCase() !== 'iam'\n ) {\n throw new Error(\n `A2A agent connection currently only supports IAM authentication, but '${targetAgentComponent.name}' uses '${targetAgentComponent.auth}' authentication.`,\n );\n }\n\n const targetAgentComponentName = targetAgentComponent.name ?? 'agent';\n const targetAgentClassName = targetAgentComponent.rc as string;\n const targetAgentKebabCase = kebabCase(targetAgentClassName);\n const targetAgentPort = targetAgentComponent.port ?? 9000;\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the A2A core client\n await ensureTypeScriptAgentConnectionProject(tree, DEPENDENCIES);\n await addTypeScriptCoreClient(tree, 'a2a', DEPENDENCIES);\n\n // 2. Generate the per-connection <Name>Client into app/\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n targetAgentKebabCase,\n targetAgentClassName,\n targetAgentPort,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add re-export to index.ts\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${targetAgentKebabCase}-client-strands.js`,\n );\n\n // 3. AST transform agent.ts to add the remote A2A agent as a tool\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${targetAgentClassName}ClientStrands`;\n const clientVarName =\n targetAgentClassName.charAt(0).toLowerCase() +\n targetAgentClassName.slice(1);\n const toolName = `ask${targetAgentClassName}`;\n const toolVarName = `${clientVarName}Tool`;\n\n // Ensure tool + z imports are available\n await addDestructuredImport(\n tree,\n agentFilePath,\n ['tool'],\n '@strands-agents/sdk',\n );\n await addDestructuredImport(tree, agentFilePath, ['z'], 'zod');\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n\n // Build the tool creation + Agent wiring.\n const toolCreationBlock = `const ${clientVarName} = await ${clientClassName}.create();\n const ${toolVarName} = tool({\n name: '${toolName}',\n description: 'Delegate a question to the remote ${targetAgentClassName} A2A agent and return its reply.',\n inputSchema: z.object({ prompt: z.string() }),\n callback: async ({ prompt }) => (await ${clientVarName}.invoke(prompt)).toString(),\n });`;\n\n // Transform the arrow function that contains `new Agent`:\n // - Expression body: wrap in block with tool creation and return\n // - Block body: prepend tool creation statement\n await applyGritQL(\n tree,\n agentFilePath,\n `or { \\`async ($p) => new Agent($args)\\` => raw\\`async ($p) => {\n ${toolCreationBlock}\n return new Agent($args);\n}\\` where { $program <: not contains \\`${clientClassName}.create\\` }, \\`async ($p) => { $body }\\` => raw\\`async ($p) => {\n ${toolCreationBlock}\n $body\n}\\` where { $body <: contains \\`new Agent($_)\\`, $program <: not contains \\`${clientClassName}.create\\` } }`,\n );\n\n // Append the tool to the tools array (after existing items)\n await appendToArrayViaGritQL(tree, agentFilePath, 'tools:', toolVarName, {\n scope: 'new Agent($_)',\n });\n }\n\n // 4. Set up dev target — depend on the target agent's dev\n // so running the host's dev also spins up the remote A2A agent.\n const agentName = agentComponent.name ?? 'agent';\n const devTargetName = `${agentName}-dev`;\n const targetDevTargetName = `${targetAgentComponentName}-dev`;\n\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: targetDevTargetName,\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Add dependencies to the workspace root manifest\n addTsDependencies(tree, DEPENDENCIES);\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_AGENT_A2A_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(sourceProject, agentFilePath),\n targetAgentClassName,\n // The source component this connection is made from, so the pair is\n // identifiable rather than just the two projects.\n { sourcePath: options.sourceComponent?.path },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_A2A_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentA2aConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","addTsDependencies","AGENT_CONNECTION_DEPENDENCIES","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","STRANDS_PEER_DEPENDENCY_NAMES","addDestructuredImport","addStarExport","appendToArrayViaGritQL","applyGritQL","declareDependencies","ownedElsewhere","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","DEPENDENCIES","ts","name","root","map","TS_AGENT_A2A_CONNECTION_GENERATOR_INFO","filename","tsAgentA2aConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","targetAgentComponent","targetComponent","Error","protocol","toLowerCase","auth","targetAgentComponentName","targetAgentClassName","rc","targetAgentKebabCase","targetAgentPort","port","npmScope","dirname","overwriteStrategy","KeepExisting","agentSourceDir","path","agentFilePath","exists","clientClassName","clientVarName","charAt","slice","toolName","toolVarName","toolCreationBlock","scope","agentName","devTargetName","targetDevTargetName","targets","projects","target","sourcePath","preferInstallDependencies","languages"],"mappings":"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"}
@@ -9,6 +9,8 @@ export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.
9
9
  readonly name: "@modelcontextprotocol/sdk";
10
10
  }, {
11
11
  readonly name: "@strands-agents/sdk";
12
+ }, {
13
+ readonly name: "express";
12
14
  }, {
13
15
  readonly name: "@aws-lambda-powertools/parameters";
14
16
  }, {
@@ -37,15 +39,11 @@ export declare const DEPENDENCIES: import("../../../utils/declared-dependencies.
37
39
  readonly name: "@a2a-js/sdk";
38
40
  } & {
39
41
  versionOnly: true;
40
- }, {
41
- readonly name: "@strands-agents/sdk";
42
- } & {
43
- versionOnly: true;
44
- }, {
45
- readonly name: "@aws-sdk/client-s3";
42
+ }, ...({
43
+ name: "@aws-sdk/client-s3" | "@strands-agents/sdk" | "express";
46
44
  } & {
47
45
  versionOnly: true;
48
- }], readonly import("../../../utils/declared-dependencies.js").DeclaredPyDependency<"ruff" | "a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aiosqlite" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "langgraph-checkpoint-aws" | "langgraph-checkpoint-sqlite" | "mcp" | "pip-check-updates" | "pip-licenses" | "pydantic" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", Record<string, never>>[]>;
46
+ })[]], readonly import("../../../utils/declared-dependencies.js").DeclaredPyDependency<"ruff" | "a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aiosqlite" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "langgraph-checkpoint-aws" | "langgraph-checkpoint-sqlite" | "mcp" | "pip-check-updates" | "pip-licenses" | "pydantic" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", Record<string, never>>[]>;
49
47
  export declare const TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO: NxGeneratorInfo;
50
48
  export declare const tsAgentGatewayConnectionGenerator: (tree: Tree, options: TsAgentGatewayConnectionGeneratorSchema) => Promise<GeneratorCallback>;
51
49
  export default tsAgentGatewayConnectionGenerator;
@@ -25,6 +25,18 @@ export const DEPENDENCIES = declareDependencies()({
25
25
  {
26
26
  name: '@strands-agents/sdk'
27
27
  },
28
+ // express is strands' optional peer (see STRANDS_PEER_DEPENDENCY_NAMES in
29
+ // agent-connection.ts). Declared here too, even though it is redundant
30
+ // with ts#agent's own unconditional declaration on the same project, so
31
+ // this generator is self-sufficient. @aws-sdk/client-s3, strands' other
32
+ // required peer, is deliberately NOT added here: ts#agent only declares
33
+ // it when session: 's3' (see generator.ts), and adding it unconditionally
34
+ // from this connection would install an unused S3 client into an
35
+ // in-memory-session agent — a user-visible change outside this fix's
36
+ // scope.
37
+ {
38
+ name: 'express'
39
+ },
28
40
  {
29
41
  name: '@aws-lambda-powertools/parameters'
30
42
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/gateway-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { readAgentCoreGatewayMetadata } from '../../../agentcore-gateway/generator.js';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n AGENT_CONNECTION_DEPENDENCIES,\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection.js';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { esmVars } from '../../../utils/module-format.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport { getNpmScope } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport type { TsAgentGatewayConnectionGeneratorSchema } from './schema';\n\n// The gateway core client + vended client need these whatever the connection's\n// options, so no entry is conditional.\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: '@strands-agents/sdk' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: 'aws4fetch' },\n { name: '@aws-sdk/credential-providers' },\n ...ownedElsewhere(AGENT_CONNECTION_DEPENDENCIES),\n ],\n});\n\nexport const TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentGatewayConnectionGenerator = async (\n tree: Tree,\n options: TsAgentGatewayConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n if (!agentComponent) {\n throw new Error(\n 'sourceComponent must be provided for ts#agent -> agentcore-gateway connections',\n );\n }\n const gateway = readAgentCoreGatewayMetadata(targetProject);\n\n if (gateway.protocol !== 'mcp') {\n throw new Error(\n `Gateway '${gateway.name}' has protocol='${gateway.protocol}'. Only MCP-protocol gateways are supported.`,\n );\n }\n if (gateway.auth !== 'iam') {\n throw new Error(\n `Gateway '${gateway.name}' uses auth='${gateway.auth}'. Agent connections currently require the gateway to use IAM authentication.`,\n );\n }\n\n const gatewayClassName = gateway.rc;\n const gatewayKebabCase = kebabCase(gatewayClassName);\n // A gateway is its own standalone project, so it exposes plain serve / dev.\n const gatewayServeTargetName = 'serve';\n const gatewayDevTargetName = 'dev';\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the gateway\n // core client template.\n await ensureTypeScriptAgentConnectionProject(tree, DEPENDENCIES);\n await addTypeScriptCoreClient(tree, 'gateway', DEPENDENCIES);\n\n // 2. Generate the per-connection <Gateway>Client into app/. Local mode\n // points at the gateway project's local gateway port.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n gatewayKebabCase,\n gatewayClassName,\n gatewayPort: gateway.port,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Re-export from the agent-connection index\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${gatewayKebabCase}-client-strands.js`,\n );\n\n // 3. AST-transform agent.ts to add the gateway client (an McpClient in\n // both deployed and local modes) to the agent's tools.\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${gatewayClassName}ClientStrands`;\n const clientVarName =\n gatewayClassName.charAt(0).toLowerCase() + gatewayClassName.slice(1);\n\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Wire dev chain — agent's dev depends on gateway's\n // aggregator target, which transitively starts each attached MCP server.\n const agentName = agentComponent.name ?? 'agent';\n const serveTargetName = `${agentName}-serve`;\n const devTargetName = `${agentName}-dev`;\n let projectConfigChanged = false;\n if (sourceProject.targets?.[serveTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, serveTargetName, {\n projects: [targetProject.name],\n target: gatewayServeTargetName,\n });\n projectConfigChanged = true;\n }\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: gatewayDevTargetName,\n });\n projectConfigChanged = true;\n }\n if (projectConfigChanged) {\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Dependencies\n addTsDependencies(tree, DEPENDENCIES, { projectRoot: sourceProject.root });\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(sourceProject, agentFilePath),\n gatewayClassName,\n // The source component this connection is made from, so the pair is\n // identifiable rather than just the two projects.\n { sourcePath: options.sourceComponent?.path },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentGatewayConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","readAgentCoreGatewayMetadata","addTsDependencies","AGENT_CONNECTION_DEPENDENCIES","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","declareDependencies","ownedElsewhere","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","DEPENDENCIES","ts","name","TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO","filename","tsAgentGatewayConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","Error","gateway","protocol","auth","gatewayClassName","rc","gatewayKebabCase","gatewayServeTargetName","gatewayDevTargetName","npmScope","dirname","gatewayPort","port","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","toLowerCase","slice","agentName","serveTargetName","devTargetName","projectConfigChanged","targets","projects","target","projectRoot","sourcePath","preferInstallDependencies","languages"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/gateway-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { readAgentCoreGatewayMetadata } from '../../../agentcore-gateway/generator.js';\nimport { addTsDependencies } from '../../../utils/add-dependencies.js';\nimport {\n AGENT_CONNECTION_DEPENDENCIES,\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection.js';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast.js';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { installDependencies } from '../../../utils/install.js';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics.js';\nimport { esmVars } from '../../../utils/module-format.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport { getNpmScope } from '../../../utils/npm-scope.js';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx.js';\nimport { toProjectRelativePath } from '../../../utils/paths.js';\nimport type { TsAgentGatewayConnectionGeneratorSchema } from './schema';\n\n// The gateway core client + vended client need these whatever the connection's\n// options, so no entry is conditional.\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: '@strands-agents/sdk' },\n // express is strands' optional peer (see STRANDS_PEER_DEPENDENCY_NAMES in\n // agent-connection.ts). Declared here too, even though it is redundant\n // with ts#agent's own unconditional declaration on the same project, so\n // this generator is self-sufficient. @aws-sdk/client-s3, strands' other\n // required peer, is deliberately NOT added here: ts#agent only declares\n // it when session: 's3' (see generator.ts), and adding it unconditionally\n // from this connection would install an unused S3 client into an\n // in-memory-session agent — a user-visible change outside this fix's\n // scope.\n { name: 'express' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: 'aws4fetch' },\n { name: '@aws-sdk/credential-providers' },\n ...ownedElsewhere(AGENT_CONNECTION_DEPENDENCIES),\n ],\n});\n\nexport const TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentGatewayConnectionGenerator = async (\n tree: Tree,\n options: TsAgentGatewayConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n if (!agentComponent) {\n throw new Error(\n 'sourceComponent must be provided for ts#agent -> agentcore-gateway connections',\n );\n }\n const gateway = readAgentCoreGatewayMetadata(targetProject);\n\n if (gateway.protocol !== 'mcp') {\n throw new Error(\n `Gateway '${gateway.name}' has protocol='${gateway.protocol}'. Only MCP-protocol gateways are supported.`,\n );\n }\n if (gateway.auth !== 'iam') {\n throw new Error(\n `Gateway '${gateway.name}' uses auth='${gateway.auth}'. Agent connections currently require the gateway to use IAM authentication.`,\n );\n }\n\n const gatewayClassName = gateway.rc;\n const gatewayKebabCase = kebabCase(gatewayClassName);\n // A gateway is its own standalone project, so it exposes plain serve / dev.\n const gatewayServeTargetName = 'serve';\n const gatewayDevTargetName = 'dev';\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the gateway\n // core client template.\n await ensureTypeScriptAgentConnectionProject(tree, DEPENDENCIES);\n await addTypeScriptCoreClient(tree, 'gateway', DEPENDENCIES);\n\n // 2. Generate the per-connection <Gateway>Client into app/. Local mode\n // points at the gateway project's local gateway port.\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n gatewayKebabCase,\n gatewayClassName,\n gatewayPort: gateway.port,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Re-export from the agent-connection index\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${gatewayKebabCase}-client-strands.js`,\n );\n\n // 3. AST-transform agent.ts to add the gateway client (an McpClient in\n // both deployed and local modes) to the agent's tools.\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${gatewayClassName}ClientStrands`;\n const clientVarName =\n gatewayClassName.charAt(0).toLowerCase() + gatewayClassName.slice(1);\n\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Wire dev chain — agent's dev depends on gateway's\n // aggregator target, which transitively starts each attached MCP server.\n const agentName = agentComponent.name ?? 'agent';\n const serveTargetName = `${agentName}-serve`;\n const devTargetName = `${agentName}-dev`;\n let projectConfigChanged = false;\n if (sourceProject.targets?.[serveTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, serveTargetName, {\n projects: [targetProject.name],\n target: gatewayServeTargetName,\n });\n projectConfigChanged = true;\n }\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: gatewayDevTargetName,\n });\n projectConfigChanged = true;\n }\n if (projectConfigChanged) {\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Dependencies\n addTsDependencies(tree, DEPENDENCIES, { projectRoot: sourceProject.root });\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(sourceProject, agentFilePath),\n gatewayClassName,\n // The source component this connection is made from, so the pair is\n // identifiable rather than just the two projects.\n { sourcePath: options.sourceComponent?.path },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentGatewayConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","readAgentCoreGatewayMetadata","addTsDependencies","AGENT_CONNECTION_DEPENDENCIES","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","declareDependencies","ownedElsewhere","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","DEPENDENCIES","ts","name","TS_AGENT_GATEWAY_CONNECTION_GENERATOR_INFO","filename","tsAgentGatewayConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","Error","gateway","protocol","auth","gatewayClassName","rc","gatewayKebabCase","gatewayServeTargetName","gatewayDevTargetName","npmScope","dirname","gatewayPort","port","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","toLowerCase","slice","agentName","serveTargetName","devTargetName","projectConfigChanged","targets","projects","target","projectRoot","sourcePath","preferInstallDependencies","languages"],"mappings":"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"}
@@ -36,7 +36,6 @@ export declare const DEPENDENCIES: import("../../utils/declared-dependencies.js"
36
36
  readonly when: (m: TsAgentMetadata) => boolean;
37
37
  }, {
38
38
  readonly name: "express";
39
- readonly when: (m: TsAgentMetadata) => boolean;
40
39
  }, {
41
40
  readonly name: "@a2a-js/sdk";
42
41
  readonly when: (m: TsAgentMetadata) => boolean;
@@ -129,15 +128,11 @@ export declare const DEPENDENCIES: import("../../utils/declared-dependencies.js"
129
128
  readonly name: "@a2a-js/sdk";
130
129
  } & {
131
130
  versionOnly: true;
132
- }, {
133
- readonly name: "@strands-agents/sdk";
134
- } & {
135
- versionOnly: true;
136
- }, {
137
- readonly name: "@aws-sdk/client-s3";
131
+ }, ...({
132
+ name: "@aws-sdk/client-s3" | "@strands-agents/sdk" | "express";
138
133
  } & {
139
134
  versionOnly: true;
140
- }, {
135
+ })[], {
141
136
  readonly name: "rolldown";
142
137
  } & {
143
138
  versionOnly: true;
@@ -47,13 +47,27 @@ export const DEPENDENCIES = declareDependencies()({
47
47
  {
48
48
  name: '@modelcontextprotocol/sdk'
49
49
  },
50
+ // @aws-sdk/client-s3 is one of @strands-agents/sdk's peers in
51
+ // STRANDS_PEER_DEPENDENCY_NAMES, but this project only actually uses S3
52
+ // when session storage is backed by it — an in-memory session installs
53
+ // no S3 client at all (see generator.spec.ts's "should not add the
54
+ // @aws-sdk/client-s3 dependency when session is in-memory"). That is a
55
+ // deliberate, tested exception to the peer rule for this one site; the
56
+ // in-memory branch does not reach pnpm's peer-suffixing bug because no
57
+ // other project in a workspace with only in-memory agents declares
58
+ // client-s3 at a floating version either.
50
59
  {
51
60
  name: '@aws-sdk/client-s3',
52
61
  when: (m)=>m.session === 's3'
53
62
  },
63
+ // express is strands' optional peer (see STRANDS_PEER_DEPENDENCY_NAMES);
64
+ // pnpm suffixes a package by its resolved peer versions, so leaving it
65
+ // undeclared on a protocol that doesn't use express can resolve a
66
+ // different express than every other importer and split
67
+ // @strands-agents/sdk into two instances. Declared unconditionally,
68
+ // matching @strands-agents/sdk itself.
54
69
  {
55
- name: 'express',
56
- when: (m)=>m.protocol !== 'http'
70
+ name: 'express'
57
71
  },
58
72
  {
59
73
  name: '@a2a-js/sdk',