@aws/nx-plugin 1.0.0-rc.57 → 1.0.0-rc.59

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 (223) hide show
  1. package/LICENSE-THIRD-PARTY +2917 -1295
  2. package/generators.json +17 -1
  3. package/migrations.json +36 -26
  4. package/package.json +13 -13
  5. package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +273 -0
  6. package/src/agentcore-gateway/agent-connection/generator.d.ts +19 -0
  7. package/src/agentcore-gateway/agent-connection/generator.js +90 -0
  8. package/src/agentcore-gateway/agent-connection/generator.js.map +1 -0
  9. package/src/agentcore-gateway/agent-connection/schema.d.js +6 -0
  10. package/src/agentcore-gateway/agent-connection/schema.d.js.map +1 -0
  11. package/src/agentcore-gateway/agent-connection/schema.d.ts +13 -0
  12. package/src/agentcore-gateway/agent-connection/schema.json +31 -0
  13. package/src/agentcore-gateway/attach-upstream.d.ts +16 -0
  14. package/src/agentcore-gateway/attach-upstream.js +32 -11
  15. package/src/agentcore-gateway/attach-upstream.js.map +1 -1
  16. package/src/agentcore-gateway/files/project/http/local-dev.ts.template +77 -0
  17. package/src/agentcore-gateway/generator.d.ts +17 -1
  18. package/src/agentcore-gateway/generator.js +25 -12
  19. package/src/agentcore-gateway/generator.js.map +1 -1
  20. package/src/agentcore-gateway/react-connection/__snapshots__/generator.spec.ts.snap +68 -0
  21. package/src/agentcore-gateway/react-connection/generator.d.ts +19 -0
  22. package/src/agentcore-gateway/react-connection/generator.js +119 -0
  23. package/src/agentcore-gateway/react-connection/generator.js.map +1 -0
  24. package/src/agentcore-gateway/react-connection/schema.d.js +6 -0
  25. package/src/agentcore-gateway/react-connection/schema.d.js.map +1 -0
  26. package/src/agentcore-gateway/react-connection/schema.d.ts +13 -0
  27. package/src/agentcore-gateway/react-connection/schema.json +31 -0
  28. package/src/agentcore-gateway/schema.d.js.map +1 -1
  29. package/src/agentcore-gateway/schema.d.ts +1 -1
  30. package/src/agentcore-gateway/schema.json +3 -2
  31. package/src/connection/agent-local-dev.d.ts +16 -0
  32. package/src/connection/agent-local-dev.js +44 -2
  33. package/src/connection/agent-local-dev.js.map +1 -1
  34. package/src/connection/gateway-runtime-config.d.ts +19 -0
  35. package/src/connection/gateway-runtime-config.js +47 -0
  36. package/src/connection/gateway-runtime-config.js.map +1 -0
  37. package/src/connection/generator.js +5 -0
  38. package/src/connection/generator.js.map +1 -1
  39. package/src/connection/scaffold-catalog.d.ts +267 -0
  40. package/src/connection/scaffold-catalog.js +347 -0
  41. package/src/connection/scaffold-catalog.js.map +1 -0
  42. package/src/connection/schema-resolver.d.ts +5 -0
  43. package/src/connection/schema-resolver.js +27 -0
  44. package/src/connection/schema-resolver.js.map +1 -0
  45. package/src/connection/supported-connections.d.ts +9 -0
  46. package/src/connection/supported-connections.js +12 -0
  47. package/src/connection/supported-connections.js.map +1 -1
  48. package/src/infra/app/__snapshots__/generator.spec.ts.snap +7 -7
  49. package/src/internal/test-matrix/generator.js +39 -1
  50. package/src/internal/test-matrix/generator.js.map +1 -1
  51. package/src/migrations/latest/gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
  52. package/src/migrations/latest/gateway-agent-targets/metadata.json +3 -0
  53. package/src/migrations/latest/gateway-agent-targets/migration.js +217 -0
  54. package/src/migrations/latest/gateway-agent-targets/migration.js.map +1 -0
  55. package/src/migrations/latest/smithy-ssdk-bundle-pins/metadata.json +3 -0
  56. package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.js +78 -0
  57. package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.js.map +1 -0
  58. package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/metadata.json +3 -0
  59. package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.js.map +1 -0
  60. package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/metadata.json +3 -0
  61. package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.js.map +1 -0
  62. package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
  63. package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
  64. package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/metadata.json +3 -0
  65. package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
  66. package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
  67. package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
  68. package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/metadata.json +3 -0
  69. package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.js.map +1 -0
  70. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/metadata.json +3 -0
  71. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
  72. package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
  73. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/metadata.json +3 -0
  74. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.d.ts +6 -0
  75. package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.js.map +1 -0
  76. package/src/preset/__snapshots__/generator.spec.ts.snap +5 -5
  77. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +10 -8
  78. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +8 -8
  79. package/src/py/agent/__snapshots__/generator.protocols.spec.ts.snap +2 -2
  80. package/src/py/agent/a2a-connection/generator.d.ts +1 -1
  81. package/src/py/agent/gateway-connection/generator.d.ts +1 -1
  82. package/src/py/agent/mcp-connection/generator.d.ts +1 -1
  83. package/src/py/agent/react-connection/generator.d.ts +4 -1
  84. package/src/py/agent/react-connection/generator.js +35 -14
  85. package/src/py/agent/react-connection/generator.js.map +1 -1
  86. package/src/py/agent/schema.json +1 -0
  87. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  88. package/src/py/dynamodb/schema.json +1 -0
  89. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +12 -12
  90. package/src/py/fast-api/generator.d.ts +5 -0
  91. package/src/py/fast-api/generator.js +3 -2
  92. package/src/py/fast-api/generator.js.map +1 -1
  93. package/src/py/fast-api/schema.json +1 -0
  94. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  95. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +5 -5
  96. package/src/py/mcp-server/schema.json +1 -0
  97. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2 -2
  98. package/src/py/rdb/schema.json +1 -0
  99. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +4 -4
  100. package/src/smithy/project/files/service/build.Dockerfile.template +2 -2
  101. package/src/smithy/project/generator.d.ts +25 -0
  102. package/src/smithy/project/generator.js +24 -3
  103. package/src/smithy/project/generator.js.map +1 -1
  104. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +7 -7
  105. package/src/smithy/ts/api/generator.d.ts +6 -1
  106. package/src/smithy/ts/api/generator.js +3 -2
  107. package/src/smithy/ts/api/generator.js.map +1 -1
  108. package/src/smithy/ts/api/schema.json +1 -0
  109. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +12 -12
  110. package/src/trpc/backend/generator.d.ts +6 -1
  111. package/src/trpc/backend/generator.js +3 -2
  112. package/src/trpc/backend/generator.js.map +1 -1
  113. package/src/trpc/backend/schema.json +1 -0
  114. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +9 -5
  115. package/src/ts/agent/generator.d.ts +32 -1
  116. package/src/ts/agent/generator.js +7 -4
  117. package/src/ts/agent/generator.js.map +1 -1
  118. package/src/ts/agent/react-connection/generator.d.ts +16 -1
  119. package/src/ts/agent/react-connection/generator.js +21 -8
  120. package/src/ts/agent/react-connection/generator.js.map +1 -1
  121. package/src/ts/agent/schema.json +1 -0
  122. package/src/ts/dcr-proxy/__snapshots__/generator.spec.ts.snap +1 -1
  123. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +2 -2
  124. package/src/ts/dynamodb/schema.json +1 -0
  125. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +2 -2
  126. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +2 -2
  127. package/src/ts/mcp-server/generator.d.ts +32 -1
  128. package/src/ts/mcp-server/generator.js +7 -4
  129. package/src/ts/mcp-server/generator.js.map +1 -1
  130. package/src/ts/mcp-server/schema.json +1 -0
  131. package/src/ts/nx-migration/generator.js +40 -27
  132. package/src/ts/nx-migration/generator.js.map +1 -1
  133. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +6 -6
  134. package/src/ts/rdb/generator.d.ts +8 -0
  135. package/src/ts/rdb/generator.js +3 -2
  136. package/src/ts/rdb/generator.js.map +1 -1
  137. package/src/ts/rdb/schema.json +1 -0
  138. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +16 -0
  139. package/src/ts/react-website/agui/generator.d.ts +11 -0
  140. package/src/ts/react-website/agui/generator.js +11 -7
  141. package/src/ts/react-website/agui/generator.js.map +1 -1
  142. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +61 -45
  143. package/src/ts/react-website/app/generator.d.ts +6 -1
  144. package/src/ts/react-website/app/generator.js +3 -2
  145. package/src/ts/react-website/app/generator.js.map +1 -1
  146. package/src/ts/react-website/app/schema.json +1 -0
  147. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +2 -2
  148. package/src/ts/react-website/cognito-auth/generator.d.ts +6 -1
  149. package/src/ts/react-website/cognito-auth/generator.js +3 -2
  150. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  151. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +23 -0
  152. package/src/utils/agent-core-constructs/agent-core-constructs.js +24 -1
  153. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  154. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +3 -0
  155. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +6 -4
  156. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +119 -3
  157. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +17 -0
  158. package/src/utils/api-constructs/api-constructs.d.ts +9 -0
  159. package/src/utils/api-constructs/api-constructs.js +11 -1
  160. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  161. package/src/utils/config/utils.d.ts +5 -0
  162. package/src/utils/config/utils.js +7 -1
  163. package/src/utils/config/utils.js.map +1 -1
  164. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +13 -2
  165. package/src/utils/connection/open-api/react.d.ts +10 -1
  166. package/src/utils/connection/open-api/react.js +3 -2
  167. package/src/utils/connection/open-api/react.js.map +1 -1
  168. package/src/utils/docker.d.ts +27 -2
  169. package/src/utils/docker.js +31 -2
  170. package/src/utils/docker.js.map +1 -1
  171. package/src/utils/identity-constructs/identity-constructs.d.ts +10 -0
  172. package/src/utils/identity-constructs/identity-constructs.js +11 -1
  173. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  174. package/src/utils/migration-manifest.d.ts +58 -0
  175. package/src/utils/migration-manifest.js +76 -0
  176. package/src/utils/migration-manifest.js.map +1 -0
  177. package/src/utils/migration-versions.d.ts +2 -0
  178. package/src/utils/migration-versions.js.map +1 -1
  179. package/src/utils/shared-constructs-constants.d.ts +6 -0
  180. package/src/utils/shared-constructs-constants.js +5 -0
  181. package/src/utils/shared-constructs-constants.js.map +1 -1
  182. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +26 -0
  183. package/src/utils/version-upgrade-migration/owned-dependencies.js +52 -4
  184. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -1
  185. package/src/utils/version-upgrade-migration/register.d.ts +9 -3
  186. package/src/utils/version-upgrade-migration/register.js +18 -14
  187. package/src/utils/version-upgrade-migration/register.js.map +1 -1
  188. package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +26 -0
  189. package/src/utils/version-upgrade-migration/sync-embedded-versions.js +304 -0
  190. package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -0
  191. package/src/utils/version-upgrade-migration/sync-vended-versions.js +14 -0
  192. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -1
  193. package/src/utils/versions.d.ts +90 -77
  194. package/src/utils/versions.js +86 -75
  195. package/src/utils/versions.js.map +1 -1
  196. package/src/utils/website-constructs/website-constructs.d.ts +11 -0
  197. package/src/utils/website-constructs/website-constructs.js +12 -1
  198. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  199. package/src/migrations/latest/backfill-generator-metadata/migration.js.map +0 -1
  200. package/src/migrations/latest/dynamodb-local-remove-optimize-flag/migration.js.map +0 -1
  201. package/src/migrations/latest/modernize-function-props-cast/migration.js.map +0 -1
  202. package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js.map +0 -1
  203. package/src/migrations/latest/restrict-cors-to-custom-domains/migration.js.map +0 -1
  204. package/src/migrations/latest/terraform-bootstrap-adopt-existing-bucket/migration.js.map +0 -1
  205. package/src/migrations/latest/ts-agent-session-management-support/migration.js.map +0 -1
  206. package/src/migrations/latest/user-identity-waf-allow-localhost-callback/migration.js.map +0 -1
  207. /package/src/agentcore-gateway/files/project/{local-dev.ts.template → mcp/local-dev.ts.template} +0 -0
  208. /package/src/migrations/latest/{dynamodb-local-remove-optimize-flag → gateway-agent-targets}/migration.d.ts +0 -0
  209. /package/src/migrations/latest/{modernize-function-props-cast → smithy-ssdk-bundle-pins}/migration.d.ts +0 -0
  210. /package/src/migrations/{latest/restrict-cors-to-custom-domains → v1.0.0-rc.50/modernize-function-props-cast}/migration.d.ts +0 -0
  211. /package/src/migrations/{latest → v1.0.0-rc.50}/modernize-function-props-cast/migration.js +0 -0
  212. /package/src/migrations/{latest/terraform-bootstrap-adopt-existing-bucket → v1.0.0-rc.50/restrict-cors-to-custom-domains}/migration.d.ts +0 -0
  213. /package/src/migrations/{latest → v1.0.0-rc.50}/restrict-cors-to-custom-domains/migration.js +0 -0
  214. /package/src/migrations/{latest/ts-agent-session-management-support → v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket}/migration.d.ts +0 -0
  215. /package/src/migrations/{latest → v1.0.0-rc.50}/terraform-bootstrap-adopt-existing-bucket/migration.js +0 -0
  216. /package/src/migrations/{latest/order-access-log-delivery-after-bucket-policy → v1.0.0-rc.52/user-identity-waf-allow-localhost-callback}/migration.d.ts +0 -0
  217. /package/src/migrations/{latest → v1.0.0-rc.52}/user-identity-waf-allow-localhost-callback/migration.js +0 -0
  218. /package/src/migrations/{latest/user-identity-waf-allow-localhost-callback → v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy}/migration.d.ts +0 -0
  219. /package/src/migrations/{latest → v1.0.0-rc.54}/order-access-log-delivery-after-bucket-policy/migration.js +0 -0
  220. /package/src/migrations/{latest → v1.0.0-rc.55}/backfill-generator-metadata/migration.d.ts +0 -0
  221. /package/src/migrations/{latest → v1.0.0-rc.55}/backfill-generator-metadata/migration.js +0 -0
  222. /package/src/migrations/{latest → v1.0.0-rc.56}/dynamodb-local-remove-optimize-flag/migration.js +0 -0
  223. /package/src/migrations/{latest → v1.0.0-rc.57}/ts-agent-session-management-support/migration.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/agentcore-gateway/react-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { getProjects, logger, type Tree } from '@nx/devkit';\nimport { addGatewayTargetToLocalDev } from '../../connection/agent-local-dev';\nimport { addGatewayUrlToConnectionNamespace } from '../../connection/gateway-runtime-config';\nimport { PY_AGENT_GENERATOR_INFO } from '../../py/agent/generator';\nimport { pyAgentReactConnectionGenerator } from '../../py/agent/react-connection/generator';\nimport { TS_AGENT_GENERATOR_INFO } from '../../ts/agent/generator';\nimport { tsAgentReactConnectionGenerator } from '../../ts/agent/react-connection/generator';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { installDependencies } from '../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../utils/metrics';\nimport { kebabCase } from '../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n type ComponentMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../utils/nx';\nimport { AGENTCORE_GATEWAY_AGENT_CONNECTION_GENERATOR_INFO } from '../agent-connection/generator';\nimport { readAgentCoreGatewayMetadata } from '../generator';\nimport type { AgentcoreGatewayReactConnectionGeneratorSchema } from './schema';\n\nexport const AGENTCORE_GATEWAY_REACT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\n/** An agent fronted by the gateway, resolved from its connection metadata. */\ninterface FrontedAgent {\n readonly projectName: string;\n readonly component: ComponentMetadata;\n readonly targetName: string;\n readonly language: 'ts' | 'py';\n}\n\n/**\n * Connect a React website to an AgentCore Gateway fronting agents.\n *\n * For each agent attached to the gateway (via the\n * `agentcore-gateway#agent-connection` generator), generates the same website\n * client as connecting to the agent directly, but routed through the\n * gateway's `/<targetName>` path — so the browser only needs to reach the\n * gateway, and the agent runtimes can sit in a VPC behind it.\n */\nexport const agentcoreGatewayReactConnectionGenerator = async (\n tree: Tree,\n options: AgentcoreGatewayReactConnectionGeneratorSchema,\n) => {\n const frontendProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const gatewayProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n const gateway = readAgentCoreGatewayMetadata(gatewayProject);\n\n if (gateway.protocol !== 'http') {\n throw new Error(\n `Gateway '${gateway.name}' has protocol='${gateway.protocol}'. Websites can only connect to http-protocol gateways, which proxy requests to their agent targets.`,\n );\n }\n\n // A2A targets speak agent-to-agent JSON-RPC, not a browser protocol, so\n // the website only connects to the gateway's AG-UI / HTTP agents. A gateway\n // with none attached yet still gets its URL published and dev wiring —\n // re-running this connection after attaching agents generates their\n // website clients.\n const agents = frontedAgents(tree, gatewayProject.name).filter(\n (agent) =>\n ((agent.component.protocol as string) ?? '').toLowerCase() !== 'a2a',\n );\n if (agents.length === 0) {\n logger.warn(\n `Gateway '${gateway.name}' has no AG-UI or HTTP agents attached, so no website clients were generated. Connect agents to the gateway, then re-run this connection to generate their clients.`,\n );\n }\n\n // One website client per fronted agent, routed through the gateway.\n for (const agent of agents) {\n const generator =\n agent.language === 'ts'\n ? tsAgentReactConnectionGenerator\n : pyAgentReactConnectionGenerator;\n await generator(tree, {\n sourceProject: frontendProject.name,\n targetProject: agent.projectName,\n targetComponent: agent.component,\n preferInstallDependencies: options.preferInstallDependencies,\n gatewayRoute: {\n gatewayClassName: gateway.rc,\n targetName: agent.targetName,\n gatewayAuth: gateway.auth,\n },\n });\n }\n\n // Publish the gateway URL to the website via the 'connection' namespace.\n await addGatewayUrlToConnectionNamespace(tree, {\n gatewayNameKebabCase: kebabCase(gateway.rc),\n gatewayNameClassName: gateway.rc,\n });\n\n // Wire the website's dev target to the local gateway, which proxies to the\n // attached agents (transitively starting them via its own dev dependencies).\n await addGatewayTargetToLocalDev(\n tree,\n frontendProject.name,\n gatewayProject.name,\n {\n gatewayClassName: gateway.rc,\n port: gateway.port,\n },\n );\n\n // Recorded so the version sync can identify this connection.\n addComponentGeneratorMetadata(\n tree,\n frontendProject.name,\n AGENTCORE_GATEWAY_REACT_CONNECTION_GENERATOR_INFO,\n gatewayProject.root,\n gateway.rc,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n AGENTCORE_GATEWAY_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\n/**\n * The agents attached to the gateway, resolved from the connection entries\n * the `agentcore-gateway#agent-connection` generator recorded: each names the\n * agent project by root (`path`) and its gateway target name (`name`), which\n * matches the agent component's class name in kebab-case.\n */\nconst frontedAgents = (\n tree: Tree,\n gatewayProjectName: string,\n): FrontedAgent[] => {\n const gatewayProject = readProjectConfigurationUnqualified(\n tree,\n gatewayProjectName,\n );\n const connections = (\n ((gatewayProject.metadata as any)?.components ?? []) as ComponentMetadata[]\n ).filter(\n (c) => c.generator === AGENTCORE_GATEWAY_AGENT_CONNECTION_GENERATOR_INFO.id,\n );\n\n const projectsByRoot = new Map(\n [...getProjects(tree).values()].map((p) => [p.root, p]),\n );\n\n return connections.flatMap((connection) => {\n const agentProject = connection.path\n ? projectsByRoot.get(connection.path)\n : undefined;\n if (!agentProject) {\n return [];\n }\n const component = (\n ((agentProject.metadata as any)?.components ?? []) as ComponentMetadata[]\n ).find(\n (c) =>\n [TS_AGENT_GENERATOR_INFO.id, PY_AGENT_GENERATOR_INFO.id].includes(\n c.generator,\n ) && kebabCase((c.rc as string) ?? '') === connection.name,\n );\n if (!component) {\n return [];\n }\n return [\n {\n projectName: agentProject.name,\n component,\n targetName: connection.name,\n language: (component.generator === TS_AGENT_GENERATOR_INFO.id\n ? 'ts'\n : 'py') as 'ts' | 'py',\n },\n ];\n });\n};\n\nexport default agentcoreGatewayReactConnectionGenerator;\n"],"names":["getProjects","logger","addGatewayTargetToLocalDev","addGatewayUrlToConnectionNamespace","PY_AGENT_GENERATOR_INFO","pyAgentReactConnectionGenerator","TS_AGENT_GENERATOR_INFO","tsAgentReactConnectionGenerator","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","AGENTCORE_GATEWAY_AGENT_CONNECTION_GENERATOR_INFO","readAgentCoreGatewayMetadata","AGENTCORE_GATEWAY_REACT_CONNECTION_GENERATOR_INFO","filename","agentcoreGatewayReactConnectionGenerator","tree","options","frontendProject","sourceProject","gatewayProject","targetProject","gateway","protocol","Error","name","agents","frontedAgents","filter","agent","component","toLowerCase","length","warn","generator","language","projectName","targetComponent","preferInstallDependencies","gatewayRoute","gatewayClassName","rc","targetName","gatewayAuth","auth","gatewayNameKebabCase","gatewayNameClassName","port","root","languages","gatewayProjectName","connections","metadata","components","c","id","projectsByRoot","Map","values","map","p","flatMap","connection","agentProject","path","get","undefined","find","includes"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */ export { };
5
+
6
+ //# sourceMappingURL=schema.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/agentcore-gateway/react-connection/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { ComponentMetadata } from '../../utils/nx';\n\nexport interface AgentcoreGatewayReactConnectionGeneratorSchema {\n sourceProject: string;\n targetProject: string;\n sourceComponent?: ComponentMetadata;\n targetComponent?: ComponentMetadata;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAGD,WAMC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import type { ComponentMetadata } from '../../utils/nx';
6
+
7
+ export interface AgentcoreGatewayReactConnectionGeneratorSchema {
8
+ sourceProject: string;
9
+ targetProject: string;
10
+ sourceComponent?: ComponentMetadata;
11
+ targetComponent?: ComponentMetadata;
12
+ preferInstallDependencies?: boolean;
13
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "agentcore-gateway#react-connection",
4
+ "title": "agentcore-gateway#react-connection",
5
+ "description": "Connect a React website to an AgentCore Gateway fronting agents",
6
+ "type": "object",
7
+ "properties": {
8
+ "sourceProject": {
9
+ "type": "string",
10
+ "description": "The React website project"
11
+ },
12
+ "targetProject": {
13
+ "type": "string",
14
+ "description": "The gateway project"
15
+ },
16
+ "sourceComponent": {
17
+ "type": "string",
18
+ "description": "The website component in the source project"
19
+ },
20
+ "targetComponent": {
21
+ "type": "string",
22
+ "description": "The gateway component in the target project"
23
+ },
24
+ "preferInstallDependencies": {
25
+ "type": "boolean",
26
+ "description": "Whether to prefer installing dependencies after the generator runs. Set to false to defer installing when batching multiple generators (an install still runs if needed so subsequent generators can compute the Nx project graph); install once at the end.",
27
+ "default": true
28
+ }
29
+ },
30
+ "required": ["sourceProject", "targetProject"]
31
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/nx-plugin/src/agentcore-gateway/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { IacOption } from '../utils/iac';\n\nexport interface AgentcoreGatewayGeneratorSchema {\n name: string;\n directory?: string;\n subDirectory?: string;\n protocol?: 'mcp';\n auth?: 'iam' | 'cognito';\n cedarPolicy?: boolean;\n infra?: 'agentcore' | 'none';\n iac: IacOption;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAGD,WAUC"}
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/agentcore-gateway/schema.d.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { IacOption } from '../utils/iac';\n\nexport interface AgentcoreGatewayGeneratorSchema {\n name: string;\n directory?: string;\n subDirectory?: string;\n protocol?: 'mcp' | 'http';\n auth?: 'iam' | 'cognito';\n cedarPolicy?: boolean;\n infra?: 'agentcore' | 'none';\n iac: IacOption;\n preferInstallDependencies?: boolean;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAGD,WAUC"}
@@ -8,7 +8,7 @@ export interface AgentcoreGatewayGeneratorSchema {
8
8
  name: string;
9
9
  directory?: string;
10
10
  subDirectory?: string;
11
- protocol?: 'mcp';
11
+ protocol?: 'mcp' | 'http';
12
12
  auth?: 'iam' | 'cognito';
13
13
  cedarPolicy?: boolean;
14
14
  infra?: 'agentcore' | 'none';
@@ -2,6 +2,7 @@
2
2
  "$schema": "https://json-schema.org/schema",
3
3
  "$id": "agentcore-gateway",
4
4
  "title": "agentcore-gateway",
5
+ "x-label": "AgentCore Gateway",
5
6
  "description": "Generate an AgentCore Gateway project",
6
7
  "type": "object",
7
8
  "properties": {
@@ -26,8 +27,8 @@
26
27
  },
27
28
  "protocol": {
28
29
  "type": "string",
29
- "description": "The inbound protocol exposed by your gateway. Only mcp is supported today; additional protocols may be added in future.",
30
- "enum": ["mcp"],
30
+ "description": "The inbound protocol exposed by your gateway. An mcp gateway aggregates MCP server targets into a single MCP endpoint. An http gateway proxies requests to agent runtime targets via path-based routing, so callers (e.g. a website) can reach agents through the gateway.",
31
+ "enum": ["mcp", "http"],
31
32
  "default": "mcp",
32
33
  "x-priority": "important"
33
34
  },
@@ -31,3 +31,19 @@ export interface AgentLocalDevOptions {
31
31
  * Agent react-connection generators.
32
32
  */
33
33
  export declare const addAgentTargetToLocalDev: (tree: Tree, sourceProjectName: string, targetProjectName: string, options: AgentLocalDevOptions) => Promise<void>;
34
+ export interface GatewayLocalDevOptions {
35
+ gatewayClassName: string;
36
+ /** Local port the gateway project's dev target listens on. */
37
+ port: number;
38
+ /**
39
+ * Additional targets to add as dev dependencies.
40
+ */
41
+ additionalDependencyTargets?: string[];
42
+ }
43
+ /**
44
+ * Adds an AgentCore Gateway project's dev target as a dependency of the
45
+ * source project's dev target (transitively starting the gateway's attached
46
+ * agents), and updates the RuntimeConfig provider to point the gateway's
47
+ * runtime config entry at the local gateway.
48
+ */
49
+ export declare const addGatewayTargetToLocalDev: (tree: Tree, sourceProjectName: string, gatewayProjectName: string, options: GatewayLocalDevOptions) => Promise<void>;
@@ -32,10 +32,52 @@ import { addDependencyToTargetIfNotPresent, readProjectConfigurationUnqualified
32
32
  addDependencyToTargetIfNotPresent(sourceProject, 'dev', additional);
33
33
  }
34
34
  updateProjectConfiguration(tree, sourceProject.name, sourceProject);
35
- // Add an override to runtime-config for the dev target to use the local url
35
+ await addLocalDevRuntimeConfigOverride(tree, sourceProject, {
36
+ statement: `runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName} = '${options.localUrl}';`,
37
+ marker: `runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName}`
38
+ });
39
+ };
40
+ /**
41
+ * Adds an AgentCore Gateway project's dev target as a dependency of the
42
+ * source project's dev target (transitively starting the gateway's attached
43
+ * agents), and updates the RuntimeConfig provider to point the gateway's
44
+ * runtime config entry at the local gateway.
45
+ */ export const addGatewayTargetToLocalDev = async (tree, sourceProjectName, gatewayProjectName, options)=>{
46
+ const sourceProject = readProjectConfigurationUnqualified(tree, sourceProjectName);
47
+ const gatewayProject = readProjectConfigurationUnqualified(tree, gatewayProjectName);
48
+ // A gateway is its own standalone project, so it exposes plain dev
49
+ if (!(gatewayProject.targets?.['dev']?.continuous && sourceProject.targets?.['dev'])) {
50
+ return;
51
+ }
52
+ addDependencyToTargetIfNotPresent(sourceProject, 'dev', {
53
+ projects: [
54
+ gatewayProject.name
55
+ ],
56
+ target: 'dev'
57
+ });
58
+ for (const additional of options.additionalDependencyTargets ?? []){
59
+ addDependencyToTargetIfNotPresent(sourceProject, 'dev', additional);
60
+ }
61
+ updateProjectConfiguration(tree, sourceProject.name, sourceProject);
62
+ // Spread rather than member assignment: the provider's fetch-failure
63
+ // fallback config carries no `gateways` key, so assigning into it would
64
+ // throw and leave the site stuck on the loading spinner. The marker is
65
+ // this gateway's own local URL (its port is unique per gateway and stable
66
+ // across re-runs), not the shared `gateways` key, so a website connected to
67
+ // several gateways gets one override statement per gateway.
68
+ await addLocalDevRuntimeConfigOverride(tree, sourceProject, {
69
+ statement: `runtimeConfig.gateways = { ...runtimeConfig.gateways, ${options.gatewayClassName}: 'http://localhost:${options.port}' };`,
70
+ marker: `'http://localhost:${options.port}'`
71
+ });
72
+ };
73
+ /**
74
+ * Add an override statement to the source project's RuntimeConfig provider so
75
+ * the dev target uses local urls. `marker` guards idempotency: the statement
76
+ * is only inserted when the overrides don't already contain it. Idempotent.
77
+ */ const addLocalDevRuntimeConfigOverride = async (tree, sourceProject, options)=>{
36
78
  const runtimeConfigProvider = joinPathFragments(sourceProject.root, 'src', 'components', 'RuntimeConfig', 'index.tsx');
37
79
  if (tree.exists(runtimeConfigProvider)) {
38
- await applyGritQL(tree, runtimeConfigProvider, `\`if ($cond) { $stmts }\` => raw\`if ($cond) {\n $stmts\n runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName} = '${options.localUrl}';\n }\` where { $cond <: contains \`'local-dev'\`, $stmts <: within \`const applyOverrides = $_\`, $stmts <: not contains \`runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName}\` }`);
80
+ await applyGritQL(tree, runtimeConfigProvider, `\`if ($cond) { $stmts }\` => raw\`if ($cond) {\n $stmts\n ${options.statement}\n }\` where { $cond <: contains \`'local-dev'\`, $stmts <: within \`const applyOverrides = $_\`, $stmts <: not contains \`${options.marker}\` }`);
39
81
  }
40
82
  };
41
83
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/nx-plugin/src/connection/agent-local-dev.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { applyGritQL } from '../utils/ast';\nimport {\n addDependencyToTargetIfNotPresent,\n type ComponentMetadata,\n readProjectConfigurationUnqualified,\n} from '../utils/nx';\n\nexport interface AgentLocalDevOptions {\n agentNameClassName: string;\n port: number;\n targetComponent?: ComponentMetadata;\n /**\n * The runtime config namespace to set the local URL on.\n * E.g. 'apis' results in `runtimeConfig.apis.X = url`\n */\n runtimeConfigNamespace: string;\n /**\n * The local URL to set in the runtime config override.\n */\n localUrl: string;\n /**\n * Additional targets to add as dev dependencies.\n */\n additionalDependencyTargets?: string[];\n}\n\n/**\n * Adds a Strands Agent's component dev target as a dependency of the\n * source project's dev target, and updates the RuntimeConfig provider\n * to point to the agent's local URL.\n *\n * This is the shared implementation used by both Python and TypeScript Strands\n * Agent react-connection generators.\n */\nexport const addAgentTargetToLocalDev = async (\n tree: Tree,\n sourceProjectName: string,\n targetProjectName: string,\n options: AgentLocalDevOptions,\n) => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n sourceProjectName,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n targetProjectName,\n );\n\n // Determine the dev target name for the agent component\n const agentDevTargetName = options.targetComponent?.name\n ? `${options.targetComponent.name}-dev`\n : 'agent-dev';\n\n // Target project must have the agent dev target which is continuous\n if (\n !(\n targetProject.targets?.[agentDevTargetName]?.continuous &&\n sourceProject.targets?.['dev']\n )\n ) {\n return;\n }\n\n // Add a dependency on the agent dev target (so that the agent's\n // own dev dependencies, such as MCP servers, are also started)\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', {\n projects: [targetProject.name],\n target: agentDevTargetName,\n });\n for (const additional of options.additionalDependencyTargets ?? []) {\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', additional);\n }\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n\n // Add an override to runtime-config for the dev target to use the local url\n const runtimeConfigProvider = joinPathFragments(\n sourceProject.root,\n 'src',\n 'components',\n 'RuntimeConfig',\n 'index.tsx',\n );\n if (tree.exists(runtimeConfigProvider)) {\n await applyGritQL(\n tree,\n runtimeConfigProvider,\n `\\`if ($cond) { $stmts }\\` => raw\\`if ($cond) {\\n $stmts\\n runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName} = '${options.localUrl}';\\n }\\` where { $cond <: contains \\`'local-dev'\\`, $stmts <: within \\`const applyOverrides = $_\\`, $stmts <: not contains \\`runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName}\\` }`,\n );\n }\n};\n"],"names":["joinPathFragments","updateProjectConfiguration","applyGritQL","addDependencyToTargetIfNotPresent","readProjectConfigurationUnqualified","addAgentTargetToLocalDev","tree","sourceProjectName","targetProjectName","options","sourceProject","targetProject","agentDevTargetName","targetComponent","name","targets","continuous","projects","target","additional","additionalDependencyTargets","runtimeConfigProvider","root","exists","runtimeConfigNamespace","agentNameClassName","localUrl"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,SAASC,WAAW,QAAQ,kBAAe;AAC3C,SACEC,iCAAiC,EAEjCC,mCAAmC,QAC9B,iBAAc;AAqBrB;;;;;;;CAOC,GACD,OAAO,MAAMC,2BAA2B,OACtCC,MACAC,mBACAC,mBACAC;IAEA,MAAMC,gBAAgBN,oCACpBE,MACAC;IAEF,MAAMI,gBAAgBP,oCACpBE,MACAE;IAGF,wDAAwD;IACxD,MAAMI,qBAAqBH,QAAQI,eAAe,EAAEC,OAChD,GAAGL,QAAQI,eAAe,CAACC,IAAI,CAAC,IAAI,CAAC,GACrC;IAEJ,oEAAoE;IACpE,IACE,CACEH,CAAAA,cAAcI,OAAO,EAAE,CAACH,mBAAmB,EAAEI,cAC7CN,cAAcK,OAAO,EAAE,CAAC,MAAM,AAAD,GAE/B;QACA;IACF;IAEA,gEAAgE;IAChE,+DAA+D;IAC/DZ,kCAAkCO,eAAe,OAAO;QACtDO,UAAU;YAACN,cAAcG,IAAI;SAAC;QAC9BI,QAAQN;IACV;IACA,KAAK,MAAMO,cAAcV,QAAQW,2BAA2B,IAAI,EAAE,CAAE;QAClEjB,kCAAkCO,eAAe,OAAOS;IAC1D;IACAlB,2BAA2BK,MAAMI,cAAcI,IAAI,EAAEJ;IAErD,4EAA4E;IAC5E,MAAMW,wBAAwBrB,kBAC5BU,cAAcY,IAAI,EAClB,OACA,cACA,iBACA;IAEF,IAAIhB,KAAKiB,MAAM,CAACF,wBAAwB;QACtC,MAAMnB,YACJI,MACAe,uBACA,CAAC,8EAA8E,EAAEZ,QAAQe,sBAAsB,CAAC,CAAC,EAAEf,QAAQgB,kBAAkB,CAAC,IAAI,EAAEhB,QAAQiB,QAAQ,CAAC,4IAA4I,EAAEjB,QAAQe,sBAAsB,CAAC,CAAC,EAAEf,QAAQgB,kBAAkB,CAAC,IAAI,CAAC;IAEzX;AACF,EAAE"}
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/connection/agent-local-dev.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n joinPathFragments,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { applyGritQL } from '../utils/ast';\nimport {\n addDependencyToTargetIfNotPresent,\n type ComponentMetadata,\n readProjectConfigurationUnqualified,\n} from '../utils/nx';\n\nexport interface AgentLocalDevOptions {\n agentNameClassName: string;\n port: number;\n targetComponent?: ComponentMetadata;\n /**\n * The runtime config namespace to set the local URL on.\n * E.g. 'apis' results in `runtimeConfig.apis.X = url`\n */\n runtimeConfigNamespace: string;\n /**\n * The local URL to set in the runtime config override.\n */\n localUrl: string;\n /**\n * Additional targets to add as dev dependencies.\n */\n additionalDependencyTargets?: string[];\n}\n\n/**\n * Adds a Strands Agent's component dev target as a dependency of the\n * source project's dev target, and updates the RuntimeConfig provider\n * to point to the agent's local URL.\n *\n * This is the shared implementation used by both Python and TypeScript Strands\n * Agent react-connection generators.\n */\nexport const addAgentTargetToLocalDev = async (\n tree: Tree,\n sourceProjectName: string,\n targetProjectName: string,\n options: AgentLocalDevOptions,\n) => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n sourceProjectName,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n targetProjectName,\n );\n\n // Determine the dev target name for the agent component\n const agentDevTargetName = options.targetComponent?.name\n ? `${options.targetComponent.name}-dev`\n : 'agent-dev';\n\n // Target project must have the agent dev target which is continuous\n if (\n !(\n targetProject.targets?.[agentDevTargetName]?.continuous &&\n sourceProject.targets?.['dev']\n )\n ) {\n return;\n }\n\n // Add a dependency on the agent dev target (so that the agent's\n // own dev dependencies, such as MCP servers, are also started)\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', {\n projects: [targetProject.name],\n target: agentDevTargetName,\n });\n for (const additional of options.additionalDependencyTargets ?? []) {\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', additional);\n }\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n\n await addLocalDevRuntimeConfigOverride(tree, sourceProject, {\n statement: `runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName} = '${options.localUrl}';`,\n marker: `runtimeConfig.${options.runtimeConfigNamespace}.${options.agentNameClassName}`,\n });\n};\n\nexport interface GatewayLocalDevOptions {\n gatewayClassName: string;\n /** Local port the gateway project's dev target listens on. */\n port: number;\n /**\n * Additional targets to add as dev dependencies.\n */\n additionalDependencyTargets?: string[];\n}\n\n/**\n * Adds an AgentCore Gateway project's dev target as a dependency of the\n * source project's dev target (transitively starting the gateway's attached\n * agents), and updates the RuntimeConfig provider to point the gateway's\n * runtime config entry at the local gateway.\n */\nexport const addGatewayTargetToLocalDev = async (\n tree: Tree,\n sourceProjectName: string,\n gatewayProjectName: string,\n options: GatewayLocalDevOptions,\n) => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n sourceProjectName,\n );\n const gatewayProject = readProjectConfigurationUnqualified(\n tree,\n gatewayProjectName,\n );\n\n // A gateway is its own standalone project, so it exposes plain dev\n if (\n !(\n gatewayProject.targets?.['dev']?.continuous &&\n sourceProject.targets?.['dev']\n )\n ) {\n return;\n }\n\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', {\n projects: [gatewayProject.name],\n target: 'dev',\n });\n for (const additional of options.additionalDependencyTargets ?? []) {\n addDependencyToTargetIfNotPresent(sourceProject, 'dev', additional);\n }\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n\n // Spread rather than member assignment: the provider's fetch-failure\n // fallback config carries no `gateways` key, so assigning into it would\n // throw and leave the site stuck on the loading spinner. The marker is\n // this gateway's own local URL (its port is unique per gateway and stable\n // across re-runs), not the shared `gateways` key, so a website connected to\n // several gateways gets one override statement per gateway.\n await addLocalDevRuntimeConfigOverride(tree, sourceProject, {\n statement: `runtimeConfig.gateways = { ...runtimeConfig.gateways, ${options.gatewayClassName}: 'http://localhost:${options.port}' };`,\n marker: `'http://localhost:${options.port}'`,\n });\n};\n\n/**\n * Add an override statement to the source project's RuntimeConfig provider so\n * the dev target uses local urls. `marker` guards idempotency: the statement\n * is only inserted when the overrides don't already contain it. Idempotent.\n */\nconst addLocalDevRuntimeConfigOverride = async (\n tree: Tree,\n sourceProject: { root: string },\n options: { statement: string; marker: string },\n) => {\n const runtimeConfigProvider = joinPathFragments(\n sourceProject.root,\n 'src',\n 'components',\n 'RuntimeConfig',\n 'index.tsx',\n );\n if (tree.exists(runtimeConfigProvider)) {\n await applyGritQL(\n tree,\n runtimeConfigProvider,\n `\\`if ($cond) { $stmts }\\` => raw\\`if ($cond) {\\n $stmts\\n ${options.statement}\\n }\\` where { $cond <: contains \\`'local-dev'\\`, $stmts <: within \\`const applyOverrides = $_\\`, $stmts <: not contains \\`${options.marker}\\` }`,\n );\n }\n};\n"],"names":["joinPathFragments","updateProjectConfiguration","applyGritQL","addDependencyToTargetIfNotPresent","readProjectConfigurationUnqualified","addAgentTargetToLocalDev","tree","sourceProjectName","targetProjectName","options","sourceProject","targetProject","agentDevTargetName","targetComponent","name","targets","continuous","projects","target","additional","additionalDependencyTargets","addLocalDevRuntimeConfigOverride","statement","runtimeConfigNamespace","agentNameClassName","localUrl","marker","addGatewayTargetToLocalDev","gatewayProjectName","gatewayProject","gatewayClassName","port","runtimeConfigProvider","root","exists"],"mappings":"AAAA;;;CAGC,GACD,SACEA,iBAAiB,EAEjBC,0BAA0B,QACrB,aAAa;AACpB,SAASC,WAAW,QAAQ,kBAAe;AAC3C,SACEC,iCAAiC,EAEjCC,mCAAmC,QAC9B,iBAAc;AAqBrB;;;;;;;CAOC,GACD,OAAO,MAAMC,2BAA2B,OACtCC,MACAC,mBACAC,mBACAC;IAEA,MAAMC,gBAAgBN,oCACpBE,MACAC;IAEF,MAAMI,gBAAgBP,oCACpBE,MACAE;IAGF,wDAAwD;IACxD,MAAMI,qBAAqBH,QAAQI,eAAe,EAAEC,OAChD,GAAGL,QAAQI,eAAe,CAACC,IAAI,CAAC,IAAI,CAAC,GACrC;IAEJ,oEAAoE;IACpE,IACE,CACEH,CAAAA,cAAcI,OAAO,EAAE,CAACH,mBAAmB,EAAEI,cAC7CN,cAAcK,OAAO,EAAE,CAAC,MAAM,AAAD,GAE/B;QACA;IACF;IAEA,gEAAgE;IAChE,+DAA+D;IAC/DZ,kCAAkCO,eAAe,OAAO;QACtDO,UAAU;YAACN,cAAcG,IAAI;SAAC;QAC9BI,QAAQN;IACV;IACA,KAAK,MAAMO,cAAcV,QAAQW,2BAA2B,IAAI,EAAE,CAAE;QAClEjB,kCAAkCO,eAAe,OAAOS;IAC1D;IACAlB,2BAA2BK,MAAMI,cAAcI,IAAI,EAAEJ;IAErD,MAAMW,iCAAiCf,MAAMI,eAAe;QAC1DY,WAAW,CAAC,cAAc,EAAEb,QAAQc,sBAAsB,CAAC,CAAC,EAAEd,QAAQe,kBAAkB,CAAC,IAAI,EAAEf,QAAQgB,QAAQ,CAAC,EAAE,CAAC;QACnHC,QAAQ,CAAC,cAAc,EAAEjB,QAAQc,sBAAsB,CAAC,CAAC,EAAEd,QAAQe,kBAAkB,EAAE;IACzF;AACF,EAAE;AAYF;;;;;CAKC,GACD,OAAO,MAAMG,6BAA6B,OACxCrB,MACAC,mBACAqB,oBACAnB;IAEA,MAAMC,gBAAgBN,oCACpBE,MACAC;IAEF,MAAMsB,iBAAiBzB,oCACrBE,MACAsB;IAGF,mEAAmE;IACnE,IACE,CACEC,CAAAA,eAAed,OAAO,EAAE,CAAC,MAAM,EAAEC,cACjCN,cAAcK,OAAO,EAAE,CAAC,MAAM,AAAD,GAE/B;QACA;IACF;IAEAZ,kCAAkCO,eAAe,OAAO;QACtDO,UAAU;YAACY,eAAef,IAAI;SAAC;QAC/BI,QAAQ;IACV;IACA,KAAK,MAAMC,cAAcV,QAAQW,2BAA2B,IAAI,EAAE,CAAE;QAClEjB,kCAAkCO,eAAe,OAAOS;IAC1D;IACAlB,2BAA2BK,MAAMI,cAAcI,IAAI,EAAEJ;IAErD,qEAAqE;IACrE,wEAAwE;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,4EAA4E;IAC5E,4DAA4D;IAC5D,MAAMW,iCAAiCf,MAAMI,eAAe;QAC1DY,WAAW,CAAC,sDAAsD,EAAEb,QAAQqB,gBAAgB,CAAC,oBAAoB,EAAErB,QAAQsB,IAAI,CAAC,IAAI,CAAC;QACrIL,QAAQ,CAAC,kBAAkB,EAAEjB,QAAQsB,IAAI,CAAC,CAAC,CAAC;IAC9C;AACF,EAAE;AAEF;;;;CAIC,GACD,MAAMV,mCAAmC,OACvCf,MACAI,eACAD;IAEA,MAAMuB,wBAAwBhC,kBAC5BU,cAAcuB,IAAI,EAClB,OACA,cACA,iBACA;IAEF,IAAI3B,KAAK4B,MAAM,CAACF,wBAAwB;QACtC,MAAM9B,YACJI,MACA0B,uBACA,CAAC,gEAAgE,EAAEvB,QAAQa,SAAS,CAAC,4HAA4H,EAAEb,QAAQiB,MAAM,CAAC,IAAI,CAAC;IAE3O;AACF"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { type Tree } from '@nx/devkit';
6
+ /**
7
+ * Register the gateway's URL in the 'connection' namespace so it is published
8
+ * to the website's runtime-config.json. Patches the generated CDK and
9
+ * Terraform constructs in-place; idempotent.
10
+ *
11
+ * Note: the 'connection' namespace is stage-scoped — every StaticWebsite in
12
+ * the stage will see this URL, not just the one the user connected.
13
+ */
14
+ export declare const addGatewayUrlToConnectionNamespace: (tree: Tree, options: {
15
+ /** The kebab-case directory name that holds the construct, e.g. 'my-gateway'. */
16
+ gatewayNameKebabCase: string;
17
+ /** The class name of the gateway, e.g. 'MyGateway'. */
18
+ gatewayNameClassName: string;
19
+ }) => Promise<void>;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */ import { joinPathFragments } from "@nx/devkit";
5
+ import { applyGritQL, matchGritQL } from "../utils/ast.js";
6
+ import { PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, SHARED_TERRAFORM_DIR } from "../utils/shared-constructs-constants.js";
7
+ const CONNECTION_TF_MODULE_NAME = 'add_gateway_url_to_connection_runtime_config';
8
+ /**
9
+ * Register the gateway's URL in the 'connection' namespace so it is published
10
+ * to the website's runtime-config.json. Patches the generated CDK and
11
+ * Terraform constructs in-place; idempotent.
12
+ *
13
+ * Note: the 'connection' namespace is stage-scoped — every StaticWebsite in
14
+ * the stage will see this URL, not just the one the user connected.
15
+ */ export const addGatewayUrlToConnectionNamespace = async (tree, options)=>{
16
+ const cdkConstructPath = joinPathFragments(PACKAGES_DIR, SHARED_CONSTRUCTS_DIR, 'src', 'app', 'gateways', options.gatewayNameKebabCase, `${options.gatewayNameKebabCase}.ts`);
17
+ if (tree.exists(cdkConstructPath)) {
18
+ await applyGritQL(tree, cdkConstructPath, `\`rc.set('agentcore', 'gateways', $args);\` => raw\`rc.set('agentcore', 'gateways', $args);
19
+
20
+ rc.set('connection', 'gateways', {
21
+ ...rc.get('connection').gateways,
22
+ ${options.gatewayNameClassName}: this.gateway.gatewayUrl,
23
+ });\` where { $program <: not contains \`rc.set('connection', 'gateways', $_)\` }`);
24
+ }
25
+ const terraformConstructPath = joinPathFragments(PACKAGES_DIR, SHARED_TERRAFORM_DIR, 'src', 'app', 'gateways', options.gatewayNameKebabCase, `${options.gatewayNameKebabCase}.tf`);
26
+ if (tree.exists(terraformConstructPath)) {
27
+ const alreadyPatched = await matchGritQL(tree, terraformConstructPath, `language hcl\n\`module "${CONNECTION_TF_MODULE_NAME}" { $_ }\``);
28
+ if (!alreadyPatched) {
29
+ const source = tree.read(terraformConstructPath, 'utf-8');
30
+ tree.write(terraformConstructPath, `${source.trimEnd()}
31
+
32
+ # Also expose the gateway URL to the frontend via the 'connection' namespace
33
+ module "${CONNECTION_TF_MODULE_NAME}" {
34
+ source = "../../../core/runtime-config/entry"
35
+
36
+ namespace = "connection"
37
+ key = "gateways"
38
+ value = { "${options.gatewayNameClassName}" = aws_bedrockagentcore_gateway.this.gateway_url }
39
+
40
+ depends_on = [aws_bedrockagentcore_gateway.this]
41
+ }
42
+ `);
43
+ }
44
+ }
45
+ };
46
+
47
+ //# sourceMappingURL=gateway-runtime-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/connection/gateway-runtime-config.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { joinPathFragments, type Tree } from '@nx/devkit';\nimport { applyGritQL, matchGritQL } from '../utils/ast';\nimport {\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n SHARED_TERRAFORM_DIR,\n} from '../utils/shared-constructs-constants';\n\nconst CONNECTION_TF_MODULE_NAME =\n 'add_gateway_url_to_connection_runtime_config';\n\n/**\n * Register the gateway's URL in the 'connection' namespace so it is published\n * to the website's runtime-config.json. Patches the generated CDK and\n * Terraform constructs in-place; idempotent.\n *\n * Note: the 'connection' namespace is stage-scoped — every StaticWebsite in\n * the stage will see this URL, not just the one the user connected.\n */\nexport const addGatewayUrlToConnectionNamespace = async (\n tree: Tree,\n options: {\n /** The kebab-case directory name that holds the construct, e.g. 'my-gateway'. */\n gatewayNameKebabCase: string;\n /** The class name of the gateway, e.g. 'MyGateway'. */\n gatewayNameClassName: string;\n },\n) => {\n const cdkConstructPath = joinPathFragments(\n PACKAGES_DIR,\n SHARED_CONSTRUCTS_DIR,\n 'src',\n 'app',\n 'gateways',\n options.gatewayNameKebabCase,\n `${options.gatewayNameKebabCase}.ts`,\n );\n if (tree.exists(cdkConstructPath)) {\n await applyGritQL(\n tree,\n cdkConstructPath,\n `\\`rc.set('agentcore', 'gateways', $args);\\` => raw\\`rc.set('agentcore', 'gateways', $args);\n\n rc.set('connection', 'gateways', {\n ...rc.get('connection').gateways,\n ${options.gatewayNameClassName}: this.gateway.gatewayUrl,\n });\\` where { $program <: not contains \\`rc.set('connection', 'gateways', $_)\\` }`,\n );\n }\n\n const terraformConstructPath = joinPathFragments(\n PACKAGES_DIR,\n SHARED_TERRAFORM_DIR,\n 'src',\n 'app',\n 'gateways',\n options.gatewayNameKebabCase,\n `${options.gatewayNameKebabCase}.tf`,\n );\n if (tree.exists(terraformConstructPath)) {\n const alreadyPatched = await matchGritQL(\n tree,\n terraformConstructPath,\n `language hcl\\n\\`module \"${CONNECTION_TF_MODULE_NAME}\" { $_ }\\``,\n );\n if (!alreadyPatched) {\n const source = tree.read(terraformConstructPath, 'utf-8')!;\n tree.write(\n terraformConstructPath,\n `${source.trimEnd()}\n\n# Also expose the gateway URL to the frontend via the 'connection' namespace\nmodule \"${CONNECTION_TF_MODULE_NAME}\" {\n source = \"../../../core/runtime-config/entry\"\n\n namespace = \"connection\"\n key = \"gateways\"\n value = { \"${options.gatewayNameClassName}\" = aws_bedrockagentcore_gateway.this.gateway_url }\n\n depends_on = [aws_bedrockagentcore_gateway.this]\n}\n`,\n );\n }\n }\n};\n"],"names":["joinPathFragments","applyGritQL","matchGritQL","PACKAGES_DIR","SHARED_CONSTRUCTS_DIR","SHARED_TERRAFORM_DIR","CONNECTION_TF_MODULE_NAME","addGatewayUrlToConnectionNamespace","tree","options","cdkConstructPath","gatewayNameKebabCase","exists","gatewayNameClassName","terraformConstructPath","alreadyPatched","source","read","write","trimEnd"],"mappings":"AAAA;;;CAGC,GACD,SAASA,iBAAiB,QAAmB,aAAa;AAC1D,SAASC,WAAW,EAAEC,WAAW,QAAQ,kBAAe;AACxD,SACEC,YAAY,EACZC,qBAAqB,EACrBC,oBAAoB,QACf,0CAAuC;AAE9C,MAAMC,4BACJ;AAEF;;;;;;;CAOC,GACD,OAAO,MAAMC,qCAAqC,OAChDC,MACAC;IAOA,MAAMC,mBAAmBV,kBACvBG,cACAC,uBACA,OACA,OACA,YACAK,QAAQE,oBAAoB,EAC5B,GAAGF,QAAQE,oBAAoB,CAAC,GAAG,CAAC;IAEtC,IAAIH,KAAKI,MAAM,CAACF,mBAAmB;QACjC,MAAMT,YACJO,MACAE,kBACA,CAAC;;;;MAID,EAAED,QAAQI,oBAAoB,CAAC;qFACgD,CAAC;IAEpF;IAEA,MAAMC,yBAAyBd,kBAC7BG,cACAE,sBACA,OACA,OACA,YACAI,QAAQE,oBAAoB,EAC5B,GAAGF,QAAQE,oBAAoB,CAAC,GAAG,CAAC;IAEtC,IAAIH,KAAKI,MAAM,CAACE,yBAAyB;QACvC,MAAMC,iBAAiB,MAAMb,YAC3BM,MACAM,wBACA,CAAC,wBAAwB,EAAER,0BAA0B,UAAU,CAAC;QAElE,IAAI,CAACS,gBAAgB;YACnB,MAAMC,SAASR,KAAKS,IAAI,CAACH,wBAAwB;YACjDN,KAAKU,KAAK,CACRJ,wBACA,GAAGE,OAAOG,OAAO,GAAG;;;QAGpB,EAAEb,0BAA0B;;;;;iBAKnB,EAAEG,QAAQI,oBAAoB,CAAC;;;;AAIhD,CAAC;QAEG;IACF;AACF,EAAE"}
@@ -2,9 +2,11 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */ import { joinPathFragments } from "@nx/devkit";
5
+ import agentcoreGatewayAgentConnectionGenerator from "../agentcore-gateway/agent-connection/generator.js";
5
6
  import agentcoreGatewayGatewayConnectionGenerator from "../agentcore-gateway/gateway-connection/generator.js";
6
7
  import { AGENTCORE_GATEWAY_GENERATOR_INFO } from "../agentcore-gateway/generator.js";
7
8
  import agentcoreGatewayMcpConnectionGenerator from "../agentcore-gateway/mcp-connection/generator.js";
9
+ import agentcoreGatewayReactConnectionGenerator from "../agentcore-gateway/react-connection/generator.js";
8
10
  import pyAgentA2aConnectionGenerator from "../py/agent/a2a-connection/generator.js";
9
11
  import pyAgentGatewayConnectionGenerator from "../py/agent/gateway-connection/generator.js";
10
12
  import pyAgentMcpConnectionGenerator from "../py/agent/mcp-connection/generator.js";
@@ -80,6 +82,9 @@ const CONNECTION_GENERATORS = {
80
82
  'py#agent -> py#agent': (tree, options)=>pyAgentA2aConnectionGenerator(tree, options),
81
83
  'ts#agent -> agentcore-gateway': (tree, options)=>tsAgentGatewayConnectionGenerator(tree, options),
82
84
  'py#agent -> agentcore-gateway': (tree, options)=>pyAgentGatewayConnectionGenerator(tree, options),
85
+ 'ts#react-website -> agentcore-gateway': (tree, options)=>agentcoreGatewayReactConnectionGenerator(tree, options),
86
+ 'agentcore-gateway -> ts#agent': (tree, options)=>agentcoreGatewayAgentConnectionGenerator(tree, options),
87
+ 'agentcore-gateway -> py#agent': (tree, options)=>agentcoreGatewayAgentConnectionGenerator(tree, options),
83
88
  'agentcore-gateway -> ts#mcp-server': (tree, options)=>agentcoreGatewayMcpConnectionGenerator(tree, options),
84
89
  'agentcore-gateway -> py#mcp-server': (tree, options)=>agentcoreGatewayMcpConnectionGenerator(tree, options),
85
90
  'agentcore-gateway -> agentcore-gateway': (tree, options)=>agentcoreGatewayGatewayConnectionGenerator(tree, options),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../packages/nx-plugin/src/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 joinPathFragments,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport agentcoreGatewayGatewayConnectionGenerator from '../agentcore-gateway/gateway-connection/generator';\nimport { AGENTCORE_GATEWAY_GENERATOR_INFO } from '../agentcore-gateway/generator';\nimport agentcoreGatewayMcpConnectionGenerator from '../agentcore-gateway/mcp-connection/generator';\nimport pyAgentA2aConnectionGenerator from '../py/agent/a2a-connection/generator';\nimport pyAgentGatewayConnectionGenerator from '../py/agent/gateway-connection/generator';\nimport pyAgentMcpConnectionGenerator from '../py/agent/mcp-connection/generator';\nimport pyAgentReactConnectionGenerator from '../py/agent/react-connection/generator';\nimport pyDynamoDBAgentConnectionGenerator from '../py/dynamodb/agent-connection/generator';\nimport pyDynamoDBFastApiConnectionGenerator from '../py/dynamodb/fast-api-connection/generator';\nimport { PY_DYNAMODB_GENERATOR_INFO } from '../py/dynamodb/generator';\nimport pyDynamoDBMcpServerConnectionGenerator from '../py/dynamodb/mcp-server-connection/generator';\nimport fastApiReactGenerator from '../py/fast-api/react/generator';\nimport pyRdbAgentConnectionGenerator from '../py/rdb/agent-connection/generator';\nimport pyRdbFastApiConnectionGenerator from '../py/rdb/fast-api-connection/generator';\nimport { PY_RDB_GENERATOR_INFO } from '../py/rdb/generator';\nimport pyRdbMcpServerConnectionGenerator from '../py/rdb/mcp-server-connection/generator';\nimport { SMITHY_PROJECT_GENERATOR_INFO } from '../smithy/project/generator';\nimport smithyReactConnectionGenerator from '../smithy/react-connection/generator';\nimport { TS_SMITHY_API_GENERATOR_INFO } from '../smithy/ts/api/generator';\nimport trpcReactGenerator from '../trpc/react/generator';\nimport tsAgentA2aConnectionGenerator from '../ts/agent/a2a-connection/generator';\nimport tsAgentGatewayConnectionGenerator from '../ts/agent/gateway-connection/generator';\nimport tsAgentMcpConnectionGenerator from '../ts/agent/mcp-connection/generator';\nimport tsAgentReactConnectionGenerator from '../ts/agent/react-connection/generator';\nimport tsDynamoDBAgentConnectionGenerator from '../ts/dynamodb/agent-connection/generator';\nimport { TS_DYNAMODB_GENERATOR_INFO } from '../ts/dynamodb/generator';\nimport tsDynamoDBMcpServerConnectionGenerator from '../ts/dynamodb/mcp-server-connection/generator';\nimport tsDynamoDBSmithyConnectionGenerator from '../ts/dynamodb/smithy-connection/generator';\nimport tsDynamoDBTrpcConnectionGenerator from '../ts/dynamodb/trpc-connection/generator';\nimport tsRdbAgentConnectionGenerator from '../ts/rdb/agent-connection/generator';\nimport { TS_RDB_GENERATOR_INFO } from '../ts/rdb/generator';\nimport tsRdbMcpServerConnectionGenerator from '../ts/rdb/mcp-server-connection/generator';\nimport tsRdbSmithyConnectionGenerator from '../ts/rdb/smithy-connection/generator';\nimport tsRdbTrpcConnectionGenerator from '../ts/rdb/trpc-connection/generator';\nimport { hasExportDeclaration } from '../utils/ast';\nimport {\n type ComponentMetadata,\n readProjectConfigurationUnqualified,\n} from '../utils/nx';\nimport { readToml } from '../utils/toml';\nimport type { ConnectionGeneratorSchema } from './schema';\nimport {\n type Connection,\n type ConnectionKey,\n SUPPORTED_CONNECTIONS,\n type SUPPORTED_PROJECT_TYPES,\n} from './supported-connections';\n\nexport type { Connection };\n\ntype ProjectType = (typeof SUPPORTED_PROJECT_TYPES)[number];\n\n/**\n * Sentinel value for sourceComponent/targetComponent that means\n * \"use the project-level connection, not a component\".\n */\nexport const PROJECT_COMPONENT_SENTINEL = '.';\n\n/**\n * The result of resolving a connection, including the matched connection\n * and any resolved source/target component metadata.\n */\nexport interface ResolvedConnection {\n readonly connection: Connection;\n readonly sourceComponent?: ComponentMetadata;\n readonly targetComponent?: ComponentMetadata;\n}\n\n/**\n * Generators for each connection type\n */\n/**\n * Options passed to connection generators, including resolved component metadata.\n */\nexport interface ResolvedConnectionOptions {\n sourceProject: string;\n targetProject: string;\n sourceComponent?: ComponentMetadata;\n targetComponent?: ComponentMetadata;\n preferInstallDependencies?: boolean;\n}\n\nconst CONNECTION_GENERATORS = {\n 'ts#trpc-api -> ts#rdb': (tree, options) =>\n tsRdbTrpcConnectionGenerator(tree, options),\n 'ts#agent -> ts#rdb': (tree, options) =>\n tsRdbAgentConnectionGenerator(tree, options),\n 'ts#smithy-api -> ts#rdb': (tree, options) =>\n tsRdbSmithyConnectionGenerator(tree, options),\n 'ts#mcp-server -> ts#rdb': (tree, options) =>\n tsRdbMcpServerConnectionGenerator(tree, options),\n 'ts#trpc-api -> ts#dynamodb': (tree, options) =>\n tsDynamoDBTrpcConnectionGenerator(tree, options),\n 'ts#agent -> ts#dynamodb': (tree, options) =>\n tsDynamoDBAgentConnectionGenerator(tree, options),\n 'ts#smithy-api -> ts#dynamodb': (tree, options) =>\n tsDynamoDBSmithyConnectionGenerator(tree, options),\n 'ts#mcp-server -> ts#dynamodb': (tree, options) =>\n tsDynamoDBMcpServerConnectionGenerator(tree, options),\n 'ts#react-website -> ts#trpc-api': (tree, options) =>\n trpcReactGenerator(tree, {\n frontendProjectName: options.sourceProject,\n backendProjectName: options.targetProject,\n preferInstallDependencies: options.preferInstallDependencies,\n }),\n 'ts#react-website -> py#fast-api': (tree, options) =>\n fastApiReactGenerator(tree, {\n frontendProjectName: options.sourceProject,\n fastApiProjectName: options.targetProject,\n preferInstallDependencies: options.preferInstallDependencies,\n }),\n 'ts#react-website -> ts#smithy-api': (tree, options) =>\n smithyReactConnectionGenerator(tree, {\n frontendProjectName: options.sourceProject,\n smithyModelOrBackendProjectName: options.targetProject,\n preferInstallDependencies: options.preferInstallDependencies,\n }),\n 'ts#react-website -> ts#agent': (tree, options) =>\n tsAgentReactConnectionGenerator(tree, options),\n 'ts#react-website -> py#agent': (tree, options) =>\n pyAgentReactConnectionGenerator(tree, options),\n 'ts#agent -> ts#mcp-server': (tree, options) =>\n tsAgentMcpConnectionGenerator(tree, options),\n 'ts#agent -> py#mcp-server': (tree, options) =>\n tsAgentMcpConnectionGenerator(tree, options),\n 'py#agent -> ts#mcp-server': (tree, options) =>\n pyAgentMcpConnectionGenerator(tree, options),\n 'py#agent -> py#mcp-server': (tree, options) =>\n pyAgentMcpConnectionGenerator(tree, options),\n 'ts#agent -> ts#agent': (tree, options) =>\n tsAgentA2aConnectionGenerator(tree, options),\n 'ts#agent -> py#agent': (tree, options) =>\n tsAgentA2aConnectionGenerator(tree, options),\n 'py#agent -> ts#agent': (tree, options) =>\n pyAgentA2aConnectionGenerator(tree, options),\n 'py#agent -> py#agent': (tree, options) =>\n pyAgentA2aConnectionGenerator(tree, options),\n 'ts#agent -> agentcore-gateway': (tree, options) =>\n tsAgentGatewayConnectionGenerator(tree, options),\n 'py#agent -> agentcore-gateway': (tree, options) =>\n pyAgentGatewayConnectionGenerator(tree, options),\n 'agentcore-gateway -> ts#mcp-server': (tree, options) =>\n agentcoreGatewayMcpConnectionGenerator(tree, options),\n 'agentcore-gateway -> py#mcp-server': (tree, options) =>\n agentcoreGatewayMcpConnectionGenerator(tree, options),\n 'agentcore-gateway -> agentcore-gateway': (tree, options) =>\n agentcoreGatewayGatewayConnectionGenerator(tree, options),\n 'py#fast-api -> py#dynamodb': (tree, options) =>\n pyDynamoDBFastApiConnectionGenerator(tree, options),\n 'py#agent -> py#dynamodb': (tree, options) =>\n pyDynamoDBAgentConnectionGenerator(tree, options),\n 'py#mcp-server -> py#dynamodb': (tree, options) =>\n pyDynamoDBMcpServerConnectionGenerator(tree, options),\n 'py#fast-api -> py#rdb': (tree, options) =>\n pyRdbFastApiConnectionGenerator(tree, options),\n 'py#agent -> py#rdb': (tree, options) =>\n pyRdbAgentConnectionGenerator(tree, options),\n 'py#mcp-server -> py#rdb': (tree, options) =>\n pyRdbMcpServerConnectionGenerator(tree, options),\n} satisfies Record<\n ConnectionKey,\n (tree: Tree, options: ResolvedConnectionOptions) => Promise<any>\n>;\n\n/**\n * Generator for a connection between two projects\n */\nexport const connectionGenerator = async (\n tree: Tree,\n options: ConnectionGeneratorSchema,\n) => {\n const resolved = await resolveConnection(tree, options);\n\n const connectionKey =\n `${resolved.connection.source} -> ${resolved.connection.target}` as ConnectionKey;\n\n return await CONNECTION_GENERATORS[connectionKey](tree, {\n sourceProject: options.sourceProject,\n targetProject: options.targetProject,\n sourceComponent: resolved.sourceComponent,\n targetComponent: resolved.targetComponent,\n preferInstallDependencies: options.preferInstallDependencies,\n });\n};\n\n/**\n * Find a component in project metadata matching the given reference.\n * Checks by name first, then by path, then by generator.\n */\nexport const findComponentInMetadata = (\n projectConfiguration: ProjectConfiguration,\n componentRef: string,\n): ComponentMetadata | undefined => {\n const components: ComponentMetadata[] =\n (projectConfiguration.metadata as any)?.components ?? [];\n\n return (\n components.find((c) => c.name === componentRef) ??\n components.find((c) => c.path === componentRef) ??\n components.find((c) => c.generator === componentRef)\n );\n};\n\n/**\n * Represents a candidate source or target for a connection, which may be\n * the project itself or a specific component within the project.\n */\ninterface ConnectionCandidate {\n readonly type: string;\n readonly component?: ComponentMetadata;\n}\n\n/**\n * A matched connection between source and target candidates.\n */\ninterface ConnectionMatch {\n readonly connection: Connection;\n readonly sourceComponent?: ComponentMetadata;\n readonly targetComponent?: ComponentMetadata;\n}\n\n/**\n * Gather all connection candidates for a project configuration. This includes:\n * - The project-level type (if it's a supported type)\n * - Each component's generator id as a candidate type\n */\nconst gatherCandidates = async (\n tree: Tree,\n projectConfig: ProjectConfiguration,\n): Promise<ConnectionCandidate[]> => {\n const type = await determineProjectTypeFromConfig(tree, projectConfig);\n const components: ComponentMetadata[] =\n (projectConfig.metadata as any)?.components ?? [];\n\n return [\n ...(type ? [{ type: type }] : []),\n ...components.map((component) => ({\n type: component.generator,\n component,\n })),\n ];\n};\n\n/**\n * Validate that a specified component exists in the project metadata.\n * Skips validation for undefined refs and the project sentinel '.'.\n */\nconst validateComponent = (\n componentRef: string | undefined,\n projectConfig: ProjectConfiguration,\n side: 'source' | 'target',\n) => {\n if (!componentRef || componentRef === PROJECT_COMPONENT_SENTINEL) return;\n const found = findComponentInMetadata(projectConfig, componentRef);\n if (!found) {\n const components: ComponentMetadata[] =\n (projectConfig.metadata as any)?.components ?? [];\n throw new Error(\n `Component '${componentRef}' not found in ${side} project ${projectConfig.name}. ` +\n `Available components: ${components.length > 0 ? components.map((c) => c.name ?? c.generator).join(', ') : 'none'}`,\n );\n }\n};\n\n/**\n * Narrow candidates based on the user's specified component reference.\n */\nconst filterConnectionCandidatesForComponentReference = (\n componentRef: string | undefined,\n projectConfig: ProjectConfiguration,\n candidates: ConnectionCandidate[],\n supportedConnections: readonly Connection[],\n side: 'source' | 'target',\n): ConnectionCandidate[] => {\n if (!componentRef) return candidates;\n if (componentRef === PROJECT_COMPONENT_SENTINEL) {\n return candidates.filter((c) => !c.component);\n }\n const component = findComponentInMetadata(projectConfig, componentRef);\n if (!component) return candidates;\n const isConnectionParticipant = supportedConnections.some(\n (c) => c[side] === component.generator,\n );\n if (!isConnectionParticipant) return candidates;\n // Filter to the specific matched component, not all components with the same generator\n return candidates.filter((c) => c.component === component);\n};\n\n/**\n * Resolve the connection to use, considering source/target projects and components.\n */\nexport const resolveConnection = async (\n tree: Tree,\n options: ConnectionGeneratorSchema,\n supportedConnections: readonly Connection[] = SUPPORTED_CONNECTIONS,\n): Promise<ResolvedConnection> => {\n const sourceConfig = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetConfig = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n // Validate explicitly specified components exist\n validateComponent(options.sourceComponent, sourceConfig, 'source');\n validateComponent(options.targetComponent, targetConfig, 'target');\n\n // Gather and narrow candidates\n const sourceCandidates = filterConnectionCandidatesForComponentReference(\n options.sourceComponent,\n sourceConfig,\n await gatherCandidates(tree, sourceConfig),\n supportedConnections,\n 'source',\n );\n const targetCandidates = filterConnectionCandidatesForComponentReference(\n options.targetComponent,\n targetConfig,\n await gatherCandidates(tree, targetConfig),\n supportedConnections,\n 'target',\n );\n\n // Cross-product candidates and find supported connections\n const matches: ConnectionMatch[] = [];\n for (const source of sourceCandidates) {\n for (const target of targetCandidates) {\n const match = supportedConnections.find(\n (c) => c.source === source.type && c.target === target.type,\n );\n if (match) {\n matches.push({\n connection: match,\n sourceComponent: source.component,\n targetComponent: target.component,\n });\n }\n }\n }\n\n if (matches.length === 0) {\n const sourceTypes = [...new Set(sourceCandidates.map((c) => c.type))];\n const targetTypes = [...new Set(targetCandidates.map((c) => c.type))];\n throw new Error(\n `This generator does not support a connection from ${options.sourceProject}${sourceTypes.length > 0 ? ` (${sourceTypes.join(', ')})` : ''} to ${options.targetProject}${targetTypes.length > 0 ? ` (${targetTypes.join(', ')})` : ''}`,\n );\n }\n\n if (matches.length > 1) {\n const connectionDescriptions = matches\n .map((m) => {\n const sourceName = m.sourceComponent?.name;\n const targetName = m.targetComponent?.name;\n const sourceLabel = sourceName\n ? `${sourceName} (${m.connection.source})`\n : m.connection.source;\n const targetLabel = targetName\n ? `${targetName} (${m.connection.target})`\n : m.connection.target;\n return `${sourceLabel} -> ${targetLabel}`;\n })\n .join(', ');\n throw new Error(\n `Ambiguous connection from ${options.sourceProject} to ${options.targetProject}. ` +\n `Multiple supported connections found: ${connectionDescriptions}. ` +\n `Please specify sourceComponent and/or targetComponent to disambiguate.`,\n );\n }\n\n return {\n connection: matches[0].connection,\n sourceComponent: matches[0].sourceComponent,\n targetComponent: matches[0].targetComponent,\n };\n};\n\n/**\n * Determine whether the given project is of a known project type\n */\nexport const determineProjectType = async (\n tree: Tree,\n projectName: string,\n): Promise<ProjectType | undefined> => {\n const projectConfiguration = readProjectConfigurationUnqualified(\n tree,\n projectName,\n );\n return await determineProjectTypeFromConfig(tree, projectConfiguration);\n};\n\n/**\n * Determine whether the given project configuration is of a known project type\n */\nconst determineProjectTypeFromConfig = async (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): Promise<ProjectType | undefined> => {\n // NB: if adding new checks, ensure these go from most to least specific\n // eg. react website is more specific than typescript project\n\n if (await isTrpcApi(tree, projectConfiguration)) {\n return 'ts#trpc-api';\n }\n\n if (isFastApi(tree, projectConfiguration)) {\n return 'py#fast-api';\n }\n\n if (isSmithyApi(tree, projectConfiguration)) {\n return 'ts#smithy-api';\n }\n\n if (isReact(tree, projectConfiguration)) {\n return 'ts#react-website';\n }\n\n if (isRdb(projectConfiguration)) {\n return 'ts#rdb';\n }\n\n if (isTsDynamoDB(projectConfiguration)) {\n return 'ts#dynamodb';\n }\n\n if (isPyDynamoDB(projectConfiguration)) {\n return 'py#dynamodb';\n }\n\n if (isPyRdb(projectConfiguration)) {\n return 'py#rdb';\n }\n\n if (isAgentCoreGateway(projectConfiguration)) {\n return 'agentcore-gateway';\n }\n\n return undefined;\n};\n\nconst sourceRoot = (projectConfiguration: ProjectConfiguration) =>\n projectConfiguration.sourceRoot ??\n joinPathFragments(projectConfiguration.root, 'src');\n\nconst isTrpcApi = async (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): Promise<boolean> => {\n // If the project.json says it's a trpc api, there's no need for introspection\n if ((projectConfiguration.metadata as any)?.apiType === 'trpc') {\n return true;\n }\n\n // Find the src/index.ts\n const indexTs = tree.read(\n joinPathFragments(sourceRoot(projectConfiguration), 'index.ts'),\n 'utf-8',\n );\n if (indexTs === null) {\n return false;\n }\n\n // If the index file exports an AppRouter, it's a trpc api\n if (await hasExportDeclaration(tree, indexTs, 'AppRouter')) {\n return true;\n }\n\n // If there's a src/router.ts or src/lambdas/router.ts which exports an AppRouter, it's a trpc api\n const trpcRouter =\n tree.read(\n joinPathFragments(sourceRoot(projectConfiguration), 'router.ts'),\n 'utf-8',\n ) ??\n tree.read(\n joinPathFragments(\n sourceRoot(projectConfiguration),\n 'lambdas',\n 'router.ts',\n ),\n 'utf-8',\n );\n\n if (trpcRouter === null) {\n return false;\n }\n\n if (await hasExportDeclaration(tree, trpcRouter, 'AppRouter')) {\n return true;\n }\n\n return false;\n};\n\nconst isReact = (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): boolean => {\n // if there's a main.tsx, it's a react app\n return tree.exists(\n joinPathFragments(sourceRoot(projectConfiguration), 'main.tsx'),\n );\n};\n\nconst isFastApi = (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): boolean => {\n // If the project.json says it's a fast api, there's no need for introspection\n if ((projectConfiguration.metadata as any)?.apiType === 'fast-api') {\n return true;\n }\n\n const pyProjectPath = joinPathFragments(\n projectConfiguration.root,\n 'pyproject.toml',\n );\n if (tree.exists(pyProjectPath)) {\n const pyProject = readToml(tree, pyProjectPath);\n if (((pyProject as any)?.project?.dependencies ?? []).includes('fastapi')) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isSmithyApi = (\n _tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): boolean => {\n // Support selecting either the smithy model or backend project\n return [\n SMITHY_PROJECT_GENERATOR_INFO.id,\n TS_SMITHY_API_GENERATOR_INFO.id,\n ].includes(((projectConfiguration.metadata as any) ?? {}).generator);\n};\n\nconst isRdb = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n TS_RDB_GENERATOR_INFO.id;\n\nconst isTsDynamoDB = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n TS_DYNAMODB_GENERATOR_INFO.id;\n\nconst isPyDynamoDB = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n PY_DYNAMODB_GENERATOR_INFO.id;\n\nconst isPyRdb = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n PY_RDB_GENERATOR_INFO.id;\n\nconst isAgentCoreGateway = (\n projectConfiguration: ProjectConfiguration,\n): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n AGENTCORE_GATEWAY_GENERATOR_INFO.id;\n\nexport default connectionGenerator;\n"],"names":["joinPathFragments","agentcoreGatewayGatewayConnectionGenerator","AGENTCORE_GATEWAY_GENERATOR_INFO","agentcoreGatewayMcpConnectionGenerator","pyAgentA2aConnectionGenerator","pyAgentGatewayConnectionGenerator","pyAgentMcpConnectionGenerator","pyAgentReactConnectionGenerator","pyDynamoDBAgentConnectionGenerator","pyDynamoDBFastApiConnectionGenerator","PY_DYNAMODB_GENERATOR_INFO","pyDynamoDBMcpServerConnectionGenerator","fastApiReactGenerator","pyRdbAgentConnectionGenerator","pyRdbFastApiConnectionGenerator","PY_RDB_GENERATOR_INFO","pyRdbMcpServerConnectionGenerator","SMITHY_PROJECT_GENERATOR_INFO","smithyReactConnectionGenerator","TS_SMITHY_API_GENERATOR_INFO","trpcReactGenerator","tsAgentA2aConnectionGenerator","tsAgentGatewayConnectionGenerator","tsAgentMcpConnectionGenerator","tsAgentReactConnectionGenerator","tsDynamoDBAgentConnectionGenerator","TS_DYNAMODB_GENERATOR_INFO","tsDynamoDBMcpServerConnectionGenerator","tsDynamoDBSmithyConnectionGenerator","tsDynamoDBTrpcConnectionGenerator","tsRdbAgentConnectionGenerator","TS_RDB_GENERATOR_INFO","tsRdbMcpServerConnectionGenerator","tsRdbSmithyConnectionGenerator","tsRdbTrpcConnectionGenerator","hasExportDeclaration","readProjectConfigurationUnqualified","readToml","SUPPORTED_CONNECTIONS","PROJECT_COMPONENT_SENTINEL","CONNECTION_GENERATORS","tree","options","frontendProjectName","sourceProject","backendProjectName","targetProject","preferInstallDependencies","fastApiProjectName","smithyModelOrBackendProjectName","connectionGenerator","resolved","resolveConnection","connectionKey","connection","source","target","sourceComponent","targetComponent","findComponentInMetadata","projectConfiguration","componentRef","components","metadata","find","c","name","path","generator","gatherCandidates","projectConfig","type","determineProjectTypeFromConfig","map","component","validateComponent","side","found","Error","length","join","filterConnectionCandidatesForComponentReference","candidates","supportedConnections","filter","isConnectionParticipant","some","sourceConfig","targetConfig","sourceCandidates","targetCandidates","matches","match","push","sourceTypes","Set","targetTypes","connectionDescriptions","m","sourceName","targetName","sourceLabel","targetLabel","determineProjectType","projectName","isTrpcApi","isFastApi","isSmithyApi","isReact","isRdb","isTsDynamoDB","isPyDynamoDB","isPyRdb","isAgentCoreGateway","undefined","sourceRoot","root","apiType","indexTs","read","trpcRouter","exists","pyProjectPath","pyProject","project","dependencies","includes","_tree","id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../packages/nx-plugin/src/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 joinPathFragments,\n type ProjectConfiguration,\n type Tree,\n} from '@nx/devkit';\nimport agentcoreGatewayAgentConnectionGenerator from '../agentcore-gateway/agent-connection/generator';\nimport agentcoreGatewayGatewayConnectionGenerator from '../agentcore-gateway/gateway-connection/generator';\nimport { AGENTCORE_GATEWAY_GENERATOR_INFO } from '../agentcore-gateway/generator';\nimport agentcoreGatewayMcpConnectionGenerator from '../agentcore-gateway/mcp-connection/generator';\nimport agentcoreGatewayReactConnectionGenerator from '../agentcore-gateway/react-connection/generator';\nimport pyAgentA2aConnectionGenerator from '../py/agent/a2a-connection/generator';\nimport pyAgentGatewayConnectionGenerator from '../py/agent/gateway-connection/generator';\nimport pyAgentMcpConnectionGenerator from '../py/agent/mcp-connection/generator';\nimport pyAgentReactConnectionGenerator from '../py/agent/react-connection/generator';\nimport pyDynamoDBAgentConnectionGenerator from '../py/dynamodb/agent-connection/generator';\nimport pyDynamoDBFastApiConnectionGenerator from '../py/dynamodb/fast-api-connection/generator';\nimport { PY_DYNAMODB_GENERATOR_INFO } from '../py/dynamodb/generator';\nimport pyDynamoDBMcpServerConnectionGenerator from '../py/dynamodb/mcp-server-connection/generator';\nimport fastApiReactGenerator from '../py/fast-api/react/generator';\nimport pyRdbAgentConnectionGenerator from '../py/rdb/agent-connection/generator';\nimport pyRdbFastApiConnectionGenerator from '../py/rdb/fast-api-connection/generator';\nimport { PY_RDB_GENERATOR_INFO } from '../py/rdb/generator';\nimport pyRdbMcpServerConnectionGenerator from '../py/rdb/mcp-server-connection/generator';\nimport { SMITHY_PROJECT_GENERATOR_INFO } from '../smithy/project/generator';\nimport smithyReactConnectionGenerator from '../smithy/react-connection/generator';\nimport { TS_SMITHY_API_GENERATOR_INFO } from '../smithy/ts/api/generator';\nimport trpcReactGenerator from '../trpc/react/generator';\nimport tsAgentA2aConnectionGenerator from '../ts/agent/a2a-connection/generator';\nimport tsAgentGatewayConnectionGenerator from '../ts/agent/gateway-connection/generator';\nimport tsAgentMcpConnectionGenerator from '../ts/agent/mcp-connection/generator';\nimport tsAgentReactConnectionGenerator from '../ts/agent/react-connection/generator';\nimport tsDynamoDBAgentConnectionGenerator from '../ts/dynamodb/agent-connection/generator';\nimport { TS_DYNAMODB_GENERATOR_INFO } from '../ts/dynamodb/generator';\nimport tsDynamoDBMcpServerConnectionGenerator from '../ts/dynamodb/mcp-server-connection/generator';\nimport tsDynamoDBSmithyConnectionGenerator from '../ts/dynamodb/smithy-connection/generator';\nimport tsDynamoDBTrpcConnectionGenerator from '../ts/dynamodb/trpc-connection/generator';\nimport tsRdbAgentConnectionGenerator from '../ts/rdb/agent-connection/generator';\nimport { TS_RDB_GENERATOR_INFO } from '../ts/rdb/generator';\nimport tsRdbMcpServerConnectionGenerator from '../ts/rdb/mcp-server-connection/generator';\nimport tsRdbSmithyConnectionGenerator from '../ts/rdb/smithy-connection/generator';\nimport tsRdbTrpcConnectionGenerator from '../ts/rdb/trpc-connection/generator';\nimport { hasExportDeclaration } from '../utils/ast';\nimport {\n type ComponentMetadata,\n readProjectConfigurationUnqualified,\n} from '../utils/nx';\nimport { readToml } from '../utils/toml';\nimport type { ConnectionGeneratorSchema } from './schema';\nimport {\n type Connection,\n type ConnectionKey,\n SUPPORTED_CONNECTIONS,\n type SUPPORTED_PROJECT_TYPES,\n} from './supported-connections';\n\nexport type { Connection };\n\ntype ProjectType = (typeof SUPPORTED_PROJECT_TYPES)[number];\n\n/**\n * Sentinel value for sourceComponent/targetComponent that means\n * \"use the project-level connection, not a component\".\n */\nexport const PROJECT_COMPONENT_SENTINEL = '.';\n\n/**\n * The result of resolving a connection, including the matched connection\n * and any resolved source/target component metadata.\n */\nexport interface ResolvedConnection {\n readonly connection: Connection;\n readonly sourceComponent?: ComponentMetadata;\n readonly targetComponent?: ComponentMetadata;\n}\n\n/**\n * Generators for each connection type\n */\n/**\n * Options passed to connection generators, including resolved component metadata.\n */\nexport interface ResolvedConnectionOptions {\n sourceProject: string;\n targetProject: string;\n sourceComponent?: ComponentMetadata;\n targetComponent?: ComponentMetadata;\n preferInstallDependencies?: boolean;\n}\n\nconst CONNECTION_GENERATORS = {\n 'ts#trpc-api -> ts#rdb': (tree, options) =>\n tsRdbTrpcConnectionGenerator(tree, options),\n 'ts#agent -> ts#rdb': (tree, options) =>\n tsRdbAgentConnectionGenerator(tree, options),\n 'ts#smithy-api -> ts#rdb': (tree, options) =>\n tsRdbSmithyConnectionGenerator(tree, options),\n 'ts#mcp-server -> ts#rdb': (tree, options) =>\n tsRdbMcpServerConnectionGenerator(tree, options),\n 'ts#trpc-api -> ts#dynamodb': (tree, options) =>\n tsDynamoDBTrpcConnectionGenerator(tree, options),\n 'ts#agent -> ts#dynamodb': (tree, options) =>\n tsDynamoDBAgentConnectionGenerator(tree, options),\n 'ts#smithy-api -> ts#dynamodb': (tree, options) =>\n tsDynamoDBSmithyConnectionGenerator(tree, options),\n 'ts#mcp-server -> ts#dynamodb': (tree, options) =>\n tsDynamoDBMcpServerConnectionGenerator(tree, options),\n 'ts#react-website -> ts#trpc-api': (tree, options) =>\n trpcReactGenerator(tree, {\n frontendProjectName: options.sourceProject,\n backendProjectName: options.targetProject,\n preferInstallDependencies: options.preferInstallDependencies,\n }),\n 'ts#react-website -> py#fast-api': (tree, options) =>\n fastApiReactGenerator(tree, {\n frontendProjectName: options.sourceProject,\n fastApiProjectName: options.targetProject,\n preferInstallDependencies: options.preferInstallDependencies,\n }),\n 'ts#react-website -> ts#smithy-api': (tree, options) =>\n smithyReactConnectionGenerator(tree, {\n frontendProjectName: options.sourceProject,\n smithyModelOrBackendProjectName: options.targetProject,\n preferInstallDependencies: options.preferInstallDependencies,\n }),\n 'ts#react-website -> ts#agent': (tree, options) =>\n tsAgentReactConnectionGenerator(tree, options),\n 'ts#react-website -> py#agent': (tree, options) =>\n pyAgentReactConnectionGenerator(tree, options),\n 'ts#agent -> ts#mcp-server': (tree, options) =>\n tsAgentMcpConnectionGenerator(tree, options),\n 'ts#agent -> py#mcp-server': (tree, options) =>\n tsAgentMcpConnectionGenerator(tree, options),\n 'py#agent -> ts#mcp-server': (tree, options) =>\n pyAgentMcpConnectionGenerator(tree, options),\n 'py#agent -> py#mcp-server': (tree, options) =>\n pyAgentMcpConnectionGenerator(tree, options),\n 'ts#agent -> ts#agent': (tree, options) =>\n tsAgentA2aConnectionGenerator(tree, options),\n 'ts#agent -> py#agent': (tree, options) =>\n tsAgentA2aConnectionGenerator(tree, options),\n 'py#agent -> ts#agent': (tree, options) =>\n pyAgentA2aConnectionGenerator(tree, options),\n 'py#agent -> py#agent': (tree, options) =>\n pyAgentA2aConnectionGenerator(tree, options),\n 'ts#agent -> agentcore-gateway': (tree, options) =>\n tsAgentGatewayConnectionGenerator(tree, options),\n 'py#agent -> agentcore-gateway': (tree, options) =>\n pyAgentGatewayConnectionGenerator(tree, options),\n 'ts#react-website -> agentcore-gateway': (tree, options) =>\n agentcoreGatewayReactConnectionGenerator(tree, options),\n 'agentcore-gateway -> ts#agent': (tree, options) =>\n agentcoreGatewayAgentConnectionGenerator(tree, options),\n 'agentcore-gateway -> py#agent': (tree, options) =>\n agentcoreGatewayAgentConnectionGenerator(tree, options),\n 'agentcore-gateway -> ts#mcp-server': (tree, options) =>\n agentcoreGatewayMcpConnectionGenerator(tree, options),\n 'agentcore-gateway -> py#mcp-server': (tree, options) =>\n agentcoreGatewayMcpConnectionGenerator(tree, options),\n 'agentcore-gateway -> agentcore-gateway': (tree, options) =>\n agentcoreGatewayGatewayConnectionGenerator(tree, options),\n 'py#fast-api -> py#dynamodb': (tree, options) =>\n pyDynamoDBFastApiConnectionGenerator(tree, options),\n 'py#agent -> py#dynamodb': (tree, options) =>\n pyDynamoDBAgentConnectionGenerator(tree, options),\n 'py#mcp-server -> py#dynamodb': (tree, options) =>\n pyDynamoDBMcpServerConnectionGenerator(tree, options),\n 'py#fast-api -> py#rdb': (tree, options) =>\n pyRdbFastApiConnectionGenerator(tree, options),\n 'py#agent -> py#rdb': (tree, options) =>\n pyRdbAgentConnectionGenerator(tree, options),\n 'py#mcp-server -> py#rdb': (tree, options) =>\n pyRdbMcpServerConnectionGenerator(tree, options),\n} satisfies Record<\n ConnectionKey,\n (tree: Tree, options: ResolvedConnectionOptions) => Promise<any>\n>;\n\n/**\n * Generator for a connection between two projects\n */\nexport const connectionGenerator = async (\n tree: Tree,\n options: ConnectionGeneratorSchema,\n) => {\n const resolved = await resolveConnection(tree, options);\n\n const connectionKey =\n `${resolved.connection.source} -> ${resolved.connection.target}` as ConnectionKey;\n\n return await CONNECTION_GENERATORS[connectionKey](tree, {\n sourceProject: options.sourceProject,\n targetProject: options.targetProject,\n sourceComponent: resolved.sourceComponent,\n targetComponent: resolved.targetComponent,\n preferInstallDependencies: options.preferInstallDependencies,\n });\n};\n\n/**\n * Find a component in project metadata matching the given reference.\n * Checks by name first, then by path, then by generator.\n */\nexport const findComponentInMetadata = (\n projectConfiguration: ProjectConfiguration,\n componentRef: string,\n): ComponentMetadata | undefined => {\n const components: ComponentMetadata[] =\n (projectConfiguration.metadata as any)?.components ?? [];\n\n return (\n components.find((c) => c.name === componentRef) ??\n components.find((c) => c.path === componentRef) ??\n components.find((c) => c.generator === componentRef)\n );\n};\n\n/**\n * Represents a candidate source or target for a connection, which may be\n * the project itself or a specific component within the project.\n */\ninterface ConnectionCandidate {\n readonly type: string;\n readonly component?: ComponentMetadata;\n}\n\n/**\n * A matched connection between source and target candidates.\n */\ninterface ConnectionMatch {\n readonly connection: Connection;\n readonly sourceComponent?: ComponentMetadata;\n readonly targetComponent?: ComponentMetadata;\n}\n\n/**\n * Gather all connection candidates for a project configuration. This includes:\n * - The project-level type (if it's a supported type)\n * - Each component's generator id as a candidate type\n */\nconst gatherCandidates = async (\n tree: Tree,\n projectConfig: ProjectConfiguration,\n): Promise<ConnectionCandidate[]> => {\n const type = await determineProjectTypeFromConfig(tree, projectConfig);\n const components: ComponentMetadata[] =\n (projectConfig.metadata as any)?.components ?? [];\n\n return [\n ...(type ? [{ type: type }] : []),\n ...components.map((component) => ({\n type: component.generator,\n component,\n })),\n ];\n};\n\n/**\n * Validate that a specified component exists in the project metadata.\n * Skips validation for undefined refs and the project sentinel '.'.\n */\nconst validateComponent = (\n componentRef: string | undefined,\n projectConfig: ProjectConfiguration,\n side: 'source' | 'target',\n) => {\n if (!componentRef || componentRef === PROJECT_COMPONENT_SENTINEL) return;\n const found = findComponentInMetadata(projectConfig, componentRef);\n if (!found) {\n const components: ComponentMetadata[] =\n (projectConfig.metadata as any)?.components ?? [];\n throw new Error(\n `Component '${componentRef}' not found in ${side} project ${projectConfig.name}. ` +\n `Available components: ${components.length > 0 ? components.map((c) => c.name ?? c.generator).join(', ') : 'none'}`,\n );\n }\n};\n\n/**\n * Narrow candidates based on the user's specified component reference.\n */\nconst filterConnectionCandidatesForComponentReference = (\n componentRef: string | undefined,\n projectConfig: ProjectConfiguration,\n candidates: ConnectionCandidate[],\n supportedConnections: readonly Connection[],\n side: 'source' | 'target',\n): ConnectionCandidate[] => {\n if (!componentRef) return candidates;\n if (componentRef === PROJECT_COMPONENT_SENTINEL) {\n return candidates.filter((c) => !c.component);\n }\n const component = findComponentInMetadata(projectConfig, componentRef);\n if (!component) return candidates;\n const isConnectionParticipant = supportedConnections.some(\n (c) => c[side] === component.generator,\n );\n if (!isConnectionParticipant) return candidates;\n // Filter to the specific matched component, not all components with the same generator\n return candidates.filter((c) => c.component === component);\n};\n\n/**\n * Resolve the connection to use, considering source/target projects and components.\n */\nexport const resolveConnection = async (\n tree: Tree,\n options: ConnectionGeneratorSchema,\n supportedConnections: readonly Connection[] = SUPPORTED_CONNECTIONS,\n): Promise<ResolvedConnection> => {\n const sourceConfig = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetConfig = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n // Validate explicitly specified components exist\n validateComponent(options.sourceComponent, sourceConfig, 'source');\n validateComponent(options.targetComponent, targetConfig, 'target');\n\n // Gather and narrow candidates\n const sourceCandidates = filterConnectionCandidatesForComponentReference(\n options.sourceComponent,\n sourceConfig,\n await gatherCandidates(tree, sourceConfig),\n supportedConnections,\n 'source',\n );\n const targetCandidates = filterConnectionCandidatesForComponentReference(\n options.targetComponent,\n targetConfig,\n await gatherCandidates(tree, targetConfig),\n supportedConnections,\n 'target',\n );\n\n // Cross-product candidates and find supported connections\n const matches: ConnectionMatch[] = [];\n for (const source of sourceCandidates) {\n for (const target of targetCandidates) {\n const match = supportedConnections.find(\n (c) => c.source === source.type && c.target === target.type,\n );\n if (match) {\n matches.push({\n connection: match,\n sourceComponent: source.component,\n targetComponent: target.component,\n });\n }\n }\n }\n\n if (matches.length === 0) {\n const sourceTypes = [...new Set(sourceCandidates.map((c) => c.type))];\n const targetTypes = [...new Set(targetCandidates.map((c) => c.type))];\n throw new Error(\n `This generator does not support a connection from ${options.sourceProject}${sourceTypes.length > 0 ? ` (${sourceTypes.join(', ')})` : ''} to ${options.targetProject}${targetTypes.length > 0 ? ` (${targetTypes.join(', ')})` : ''}`,\n );\n }\n\n if (matches.length > 1) {\n const connectionDescriptions = matches\n .map((m) => {\n const sourceName = m.sourceComponent?.name;\n const targetName = m.targetComponent?.name;\n const sourceLabel = sourceName\n ? `${sourceName} (${m.connection.source})`\n : m.connection.source;\n const targetLabel = targetName\n ? `${targetName} (${m.connection.target})`\n : m.connection.target;\n return `${sourceLabel} -> ${targetLabel}`;\n })\n .join(', ');\n throw new Error(\n `Ambiguous connection from ${options.sourceProject} to ${options.targetProject}. ` +\n `Multiple supported connections found: ${connectionDescriptions}. ` +\n `Please specify sourceComponent and/or targetComponent to disambiguate.`,\n );\n }\n\n return {\n connection: matches[0].connection,\n sourceComponent: matches[0].sourceComponent,\n targetComponent: matches[0].targetComponent,\n };\n};\n\n/**\n * Determine whether the given project is of a known project type\n */\nexport const determineProjectType = async (\n tree: Tree,\n projectName: string,\n): Promise<ProjectType | undefined> => {\n const projectConfiguration = readProjectConfigurationUnqualified(\n tree,\n projectName,\n );\n return await determineProjectTypeFromConfig(tree, projectConfiguration);\n};\n\n/**\n * Determine whether the given project configuration is of a known project type\n */\nconst determineProjectTypeFromConfig = async (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): Promise<ProjectType | undefined> => {\n // NB: if adding new checks, ensure these go from most to least specific\n // eg. react website is more specific than typescript project\n\n if (await isTrpcApi(tree, projectConfiguration)) {\n return 'ts#trpc-api';\n }\n\n if (isFastApi(tree, projectConfiguration)) {\n return 'py#fast-api';\n }\n\n if (isSmithyApi(tree, projectConfiguration)) {\n return 'ts#smithy-api';\n }\n\n if (isReact(tree, projectConfiguration)) {\n return 'ts#react-website';\n }\n\n if (isRdb(projectConfiguration)) {\n return 'ts#rdb';\n }\n\n if (isTsDynamoDB(projectConfiguration)) {\n return 'ts#dynamodb';\n }\n\n if (isPyDynamoDB(projectConfiguration)) {\n return 'py#dynamodb';\n }\n\n if (isPyRdb(projectConfiguration)) {\n return 'py#rdb';\n }\n\n if (isAgentCoreGateway(projectConfiguration)) {\n return 'agentcore-gateway';\n }\n\n return undefined;\n};\n\nconst sourceRoot = (projectConfiguration: ProjectConfiguration) =>\n projectConfiguration.sourceRoot ??\n joinPathFragments(projectConfiguration.root, 'src');\n\nconst isTrpcApi = async (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): Promise<boolean> => {\n // If the project.json says it's a trpc api, there's no need for introspection\n if ((projectConfiguration.metadata as any)?.apiType === 'trpc') {\n return true;\n }\n\n // Find the src/index.ts\n const indexTs = tree.read(\n joinPathFragments(sourceRoot(projectConfiguration), 'index.ts'),\n 'utf-8',\n );\n if (indexTs === null) {\n return false;\n }\n\n // If the index file exports an AppRouter, it's a trpc api\n if (await hasExportDeclaration(tree, indexTs, 'AppRouter')) {\n return true;\n }\n\n // If there's a src/router.ts or src/lambdas/router.ts which exports an AppRouter, it's a trpc api\n const trpcRouter =\n tree.read(\n joinPathFragments(sourceRoot(projectConfiguration), 'router.ts'),\n 'utf-8',\n ) ??\n tree.read(\n joinPathFragments(\n sourceRoot(projectConfiguration),\n 'lambdas',\n 'router.ts',\n ),\n 'utf-8',\n );\n\n if (trpcRouter === null) {\n return false;\n }\n\n if (await hasExportDeclaration(tree, trpcRouter, 'AppRouter')) {\n return true;\n }\n\n return false;\n};\n\nconst isReact = (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): boolean => {\n // if there's a main.tsx, it's a react app\n return tree.exists(\n joinPathFragments(sourceRoot(projectConfiguration), 'main.tsx'),\n );\n};\n\nconst isFastApi = (\n tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): boolean => {\n // If the project.json says it's a fast api, there's no need for introspection\n if ((projectConfiguration.metadata as any)?.apiType === 'fast-api') {\n return true;\n }\n\n const pyProjectPath = joinPathFragments(\n projectConfiguration.root,\n 'pyproject.toml',\n );\n if (tree.exists(pyProjectPath)) {\n const pyProject = readToml(tree, pyProjectPath);\n if (((pyProject as any)?.project?.dependencies ?? []).includes('fastapi')) {\n return true;\n }\n }\n\n return false;\n};\n\nconst isSmithyApi = (\n _tree: Tree,\n projectConfiguration: ProjectConfiguration,\n): boolean => {\n // Support selecting either the smithy model or backend project\n return [\n SMITHY_PROJECT_GENERATOR_INFO.id,\n TS_SMITHY_API_GENERATOR_INFO.id,\n ].includes(((projectConfiguration.metadata as any) ?? {}).generator);\n};\n\nconst isRdb = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n TS_RDB_GENERATOR_INFO.id;\n\nconst isTsDynamoDB = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n TS_DYNAMODB_GENERATOR_INFO.id;\n\nconst isPyDynamoDB = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n PY_DYNAMODB_GENERATOR_INFO.id;\n\nconst isPyRdb = (projectConfiguration: ProjectConfiguration): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n PY_RDB_GENERATOR_INFO.id;\n\nconst isAgentCoreGateway = (\n projectConfiguration: ProjectConfiguration,\n): boolean =>\n ((projectConfiguration.metadata as any) ?? {}).generator ===\n AGENTCORE_GATEWAY_GENERATOR_INFO.id;\n\nexport default connectionGenerator;\n"],"names":["joinPathFragments","agentcoreGatewayAgentConnectionGenerator","agentcoreGatewayGatewayConnectionGenerator","AGENTCORE_GATEWAY_GENERATOR_INFO","agentcoreGatewayMcpConnectionGenerator","agentcoreGatewayReactConnectionGenerator","pyAgentA2aConnectionGenerator","pyAgentGatewayConnectionGenerator","pyAgentMcpConnectionGenerator","pyAgentReactConnectionGenerator","pyDynamoDBAgentConnectionGenerator","pyDynamoDBFastApiConnectionGenerator","PY_DYNAMODB_GENERATOR_INFO","pyDynamoDBMcpServerConnectionGenerator","fastApiReactGenerator","pyRdbAgentConnectionGenerator","pyRdbFastApiConnectionGenerator","PY_RDB_GENERATOR_INFO","pyRdbMcpServerConnectionGenerator","SMITHY_PROJECT_GENERATOR_INFO","smithyReactConnectionGenerator","TS_SMITHY_API_GENERATOR_INFO","trpcReactGenerator","tsAgentA2aConnectionGenerator","tsAgentGatewayConnectionGenerator","tsAgentMcpConnectionGenerator","tsAgentReactConnectionGenerator","tsDynamoDBAgentConnectionGenerator","TS_DYNAMODB_GENERATOR_INFO","tsDynamoDBMcpServerConnectionGenerator","tsDynamoDBSmithyConnectionGenerator","tsDynamoDBTrpcConnectionGenerator","tsRdbAgentConnectionGenerator","TS_RDB_GENERATOR_INFO","tsRdbMcpServerConnectionGenerator","tsRdbSmithyConnectionGenerator","tsRdbTrpcConnectionGenerator","hasExportDeclaration","readProjectConfigurationUnqualified","readToml","SUPPORTED_CONNECTIONS","PROJECT_COMPONENT_SENTINEL","CONNECTION_GENERATORS","tree","options","frontendProjectName","sourceProject","backendProjectName","targetProject","preferInstallDependencies","fastApiProjectName","smithyModelOrBackendProjectName","connectionGenerator","resolved","resolveConnection","connectionKey","connection","source","target","sourceComponent","targetComponent","findComponentInMetadata","projectConfiguration","componentRef","components","metadata","find","c","name","path","generator","gatherCandidates","projectConfig","type","determineProjectTypeFromConfig","map","component","validateComponent","side","found","Error","length","join","filterConnectionCandidatesForComponentReference","candidates","supportedConnections","filter","isConnectionParticipant","some","sourceConfig","targetConfig","sourceCandidates","targetCandidates","matches","match","push","sourceTypes","Set","targetTypes","connectionDescriptions","m","sourceName","targetName","sourceLabel","targetLabel","determineProjectType","projectName","isTrpcApi","isFastApi","isSmithyApi","isReact","isRdb","isTsDynamoDB","isPyDynamoDB","isPyRdb","isAgentCoreGateway","undefined","sourceRoot","root","apiType","indexTs","read","trpcRouter","exists","pyProjectPath","pyProject","project","dependencies","includes","_tree","id"],"mappings":"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"}