@aws/nx-plugin 1.0.0-rc.53 → 1.0.0-rc.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/migrations.json +50 -0
- package/package.json +1 -1
- package/src/agentcore-gateway/gateway-connection/generator.js +3 -1
- package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -1
- package/src/agentcore-gateway/generator.d.ts +49 -1
- package/src/agentcore-gateway/generator.js +55 -22
- package/src/agentcore-gateway/generator.js.map +1 -1
- package/src/agentcore-gateway/mcp-connection/generator.js +3 -1
- package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +2 -0
- package/src/infra/app/generator.d.ts +43 -0
- package/src/infra/app/generator.js +47 -18
- package/src/infra/app/generator.js.map +1 -1
- package/src/init/generator.d.ts +13 -0
- package/src/init/generator.js +14 -3
- package/src/init/generator.js.map +1 -1
- package/src/migrations/latest/backfill-generator-metadata/migration.d.ts +96 -0
- package/src/migrations/latest/backfill-generator-metadata/migration.js +670 -0
- package/src/migrations/latest/backfill-generator-metadata/migration.js.map +1 -0
- package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
- package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js +94 -0
- package/src/migrations/latest/order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
- package/src/preset/generator.d.ts +13 -0
- package/src/preset/generator.js +12 -3
- package/src/preset/generator.js.map +1 -1
- package/src/py/agent/a2a-connection/generator.d.ts +24 -0
- package/src/py/agent/a2a-connection/generator.js +49 -20
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/gateway-connection/generator.d.ts +23 -0
- package/src/py/agent/gateway-connection/generator.js +45 -11
- package/src/py/agent/gateway-connection/generator.js.map +1 -1
- package/src/py/agent/generator.d.ts +146 -1
- package/src/py/agent/generator.js +173 -76
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/generator.d.ts +23 -0
- package/src/py/agent/mcp-connection/generator.js +45 -11
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/generator.d.ts +146 -0
- package/src/py/agent/react-connection/generator.js +27 -4
- package/src/py/agent/react-connection/generator.js.map +1 -1
- package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/py/dynamodb/agent-connection/generator.js +7 -1
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +3 -1
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -1
- package/src/py/dynamodb/generator.d.ts +29 -0
- package/src/py/dynamodb/generator.js +32 -12
- package/src/py/dynamodb/generator.js.map +1 -1
- package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js +7 -1
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/py/fast-api/generator.d.ts +63 -0
- package/src/py/fast-api/generator.js +58 -23
- package/src/py/fast-api/generator.js.map +1 -1
- package/src/py/fast-api/react/generator.d.ts +16 -1
- package/src/py/fast-api/react/generator.js +15 -3
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/lambda-function/generator.d.ts +21 -0
- package/src/py/lambda-function/generator.js +29 -10
- package/src/py/lambda-function/generator.js.map +1 -1
- package/src/py/mcp-server/generator.d.ts +60 -0
- package/src/py/mcp-server/generator.js +62 -25
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/project/generator.d.ts +13 -0
- package/src/py/project/generator.js +29 -10
- package/src/py/project/generator.js.map +1 -1
- package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +19 -0
- package/src/py/rdb/agent-connection/generator.js +7 -1
- package/src/py/rdb/agent-connection/generator.js.map +1 -1
- package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +7 -0
- package/src/py/rdb/fast-api-connection/generator.js +3 -1
- package/src/py/rdb/fast-api-connection/generator.js.map +1 -1
- package/src/py/rdb/generator.d.ts +89 -0
- package/src/py/rdb/generator.js +88 -40
- package/src/py/rdb/generator.js.map +1 -1
- package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/py/rdb/mcp-server-connection/generator.js +7 -1
- package/src/py/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/smithy/project/generator.d.ts +7 -0
- package/src/smithy/project/generator.js +8 -2
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/react-connection/generator.d.ts +15 -0
- package/src/smithy/react-connection/generator.js +17 -3
- package/src/smithy/react-connection/generator.js.map +1 -1
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +1 -0
- package/src/smithy/ts/api/generator.d.ts +79 -0
- package/src/smithy/ts/api/generator.js +77 -33
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/generator.d.ts +50 -0
- package/src/terraform/project/generator.js +63 -17
- package/src/terraform/project/generator.js.map +1 -1
- package/src/trpc/backend/generator.d.ts +84 -0
- package/src/trpc/backend/generator.js +98 -38
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/react/generator.d.ts +37 -0
- package/src/trpc/react/generator.js +63 -26
- package/src/trpc/react/generator.js.map +1 -1
- package/src/ts/agent/a2a-connection/generator.d.ts +46 -0
- package/src/ts/agent/a2a-connection/generator.js +53 -16
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/gateway-connection/generator.d.ts +37 -0
- package/src/ts/agent/gateway-connection/generator.js +41 -14
- package/src/ts/agent/gateway-connection/generator.js.map +1 -1
- package/src/ts/agent/generator.d.ts +162 -0
- package/src/ts/agent/generator.js +166 -75
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
- package/src/ts/agent/mcp-connection/generator.js +41 -14
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/generator.d.ts +186 -0
- package/src/ts/agent/react-connection/generator.js +70 -21
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/astro-docs/generator.d.ts +38 -0
- package/src/ts/astro-docs/generator.js +58 -19
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/dcr-proxy/generator.d.ts +24 -0
- package/src/ts/dcr-proxy/generator.js +31 -14
- package/src/ts/dcr-proxy/generator.js.map +1 -1
- package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/ts/dynamodb/agent-connection/generator.js +7 -1
- package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/generator.d.ts +41 -0
- package/src/ts/dynamodb/generator.js +47 -20
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +18 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.js +7 -1
- package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/dynamodb/smithy-connection/generator.js +3 -1
- package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/dynamodb/trpc-connection/generator.js +3 -1
- package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
- package/src/ts/lambda-function/generator.d.ts +38 -0
- package/src/ts/lambda-function/generator.js +49 -20
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lib/generator.d.ts +7 -0
- package/src/ts/lib/generator.js +8 -1
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/ts-project-utils.d.ts +3 -1
- package/src/ts/lib/ts-project-utils.js +3 -2
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/vitest.d.ts +10 -1
- package/src/ts/lib/vitest.js +14 -2
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/generator.d.ts +71 -0
- package/src/ts/mcp-server/generator.js +73 -36
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/generator.d.ts +3 -0
- package/src/ts/nx-generator/generator.js +8 -2
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-migration/generator.d.ts +3 -0
- package/src/ts/nx-migration/generator.js +8 -2
- package/src/ts/nx-migration/generator.js.map +1 -1
- package/src/ts/nx-plugin/generator.d.ts +3 -0
- package/src/ts/nx-plugin/generator.js +8 -2
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/utils.d.ts +7 -2
- package/src/ts/nx-plugin/utils.js +10 -4
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +10 -0
- package/src/ts/rdb/agent-connection/generator.js +8 -1
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/generator.d.ts +101 -0
- package/src/ts/rdb/generator.js +93 -41
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +10 -0
- package/src/ts/rdb/mcp-server-connection/generator.js +8 -1
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/rdb/smithy-connection/generator.js +4 -1
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +9 -0
- package/src/ts/rdb/trpc-connection/generator.js +3 -1
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/react-website/agui/generator.d.ts +86 -0
- package/src/ts/react-website/agui/generator.js +63 -28
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +20 -2
- package/src/ts/react-website/app/generator.d.ts +136 -1
- package/src/ts/react-website/app/generator.js +109 -40
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/generator.d.ts +19 -0
- package/src/ts/react-website/cognito-auth/generator.js +21 -9
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/utils/add-dependencies.d.ts +38 -0
- package/src/utils/add-dependencies.js +83 -0
- package/src/utils/add-dependencies.js.map +1 -0
- package/src/utils/agent-connection/agent-connection.d.ts +27 -6
- package/src/utils/agent-connection/agent-connection.js +47 -18
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +19 -1
- package/src/utils/agent-core-constructs/agent-core-constructs.js +26 -6
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/api-constructs/api-constructs.d.ts +21 -2
- package/src/utils/api-constructs/api-constructs.js +26 -5
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/bundle/bundle.d.ts +6 -1
- package/src/utils/bundle/bundle.js +8 -2
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.d.ts +5 -4
- package/src/utils/commands.js +2 -6
- package/src/utils/commands.js.map +1 -1
- package/src/utils/connection/open-api/react.d.ts +18 -1
- package/src/utils/connection/open-api/react.js +27 -3
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/declared-dependencies.d.ts +140 -0
- package/src/utils/declared-dependencies.js +64 -0
- package/src/utils/declared-dependencies.js.map +1 -0
- package/src/utils/docker.d.ts +10 -1
- package/src/utils/docker.js +7 -3
- package/src/utils/docker.js.map +1 -1
- package/src/utils/fs.d.ts +15 -4
- package/src/utils/fs.js +26 -13
- package/src/utils/fs.js.map +1 -1
- package/src/utils/init.d.ts +14 -1
- package/src/utils/init.js +25 -7
- package/src/utils/init.js.map +1 -1
- package/src/utils/migration-versions.d.ts +15 -1
- package/src/utils/migration-versions.js +53 -7
- package/src/utils/migration-versions.js.map +1 -1
- package/src/utils/nx.d.ts +18 -0
- package/src/utils/nx.js +4 -0
- package/src/utils/nx.js.map +1 -1
- package/src/utils/py.d.ts +3 -2
- package/src/utils/py.js +10 -10
- package/src/utils/py.js.map +1 -1
- package/src/utils/shared-constructs-constants.d.ts +39 -4
- package/src/utils/shared-constructs-constants.js +29 -0
- package/src/utils/shared-constructs-constants.js.map +1 -1
- package/src/utils/shared-constructs.d.ts +4 -1
- package/src/utils/shared-constructs.js +5 -4
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.d.ts +8 -1
- package/src/utils/shared-dynamodb-scripts.js +11 -3
- package/src/utils/shared-dynamodb-scripts.js.map +1 -1
- package/src/utils/shared-infra-scripts.d.ts +16 -1
- package/src/utils/shared-infra-scripts.js +18 -3
- package/src/utils/shared-infra-scripts.js.map +1 -1
- package/src/utils/shared-rdb-scripts.d.ts +12 -1
- package/src/utils/shared-rdb-scripts.js +17 -3
- package/src/utils/shared-rdb-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.d.ts +26 -1
- package/src/utils/shared-shadcn.js +31 -14
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
- package/src/utils/version-upgrade-migration/migration.js +16 -0
- package/src/utils/version-upgrade-migration/migration.js.map +1 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +35 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.js +42 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +50 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.js +98 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
- package/src/utils/version-upgrade-migration/register.d.ts +18 -0
- package/src/utils/version-upgrade-migration/register.js +33 -0
- package/src/utils/version-upgrade-migration/register.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.js +504 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
- package/src/utils/versions.d.ts +25 -5
- package/src/utils/versions.js +46 -4
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +4 -0
|
@@ -2,17 +2,43 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateProjectConfiguration } from "@nx/devkit";
|
|
5
|
-
import {
|
|
5
|
+
import { addTsDependencies } from "../../../utils/add-dependencies.js";
|
|
6
|
+
import { AGENT_CONNECTION_DEPENDENCIES, AGENT_CONNECTION_PROJECT_DIR, addTypeScriptClientToAgent, addTypeScriptCoreClient, ensureTypeScriptAgentConnectionProject } from "../../../utils/agent-connection/agent-connection.js";
|
|
6
7
|
import { addDestructuredImport, addStarExport } from "../../../utils/ast.js";
|
|
7
|
-
import {
|
|
8
|
+
import { declareDependencies, ownedElsewhere } from "../../../utils/declared-dependencies.js";
|
|
8
9
|
import { formatFilesInSubtree } from "../../../utils/format.js";
|
|
9
10
|
import { installDependencies } from "../../../utils/install.js";
|
|
10
11
|
import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
|
|
11
12
|
import { esmVars } from "../../../utils/module-format.js";
|
|
12
13
|
import { kebabCase } from "../../../utils/names.js";
|
|
13
14
|
import { getNpmScope } from "../../../utils/npm-scope.js";
|
|
14
|
-
import { addDependencyToTargetIfNotPresent, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
|
|
15
|
-
import {
|
|
15
|
+
import { addComponentGeneratorMetadata, addDependencyToTargetIfNotPresent, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
|
|
16
|
+
import { toProjectRelativePath } from "../../../utils/paths.js";
|
|
17
|
+
// The MCP core client + vended client need these whatever the connection's
|
|
18
|
+
// options, so no entry is conditional.
|
|
19
|
+
export const DEPENDENCIES = declareDependencies()({
|
|
20
|
+
ts: [
|
|
21
|
+
{
|
|
22
|
+
name: '@modelcontextprotocol/sdk'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: '@strands-agents/sdk'
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: '@aws-lambda-powertools/parameters'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: '@aws-sdk/client-appconfigdata'
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'aws4fetch'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: '@aws-sdk/credential-providers'
|
|
38
|
+
},
|
|
39
|
+
...ownedElsewhere(AGENT_CONNECTION_DEPENDENCIES)
|
|
40
|
+
]
|
|
41
|
+
});
|
|
16
42
|
export const TS_AGENT_MCP_CONNECTION_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
|
|
17
43
|
export const tsAgentMcpConnectionGenerator = async (tree, options)=>{
|
|
18
44
|
const sourceProject = readProjectConfigurationUnqualified(tree, options.sourceProject);
|
|
@@ -31,8 +57,8 @@ export const tsAgentMcpConnectionGenerator = async (tree, options)=>{
|
|
|
31
57
|
const mcpServerPort = mcpComponent.port ?? 8000;
|
|
32
58
|
const npmScope = getNpmScope(tree);
|
|
33
59
|
// 1. Ensure the shared agent-connection project exists + has the MCP core client
|
|
34
|
-
await ensureTypeScriptAgentConnectionProject(tree);
|
|
35
|
-
await addTypeScriptCoreClient(tree, 'mcp');
|
|
60
|
+
await ensureTypeScriptAgentConnectionProject(tree, DEPENDENCIES);
|
|
61
|
+
await addTypeScriptCoreClient(tree, 'mcp', DEPENDENCIES);
|
|
36
62
|
// 2. Generate the per-connection <Name>Client into app/
|
|
37
63
|
generateFiles(tree, joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'), joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'), {
|
|
38
64
|
mcpServerKebabCase,
|
|
@@ -70,14 +96,15 @@ export const tsAgentMcpConnectionGenerator = async (tree, options)=>{
|
|
|
70
96
|
updateProjectConfiguration(tree, sourceProject.name, sourceProject);
|
|
71
97
|
}
|
|
72
98
|
// 5. Add dependencies required by the MCP core client + vended client
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
99
|
+
addTsDependencies(tree, DEPENDENCIES, {
|
|
100
|
+
projectRoot: sourceProject.root
|
|
101
|
+
});
|
|
102
|
+
// Recorded so the version sync knows this connection's dependencies are ours.
|
|
103
|
+
addComponentGeneratorMetadata(tree, sourceProject.name, TS_AGENT_MCP_CONNECTION_GENERATOR_INFO, toProjectRelativePath(sourceProject, agentFilePath), mcpServerClassName, // The source component this connection is made from, so the pair is
|
|
104
|
+
// identifiable rather than just the two projects.
|
|
105
|
+
{
|
|
106
|
+
sourcePath: options.sourceComponent?.path
|
|
107
|
+
});
|
|
81
108
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
82
109
|
TS_AGENT_MCP_CONNECTION_GENERATOR_INFO
|
|
83
110
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/mcp-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport {\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { esmVars } from '../../../utils/module-format';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScope } from '../../../utils/npm-scope';\nimport {\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport type { TsAgentMcpConnectionGeneratorSchema } from './schema';\n\nexport const TS_AGENT_MCP_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentMcpConnectionGenerator = async (\n tree: Tree,\n options: TsAgentMcpConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n const mcpComponent = options.targetComponent;\n\n if (!agentComponent || !mcpComponent) {\n throw new Error(\n 'Both sourceComponent and targetComponent must be provided for ts#agent -> mcp connections',\n );\n }\n\n if (mcpComponent.auth && mcpComponent.auth.toLowerCase() !== 'iam') {\n throw new Error(\n `MCP server connection currently only supports IAM authentication, but '${mcpComponent.name}' uses '${mcpComponent.auth}' authentication.`,\n );\n }\n\n const mcpComponentName = mcpComponent.name ?? 'mcp-server';\n const mcpServerClassName = mcpComponent.rc as string;\n const mcpServerKebabCase = kebabCase(mcpServerClassName);\n const mcpServerPort = mcpComponent.port ?? 8000;\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the MCP core client\n await ensureTypeScriptAgentConnectionProject(tree);\n await addTypeScriptCoreClient(tree, 'mcp');\n\n // 2. Generate the per-connection <Name>Client into app/\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n mcpServerKebabCase,\n mcpServerClassName,\n mcpServerPort,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add re-export to index.ts\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${mcpServerKebabCase}-client-strands.js`,\n );\n\n // 3. AST transform agent.ts to add MCP tools\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${mcpServerClassName}ClientStrands`;\n const clientVarName =\n mcpServerClassName.charAt(0).toLowerCase() + mcpServerClassName.slice(1);\n\n // Add import for the client\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Set up dev target\n const agentName = agentComponent.name ?? 'agent';\n const devTargetName = `${agentName}-dev`;\n const mcpDevTargetName = `${mcpComponentName}-dev`;\n\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: mcpDevTargetName,\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Add dependencies required by the MCP core client + vended client\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@modelcontextprotocol/sdk',\n '@strands-agents/sdk',\n '@aws-lambda-powertools/parameters',\n '@aws-sdk/client-appconfigdata',\n 'aws4fetch',\n '@aws-sdk/credential-providers',\n ]),\n {},\n joinPathFragments(sourceProject.root, 'package.json'),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_MCP_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentMcpConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","addDependenciesToPackageJson","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","TS_AGENT_MCP_CONNECTION_GENERATOR_INFO","filename","tsAgentMcpConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","mcpComponent","targetComponent","Error","auth","toLowerCase","name","mcpComponentName","mcpServerClassName","rc","mcpServerKebabCase","mcpServerPort","port","npmScope","dirname","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","slice","agentName","devTargetName","mcpDevTargetName","targets","projects","target","preferInstallDependencies","languages"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/mcp-connection/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type GeneratorCallback,\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateProjectConfiguration,\n} from '@nx/devkit';\nimport { addTsDependencies } from '../../../utils/add-dependencies';\nimport {\n AGENT_CONNECTION_DEPENDENCIES,\n AGENT_CONNECTION_PROJECT_DIR,\n addTypeScriptClientToAgent,\n addTypeScriptCoreClient,\n ensureTypeScriptAgentConnectionProject,\n} from '../../../utils/agent-connection/agent-connection';\nimport { addDestructuredImport, addStarExport } from '../../../utils/ast';\nimport {\n declareDependencies,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { esmVars } from '../../../utils/module-format';\nimport { kebabCase } from '../../../utils/names';\nimport { getNpmScope } from '../../../utils/npm-scope';\nimport {\n addComponentGeneratorMetadata,\n addDependencyToTargetIfNotPresent,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { toProjectRelativePath } from '../../../utils/paths';\nimport type { TsAgentMcpConnectionGeneratorSchema } from './schema';\n\n// The MCP core client + vended client need these whatever the connection's\n// options, so no entry is conditional.\nexport const DEPENDENCIES = declareDependencies()({\n ts: [\n { name: '@modelcontextprotocol/sdk' },\n { name: '@strands-agents/sdk' },\n { name: '@aws-lambda-powertools/parameters' },\n { name: '@aws-sdk/client-appconfigdata' },\n { name: 'aws4fetch' },\n { name: '@aws-sdk/credential-providers' },\n ...ownedElsewhere(AGENT_CONNECTION_DEPENDENCIES),\n ],\n});\n\nexport const TS_AGENT_MCP_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport const tsAgentMcpConnectionGenerator = async (\n tree: Tree,\n options: TsAgentMcpConnectionGeneratorSchema,\n): Promise<GeneratorCallback> => {\n const sourceProject = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const targetProject = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const agentComponent = options.sourceComponent;\n const mcpComponent = options.targetComponent;\n\n if (!agentComponent || !mcpComponent) {\n throw new Error(\n 'Both sourceComponent and targetComponent must be provided for ts#agent -> mcp connections',\n );\n }\n\n if (mcpComponent.auth && mcpComponent.auth.toLowerCase() !== 'iam') {\n throw new Error(\n `MCP server connection currently only supports IAM authentication, but '${mcpComponent.name}' uses '${mcpComponent.auth}' authentication.`,\n );\n }\n\n const mcpComponentName = mcpComponent.name ?? 'mcp-server';\n const mcpServerClassName = mcpComponent.rc as string;\n const mcpServerKebabCase = kebabCase(mcpServerClassName);\n const mcpServerPort = mcpComponent.port ?? 8000;\n\n const npmScope = getNpmScope(tree);\n\n // 1. Ensure the shared agent-connection project exists + has the MCP core client\n await ensureTypeScriptAgentConnectionProject(tree, DEPENDENCIES);\n await addTypeScriptCoreClient(tree, 'mcp', DEPENDENCIES);\n\n // 2. Generate the per-connection <Name>Client into app/\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files', 'agent-connection', 'app'),\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'app'),\n {\n mcpServerKebabCase,\n mcpServerClassName,\n mcpServerPort,\n ...esmVars(tree),\n },\n { overwriteStrategy: OverwriteStrategy.KeepExisting },\n );\n\n // Add re-export to index.ts\n await addStarExport(\n tree,\n joinPathFragments(AGENT_CONNECTION_PROJECT_DIR, 'src', 'index.ts'),\n `./app/${mcpServerKebabCase}-client-strands.js`,\n );\n\n // 3. AST transform agent.ts to add MCP tools\n const agentSourceDir = joinPathFragments(\n sourceProject.root,\n agentComponent.path ?? 'src',\n );\n const agentFilePath = joinPathFragments(agentSourceDir, 'agent.ts');\n\n if (tree.exists(agentFilePath)) {\n const clientClassName = `${mcpServerClassName}ClientStrands`;\n const clientVarName =\n mcpServerClassName.charAt(0).toLowerCase() + mcpServerClassName.slice(1);\n\n // Add import for the client\n await addDestructuredImport(\n tree,\n agentFilePath,\n [clientClassName],\n `@${npmScope}/agent-connection`,\n );\n\n await addTypeScriptClientToAgent(\n tree,\n agentFilePath,\n clientClassName,\n clientVarName,\n );\n }\n\n // 4. Set up dev target\n const agentName = agentComponent.name ?? 'agent';\n const devTargetName = `${agentName}-dev`;\n const mcpDevTargetName = `${mcpComponentName}-dev`;\n\n if (sourceProject.targets?.[devTargetName]) {\n addDependencyToTargetIfNotPresent(sourceProject, devTargetName, {\n projects: [targetProject.name],\n target: mcpDevTargetName,\n });\n updateProjectConfiguration(tree, sourceProject.name, sourceProject);\n }\n\n // 5. Add dependencies required by the MCP core client + vended client\n addTsDependencies(tree, DEPENDENCIES, { projectRoot: sourceProject.root });\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n sourceProject.name,\n TS_AGENT_MCP_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(sourceProject, agentFilePath),\n mcpServerClassName,\n // The source component this connection is made from, so the pair is\n // identifiable rather than just the two projects.\n { sourcePath: options.sourceComponent?.path },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_MCP_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n};\n\nexport default tsAgentMcpConnectionGenerator;\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateProjectConfiguration","addTsDependencies","AGENT_CONNECTION_DEPENDENCIES","AGENT_CONNECTION_PROJECT_DIR","addTypeScriptClientToAgent","addTypeScriptCoreClient","ensureTypeScriptAgentConnectionProject","addDestructuredImport","addStarExport","declareDependencies","ownedElsewhere","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","esmVars","kebabCase","getNpmScope","addComponentGeneratorMetadata","addDependencyToTargetIfNotPresent","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","DEPENDENCIES","ts","name","TS_AGENT_MCP_CONNECTION_GENERATOR_INFO","filename","tsAgentMcpConnectionGenerator","tree","options","sourceProject","targetProject","agentComponent","sourceComponent","mcpComponent","targetComponent","Error","auth","toLowerCase","mcpComponentName","mcpServerClassName","rc","mcpServerKebabCase","mcpServerPort","port","npmScope","dirname","overwriteStrategy","KeepExisting","agentSourceDir","root","path","agentFilePath","exists","clientClassName","clientVarName","charAt","slice","agentName","devTargetName","mcpDevTargetName","targets","projects","target","projectRoot","sourcePath","preferInstallDependencies","languages"],"mappings":"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"}
|
|
@@ -5,6 +5,192 @@
|
|
|
5
5
|
import { type Tree } from '@nx/devkit';
|
|
6
6
|
import type { ResolvedConnectionOptions } from '../../../connection/generator';
|
|
7
7
|
import { type NxGeneratorInfo } from '../../../utils/nx';
|
|
8
|
+
/** The metadata this generator records, which its predicates read. */
|
|
9
|
+
export interface TsAgentReactConnectionMetadata {
|
|
10
|
+
readonly auth: string;
|
|
11
|
+
readonly protocol: string;
|
|
12
|
+
/** The AG-UI theme module, which the website's `ux` selects. */
|
|
13
|
+
readonly theme: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const DEPENDENCIES: import("../../../utils/declared-dependencies").DependencyDeclaration<readonly [{
|
|
16
|
+
readonly name: "@trpc/client";
|
|
17
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "@tanstack/react-query";
|
|
20
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
21
|
+
}, {
|
|
22
|
+
readonly name: "@tanstack/react-query-devtools";
|
|
23
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
24
|
+
}, {
|
|
25
|
+
readonly name: "@trpc/tanstack-react-query";
|
|
26
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
27
|
+
}, {
|
|
28
|
+
readonly name: "oidc-client-ts";
|
|
29
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
30
|
+
}, {
|
|
31
|
+
readonly name: "aws4fetch";
|
|
32
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
33
|
+
}, {
|
|
34
|
+
readonly name: "@aws-sdk/credential-provider-cognito-identity";
|
|
35
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
36
|
+
}, {
|
|
37
|
+
readonly name: "react-oidc-context";
|
|
38
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
39
|
+
}, {
|
|
40
|
+
readonly name: "@smithy/types";
|
|
41
|
+
readonly when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
42
|
+
readonly dev: true;
|
|
43
|
+
}, Omit<{
|
|
44
|
+
readonly name: "@copilotkit/react-core";
|
|
45
|
+
}, "when"> & {
|
|
46
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
47
|
+
} & {
|
|
48
|
+
versionOnly: true;
|
|
49
|
+
}, Omit<{
|
|
50
|
+
readonly name: "@ag-ui/client";
|
|
51
|
+
}, "when"> & {
|
|
52
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
53
|
+
} & {
|
|
54
|
+
versionOnly: true;
|
|
55
|
+
}, Omit<{
|
|
56
|
+
readonly name: "@cloudscape-design/chat-components";
|
|
57
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
58
|
+
}, "when"> & {
|
|
59
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
60
|
+
} & {
|
|
61
|
+
versionOnly: true;
|
|
62
|
+
}, Omit<{
|
|
63
|
+
readonly name: "lucide-react";
|
|
64
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
65
|
+
}, "when"> & {
|
|
66
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
67
|
+
} & {
|
|
68
|
+
versionOnly: true;
|
|
69
|
+
}, Omit<{
|
|
70
|
+
readonly name: "oidc-client-ts";
|
|
71
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
72
|
+
}, "when"> & {
|
|
73
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
74
|
+
} & {
|
|
75
|
+
versionOnly: true;
|
|
76
|
+
}, Omit<{
|
|
77
|
+
readonly name: "aws4fetch";
|
|
78
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
79
|
+
}, "when"> & {
|
|
80
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
81
|
+
} & {
|
|
82
|
+
versionOnly: true;
|
|
83
|
+
}, Omit<{
|
|
84
|
+
readonly name: "@aws-sdk/credential-provider-cognito-identity";
|
|
85
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
86
|
+
}, "when"> & {
|
|
87
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
88
|
+
} & {
|
|
89
|
+
versionOnly: true;
|
|
90
|
+
}, Omit<{
|
|
91
|
+
readonly name: "react-oidc-context";
|
|
92
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
93
|
+
}, "when"> & {
|
|
94
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
95
|
+
} & {
|
|
96
|
+
versionOnly: true;
|
|
97
|
+
}, Omit<{
|
|
98
|
+
readonly name: "@smithy/types";
|
|
99
|
+
readonly when: (m: import("../../react-website/agui/generator").AgUiMetadata) => boolean;
|
|
100
|
+
readonly dev: true;
|
|
101
|
+
}, "when"> & {
|
|
102
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
103
|
+
} & {
|
|
104
|
+
versionOnly: true;
|
|
105
|
+
}, Omit<{
|
|
106
|
+
readonly name: "react";
|
|
107
|
+
} & {
|
|
108
|
+
versionOnly: true;
|
|
109
|
+
}, "when"> & {
|
|
110
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
111
|
+
} & {
|
|
112
|
+
versionOnly: true;
|
|
113
|
+
}, Omit<{
|
|
114
|
+
readonly name: "react-dom";
|
|
115
|
+
} & {
|
|
116
|
+
versionOnly: true;
|
|
117
|
+
}, "when"> & {
|
|
118
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
119
|
+
} & {
|
|
120
|
+
versionOnly: true;
|
|
121
|
+
}, Omit<{
|
|
122
|
+
readonly name: "class-variance-authority";
|
|
123
|
+
} & {
|
|
124
|
+
versionOnly: true;
|
|
125
|
+
}, "when"> & {
|
|
126
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
127
|
+
} & {
|
|
128
|
+
versionOnly: true;
|
|
129
|
+
}, Omit<{
|
|
130
|
+
readonly name: "clsx";
|
|
131
|
+
} & {
|
|
132
|
+
versionOnly: true;
|
|
133
|
+
}, "when"> & {
|
|
134
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
135
|
+
} & {
|
|
136
|
+
versionOnly: true;
|
|
137
|
+
}, Omit<{
|
|
138
|
+
readonly name: "tailwind-merge";
|
|
139
|
+
} & {
|
|
140
|
+
versionOnly: true;
|
|
141
|
+
}, "when"> & {
|
|
142
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
143
|
+
} & {
|
|
144
|
+
versionOnly: true;
|
|
145
|
+
}, Omit<{
|
|
146
|
+
readonly name: "lucide-react";
|
|
147
|
+
} & {
|
|
148
|
+
versionOnly: true;
|
|
149
|
+
}, "when"> & {
|
|
150
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
151
|
+
} & {
|
|
152
|
+
versionOnly: true;
|
|
153
|
+
}, Omit<{
|
|
154
|
+
readonly name: "tw-animate-css";
|
|
155
|
+
} & {
|
|
156
|
+
versionOnly: true;
|
|
157
|
+
}, "when"> & {
|
|
158
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
159
|
+
} & {
|
|
160
|
+
versionOnly: true;
|
|
161
|
+
}, Omit<{
|
|
162
|
+
readonly name: "radix-ui";
|
|
163
|
+
} & {
|
|
164
|
+
versionOnly: true;
|
|
165
|
+
}, "when"> & {
|
|
166
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
167
|
+
} & {
|
|
168
|
+
versionOnly: true;
|
|
169
|
+
}, Omit<{
|
|
170
|
+
readonly name: "vite";
|
|
171
|
+
} & {
|
|
172
|
+
versionOnly: true;
|
|
173
|
+
}, "when"> & {
|
|
174
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
175
|
+
} & {
|
|
176
|
+
versionOnly: true;
|
|
177
|
+
}, Omit<{
|
|
178
|
+
readonly name: "vitest";
|
|
179
|
+
} & {
|
|
180
|
+
versionOnly: true;
|
|
181
|
+
}, "when"> & {
|
|
182
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
183
|
+
} & {
|
|
184
|
+
versionOnly: true;
|
|
185
|
+
}, Omit<{
|
|
186
|
+
readonly name: "@vitest/coverage-v8";
|
|
187
|
+
} & {
|
|
188
|
+
versionOnly: true;
|
|
189
|
+
}, "when"> & {
|
|
190
|
+
when: (m: TsAgentReactConnectionMetadata) => boolean;
|
|
191
|
+
} & {
|
|
192
|
+
versionOnly: true;
|
|
193
|
+
}], readonly import("../../../utils/declared-dependencies").DeclaredPyDependency<"a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "mcp" | "pip-check-updates" | "pip-licenses" | "ruff" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", TsAgentReactConnectionMetadata>[]>;
|
|
8
194
|
export declare const TS_AGENT_REACT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo;
|
|
9
195
|
export declare function tsAgentReactConnectionGenerator(tree: Tree, options: ResolvedConnectionOptions): Promise<() => Promise<void>>;
|
|
10
196
|
export default tsAgentReactConnectionGenerator;
|
|
@@ -3,17 +3,68 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/ import { generateFiles, joinPathFragments, OverwriteStrategy, updateJson } from "@nx/devkit";
|
|
5
5
|
import { addAgentRuntimeToConnectionNamespace } from "../../../connection/agent-runtime-config.js";
|
|
6
|
+
import { addTsDependencies } from "../../../utils/add-dependencies.js";
|
|
6
7
|
import { addSingleImport, applyGritQL } from "../../../utils/ast.js";
|
|
7
|
-
import {
|
|
8
|
+
import { declareDependencies, onlyWhen, ownedElsewhere } from "../../../utils/declared-dependencies.js";
|
|
8
9
|
import { formatFilesInSubtree } from "../../../utils/format.js";
|
|
9
10
|
import { installDependencies } from "../../../utils/install.js";
|
|
10
11
|
import { addGeneratorMetricsIfApplicable } from "../../../utils/metrics.js";
|
|
11
12
|
import { kebabCase, toClassName } from "../../../utils/names.js";
|
|
12
|
-
import { getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
|
|
13
|
-
import {
|
|
14
|
-
import { addAgUiReactConnection } from "../../react-website/agui/generator.js";
|
|
13
|
+
import { addComponentGeneratorMetadata, getGeneratorInfo, readProjectConfigurationUnqualified } from "../../../utils/nx.js";
|
|
14
|
+
import { toProjectRelativePath } from "../../../utils/paths.js";
|
|
15
|
+
import { DEPENDENCIES as AGUI_DEPENDENCIES, addAgUiReactConnection, resolveAgUiTheme } from "../../react-website/agui/generator.js";
|
|
15
16
|
import { runtimeConfigGenerator } from "../../react-website/runtime-config/generator.js";
|
|
16
17
|
import { addTsAgentTargetToLocalDev } from "./local-dev.js";
|
|
18
|
+
/** The tRPC-over-HTTP path, which the AG-UI path takes none of. */ const isHttp = (m)=>m.protocol !== 'ag-ui';
|
|
19
|
+
/** The AG-UI path, whose packages `addAgUiReactConnection` adds. */ const isAgUi = (m)=>!isHttp(m);
|
|
20
|
+
// Each entry names the protocol path it belongs to: the HTTP path's client and
|
|
21
|
+
// auth packages are added here, the AG-UI path's by `addAgUiReactConnection` on
|
|
22
|
+
// this generator's behalf.
|
|
23
|
+
export const DEPENDENCIES = declareDependencies()({
|
|
24
|
+
ts: [
|
|
25
|
+
{
|
|
26
|
+
name: '@trpc/client',
|
|
27
|
+
when: isHttp
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: '@tanstack/react-query',
|
|
31
|
+
when: isHttp
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: '@tanstack/react-query-devtools',
|
|
35
|
+
when: isHttp
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: '@trpc/tanstack-react-query',
|
|
39
|
+
when: isHttp
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'oidc-client-ts',
|
|
43
|
+
when: (m)=>isHttp(m) && m.auth === 'iam'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'aws4fetch',
|
|
47
|
+
when: (m)=>isHttp(m) && m.auth === 'iam'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: '@aws-sdk/credential-provider-cognito-identity',
|
|
51
|
+
when: (m)=>isHttp(m) && m.auth === 'iam'
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'react-oidc-context',
|
|
55
|
+
when: (m)=>isHttp(m) && (m.auth === 'iam' || m.auth === 'cognito')
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: '@smithy/types',
|
|
59
|
+
when: isHttp,
|
|
60
|
+
dev: true
|
|
61
|
+
},
|
|
62
|
+
// `addAgUiReactConnection` adds these itself, so they are declared for
|
|
63
|
+
// ownership only. Gated on the AG-UI path, and within it on each entry's
|
|
64
|
+
// own theme or auth condition, which the metadata below records.
|
|
65
|
+
...ownedElsewhere(onlyWhen(AGUI_DEPENDENCIES.ts, isAgUi))
|
|
66
|
+
]
|
|
67
|
+
});
|
|
17
68
|
export const TS_AGENT_REACT_CONNECTION_GENERATOR_INFO = getGeneratorInfo(import.meta.filename);
|
|
18
69
|
export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
19
70
|
const frontendProjectConfig = readProjectConfigurationUnqualified(tree, options.sourceProject);
|
|
@@ -27,6 +78,13 @@ export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
|
27
78
|
const auth = (targetComponent?.auth ?? metadata?.auth ?? 'iam').toLowerCase();
|
|
28
79
|
const agentProjectAlias = agentProjectConfig.name;
|
|
29
80
|
const agentPath = targetComponent?.path ?? 'src/agent';
|
|
81
|
+
// Recorded below and read by the declaration's predicates, so the packages
|
|
82
|
+
// added here are exactly the ones the version sync will own.
|
|
83
|
+
const connectionMetadata = {
|
|
84
|
+
auth,
|
|
85
|
+
protocol: targetComponent?.protocol ?? 'http',
|
|
86
|
+
theme: resolveAgUiTheme(frontendProjectConfig)
|
|
87
|
+
};
|
|
30
88
|
if ((targetComponent?.protocol ?? '').toLowerCase() === 'a2a') {
|
|
31
89
|
throw new Error(`Cannot connect a React website to an A2A agent. ` + `Consider generating an agent with the HTTP or AG-UI protocol instead.`);
|
|
32
90
|
}
|
|
@@ -43,6 +101,8 @@ export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
|
43
101
|
port: agentPort,
|
|
44
102
|
targetComponent
|
|
45
103
|
});
|
|
104
|
+
// Recorded so the version sync knows this connection's dependencies are ours.
|
|
105
|
+
addComponentGeneratorMetadata(tree, frontendProjectConfig.name, TS_AGENT_REACT_CONNECTION_GENERATOR_INFO, toProjectRelativePath(frontendProjectConfig, joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks', `useAgui${agentNameClassName}`)), agentNameClassName, connectionMetadata);
|
|
46
106
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
47
107
|
TS_AGENT_REACT_CONNECTION_GENERATOR_INFO
|
|
48
108
|
]);
|
|
@@ -100,23 +160,12 @@ export async function tsAgentReactConnectionGenerator(tree, options) {
|
|
|
100
160
|
agentNameKebabCase: kebabCase(agentNameClassName),
|
|
101
161
|
agentNameClassName
|
|
102
162
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
'oidc-client-ts',
|
|
110
|
-
'aws4fetch',
|
|
111
|
-
'@aws-sdk/credential-provider-cognito-identity',
|
|
112
|
-
'react-oidc-context'
|
|
113
|
-
] : [],
|
|
114
|
-
...auth === 'cognito' ? [
|
|
115
|
-
'react-oidc-context'
|
|
116
|
-
] : []
|
|
117
|
-
]), withVersions([
|
|
118
|
-
'@smithy/types'
|
|
119
|
-
]), joinPathFragments(frontendProjectConfig.root, 'package.json'));
|
|
163
|
+
addTsDependencies(tree, DEPENDENCIES, {
|
|
164
|
+
metadata: connectionMetadata,
|
|
165
|
+
projectRoot: frontendProjectConfig.root
|
|
166
|
+
});
|
|
167
|
+
// Recorded so the version sync knows this connection's dependencies are ours.
|
|
168
|
+
addComponentGeneratorMetadata(tree, frontendProjectConfig.name, TS_AGENT_REACT_CONNECTION_GENERATOR_INFO, toProjectRelativePath(frontendProjectConfig, joinPathFragments(frontendProjectConfig.sourceRoot, 'components', clientProviderName)), agentNameClassName, connectionMetadata);
|
|
120
169
|
await addGeneratorMetricsIfApplicable(tree, [
|
|
121
170
|
TS_AGENT_REACT_CONNECTION_GENERATOR_INFO
|
|
122
171
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/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 {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config';\nimport type { ResolvedConnectionOptions } from '../../../connection/generator';\nimport { addSingleImport, applyGritQL } from '../../../utils/ast';\nimport { addDependenciesToPackageJson } from '../../../utils/dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { kebabCase, toClassName } from '../../../utils/names';\nimport {\n type ComponentMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { withVersions } from '../../../utils/versions';\nimport {\n type AgUiAuth,\n addAgUiReactConnection,\n} from '../../react-website/agui/generator';\nimport { runtimeConfigGenerator } from '../../react-website/runtime-config/generator';\nimport { addTsAgentTargetToLocalDev } from './local-dev';\n\nexport const TS_AGENT_REACT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport async function tsAgentReactConnectionGenerator(\n tree: Tree,\n options: ResolvedConnectionOptions,\n) {\n const frontendProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const agentProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const targetComponent: ComponentMetadata | undefined =\n options.targetComponent;\n\n // Extract agent metadata from the target component or project metadata\n const metadata = agentProjectConfig.metadata as any;\n const agentName = targetComponent?.name ?? 'agent';\n const agentNameClassName = targetComponent?.rc ?? toClassName(agentName);\n const agentPort = targetComponent?.port ?? metadata?.ports?.[0] ?? 8081;\n const auth = (targetComponent?.auth ?? metadata?.auth ?? 'iam').toLowerCase();\n const agentProjectAlias = agentProjectConfig.name;\n const agentPath = targetComponent?.path ?? 'src/agent';\n\n if ((targetComponent?.protocol ?? '').toLowerCase() === 'a2a') {\n throw new Error(\n `Cannot connect a React website to an A2A agent. ` +\n `Consider generating an agent with the HTTP or AG-UI protocol instead.`,\n );\n }\n\n if (targetComponent?.protocol === 'ag-ui') {\n await addAgUiReactConnection(tree, {\n frontendProjectConfig,\n agentName,\n agentNameClassName,\n auth: auth as AgUiAuth,\n });\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n }\n\n // Ensure the agent project has a wildcard path entry in tsconfig.base.json\n // so that deep imports (e.g., for the router type) resolve correctly\n ensureWildcardPathEntry(\n tree,\n agentProjectConfig.name,\n agentProjectConfig.root,\n );\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n frontendProjectConfig.root,\n {\n agentName,\n agentNameClassName,\n auth,\n agentProjectAlias,\n agentPath,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate the tanstack query provider if it does not exist already\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/components/tanstack-query',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'components'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n preferInstallDependencies: false,\n });\n\n // update main.tsx\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'QueryClientProvider',\n './components/QueryClientProvider',\n );\n\n const clientProviderName = `${agentNameClassName}AgentClientProvider`;\n await addSingleImport(\n tree,\n mainTsxPath,\n clientProviderName,\n `./components/${clientProviderName}`,\n );\n\n // Wrap <App /> in QueryClientProvider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n '`<App />` => `<QueryClientProvider><App /></QueryClientProvider>` where { $program <: not contains `<QueryClientProvider>$_</QueryClientProvider>` }',\n );\n\n // Wrap <App /> in the agent client provider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<${clientProviderName}><App /></${clientProviderName}>\\` where { $program <: not contains \\`<${clientProviderName}>$_</${clientProviderName}>\\` }`,\n );\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n // Expose the agent's runtime ARN to the frontend via the 'connection'\n // namespace (which is published to runtime-config.json). The agent construct\n // itself only registers to the 'agentcore' namespace by default.\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n\n addDependenciesToPackageJson(\n tree,\n withVersions([\n '@trpc/client',\n '@tanstack/react-query',\n '@tanstack/react-query-devtools',\n '@trpc/tanstack-react-query',\n ...((auth === 'iam'\n ? [\n 'oidc-client-ts',\n 'aws4fetch',\n '@aws-sdk/credential-provider-cognito-identity',\n 'react-oidc-context',\n ]\n : []) as any),\n ...((auth === 'cognito' ? ['react-oidc-context'] : []) as any),\n ]),\n withVersions(['@smithy/types']),\n joinPathFragments(frontendProjectConfig.root, 'package.json'),\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n}\nexport default tsAgentReactConnectionGenerator;\n\n/**\n * Ensures a wildcard path entry exists in tsconfig.base.json for the given project,\n * allowing deep imports (e.g., `@scope/project/src/agent/router.js`).\n */\nfunction ensureWildcardPathEntry(\n tree: Tree,\n projectName: string,\n projectRoot: string,\n) {\n const tsconfigPath = ['tsconfig.base.json', 'tsconfig.json'].find((p) =>\n tree.exists(p),\n );\n if (!tsconfigPath) return;\n\n updateJson(tree, tsconfigPath, (json) => {\n const paths = json.compilerOptions?.paths ?? {};\n const wildcardKey = `${projectName}/*`;\n if (!paths[wildcardKey]) {\n paths[wildcardKey] = [`./${projectRoot}/*`];\n }\n json.compilerOptions = {\n ...json.compilerOptions,\n paths,\n };\n return json;\n });\n}\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addAgentRuntimeToConnectionNamespace","addSingleImport","applyGritQL","addDependenciesToPackageJson","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","getGeneratorInfo","readProjectConfigurationUnqualified","withVersions","addAgUiReactConnection","runtimeConfigGenerator","addTsAgentTargetToLocalDev","TS_AGENT_REACT_CONNECTION_GENERATOR_INFO","filename","tsAgentReactConnectionGenerator","tree","options","frontendProjectConfig","sourceProject","agentProjectConfig","targetProject","targetComponent","metadata","agentName","name","agentNameClassName","rc","agentPort","port","ports","auth","toLowerCase","agentProjectAlias","agentPath","path","protocol","Error","preferInstallDependencies","languages","ensureWildcardPathEntry","root","dirname","overwriteStrategy","KeepExisting","sourceRoot","project","mainTsxPath","clientProviderName","agentNameKebabCase","projectName","projectRoot","tsconfigPath","find","p","exists","json","paths","compilerOptions","wildcardKey"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../packages/nx-plugin/src/ts/agent/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 {\n generateFiles,\n joinPathFragments,\n OverwriteStrategy,\n type Tree,\n updateJson,\n} from '@nx/devkit';\nimport { addAgentRuntimeToConnectionNamespace } from '../../../connection/agent-runtime-config';\nimport type { ResolvedConnectionOptions } from '../../../connection/generator';\nimport { addTsDependencies } from '../../../utils/add-dependencies';\nimport { addSingleImport, applyGritQL } from '../../../utils/ast';\nimport {\n declareDependencies,\n onlyWhen,\n ownedElsewhere,\n} from '../../../utils/declared-dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { installDependencies } from '../../../utils/install';\nimport { addGeneratorMetricsIfApplicable } from '../../../utils/metrics';\nimport { kebabCase, toClassName } from '../../../utils/names';\nimport {\n addComponentGeneratorMetadata,\n type ComponentMetadata,\n getGeneratorInfo,\n type NxGeneratorInfo,\n readProjectConfigurationUnqualified,\n} from '../../../utils/nx';\nimport { toProjectRelativePath } from '../../../utils/paths';\nimport {\n DEPENDENCIES as AGUI_DEPENDENCIES,\n type AgUiAuth,\n addAgUiReactConnection,\n resolveAgUiTheme,\n} from '../../react-website/agui/generator';\nimport { runtimeConfigGenerator } from '../../react-website/runtime-config/generator';\nimport { addTsAgentTargetToLocalDev } from './local-dev';\n\n/** The metadata this generator records, which its predicates read. */\nexport interface TsAgentReactConnectionMetadata {\n readonly auth: string;\n readonly protocol: string;\n /** The AG-UI theme module, which the website's `ux` selects. */\n readonly theme: string;\n}\n\n/** The tRPC-over-HTTP path, which the AG-UI path takes none of. */\nconst isHttp = (m: TsAgentReactConnectionMetadata) => m.protocol !== 'ag-ui';\n\n/** The AG-UI path, whose packages `addAgUiReactConnection` adds. */\nconst isAgUi = (m: TsAgentReactConnectionMetadata) => !isHttp(m);\n\n// Each entry names the protocol path it belongs to: the HTTP path's client and\n// auth packages are added here, the AG-UI path's by `addAgUiReactConnection` on\n// this generator's behalf.\nexport const DEPENDENCIES =\n declareDependencies<TsAgentReactConnectionMetadata>()({\n ts: [\n { name: '@trpc/client', when: isHttp },\n { name: '@tanstack/react-query', when: isHttp },\n { name: '@tanstack/react-query-devtools', when: isHttp },\n { name: '@trpc/tanstack-react-query', when: isHttp },\n { name: 'oidc-client-ts', when: (m) => isHttp(m) && m.auth === 'iam' },\n { name: 'aws4fetch', when: (m) => isHttp(m) && m.auth === 'iam' },\n {\n name: '@aws-sdk/credential-provider-cognito-identity',\n when: (m) => isHttp(m) && m.auth === 'iam',\n },\n {\n name: 'react-oidc-context',\n when: (m) => isHttp(m) && (m.auth === 'iam' || m.auth === 'cognito'),\n },\n { name: '@smithy/types', when: isHttp, dev: true },\n // `addAgUiReactConnection` adds these itself, so they are declared for\n // ownership only. Gated on the AG-UI path, and within it on each entry's\n // own theme or auth condition, which the metadata below records.\n ...ownedElsewhere(onlyWhen(AGUI_DEPENDENCIES.ts, isAgUi)),\n ],\n });\n\nexport const TS_AGENT_REACT_CONNECTION_GENERATOR_INFO: NxGeneratorInfo =\n getGeneratorInfo(import.meta.filename);\n\nexport async function tsAgentReactConnectionGenerator(\n tree: Tree,\n options: ResolvedConnectionOptions,\n) {\n const frontendProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.sourceProject,\n );\n const agentProjectConfig = readProjectConfigurationUnqualified(\n tree,\n options.targetProject,\n );\n\n const targetComponent: ComponentMetadata | undefined =\n options.targetComponent;\n\n // Extract agent metadata from the target component or project metadata\n const metadata = agentProjectConfig.metadata as any;\n const agentName = targetComponent?.name ?? 'agent';\n const agentNameClassName = targetComponent?.rc ?? toClassName(agentName);\n const agentPort = targetComponent?.port ?? metadata?.ports?.[0] ?? 8081;\n const auth = (targetComponent?.auth ?? metadata?.auth ?? 'iam').toLowerCase();\n const agentProjectAlias = agentProjectConfig.name;\n const agentPath = targetComponent?.path ?? 'src/agent';\n\n // Recorded below and read by the declaration's predicates, so the packages\n // added here are exactly the ones the version sync will own.\n const connectionMetadata: TsAgentReactConnectionMetadata = {\n auth,\n protocol: targetComponent?.protocol ?? 'http',\n theme: resolveAgUiTheme(frontendProjectConfig),\n };\n\n if ((targetComponent?.protocol ?? '').toLowerCase() === 'a2a') {\n throw new Error(\n `Cannot connect a React website to an A2A agent. ` +\n `Consider generating an agent with the HTTP or AG-UI protocol instead.`,\n );\n }\n\n if (targetComponent?.protocol === 'ag-ui') {\n await addAgUiReactConnection(tree, {\n frontendProjectConfig,\n agentName,\n agentNameClassName,\n auth: auth as AgUiAuth,\n });\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n frontendProjectConfig.name,\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(\n frontendProjectConfig,\n joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'hooks',\n `useAgui${agentNameClassName}`,\n ),\n ),\n agentNameClassName,\n connectionMetadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n }\n\n // Ensure the agent project has a wildcard path entry in tsconfig.base.json\n // so that deep imports (e.g., for the router type) resolve correctly\n ensureWildcardPathEntry(\n tree,\n agentProjectConfig.name,\n agentProjectConfig.root,\n );\n\n generateFiles(\n tree,\n joinPathFragments(import.meta.dirname, 'files'),\n frontendProjectConfig.root,\n {\n agentName,\n agentNameClassName,\n auth,\n agentProjectAlias,\n agentPath,\n },\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n // Generate the tanstack query provider if it does not exist already\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/components/tanstack-query',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'components'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n\n if (auth === 'iam') {\n generateFiles(\n tree,\n joinPathFragments(\n import.meta.dirname,\n '../../../utils/files/website/hooks/sigv4',\n ),\n joinPathFragments(frontendProjectConfig.sourceRoot, 'hooks'),\n {},\n {\n overwriteStrategy: OverwriteStrategy.KeepExisting,\n },\n );\n }\n\n await runtimeConfigGenerator(tree, {\n project: frontendProjectConfig.name,\n preferInstallDependencies: false,\n });\n\n // update main.tsx\n const mainTsxPath = joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'main.tsx',\n );\n await addSingleImport(\n tree,\n mainTsxPath,\n 'QueryClientProvider',\n './components/QueryClientProvider',\n );\n\n const clientProviderName = `${agentNameClassName}AgentClientProvider`;\n await addSingleImport(\n tree,\n mainTsxPath,\n clientProviderName,\n `./components/${clientProviderName}`,\n );\n\n // Wrap <App /> in QueryClientProvider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n '`<App />` => `<QueryClientProvider><App /></QueryClientProvider>` where { $program <: not contains `<QueryClientProvider>$_</QueryClientProvider>` }',\n );\n\n // Wrap <App /> in the agent client provider if not already present\n await applyGritQL(\n tree,\n mainTsxPath,\n `\\`<App />\\` => \\`<${clientProviderName}><App /></${clientProviderName}>\\` where { $program <: not contains \\`<${clientProviderName}>$_</${clientProviderName}>\\` }`,\n );\n\n await addTsAgentTargetToLocalDev(\n tree,\n frontendProjectConfig.name,\n agentProjectConfig.name,\n {\n agentName,\n agentNameClassName,\n port: agentPort,\n targetComponent,\n },\n );\n\n // Expose the agent's runtime ARN to the frontend via the 'connection'\n // namespace (which is published to runtime-config.json). The agent construct\n // itself only registers to the 'agentcore' namespace by default.\n await addAgentRuntimeToConnectionNamespace(tree, {\n agentNameKebabCase: kebabCase(agentNameClassName),\n agentNameClassName,\n });\n\n addTsDependencies(tree, DEPENDENCIES, {\n metadata: connectionMetadata,\n projectRoot: frontendProjectConfig.root,\n });\n\n // Recorded so the version sync knows this connection's dependencies are ours.\n addComponentGeneratorMetadata(\n tree,\n frontendProjectConfig.name,\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n toProjectRelativePath(\n frontendProjectConfig,\n joinPathFragments(\n frontendProjectConfig.sourceRoot,\n 'components',\n clientProviderName,\n ),\n ),\n agentNameClassName,\n connectionMetadata,\n );\n\n await addGeneratorMetricsIfApplicable(tree, [\n TS_AGENT_REACT_CONNECTION_GENERATOR_INFO,\n ]);\n\n await formatFilesInSubtree(tree);\n return () =>\n installDependencies(tree, options.preferInstallDependencies, {\n languages: ['typescript'],\n });\n}\nexport default tsAgentReactConnectionGenerator;\n\n/**\n * Ensures a wildcard path entry exists in tsconfig.base.json for the given project,\n * allowing deep imports (e.g., `@scope/project/src/agent/router.js`).\n */\nfunction ensureWildcardPathEntry(\n tree: Tree,\n projectName: string,\n projectRoot: string,\n) {\n const tsconfigPath = ['tsconfig.base.json', 'tsconfig.json'].find((p) =>\n tree.exists(p),\n );\n if (!tsconfigPath) return;\n\n updateJson(tree, tsconfigPath, (json) => {\n const paths = json.compilerOptions?.paths ?? {};\n const wildcardKey = `${projectName}/*`;\n if (!paths[wildcardKey]) {\n paths[wildcardKey] = [`./${projectRoot}/*`];\n }\n json.compilerOptions = {\n ...json.compilerOptions,\n paths,\n };\n return json;\n });\n}\n"],"names":["generateFiles","joinPathFragments","OverwriteStrategy","updateJson","addAgentRuntimeToConnectionNamespace","addTsDependencies","addSingleImport","applyGritQL","declareDependencies","onlyWhen","ownedElsewhere","formatFilesInSubtree","installDependencies","addGeneratorMetricsIfApplicable","kebabCase","toClassName","addComponentGeneratorMetadata","getGeneratorInfo","readProjectConfigurationUnqualified","toProjectRelativePath","DEPENDENCIES","AGUI_DEPENDENCIES","addAgUiReactConnection","resolveAgUiTheme","runtimeConfigGenerator","addTsAgentTargetToLocalDev","isHttp","m","protocol","isAgUi","ts","name","when","auth","dev","TS_AGENT_REACT_CONNECTION_GENERATOR_INFO","filename","tsAgentReactConnectionGenerator","tree","options","frontendProjectConfig","sourceProject","agentProjectConfig","targetProject","targetComponent","metadata","agentName","agentNameClassName","rc","agentPort","port","ports","toLowerCase","agentProjectAlias","agentPath","path","connectionMetadata","theme","Error","sourceRoot","preferInstallDependencies","languages","ensureWildcardPathEntry","root","dirname","overwriteStrategy","KeepExisting","project","mainTsxPath","clientProviderName","agentNameKebabCase","projectRoot","projectName","tsconfigPath","find","p","exists","json","paths","compilerOptions","wildcardKey"],"mappings":"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"}
|
|
@@ -5,6 +5,44 @@
|
|
|
5
5
|
import { type GeneratorCallback, type Tree } from '@nx/devkit';
|
|
6
6
|
import { type NxGeneratorInfo } from '../../utils/nx';
|
|
7
7
|
import type { TsAstroDocsGeneratorSchema } from './schema';
|
|
8
|
+
/** The metadata this generator records, which its predicates read. */
|
|
9
|
+
export interface TsAstroDocsMetadata {
|
|
10
|
+
readonly framework: string;
|
|
11
|
+
readonly includeTranslation: boolean;
|
|
12
|
+
readonly includeBlog: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const DEPENDENCIES: import("../../utils/declared-dependencies").DependencyDeclaration<readonly [{
|
|
15
|
+
readonly name: "astro";
|
|
16
|
+
}, {
|
|
17
|
+
readonly name: "@astrojs/starlight";
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "starlight-blog";
|
|
20
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
21
|
+
}, {
|
|
22
|
+
readonly name: "@strands-agents/sdk";
|
|
23
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
24
|
+
}, {
|
|
25
|
+
readonly name: "commander";
|
|
26
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
27
|
+
}, {
|
|
28
|
+
readonly name: "fast-glob";
|
|
29
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
30
|
+
}, {
|
|
31
|
+
readonly name: "fs-extra";
|
|
32
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
33
|
+
}, {
|
|
34
|
+
readonly name: "simple-git";
|
|
35
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
36
|
+
}, {
|
|
37
|
+
readonly name: "@types/fs-extra";
|
|
38
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
39
|
+
readonly dev: true;
|
|
40
|
+
}, {
|
|
41
|
+
readonly name: "tsx";
|
|
42
|
+
readonly when: (m: TsAstroDocsMetadata) => boolean;
|
|
43
|
+
readonly dev: true;
|
|
44
|
+
readonly root: true;
|
|
45
|
+
}], readonly import("../../utils/declared-dependencies").DeclaredPyDependency<"a2a-sdk" | "ag-ui-langgraph" | "ag-ui-protocol" | "ag-ui-strands" | "aws-lambda-powertools" | "aws-lambda-powertools[tracer]" | "aws-lambda-powertools[parser]" | "aws-opentelemetry-distro" | "bedrock-agentcore" | "boto3" | "checkov" | "fastapi" | "fastapi[standard]" | "httpx" | "langchain" | "langchain-aws" | "langchain-mcp-adapters" | "langgraph" | "mcp" | "pip-check-updates" | "pip-licenses" | "ruff" | "strands-agents" | "strands-agents[a2a]" | "strands-agents-tools" | "ty" | "pynamodb" | "uvicorn" | "sqlmodel" | "alembic" | "aiomysql" | "asyncpg" | "greenlet", TsAstroDocsMetadata>[]>;
|
|
8
46
|
export declare const TS_ASTRO_DOCS_GENERATOR_INFO: NxGeneratorInfo;
|
|
9
47
|
export declare const tsAstroDocsGenerator: (tree: Tree, schema: TsAstroDocsGeneratorSchema) => Promise<GeneratorCallback>;
|
|
10
48
|
export default tsAstroDocsGenerator;
|