@aws/nx-plugin 1.0.0-rc.79 → 1.0.0-rc.80

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 (469) hide show
  1. package/generators.json +10 -0
  2. package/migrations.json +1 -1
  3. package/package.json +1 -1
  4. package/src/agentcore-gateway/agent-connection/generator.d.ts +1 -1
  5. package/src/agentcore-gateway/agent-connection/generator.js.map +1 -1
  6. package/src/agentcore-gateway/agent-connection/schema.d.js.map +1 -1
  7. package/src/agentcore-gateway/agent-connection/schema.d.ts +1 -1
  8. package/src/agentcore-gateway/attach-upstream.js.map +1 -1
  9. package/src/agentcore-gateway/gateway-connection/generator.d.ts +1 -1
  10. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -1
  11. package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -1
  12. package/src/agentcore-gateway/gateway-connection/schema.d.ts +1 -1
  13. package/src/agentcore-gateway/generator.d.ts +3 -3
  14. package/src/agentcore-gateway/generator.js.map +1 -1
  15. package/src/agentcore-gateway/mcp-connection/generator.d.ts +1 -1
  16. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -1
  17. package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -1
  18. package/src/agentcore-gateway/mcp-connection/schema.d.ts +1 -1
  19. package/src/agentcore-gateway/react-connection/generator.d.ts +1 -1
  20. package/src/agentcore-gateway/react-connection/generator.js.map +1 -1
  21. package/src/agentcore-gateway/react-connection/schema.d.js.map +1 -1
  22. package/src/agentcore-gateway/react-connection/schema.d.ts +1 -1
  23. package/src/agentcore-gateway/schema.d.js.map +1 -1
  24. package/src/agentcore-gateway/schema.d.ts +1 -1
  25. package/src/agentcore-harness/generator.d.ts +4 -4
  26. package/src/agentcore-harness/generator.js.map +1 -1
  27. package/src/agentcore-harness/schema.d.js.map +1 -1
  28. package/src/agentcore-harness/schema.d.ts +1 -1
  29. package/src/connection/agent-local-dev.d.ts +1 -1
  30. package/src/connection/agent-local-dev.js.map +1 -1
  31. package/src/connection/agent-runtime-config.js.map +1 -1
  32. package/src/connection/gateway-runtime-config.js.map +1 -1
  33. package/src/connection/generator.d.ts +2 -2
  34. package/src/connection/generator.js.map +1 -1
  35. package/src/connection/local-dev.js.map +1 -1
  36. package/src/connection/scaffold-catalog.d.ts +1 -1
  37. package/src/connection/scaffold-catalog.js +6 -6
  38. package/src/connection/scaffold-catalog.js.map +1 -1
  39. package/src/connection/schema-resolver.d.ts +1 -1
  40. package/src/connection/schema-resolver.js.map +1 -1
  41. package/src/index.d.ts +1 -1
  42. package/src/index.js.map +1 -1
  43. package/src/infra/app/generator.d.ts +7 -7
  44. package/src/infra/app/generator.js.map +1 -1
  45. package/src/init/generator.d.ts +3 -3
  46. package/src/init/generator.js.map +1 -1
  47. package/src/init/schema.d.js.map +1 -1
  48. package/src/init/schema.d.ts +2 -2
  49. package/src/internal/test-matrix/generator.js.map +1 -1
  50. package/src/license/config-types.d.ts +2 -2
  51. package/src/license/config-types.js.map +1 -1
  52. package/src/license/config.d.ts +2 -2
  53. package/src/license/config.js.map +1 -1
  54. package/src/license/dependency-check/check.d.ts +2 -2
  55. package/src/license/dependency-check/check.js.map +1 -1
  56. package/src/license/dependency-check/collectors/collector.js.map +1 -1
  57. package/src/license/dependency-check/collectors/python-collector.js.map +1 -1
  58. package/src/license/dependency-check/evaluator.d.ts +1 -1
  59. package/src/license/dependency-check/evaluator.js.map +1 -1
  60. package/src/license/dependency-check/executor.js.map +1 -1
  61. package/src/license/dependency-check/pre-approved.d.ts +1 -1
  62. package/src/license/dependency-check/pre-approved.js.map +1 -1
  63. package/src/license/dependency-check/types.d.ts +1 -1
  64. package/src/license/dependency-check/types.js.map +1 -1
  65. package/src/license/generator.d.ts +1 -1
  66. package/src/license/generator.js.map +1 -1
  67. package/src/license/index.d.ts +4 -4
  68. package/src/license/index.js.map +1 -1
  69. package/src/license/known-exceptions.d.ts +1 -1
  70. package/src/license/known-exceptions.js.map +1 -1
  71. package/src/license/sync/generator.js.map +1 -1
  72. package/src/license/sync/project-file-sync.d.ts +1 -1
  73. package/src/license/sync/project-file-sync.js.map +1 -1
  74. package/src/mcp-server/dev-server.js.map +1 -1
  75. package/src/mcp-server/generator-info.d.ts +3 -3
  76. package/src/mcp-server/generator-info.js.map +1 -1
  77. package/src/mcp-server/guide-pipeline.d.ts +1 -1
  78. package/src/mcp-server/guide-pipeline.js.map +1 -1
  79. package/src/mcp-server/guide-render.js.map +1 -1
  80. package/src/mcp-server/index.js.map +1 -1
  81. package/src/mcp-server/mdx-ast.js.map +1 -1
  82. package/src/mcp-server/server.js.map +1 -1
  83. package/src/mcp-server/tools/add-to-existing-project.d.ts +1 -1
  84. package/src/mcp-server/tools/add-to-existing-project.js.map +1 -1
  85. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  86. package/src/mcp-server/tools/general-guidance.d.ts +1 -1
  87. package/src/mcp-server/tools/general-guidance.js +1 -1
  88. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  89. package/src/mcp-server/tools/generator-guide.d.ts +1 -1
  90. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  91. package/src/mcp-server/tools/list-generators.d.ts +1 -1
  92. package/src/mcp-server/tools/list-generators.js.map +1 -1
  93. package/src/mcp-server/tools/upgrade-workspace.d.ts +1 -1
  94. package/src/mcp-server/tools/upgrade-workspace.js.map +1 -1
  95. package/src/migrations/latest/apt-security-updates-in-container-images/migration.js.map +1 -1
  96. package/src/migrations/latest/dynamodb-configurable-encryption/migration.js.map +1 -1
  97. package/src/migrations/latest/py-agent-ag-ui-hooks/migration.js.map +1 -1
  98. package/src/migrations/latest/py-agent-session-id-middleware-extraction/migration.js.map +1 -1
  99. package/src/migrations/latest/remove-mcp-inspector-license-exceptions/migration.js.map +1 -1
  100. package/src/migrations/latest/static-website-configurable-waf-encryption/migration.js.map +1 -1
  101. package/src/migrations/latest/ts-agent-session-id-middleware-extraction/migration.js.map +1 -1
  102. package/src/migrations/latest/user-identity-configurable-mfa/migration.js.map +1 -1
  103. package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js.map +1 -1
  104. package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js.map +1 -1
  105. package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -1
  106. package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js.map +1 -1
  107. package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js.map +1 -1
  108. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.d.ts +1 -1
  109. package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js.map +1 -1
  110. package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js.map +1 -1
  111. package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js.map +1 -1
  112. package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js.map +1 -1
  113. package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js.map +1 -1
  114. package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js.map +1 -1
  115. package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js.map +1 -1
  116. package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js.map +1 -1
  117. package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js.map +1 -1
  118. package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js.map +1 -1
  119. package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js.map +1 -1
  120. package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js.map +1 -1
  121. package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js.map +1 -1
  122. package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js.map +1 -1
  123. package/src/migrations/v1.0.0-rc.67/0001-smithy-server-package-rename/migration.js.map +1 -1
  124. package/src/migrations/v1.0.0-rc.68/0001-translate-script-whole-file-writes/migration.js.map +1 -1
  125. package/src/migrations/v1.0.0-rc.70/0001-py-agent-a2a-lifespan-construction/migration.js.map +1 -1
  126. package/src/migrations/v1.0.0-rc.71/0001-py-agent-a2a-httpx-client-per-call/migration.js.map +1 -1
  127. package/src/migrations/v1.0.0-rc.72/0001-py-agent-session-management-support/migration.js.map +1 -1
  128. package/src/open-api/ts-client/generator.d.ts +1 -1
  129. package/src/open-api/ts-client/generator.js.map +1 -1
  130. package/src/open-api/ts-hooks/generator.d.ts +1 -1
  131. package/src/open-api/ts-hooks/generator.js.map +1 -1
  132. package/src/open-api/ts-hooks/generator.spec.tsx +6 -6
  133. package/src/open-api/ts-metadata/generator.d.ts +1 -1
  134. package/src/open-api/ts-metadata/generator.js.map +1 -1
  135. package/src/open-api/utils/codegen-data/languages.d.ts +1 -1
  136. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  137. package/src/open-api/utils/codegen-data.d.ts +2 -2
  138. package/src/open-api/utils/codegen-data.js.map +1 -1
  139. package/src/open-api/utils/normalise.d.ts +1 -1
  140. package/src/open-api/utils/normalise.js.map +1 -1
  141. package/src/open-api/utils/parse.d.ts +1 -1
  142. package/src/open-api/utils/parse.js.map +1 -1
  143. package/src/open-api/utils/parser.d.ts +2 -2
  144. package/src/open-api/utils/parser.js.map +1 -1
  145. package/src/open-api/utils/refs.d.ts +1 -1
  146. package/src/open-api/utils/refs.js.map +1 -1
  147. package/src/preset/generator.d.ts +3 -3
  148. package/src/preset/generator.js.map +1 -1
  149. package/src/preset/schema.d.js.map +1 -1
  150. package/src/preset/schema.d.ts +3 -3
  151. package/src/py/agent/a2a-connection/generator.d.ts +3 -3
  152. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  153. package/src/py/agent/a2a-connection/schema.d.js.map +1 -1
  154. package/src/py/agent/a2a-connection/schema.d.ts +1 -1
  155. package/src/py/agent/gateway-connection/generator.d.ts +3 -3
  156. package/src/py/agent/gateway-connection/generator.js.map +1 -1
  157. package/src/py/agent/gateway-connection/schema.d.js.map +1 -1
  158. package/src/py/agent/gateway-connection/schema.d.ts +1 -1
  159. package/src/py/agent/generator.d.ts +3 -3
  160. package/src/py/agent/generator.js.map +1 -1
  161. package/src/py/agent/mcp-connection/generator.d.ts +3 -3
  162. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  163. package/src/py/agent/mcp-connection/schema.d.js.map +1 -1
  164. package/src/py/agent/mcp-connection/schema.d.ts +1 -1
  165. package/src/py/agent/react-connection/generator.d.ts +12 -12
  166. package/src/py/agent/react-connection/generator.js.map +1 -1
  167. package/src/py/agent/react-connection/local-dev.d.ts +1 -1
  168. package/src/py/agent/react-connection/local-dev.js.map +1 -1
  169. package/src/py/agent/react-connection/schema.d.js.map +1 -1
  170. package/src/py/agent/react-connection/schema.d.ts +1 -1
  171. package/src/py/agent/schema.d.js.map +1 -1
  172. package/src/py/agent/schema.d.ts +1 -1
  173. package/src/py/api/generator.d.ts +1 -1
  174. package/src/py/api/generator.js.map +1 -1
  175. package/src/py/api/schema.d.js.map +1 -1
  176. package/src/py/api/schema.d.ts +1 -1
  177. package/src/py/dynamodb/agent-connection/generator.d.ts +1 -1
  178. package/src/py/dynamodb/agent-connection/generator.js.map +1 -1
  179. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -1
  180. package/src/py/dynamodb/agent-connection/schema.d.ts +1 -1
  181. package/src/py/dynamodb/fast-api-connection/generator.d.ts +1 -1
  182. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -1
  183. package/src/py/dynamodb/generator.d.ts +4 -4
  184. package/src/py/dynamodb/generator.js.map +1 -1
  185. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +1 -1
  186. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -1
  187. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -1
  188. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +1 -1
  189. package/src/py/dynamodb/schema.d.js.map +1 -1
  190. package/src/py/dynamodb/schema.d.ts +1 -1
  191. package/src/py/fast-api/generator.d.ts +3 -3
  192. package/src/py/fast-api/generator.js.map +1 -1
  193. package/src/py/fast-api/react/generator.d.ts +3 -3
  194. package/src/py/fast-api/react/generator.js.map +1 -1
  195. package/src/py/fast-api/react/open-api.js.map +1 -1
  196. package/src/py/fast-api/schema.d.js.map +1 -1
  197. package/src/py/fast-api/schema.d.ts +1 -1
  198. package/src/py/lambda-function/files/handler/__lambdaFunctionSnakeCase__.py.template +1 -1
  199. package/src/py/lambda-function/generator.d.ts +10 -4
  200. package/src/py/lambda-function/generator.js +8 -1
  201. package/src/py/lambda-function/generator.js.map +1 -1
  202. package/src/py/lambda-function/schema.d.js.map +1 -1
  203. package/src/py/lambda-function/schema.d.ts +2 -2
  204. package/src/py/lambda-function/schema.json +1 -1
  205. package/src/py/mcp-server/generator.d.ts +3 -3
  206. package/src/py/mcp-server/generator.js.map +1 -1
  207. package/src/py/mcp-server/schema.d.js.map +1 -1
  208. package/src/py/mcp-server/schema.d.ts +1 -1
  209. package/src/py/project/generator.d.ts +2 -2
  210. package/src/py/project/generator.js.map +1 -1
  211. package/src/py/project/schema.json +1 -0
  212. package/src/py/rdb/agent-connection/generator.d.ts +1 -1
  213. package/src/py/rdb/agent-connection/generator.js.map +1 -1
  214. package/src/py/rdb/agent-connection/schema.d.js.map +1 -1
  215. package/src/py/rdb/agent-connection/schema.d.ts +1 -1
  216. package/src/py/rdb/fast-api-connection/generator.d.ts +1 -1
  217. package/src/py/rdb/fast-api-connection/generator.js.map +1 -1
  218. package/src/py/rdb/generator.d.ts +3 -3
  219. package/src/py/rdb/generator.js.map +1 -1
  220. package/src/py/rdb/mcp-server-connection/generator.d.ts +1 -1
  221. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -1
  222. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -1
  223. package/src/py/rdb/mcp-server-connection/schema.d.ts +1 -1
  224. package/src/sdk/agentcore-gateway.d.ts +1 -1
  225. package/src/sdk/agentcore-gateway.js.map +1 -1
  226. package/src/sdk/agentcore-harness.d.ts +1 -1
  227. package/src/sdk/agentcore-harness.js.map +1 -1
  228. package/src/sdk/connection.d.ts +1 -1
  229. package/src/sdk/connection.js.map +1 -1
  230. package/src/sdk/license.d.ts +3 -3
  231. package/src/sdk/license.js.map +1 -1
  232. package/src/sdk/open-api.d.ts +3 -3
  233. package/src/sdk/open-api.js.map +1 -1
  234. package/src/sdk/py.d.ts +7 -7
  235. package/src/sdk/py.js.map +1 -1
  236. package/src/sdk/smithy.d.ts +1 -1
  237. package/src/sdk/smithy.js.map +1 -1
  238. package/src/sdk/terraform.d.ts +1 -1
  239. package/src/sdk/terraform.js.map +1 -1
  240. package/src/sdk/ts.d.ts +18 -18
  241. package/src/sdk/ts.js.map +1 -1
  242. package/src/sdk/utils/ast.d.ts +1 -1
  243. package/src/sdk/utils/ast.js.map +1 -1
  244. package/src/sdk/utils/format.d.ts +1 -1
  245. package/src/sdk/utils/format.js.map +1 -1
  246. package/src/sdk/utils/test.d.ts +1 -1
  247. package/src/sdk/utils/test.js.map +1 -1
  248. package/src/smithy/project/generator.d.ts +4 -4
  249. package/src/smithy/project/generator.js.map +1 -1
  250. package/src/smithy/react-connection/generator.d.ts +3 -3
  251. package/src/smithy/react-connection/generator.js.map +1 -1
  252. package/src/smithy/ts/api/generator.d.ts +3 -3
  253. package/src/smithy/ts/api/generator.js.map +1 -1
  254. package/src/smithy/ts/api/schema.d.js.map +1 -1
  255. package/src/smithy/ts/api/schema.d.ts +1 -1
  256. package/src/terraform/project/generator.d.ts +5 -5
  257. package/src/terraform/project/generator.js.map +1 -1
  258. package/src/trpc/backend/generator.d.ts +3 -3
  259. package/src/trpc/backend/generator.js.map +1 -1
  260. package/src/trpc/backend/schema.d.js.map +1 -1
  261. package/src/trpc/backend/schema.d.ts +1 -1
  262. package/src/trpc/react/generator.d.ts +3 -3
  263. package/src/trpc/react/generator.js.map +1 -1
  264. package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
  265. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  266. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -1
  267. package/src/ts/agent/a2a-connection/schema.d.ts +1 -1
  268. package/src/ts/agent/gateway-connection/generator.d.ts +3 -3
  269. package/src/ts/agent/gateway-connection/generator.js.map +1 -1
  270. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -1
  271. package/src/ts/agent/gateway-connection/schema.d.ts +1 -1
  272. package/src/ts/agent/generator.d.ts +3 -3
  273. package/src/ts/agent/generator.js.map +1 -1
  274. package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
  275. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  276. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -1
  277. package/src/ts/agent/mcp-connection/schema.d.ts +1 -1
  278. package/src/ts/agent/react-connection/generator.d.ts +11 -11
  279. package/src/ts/agent/react-connection/generator.js.map +1 -1
  280. package/src/ts/agent/react-connection/local-dev.d.ts +1 -1
  281. package/src/ts/agent/react-connection/local-dev.js.map +1 -1
  282. package/src/ts/agent/react-connection/schema.d.js.map +1 -1
  283. package/src/ts/agent/react-connection/schema.d.ts +1 -1
  284. package/src/ts/agent/schema.d.js.map +1 -1
  285. package/src/ts/agent/schema.d.ts +1 -1
  286. package/src/ts/api/generator.d.ts +1 -1
  287. package/src/ts/api/generator.js.map +1 -1
  288. package/src/ts/api/schema.d.js.map +1 -1
  289. package/src/ts/api/schema.d.ts +1 -1
  290. package/src/ts/astro-docs/generator.d.ts +3 -3
  291. package/src/ts/astro-docs/generator.js.map +1 -1
  292. package/src/ts/dcr-proxy/generator.d.ts +5 -5
  293. package/src/ts/dcr-proxy/generator.js.map +1 -1
  294. package/src/ts/dcr-proxy/schema.d.js.map +1 -1
  295. package/src/ts/dcr-proxy/schema.d.ts +1 -1
  296. package/src/ts/docs/generator.d.ts +1 -1
  297. package/src/ts/docs/generator.js.map +1 -1
  298. package/src/ts/dynamodb/agent-connection/generator.d.ts +1 -1
  299. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  300. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -1
  301. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -1
  302. package/src/ts/dynamodb/generator.d.ts +5 -5
  303. package/src/ts/dynamodb/generator.js +1 -0
  304. package/src/ts/dynamodb/generator.js.map +1 -1
  305. package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +1 -1
  306. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  307. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -1
  308. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -1
  309. package/src/ts/dynamodb/schema.d.js.map +1 -1
  310. package/src/ts/dynamodb/schema.d.ts +1 -1
  311. package/src/ts/dynamodb/smithy-connection/generator.d.ts +1 -1
  312. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  313. package/src/ts/dynamodb/trpc-connection/generator.d.ts +1 -1
  314. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  315. package/src/ts/lambda-function/generator.d.ts +5 -5
  316. package/src/ts/lambda-function/generator.js.map +1 -1
  317. package/src/ts/lambda-function/schema.d.js.map +1 -1
  318. package/src/ts/lambda-function/schema.d.ts +1 -1
  319. package/src/ts/lib/biome.d.ts +1 -1
  320. package/src/ts/lib/biome.js.map +1 -1
  321. package/src/ts/lib/generator.d.ts +3 -3
  322. package/src/ts/lib/generator.js.map +1 -1
  323. package/src/ts/lib/ts-project-utils.d.ts +3 -3
  324. package/src/ts/lib/ts-project-utils.js.map +1 -1
  325. package/src/ts/lib/vitest.d.ts +2 -2
  326. package/src/ts/lib/vitest.js.map +1 -1
  327. package/src/ts/mcp-server/generator.d.ts +3 -3
  328. package/src/ts/mcp-server/generator.js.map +1 -1
  329. package/src/ts/mcp-server/schema.d.js.map +1 -1
  330. package/src/ts/mcp-server/schema.d.ts +1 -1
  331. package/src/ts/nx-generator/generator.d.ts +2 -2
  332. package/src/ts/nx-generator/generator.js.map +1 -1
  333. package/src/ts/nx-migration/generator.d.ts +3 -3
  334. package/src/ts/nx-migration/generator.js.map +1 -1
  335. package/src/ts/nx-plugin/generator.d.ts +3 -3
  336. package/src/ts/nx-plugin/generator.js.map +1 -1
  337. package/src/ts/nx-plugin/utils.d.ts +1 -1
  338. package/src/ts/nx-plugin/utils.js.map +1 -1
  339. package/src/ts/rdb/agent-connection/generator.d.ts +1 -1
  340. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  341. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -1
  342. package/src/ts/rdb/agent-connection/schema.d.ts +1 -1
  343. package/src/ts/rdb/generator.d.ts +4 -4
  344. package/src/ts/rdb/generator.js +1 -0
  345. package/src/ts/rdb/generator.js.map +1 -1
  346. package/src/ts/rdb/mcp-server-connection/generator.d.ts +1 -1
  347. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  348. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -1
  349. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -1
  350. package/src/ts/rdb/schema.d.js.map +1 -1
  351. package/src/ts/rdb/schema.d.ts +1 -1
  352. package/src/ts/rdb/smithy-connection/generator.d.ts +1 -1
  353. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  354. package/src/ts/rdb/trpc-connection/generator.d.ts +1 -1
  355. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  356. package/src/ts/react-website/agui/generator.d.ts +2 -2
  357. package/src/ts/react-website/agui/generator.js.map +1 -1
  358. package/src/ts/react-website/app/generator.d.ts +3 -3
  359. package/src/ts/react-website/app/generator.js.map +1 -1
  360. package/src/ts/react-website/app/schema.d.js.map +1 -1
  361. package/src/ts/react-website/app/schema.d.ts +2 -2
  362. package/src/ts/react-website/cognito-auth/generator.d.ts +5 -5
  363. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  364. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -1
  365. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -1
  366. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  367. package/src/ts/react-website/runtime-config/generator.d.ts +1 -1
  368. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  369. package/src/ts/sync/generator.d.ts +1 -1
  370. package/src/ts/sync/generator.js.map +1 -1
  371. package/src/ts/website/app/generator.d.ts +1 -1
  372. package/src/ts/website/app/generator.js.map +1 -1
  373. package/src/ts/website/app/schema.d.js.map +1 -1
  374. package/src/ts/website/app/schema.d.ts +2 -2
  375. package/src/ts/website/auth/generator.d.ts +1 -1
  376. package/src/ts/website/auth/generator.js.map +1 -1
  377. package/src/ts/website/auth/schema.d.js.map +1 -1
  378. package/src/ts/website/auth/schema.d.ts +1 -1
  379. package/src/utils/add-dependencies.d.ts +1 -1
  380. package/src/utils/add-dependencies.js.map +1 -1
  381. package/src/utils/agent-chat/agent-chat.js.map +1 -1
  382. package/src/utils/agent-connection/agent-connection.d.ts +2 -2
  383. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  384. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +4 -4
  385. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  386. package/src/utils/api-constructs/api-constructs.d.ts +3 -3
  387. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  388. package/src/utils/api-constructs/open-api-metadata.d.ts +1 -1
  389. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  390. package/src/utils/ast/website.js.map +1 -1
  391. package/src/utils/ast.js +6 -0
  392. package/src/utils/ast.js.map +1 -1
  393. package/src/utils/bundle/bundle.d.ts +1 -1
  394. package/src/utils/bundle/bundle.js.map +1 -1
  395. package/src/utils/commands.d.ts +1 -1
  396. package/src/utils/commands.js.map +1 -1
  397. package/src/utils/config/index.d.ts +6 -6
  398. package/src/utils/config/index.js.map +1 -1
  399. package/src/utils/config/utils.d.ts +1 -1
  400. package/src/utils/config/utils.js.map +1 -1
  401. package/src/utils/connection/open-api/react.d.ts +1 -1
  402. package/src/utils/connection/open-api/react.js.map +1 -1
  403. package/src/utils/containers.js.map +1 -1
  404. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.d.ts +1 -1
  405. package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -1
  406. package/src/utils/declared-dependencies.d.ts +1 -1
  407. package/src/utils/declared-dependencies.js.map +1 -1
  408. package/src/utils/dependencies.js.map +1 -1
  409. package/src/utils/docker.d.ts +1 -1
  410. package/src/utils/docker.js.map +1 -1
  411. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +1 -1
  412. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  413. package/src/utils/format.js.map +1 -1
  414. package/src/utils/fs.d.ts +1 -1
  415. package/src/utils/fs.js.map +1 -1
  416. package/src/utils/function-constructs/function-constructs.d.ts +1 -1
  417. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  418. package/src/utils/iac.d.ts +2 -2
  419. package/src/utils/iac.js.map +1 -1
  420. package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
  421. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  422. package/src/utils/init.d.ts +3 -3
  423. package/src/utils/init.js.map +1 -1
  424. package/src/utils/install.d.ts +1 -1
  425. package/src/utils/install.js.map +1 -1
  426. package/src/utils/mcp.js.map +1 -1
  427. package/src/utils/metrics.d.ts +1 -1
  428. package/src/utils/metrics.js.map +1 -1
  429. package/src/utils/migration-manifest.d.ts +1 -1
  430. package/src/utils/migration-manifest.js.map +1 -1
  431. package/src/utils/nx.d.ts +3 -3
  432. package/src/utils/nx.js.map +1 -1
  433. package/src/utils/paths.js.map +1 -1
  434. package/src/utils/pkg-manager.d.ts +1 -1
  435. package/src/utils/pkg-manager.js.map +1 -1
  436. package/src/utils/pnpm-workspace.js.map +1 -1
  437. package/src/utils/project-package-json.js.map +1 -1
  438. package/src/utils/py.d.ts +2 -2
  439. package/src/utils/py.js.map +1 -1
  440. package/src/utils/rdb-constructs/rdb-constructs.d.ts +2 -2
  441. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  442. package/src/utils/shared-constructs-constants.js.map +1 -1
  443. package/src/utils/shared-constructs.d.ts +3 -3
  444. package/src/utils/shared-constructs.js.map +1 -1
  445. package/src/utils/shared-dynamodb-scripts.d.ts +1 -1
  446. package/src/utils/shared-dynamodb-scripts.js.map +1 -1
  447. package/src/utils/shared-infra-config.js.map +1 -1
  448. package/src/utils/shared-infra-scripts.d.ts +2 -2
  449. package/src/utils/shared-infra-scripts.js.map +1 -1
  450. package/src/utils/shared-rdb-scripts.d.ts +1 -1
  451. package/src/utils/shared-rdb-scripts.js.map +1 -1
  452. package/src/utils/shared-scripts.js.map +1 -1
  453. package/src/utils/shared-shadcn.d.ts +1 -1
  454. package/src/utils/shared-shadcn.js.map +1 -1
  455. package/src/utils/smithy.js.map +1 -1
  456. package/src/utils/test.js.map +1 -1
  457. package/src/utils/version-upgrade-migration/migration.js.map +1 -1
  458. package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -1
  459. package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +1 -1
  460. package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -1
  461. package/src/utils/version-upgrade-migration/register.js.map +1 -1
  462. package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +1 -1
  463. package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -1
  464. package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -1
  465. package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -1
  466. package/src/utils/versions.d.ts +1 -1
  467. package/src/utils/versions.js.map +1 -1
  468. package/src/utils/website-constructs/website-constructs.d.ts +2 -2
  469. package/src/utils/website-constructs/website-constructs.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.0-rc.71/0001-py-agent-a2a-httpx-client-per-call/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type MigrationReturnObject,\n type Tree,\n visitNotIgnoredFiles,\n} from '@nx/devkit';\nimport { applyGritQL, matchGritQL } from '../../../utils/ast';\nimport { formatFilesInSubtree } from '../../../utils/format';\n\n/**\n * Rebuild the `httpx.AsyncClient` (and, for Strands, the `A2AAgent`) fresh on\n * every A2A delegate call, instead of reusing the one built once at factory\n * time - fixes a reproducible `RuntimeError: Event loop is closed` on the\n * second call through a shared client.\n *\n * Both frameworks' A2A clients call out through a synchronous wrapper\n * (`_run_sync`) that runs the async call via `asyncio.run(...)` - a brand new\n * event loop per call, closed when the call returns. `AgentCoreA2aClientConfig`\n * builds one `httpx.AsyncClient` a single time, at factory call time, and that\n * client's connection pool binds to whichever event loop first touches it. So\n * call #1 creates a loop, uses the shared client, closes the loop; call #2\n * creates a *new* loop, but the shared client's pool is still bound to the\n * old, now-closed one.\n *\n * Strands hits the same failure one layer down: `A2AAgent.__call__` is itself\n * synchronous and does its own `asyncio.run(...)` per call internally, while\n * reusing the same factory-built `httpx.AsyncClient` via `client_config`.\n *\n * The fix in both `AgentCoreA2aClientLangChain`/`AgentCoreA2aClientStrands` is\n * to stop handing out a client wired to one long-lived `httpx.AsyncClient`.\n * Instead each call opens a fresh `httpx.AsyncClient` (reusing only the\n * `auth`/`timeout` off the once-built shared config) scoped to that call via\n * `async with`, so its connection pool lives and dies with the same loop that\n * created it. For Strands this also means `AgentCoreA2aClientStrands`'s\n * factories no longer return a raw `A2AAgent` (dropped in favour of a private\n * `_A2AClient` built per call), so the per-target `<Agent>ClientStrands.create`\n * wrapper's `-> A2AAgent` return annotation and its now-unused `A2AAgent`\n * import go stale too.\n */\nconst pyMatch = (snippet: string) => `language python\\n\\`${snippet}\\``;\n\nconst pyRewrite = (from: string, to: string): string => {\n const replacement = to.includes('\\n') ? `raw\\`${to}\\`` : `\\`${to}\\``;\n return `${pyMatch(from)} => ${replacement}`;\n};\n\nconst allMatch = async (\n tree: Tree,\n filePath: string,\n patterns: string[],\n): Promise<boolean> => {\n for (const pattern of patterns) {\n if (!(await matchGritQL(tree, filePath, pattern))) return false;\n }\n return true;\n};\n\n// --- agentcore_a2a_client_langchain.py (framework-agnostic core, shared) ---\n\nconst LANGCHAIN_IMPORT_OLD =\n 'from a2a.client import A2ACardResolver, ClientConfig, ClientFactory';\nconst LANGCHAIN_IMPORT_NEW = `import httpx\nfrom a2a.client import A2ACardResolver, ClientConfig, ClientFactory`;\n\nconst LANGCHAIN_INVOKE_OLD = ` async def _invoke(self, prompt: str) -> str:\n # AgentCoreA2aClientConfig always sets the signed httpx client.\n httpx_client = self._config.httpx_client\n if httpx_client is None:\n raise RuntimeError(\"A2A client config is missing an httpx client\")\n card = await A2ACardResolver(\n httpx_client=httpx_client, base_url=self._url\n ).get_agent_card()\n client = ClientFactory(self._config).create(card)\n message = Message(\n kind=\"message\",\n role=Role.user,\n message_id=uuid4().hex,\n parts=[Part(TextPart(kind=\"text\", text=prompt))],\n )\n # The client config uses streaming=False, so the last event carries the\n # complete response.\n reply = \"\"\n async for event in client.send_message(message):\n text = _text(event)\n if text:\n reply = text\n return reply`;\n\nconst LANGCHAIN_INVOKE_NEW = `async def _invoke(self, prompt: str) -> str:\n # AgentCoreA2aClientConfig always sets the signed httpx client.\n shared_client = self._config.httpx_client\n if shared_client is None:\n raise RuntimeError(\"A2A client config is missing an httpx client\")\n async with httpx.AsyncClient(\n auth=shared_client.auth, timeout=shared_client.timeout\n ) as httpx_client:\n card = await A2ACardResolver(\n httpx_client=httpx_client, base_url=self._url\n ).get_agent_card()\n client = ClientFactory(\n ClientConfig(httpx_client=httpx_client, streaming=False)\n ).create(card)\n message = Message(\n kind=\"message\",\n role=Role.user,\n message_id=uuid4().hex,\n parts=[Part(TextPart(kind=\"text\", text=prompt))],\n )\n # The client config uses streaming=False, so the last event carries\n # the complete response.\n reply = \"\"\n async for event in client.send_message(message):\n text = _text(event)\n if text:\n reply = text\n return reply`;\n\nconst migrateLangchainCoreClient = async (\n tree: Tree,\n filePath: string,\n nextSteps: string[],\n): Promise<void> => {\n const contents = tree.read(filePath, 'utf-8') ?? '';\n if (!contents.includes('client = ClientFactory(self._config).create(card)'))\n return;\n\n const ready = await allMatch(tree, filePath, [\n pyMatch(LANGCHAIN_IMPORT_OLD),\n pyMatch(LANGCHAIN_INVOKE_OLD),\n ]);\n\n if (!ready) {\n nextSteps.push(\n `${filePath}: diverged from the generated shape - left untouched. Manually rebuild a fresh httpx.AsyncClient per call in _invoke instead of reusing the one built at factory time (see the agent-connection generator's agentcore_a2a_client_langchain.py template).`,\n );\n return;\n }\n\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(LANGCHAIN_IMPORT_OLD, LANGCHAIN_IMPORT_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(LANGCHAIN_INVOKE_OLD, LANGCHAIN_INVOKE_NEW),\n );\n};\n\n// --- agentcore_a2a_client_strands.py (Strands core client) ------------------\n\nconst STRANDS_IMPORT1_OLD = 'from collections.abc import Callable';\nconst STRANDS_IMPORT1_NEW = `import asyncio\nfrom collections.abc import Callable\nfrom concurrent.futures import ThreadPoolExecutor`;\n\nconst STRANDS_IMPORT2_OLD = 'from strands.agent.a2a_agent import A2AAgent';\nconst STRANDS_IMPORT2_NEW = `import httpx\nfrom a2a.client import ClientConfig\nfrom strands.agent.a2a_agent import A2AAgent\nfrom strands.agent.agent_result import AgentResult`;\n\nconst STRANDS_BUILD_OLD = `def _build(\n config: tuple, *, name: str | None, description: str | None\n) -> A2AAgent:\n url, client_config = config\n kwargs: dict = {\"endpoint\": url, \"client_config\": client_config}\n if name:\n kwargs[\"name\"] = name\n if description:\n kwargs[\"description\"] = description\n return A2AAgent(**kwargs)`;\n\nconst STRANDS_BUILD_NEW = `def _run_sync(coro):\n # The tool is invoked from sync agent code, which under uvicorn runs inside a\n # live event loop where asyncio.run() would raise — fall back to a worker.\n try:\n asyncio.get_running_loop()\n except RuntimeError:\n return asyncio.run(coro)\n with ThreadPoolExecutor(max_workers=1) as pool:\n return pool.submit(asyncio.run, coro).result()\n\n\nclass _A2AClient:\n def __init__(\n self,\n url: str,\n client_config: ClientConfig,\n *,\n name: str | None,\n description: str | None,\n ):\n shared_client = client_config.httpx_client\n if shared_client is None:\n raise RuntimeError(\"A2A client config is missing an httpx client\")\n self._url = url\n self._auth = shared_client.auth\n self._timeout = shared_client.timeout\n self._name = name\n self._description = description\n\n def __call__(self, prompt: str) -> AgentResult:\n return _run_sync(self._invoke(prompt))\n\n async def _invoke(self, prompt: str) -> AgentResult:\n async with httpx.AsyncClient(\n auth=self._auth, timeout=self._timeout\n ) as httpx_client:\n agent = A2AAgent(\n endpoint=self._url,\n name=self._name,\n description=self._description,\n client_config=ClientConfig(httpx_client=httpx_client, streaming=False),\n )\n return await agent.invoke_async(prompt)\n\n\ndef _build(\n config: tuple, *, name: str | None, description: str | None\n) -> _A2AClient:\n url, client_config = config\n return _A2AClient(url, client_config, name=name, description=description)`;\n\nconst STRANDS_IAM_OLD = ` @staticmethod\n def with_iam_auth(\n agent_runtime_arn: str,\n *,\n name: str | None = None,\n description: str | None = None,\n ) -> A2AAgent:\n \"\"\"SigV4-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_iam_auth(agent_runtime_arn),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_IAM_NEW = `@staticmethod\ndef with_iam_auth(\n agent_runtime_arn: str,\n *,\n name: str | None = None,\n description: str | None = None,\n) -> _A2AClient:\n \"\"\"SigV4-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_iam_auth(agent_runtime_arn),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_JWT_OLD = ` @staticmethod\n def with_jwt_auth(\n agent_runtime_arn: str,\n access_token_provider: Callable[[], str],\n *,\n name: str | None = None,\n description: str | None = None,\n ) -> A2AAgent:\n \"\"\"Bearer-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_jwt_auth(\n agent_runtime_arn, access_token_provider\n ),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_JWT_NEW = `@staticmethod\ndef with_jwt_auth(\n agent_runtime_arn: str,\n access_token_provider: Callable[[], str],\n *,\n name: str | None = None,\n description: str | None = None,\n) -> _A2AClient:\n \"\"\"Bearer-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_jwt_auth(\n agent_runtime_arn, access_token_provider\n ),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_NOAUTH_OLD = ` @staticmethod\n def without_auth(\n url: str,\n *,\n name: str | None = None,\n description: str | None = None,\n ) -> A2AAgent:\n \"\"\"Plain-HTTP client — for local dev.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.without_auth(url),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_NOAUTH_NEW = `@staticmethod\ndef without_auth(\n url: str,\n *,\n name: str | None = None,\n description: str | None = None,\n) -> _A2AClient:\n \"\"\"Plain-HTTP client — for local dev.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.without_auth(url),\n name=name,\n description=description,\n )`;\n\nconst migrateStrandsCoreClient = async (\n tree: Tree,\n filePath: string,\n nextSteps: string[],\n): Promise<void> => {\n const contents = tree.read(filePath, 'utf-8') ?? '';\n if (!contents.includes('return A2AAgent(**kwargs)')) return;\n\n const ready = await allMatch(tree, filePath, [\n pyMatch(STRANDS_IMPORT1_OLD),\n pyMatch(STRANDS_IMPORT2_OLD),\n pyMatch(STRANDS_BUILD_OLD),\n pyMatch(STRANDS_IAM_OLD),\n pyMatch(STRANDS_JWT_OLD),\n pyMatch(STRANDS_NOAUTH_OLD),\n ]);\n\n if (!ready) {\n nextSteps.push(\n `${filePath}: diverged from the generated shape - left untouched. Manually rebuild a fresh httpx.AsyncClient (and A2AAgent) per call instead of reusing the ones built at factory time (see the agent-connection generator's agentcore_a2a_client_strands.py template).`,\n );\n return;\n }\n\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_IMPORT1_OLD, STRANDS_IMPORT1_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_IMPORT2_OLD, STRANDS_IMPORT2_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_BUILD_OLD, STRANDS_BUILD_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_IAM_OLD, STRANDS_IAM_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_JWT_OLD, STRANDS_JWT_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_NOAUTH_OLD, STRANDS_NOAUTH_NEW),\n );\n};\n\n// --- <target>_client_strands.py (per-target wrapper, one per connection) ---\n\nconst WRAPPER_IMPORT_OLD = 'from strands.agent.a2a_agent import A2AAgent';\n\nconst WRAPPER_CREATE_OLD = 'def create() -> A2AAgent:\\n $body';\nconst WRAPPER_CREATE_NEW = 'def create():\\n $body';\n\nconst migrateStrandsWrapperClient = async (\n tree: Tree,\n filePath: string,\n nextSteps: string[],\n): Promise<void> => {\n const contents = tree.read(filePath, 'utf-8') ?? '';\n if (!contents.includes('def create() -> A2AAgent:')) return;\n\n const ready = await allMatch(tree, filePath, [\n pyMatch(WRAPPER_IMPORT_OLD),\n pyMatch(WRAPPER_CREATE_OLD),\n ]);\n\n if (!ready) {\n nextSteps.push(\n `${filePath}: diverged from the generated shape - left untouched. Manually drop the A2AAgent import and its -> A2AAgent return annotation on create() (see the py#agent#a2a-connection generator's per-target client_strands.py template).`,\n );\n return;\n }\n\n await applyGritQL(tree, filePath, `${pyMatch(WRAPPER_IMPORT_OLD)} => .`);\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(WRAPPER_CREATE_OLD, WRAPPER_CREATE_NEW),\n );\n};\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n const filePaths: string[] = [];\n visitNotIgnoredFiles(tree, '', (filePath) => filePaths.push(filePath));\n\n for (const filePath of filePaths) {\n if (filePath.endsWith('/agentcore_a2a_client_langchain.py')) {\n await migrateLangchainCoreClient(tree, filePath, nextSteps);\n } else if (filePath.endsWith('/agentcore_a2a_client_strands.py')) {\n await migrateStrandsCoreClient(tree, filePath, nextSteps);\n } else if (filePath.endsWith('_client_strands.py')) {\n await migrateStrandsWrapperClient(tree, filePath, nextSteps);\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["visitNotIgnoredFiles","applyGritQL","matchGritQL","formatFilesInSubtree","pyMatch","snippet","pyRewrite","from","to","replacement","includes","allMatch","tree","filePath","patterns","pattern","LANGCHAIN_IMPORT_OLD","LANGCHAIN_IMPORT_NEW","LANGCHAIN_INVOKE_OLD","LANGCHAIN_INVOKE_NEW","migrateLangchainCoreClient","nextSteps","contents","read","ready","push","STRANDS_IMPORT1_OLD","STRANDS_IMPORT1_NEW","STRANDS_IMPORT2_OLD","STRANDS_IMPORT2_NEW","STRANDS_BUILD_OLD","STRANDS_BUILD_NEW","STRANDS_IAM_OLD","STRANDS_IAM_NEW","STRANDS_JWT_OLD","STRANDS_JWT_NEW","STRANDS_NOAUTH_OLD","STRANDS_NOAUTH_NEW","migrateStrandsCoreClient","WRAPPER_IMPORT_OLD","WRAPPER_CREATE_OLD","WRAPPER_CREATE_NEW","migrateStrandsWrapperClient","migration","filePaths","endsWith"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.0-rc.71/0001-py-agent-a2a-httpx-client-per-call/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n type MigrationReturnObject,\n type Tree,\n visitNotIgnoredFiles,\n} from '@nx/devkit';\nimport { applyGritQL, matchGritQL } from '../../../utils/ast.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\n\n/**\n * Rebuild the `httpx.AsyncClient` (and, for Strands, the `A2AAgent`) fresh on\n * every A2A delegate call, instead of reusing the one built once at factory\n * time - fixes a reproducible `RuntimeError: Event loop is closed` on the\n * second call through a shared client.\n *\n * Both frameworks' A2A clients call out through a synchronous wrapper\n * (`_run_sync`) that runs the async call via `asyncio.run(...)` - a brand new\n * event loop per call, closed when the call returns. `AgentCoreA2aClientConfig`\n * builds one `httpx.AsyncClient` a single time, at factory call time, and that\n * client's connection pool binds to whichever event loop first touches it. So\n * call #1 creates a loop, uses the shared client, closes the loop; call #2\n * creates a *new* loop, but the shared client's pool is still bound to the\n * old, now-closed one.\n *\n * Strands hits the same failure one layer down: `A2AAgent.__call__` is itself\n * synchronous and does its own `asyncio.run(...)` per call internally, while\n * reusing the same factory-built `httpx.AsyncClient` via `client_config`.\n *\n * The fix in both `AgentCoreA2aClientLangChain`/`AgentCoreA2aClientStrands` is\n * to stop handing out a client wired to one long-lived `httpx.AsyncClient`.\n * Instead each call opens a fresh `httpx.AsyncClient` (reusing only the\n * `auth`/`timeout` off the once-built shared config) scoped to that call via\n * `async with`, so its connection pool lives and dies with the same loop that\n * created it. For Strands this also means `AgentCoreA2aClientStrands`'s\n * factories no longer return a raw `A2AAgent` (dropped in favour of a private\n * `_A2AClient` built per call), so the per-target `<Agent>ClientStrands.create`\n * wrapper's `-> A2AAgent` return annotation and its now-unused `A2AAgent`\n * import go stale too.\n */\nconst pyMatch = (snippet: string) => `language python\\n\\`${snippet}\\``;\n\nconst pyRewrite = (from: string, to: string): string => {\n const replacement = to.includes('\\n') ? `raw\\`${to}\\`` : `\\`${to}\\``;\n return `${pyMatch(from)} => ${replacement}`;\n};\n\nconst allMatch = async (\n tree: Tree,\n filePath: string,\n patterns: string[],\n): Promise<boolean> => {\n for (const pattern of patterns) {\n if (!(await matchGritQL(tree, filePath, pattern))) return false;\n }\n return true;\n};\n\n// --- agentcore_a2a_client_langchain.py (framework-agnostic core, shared) ---\n\nconst LANGCHAIN_IMPORT_OLD =\n 'from a2a.client import A2ACardResolver, ClientConfig, ClientFactory';\nconst LANGCHAIN_IMPORT_NEW = `import httpx\nfrom a2a.client import A2ACardResolver, ClientConfig, ClientFactory`;\n\nconst LANGCHAIN_INVOKE_OLD = ` async def _invoke(self, prompt: str) -> str:\n # AgentCoreA2aClientConfig always sets the signed httpx client.\n httpx_client = self._config.httpx_client\n if httpx_client is None:\n raise RuntimeError(\"A2A client config is missing an httpx client\")\n card = await A2ACardResolver(\n httpx_client=httpx_client, base_url=self._url\n ).get_agent_card()\n client = ClientFactory(self._config).create(card)\n message = Message(\n kind=\"message\",\n role=Role.user,\n message_id=uuid4().hex,\n parts=[Part(TextPart(kind=\"text\", text=prompt))],\n )\n # The client config uses streaming=False, so the last event carries the\n # complete response.\n reply = \"\"\n async for event in client.send_message(message):\n text = _text(event)\n if text:\n reply = text\n return reply`;\n\nconst LANGCHAIN_INVOKE_NEW = `async def _invoke(self, prompt: str) -> str:\n # AgentCoreA2aClientConfig always sets the signed httpx client.\n shared_client = self._config.httpx_client\n if shared_client is None:\n raise RuntimeError(\"A2A client config is missing an httpx client\")\n async with httpx.AsyncClient(\n auth=shared_client.auth, timeout=shared_client.timeout\n ) as httpx_client:\n card = await A2ACardResolver(\n httpx_client=httpx_client, base_url=self._url\n ).get_agent_card()\n client = ClientFactory(\n ClientConfig(httpx_client=httpx_client, streaming=False)\n ).create(card)\n message = Message(\n kind=\"message\",\n role=Role.user,\n message_id=uuid4().hex,\n parts=[Part(TextPart(kind=\"text\", text=prompt))],\n )\n # The client config uses streaming=False, so the last event carries\n # the complete response.\n reply = \"\"\n async for event in client.send_message(message):\n text = _text(event)\n if text:\n reply = text\n return reply`;\n\nconst migrateLangchainCoreClient = async (\n tree: Tree,\n filePath: string,\n nextSteps: string[],\n): Promise<void> => {\n const contents = tree.read(filePath, 'utf-8') ?? '';\n if (!contents.includes('client = ClientFactory(self._config).create(card)'))\n return;\n\n const ready = await allMatch(tree, filePath, [\n pyMatch(LANGCHAIN_IMPORT_OLD),\n pyMatch(LANGCHAIN_INVOKE_OLD),\n ]);\n\n if (!ready) {\n nextSteps.push(\n `${filePath}: diverged from the generated shape - left untouched. Manually rebuild a fresh httpx.AsyncClient per call in _invoke instead of reusing the one built at factory time (see the agent-connection generator's agentcore_a2a_client_langchain.py template).`,\n );\n return;\n }\n\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(LANGCHAIN_IMPORT_OLD, LANGCHAIN_IMPORT_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(LANGCHAIN_INVOKE_OLD, LANGCHAIN_INVOKE_NEW),\n );\n};\n\n// --- agentcore_a2a_client_strands.py (Strands core client) ------------------\n\nconst STRANDS_IMPORT1_OLD = 'from collections.abc import Callable';\nconst STRANDS_IMPORT1_NEW = `import asyncio\nfrom collections.abc import Callable\nfrom concurrent.futures import ThreadPoolExecutor`;\n\nconst STRANDS_IMPORT2_OLD = 'from strands.agent.a2a_agent import A2AAgent';\nconst STRANDS_IMPORT2_NEW = `import httpx\nfrom a2a.client import ClientConfig\nfrom strands.agent.a2a_agent import A2AAgent\nfrom strands.agent.agent_result import AgentResult`;\n\nconst STRANDS_BUILD_OLD = `def _build(\n config: tuple, *, name: str | None, description: str | None\n) -> A2AAgent:\n url, client_config = config\n kwargs: dict = {\"endpoint\": url, \"client_config\": client_config}\n if name:\n kwargs[\"name\"] = name\n if description:\n kwargs[\"description\"] = description\n return A2AAgent(**kwargs)`;\n\nconst STRANDS_BUILD_NEW = `def _run_sync(coro):\n # The tool is invoked from sync agent code, which under uvicorn runs inside a\n # live event loop where asyncio.run() would raise — fall back to a worker.\n try:\n asyncio.get_running_loop()\n except RuntimeError:\n return asyncio.run(coro)\n with ThreadPoolExecutor(max_workers=1) as pool:\n return pool.submit(asyncio.run, coro).result()\n\n\nclass _A2AClient:\n def __init__(\n self,\n url: str,\n client_config: ClientConfig,\n *,\n name: str | None,\n description: str | None,\n ):\n shared_client = client_config.httpx_client\n if shared_client is None:\n raise RuntimeError(\"A2A client config is missing an httpx client\")\n self._url = url\n self._auth = shared_client.auth\n self._timeout = shared_client.timeout\n self._name = name\n self._description = description\n\n def __call__(self, prompt: str) -> AgentResult:\n return _run_sync(self._invoke(prompt))\n\n async def _invoke(self, prompt: str) -> AgentResult:\n async with httpx.AsyncClient(\n auth=self._auth, timeout=self._timeout\n ) as httpx_client:\n agent = A2AAgent(\n endpoint=self._url,\n name=self._name,\n description=self._description,\n client_config=ClientConfig(httpx_client=httpx_client, streaming=False),\n )\n return await agent.invoke_async(prompt)\n\n\ndef _build(\n config: tuple, *, name: str | None, description: str | None\n) -> _A2AClient:\n url, client_config = config\n return _A2AClient(url, client_config, name=name, description=description)`;\n\nconst STRANDS_IAM_OLD = ` @staticmethod\n def with_iam_auth(\n agent_runtime_arn: str,\n *,\n name: str | None = None,\n description: str | None = None,\n ) -> A2AAgent:\n \"\"\"SigV4-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_iam_auth(agent_runtime_arn),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_IAM_NEW = `@staticmethod\ndef with_iam_auth(\n agent_runtime_arn: str,\n *,\n name: str | None = None,\n description: str | None = None,\n) -> _A2AClient:\n \"\"\"SigV4-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_iam_auth(agent_runtime_arn),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_JWT_OLD = ` @staticmethod\n def with_jwt_auth(\n agent_runtime_arn: str,\n access_token_provider: Callable[[], str],\n *,\n name: str | None = None,\n description: str | None = None,\n ) -> A2AAgent:\n \"\"\"Bearer-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_jwt_auth(\n agent_runtime_arn, access_token_provider\n ),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_JWT_NEW = `@staticmethod\ndef with_jwt_auth(\n agent_runtime_arn: str,\n access_token_provider: Callable[[], str],\n *,\n name: str | None = None,\n description: str | None = None,\n) -> _A2AClient:\n \"\"\"Bearer-authenticated client for a Bedrock AgentCore runtime.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.with_jwt_auth(\n agent_runtime_arn, access_token_provider\n ),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_NOAUTH_OLD = ` @staticmethod\n def without_auth(\n url: str,\n *,\n name: str | None = None,\n description: str | None = None,\n ) -> A2AAgent:\n \"\"\"Plain-HTTP client — for local dev.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.without_auth(url),\n name=name,\n description=description,\n )`;\n\nconst STRANDS_NOAUTH_NEW = `@staticmethod\ndef without_auth(\n url: str,\n *,\n name: str | None = None,\n description: str | None = None,\n) -> _A2AClient:\n \"\"\"Plain-HTTP client — for local dev.\"\"\"\n return _build(\n AgentCoreA2aClientConfig.without_auth(url),\n name=name,\n description=description,\n )`;\n\nconst migrateStrandsCoreClient = async (\n tree: Tree,\n filePath: string,\n nextSteps: string[],\n): Promise<void> => {\n const contents = tree.read(filePath, 'utf-8') ?? '';\n if (!contents.includes('return A2AAgent(**kwargs)')) return;\n\n const ready = await allMatch(tree, filePath, [\n pyMatch(STRANDS_IMPORT1_OLD),\n pyMatch(STRANDS_IMPORT2_OLD),\n pyMatch(STRANDS_BUILD_OLD),\n pyMatch(STRANDS_IAM_OLD),\n pyMatch(STRANDS_JWT_OLD),\n pyMatch(STRANDS_NOAUTH_OLD),\n ]);\n\n if (!ready) {\n nextSteps.push(\n `${filePath}: diverged from the generated shape - left untouched. Manually rebuild a fresh httpx.AsyncClient (and A2AAgent) per call instead of reusing the ones built at factory time (see the agent-connection generator's agentcore_a2a_client_strands.py template).`,\n );\n return;\n }\n\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_IMPORT1_OLD, STRANDS_IMPORT1_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_IMPORT2_OLD, STRANDS_IMPORT2_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_BUILD_OLD, STRANDS_BUILD_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_IAM_OLD, STRANDS_IAM_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_JWT_OLD, STRANDS_JWT_NEW),\n );\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(STRANDS_NOAUTH_OLD, STRANDS_NOAUTH_NEW),\n );\n};\n\n// --- <target>_client_strands.py (per-target wrapper, one per connection) ---\n\nconst WRAPPER_IMPORT_OLD = 'from strands.agent.a2a_agent import A2AAgent';\n\nconst WRAPPER_CREATE_OLD = 'def create() -> A2AAgent:\\n $body';\nconst WRAPPER_CREATE_NEW = 'def create():\\n $body';\n\nconst migrateStrandsWrapperClient = async (\n tree: Tree,\n filePath: string,\n nextSteps: string[],\n): Promise<void> => {\n const contents = tree.read(filePath, 'utf-8') ?? '';\n if (!contents.includes('def create() -> A2AAgent:')) return;\n\n const ready = await allMatch(tree, filePath, [\n pyMatch(WRAPPER_IMPORT_OLD),\n pyMatch(WRAPPER_CREATE_OLD),\n ]);\n\n if (!ready) {\n nextSteps.push(\n `${filePath}: diverged from the generated shape - left untouched. Manually drop the A2AAgent import and its -> A2AAgent return annotation on create() (see the py#agent#a2a-connection generator's per-target client_strands.py template).`,\n );\n return;\n }\n\n await applyGritQL(tree, filePath, `${pyMatch(WRAPPER_IMPORT_OLD)} => .`);\n await applyGritQL(\n tree,\n filePath,\n pyRewrite(WRAPPER_CREATE_OLD, WRAPPER_CREATE_NEW),\n );\n};\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n const filePaths: string[] = [];\n visitNotIgnoredFiles(tree, '', (filePath) => filePaths.push(filePath));\n\n for (const filePath of filePaths) {\n if (filePath.endsWith('/agentcore_a2a_client_langchain.py')) {\n await migrateLangchainCoreClient(tree, filePath, nextSteps);\n } else if (filePath.endsWith('/agentcore_a2a_client_strands.py')) {\n await migrateStrandsCoreClient(tree, filePath, nextSteps);\n } else if (filePath.endsWith('_client_strands.py')) {\n await migrateStrandsWrapperClient(tree, filePath, nextSteps);\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["visitNotIgnoredFiles","applyGritQL","matchGritQL","formatFilesInSubtree","pyMatch","snippet","pyRewrite","from","to","replacement","includes","allMatch","tree","filePath","patterns","pattern","LANGCHAIN_IMPORT_OLD","LANGCHAIN_IMPORT_NEW","LANGCHAIN_INVOKE_OLD","LANGCHAIN_INVOKE_NEW","migrateLangchainCoreClient","nextSteps","contents","read","ready","push","STRANDS_IMPORT1_OLD","STRANDS_IMPORT1_NEW","STRANDS_IMPORT2_OLD","STRANDS_IMPORT2_NEW","STRANDS_BUILD_OLD","STRANDS_BUILD_NEW","STRANDS_IAM_OLD","STRANDS_IAM_NEW","STRANDS_JWT_OLD","STRANDS_JWT_NEW","STRANDS_NOAUTH_OLD","STRANDS_NOAUTH_NEW","migrateStrandsCoreClient","WRAPPER_IMPORT_OLD","WRAPPER_CREATE_OLD","WRAPPER_CREATE_NEW","migrateStrandsWrapperClient","migration","filePaths","endsWith"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.0-rc.72/0001-py-agent-session-management-support/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n getProjects,\n joinPathFragments,\n type MigrationReturnObject,\n type ProjectConfiguration,\n type Tree,\n visitNotIgnoredFiles,\n} from '@nx/devkit';\nimport { PY_AGENT_GENERATOR_INFO } from '../../../py/agent/generator';\nimport { addPyDependencies } from '../../../utils/add-dependencies';\nimport {\n addPythonReExport,\n getPythonAgentConnectionModuleName,\n getPythonAgentConnectionProjectDir,\n} from '../../../utils/agent-connection/agent-connection';\nimport {\n applyGritQL,\n captureGritQLVariable,\n matchGritQL,\n} from '../../../utils/ast';\nimport { declareDependencies } from '../../../utils/declared-dependencies';\nimport { formatFilesInSubtree } from '../../../utils/format';\nimport { kebabCase } from '../../../utils/names';\nimport type { ComponentMetadata } from '../../../utils/nx';\nimport {\n getRelativePathToRootByDirectory,\n toProjectRelativePath,\n} from '../../../utils/paths';\n\n/**\n * Add session management support to py#agent.\n *\n * How to write a migration:\n * - https://nx.dev/docs/kb/migration-generators\n * - What `nextSteps` means: https://nx.dev/docs/reference/devkit/MigrationReturnObject\n *\n * Guardrails:\n * - Pattern-match before writing: skip files that have diverged from the shape\n * your generators produce and report them via `nextSteps`, rather than\n * clobbering the user's changes.\n * - Idempotent: re-running must be a no-op.\n * - Format what you write: finish with `formatFilesInSubtree` so the files\n * this migration wrote are formatted correctly.\n */\n\n// Captures the agent-connection module a file imports `log_model_errors` (or\n// `session_id_context`) from, and gates every rewrite below on the import\n// actually being present. Generic over `$names` since a connection generator\n// may have merged its own import into the same line.\nconst LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN =\n 'language python\\n`from $mod import $names` where { $names <: contains `log_model_errors` }';\nconst SESSION_ID_CONTEXT_IMPORT_CAPTURE_PATTERN =\n 'language python\\n`from $mod import $names` where { $names <: contains `session_id_context` }';\n\nconst DEPENDENCIES = declareDependencies()({\n py: [{ name: 'langgraph-checkpoint-sqlite' }, { name: 'aiosqlite' }],\n ts: [],\n});\n\nconst LANGCHAIN_AGENT_MATCH_PATTERN =\n 'language python\\n`create_agent($args)` where { $args <: contains `system_prompt=$_`, $args <: contains `checkpointer=InMemorySaver()` }';\nconst LANGCHAIN_CHECKPOINTER_PATTERN =\n 'language python\\n`checkpointer=InMemorySaver()` => `checkpointer=get_checkpointer()`';\nconst LANGCHAIN_IN_MEMORY_IMPORT_PATTERN =\n 'language python\\n`from langgraph.checkpoint.memory import InMemorySaver` => .';\nconst langChainSessionImportPattern =\n 'language python\\n`from langchain.agents import create_agent` => raw`from langchain.agents import create_agent\\n\\nfrom .session import get_checkpointer`';\n\n// Every strands agent.py already hooks log_model_errors regardless of\n// protocol (hooks, unlike session_manager, carry over per-thread for AG-UI\n// without special wiring — see StrandsAgent's kwargs-forwarding), so\n// log_tool_errors is retrofitted the same way for every protocol.\nconst LOG_TOOL_ERRORS_HOOKS_PATTERN =\n 'language python\\n`hooks=[$hooks]` where { $hooks <: contains `log_model_errors`, $hooks <: not contains `log_tool_errors` }';\nconst logToolErrorsImportPattern = (mod: string) =>\n `language python\\n\\`from contextlib import contextmanager\\` => raw\\`from contextlib import contextmanager\\nfrom ${mod} import log_tool_errors\\``;\nconst LOG_TOOL_ERRORS_WRITE_PATTERN =\n 'language python\\n`hooks=[log_model_errors]` => `hooks=[log_model_errors, log_tool_errors]`';\n\n// Existing agent-connection projects predate tool_errors_strands.py. This has\n// no EJS templating, so it's read verbatim from the generator's own template\n// rather than kept as a second, hand-copied source of truth.\nconst TOOL_ERRORS_STRANDS_PY_CONTENT = readFileSync(\n join(\n import.meta.dirname,\n '../../../utils/agent-connection/files/py-core-strands/base/tool_errors_strands.py.template',\n ),\n 'utf-8',\n);\n\n/**\n * Ensures the shared Python agent-connection project has tool_errors_strands.py\n * and re-exports log_tool_errors, backfilling projects generated before this\n * helper existed. Returns false (and leaves the tree untouched) if the\n * agent-connection project itself can't be found.\n */\nasync function ensureToolErrorsBase(tree: Tree): Promise<boolean> {\n const projectDir = getPythonAgentConnectionProjectDir(tree);\n if (!tree.exists(joinPathFragments(projectDir, 'project.json'))) {\n return false;\n }\n const moduleDir = joinPathFragments(\n projectDir,\n getPythonAgentConnectionModuleName(tree),\n );\n const toolErrorsPath = joinPathFragments(\n moduleDir,\n 'core',\n 'tool_errors_strands.py',\n );\n if (!tree.exists(toolErrorsPath)) {\n tree.write(toolErrorsPath, TOOL_ERRORS_STRANDS_PY_CONTENT);\n }\n await addPythonReExport(\n tree,\n joinPathFragments(moduleDir, '__init__.py'),\n '.core.tool_errors_strands',\n 'log_tool_errors',\n );\n return true;\n}\n\n// HTTP/A2A agents build one Agent per session (via with_session_id), so\n// wiring `session_manager` directly into the constructor is safe. Anchored\n// on a `tools=` keyword argument so this only matches an inline kwargs call\n// (as the generator produces), not e.g. `Agent(**agent_kwargs)`.\nconst AGENT_PY_CONSTRUCTOR_MATCH_PATTERN =\n 'language python\\n`Agent($args)` where { $args <: contains `tools=$_` }';\nconst AGENT_PY_SESSION_MANAGER_PATTERN =\n 'language python\\n`yield Agent($args)` => `yield Agent(session_manager=get_session_manager(), $args)` where { $args <: not contains `session_manager=$_` }';\nconst AGENT_PY_SESSION_IMPORT_PATTERN =\n 'language python\\n`from contextlib import contextmanager` => raw`from contextlib import contextmanager\\n\\nfrom .session import get_session_manager`';\n\n// AG-UI's StrandsAgent adapter needs a session_manager_provider (called once\n// per thread_id) rather than a plain session_manager.\nconst AGUI_MAIN_IMPORT_PATTERN =\n 'language python\\n`from ag_ui_strands import $names` => `from ag_ui_strands import StrandsAgentConfig, $names` where { $names <: contains `StrandsAgent`, $names <: not contains `StrandsAgentConfig` }';\nconst AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN =\n 'language python\\n`StrandsAgent($args)` where { $args <: contains `agent=$_` }';\nconst AGUI_MAIN_CONSTRUCTOR_PATTERN = `${AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN} => \\`StrandsAgent(config=StrandsAgentConfig(session_manager_provider=lambda _input_data: get_session_manager()), $args)\\` where { $args <: not contains \\`config=\\` }`;\nconst AGUI_MAIN_SESSION_IMPORT_PATTERN =\n 'language python\\n`from .agent import get_agent` => raw`from .agent import get_agent\\nfrom .session import get_session_manager` where { $program <: not contains `from .session import get_session_manager` }';\n\n// Existing agents predate session.py, so there's no prior storage to\n// preserve — default to in-memory, mirroring the ts#agent migration.\nconst legacySessionManagerContent = (\n agentConnectionModule: string,\n localSessionsDir: string,\n): string =>\n `import os\n\nfrom strands.session import FileSessionManager, SessionManager\n\nfrom ${agentConnectionModule} import get_current_session_id\n\n\ndef get_session_manager() -> SessionManager | None:\n \"\"\"Returns a SessionManager for persisting conversation state across\n invocations. Local development always uses local file storage for\n convenience, regardless of the configured session option. Without a\n configured session option, conversation state is kept in memory only and\n does not survive process restarts.\n \"\"\"\n session_id = get_current_session_id()\n if not session_id:\n raise RuntimeError(\n \"No current session id — cannot resolve a SessionManager outside of a request scope.\"\n )\n if os.environ.get(\"LOCAL_DEV\") == \"true\":\n return FileSessionManager(session_id=session_id, storage_dir=\"${localSessionsDir}\")\n return None\n`;\n\nconst legacyLangChainSessionContent = (localSessionsDir: string): string =>\n `import os\n\nimport aiosqlite\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.checkpoint.memory import InMemorySaver\nfrom langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver\n\n\ndef get_checkpointer() -> BaseCheckpointSaver:\n \"\"\"Returns the checkpointer used to persist conversation state.\"\"\"\n if os.environ.get(\"LOCAL_DEV\") == \"true\":\n os.makedirs(\"${localSessionsDir}\", exist_ok=True)\n conn = aiosqlite.connect(os.path.join(\"${localSessionsDir}\", \"checkpoints.sqlite\"))\n return AsyncSqliteSaver(conn)\n return InMemorySaver()\n`;\n\n/** The Nx project owning `dirPath`, if any (the longest-matching project.root). */\nconst findOwningProject = (\n tree: Tree,\n dirPath: string,\n): ProjectConfiguration | undefined => {\n let best: ProjectConfiguration | undefined;\n for (const project of getProjects(tree).values()) {\n if (\n (dirPath === project.root || dirPath.startsWith(`${project.root}/`)) &&\n (!best || project.root.length > best.root.length)\n ) {\n best = project;\n }\n }\n return best;\n};\n\n/** This agent's metadata, accepting both current and legacy component paths. */\nconst findAgentComponentMetadata = (\n project: ProjectConfiguration,\n dirRelativeToProjectRoot: string,\n): ComponentMetadata | undefined =>\n (project.metadata as { components?: ComponentMetadata[] })?.components?.find(\n (component) =>\n component.generator === PY_AGENT_GENERATOR_INFO.id &&\n (component.path === dirRelativeToProjectRoot ||\n component.path === `${dirRelativeToProjectRoot}/agent.py`),\n );\n\n/**\n * This agent's real kebab-case name — the generator's own target-prefix\n * (ComponentMetadata's `name` field), used directly rather than\n * reconstructing it by kebab-casing the class name (`rc`). That round trip\n * loses word boundaries for names with single-letter segments, e.g.\n * `kebabCase(\"OldSHttp\")` => \"old-shttp\", not the real \"old-s-http\".\n *\n * When no `--name` was given at generation time, the generator falls back\n * to `${project}-agent` for the real name, but records a literal 'agent' as\n * the target-prefix — indistinguishable from an agent explicitly named\n * \"agent\" — so re-derive the fallback from the project name in that case,\n * exactly as the generator itself does.\n */\nconst agentTmpNameFor = (\n project: ProjectConfiguration,\n dir: string,\n): string | undefined => {\n const dirRelativeToProjectRoot = toProjectRelativePath(project, dir);\n const targetPrefix = findAgentComponentMetadata(\n project,\n dirRelativeToProjectRoot,\n )?.name;\n if (!targetPrefix) return undefined;\n if (targetPrefix !== 'agent') return targetPrefix;\n return kebabCase(`${project.name.split('.').pop() ?? project.name}-agent`);\n};\n\n/** This agent's protocol + framework, from its ComponentMetadata entry. */\nconst agentComponentFor = (\n project: ProjectConfiguration,\n dir: string,\n): ComponentMetadata | undefined => {\n const dirRelativeToProjectRoot = toProjectRelativePath(project, dir);\n return findAgentComponentMetadata(project, dirRelativeToProjectRoot);\n};\n\n/** The relative path from `projectRoot` up to this agent's workspace-root-level local session storage. */\nconst localSessionsDirFor = (\n projectRoot: string,\n agentTmpName: string,\n framework: 'strands' | 'langchain' = 'strands',\n): string =>\n joinPathFragments(\n getRelativePathToRootByDirectory(projectRoot),\n `tmp/agents/${framework}/${agentTmpName}`,\n );\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n const filePaths: string[] = [];\n visitNotIgnoredFiles(tree, '', (filePath) => filePaths.push(filePath));\n\n for (const filePath of filePaths) {\n if (filePath.endsWith('/agent.py')) {\n // log_tool_errors applies to every protocol (unlike session_manager),\n // so retrofit it independently of whether the owning project can be\n // resolved below. LOG_TOOL_ERRORS_HOOKS_PATTERN's own `where` clause\n // (contains log_model_errors, not already containing log_tool_errors)\n // doubles as the \"still needs retrofitting\" check.\n if (await matchGritQL(tree, filePath, LOG_TOOL_ERRORS_HOOKS_PATTERN)) {\n const mod = await captureGritQLVariable(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n 'mod',\n );\n if ((await ensureToolErrorsBase(tree)) && mod) {\n await applyGritQL(tree, filePath, logToolErrorsImportPattern(mod));\n await applyGritQL(tree, filePath, LOG_TOOL_ERRORS_WRITE_PATTERN);\n } else {\n nextSteps.push(\n `${filePath}: could not find the shared agent-connection project — manually add \\`log_tool_errors\\` to the hooks list (see the py#agent generator's template).`,\n );\n }\n }\n\n const dir = filePath.split('/').slice(0, -1).join('/');\n const project = findOwningProject(tree, dir);\n\n // Without a registered project there's no ComponentMetadata, so this\n // agent's protocol/framework/agent-connection module can't be\n // resolved — and a pre-migration AG-UI agent.py is textually identical\n // to an HTTP/A2A one, so there's nothing left to safely guess from.\n if (!project) {\n if (\n await matchGritQL(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n )\n ) {\n nextSteps.push(\n `${filePath}: could not determine the project root — manually verify whether this is an AG-UI or HTTP/A2A Strands agent and wire session_manager in accordingly (see the py#agent generator's template).`,\n );\n }\n continue;\n }\n\n const component = agentComponentFor(project, dir);\n\n if (component?.framework === 'langchain') {\n const content = tree.read(filePath, 'utf-8') ?? '';\n if (content.includes('checkpointer=get_checkpointer()')) {\n continue;\n }\n if (\n !(await matchGritQL(tree, filePath, LANGCHAIN_AGENT_MATCH_PATTERN))\n ) {\n nextSteps.push(\n `${filePath}: the create_agent call has diverged from the generated shape — manually create ${dir}/session.py and pass \\`checkpointer=get_checkpointer()\\` to \\`create_agent\\` (see the py#agent generator's template).`,\n );\n continue;\n }\n\n const agentName = agentTmpNameFor(project, dir);\n const sessionPath = `${dir}/session.py`;\n if (!agentName) {\n nextSteps.push(\n `${filePath}: could not determine this agent's name from its ComponentMetadata — manually create ${sessionPath} and pass \\`checkpointer=get_checkpointer()\\` to \\`create_agent\\` (see the py#agent generator's template).`,\n );\n continue;\n }\n\n if (!tree.exists(sessionPath)) {\n tree.write(\n sessionPath,\n legacyLangChainSessionContent(\n localSessionsDirFor(project.root, agentName, 'langchain'),\n ),\n );\n }\n addPyDependencies(tree, DEPENDENCIES, { projectRoot: project.root });\n await applyGritQL(tree, filePath, langChainSessionImportPattern);\n await applyGritQL(tree, filePath, LANGCHAIN_IN_MEMORY_IMPORT_PATTERN);\n await applyGritQL(tree, filePath, LANGCHAIN_CHECKPOINTER_PATTERN);\n const migratedContent = tree.read(filePath, 'utf-8') ?? '';\n if (\n !migratedContent.includes('from .session import get_checkpointer') ||\n !migratedContent.includes('checkpointer=get_checkpointer()')\n ) {\n nextSteps.push(\n `${filePath}: session.py was created but the checkpointer could not be wired automatically — import \\`get_checkpointer\\` from it and pass \\`checkpointer=get_checkpointer()\\` to \\`create_agent\\`.`,\n );\n }\n continue;\n }\n\n // AG-UI wires session_manager_provider on the StrandsAgent adapter in\n // main.py instead — handled by the branch below.\n if (component?.protocol === 'ag-ui') {\n continue;\n }\n\n if (!component?.protocol) {\n if (\n await matchGritQL(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n )\n ) {\n nextSteps.push(\n `${filePath}: could not determine this agent's protocol/framework from its ComponentMetadata — manually verify whether it's AG-UI or HTTP/A2A Strands and wire session_manager in accordingly (see the py#agent generator's template).`,\n );\n }\n continue;\n }\n\n // HTTP/A2A: wire session_manager into the Agent constructor and create\n // the sibling session.py if it doesn't exist yet.\n if (\n !(await matchGritQL(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n ))\n ) {\n continue;\n }\n\n const sessionPath = `${dir}/session.py`;\n\n if (\n !(await matchGritQL(tree, filePath, AGENT_PY_CONSTRUCTOR_MATCH_PATTERN))\n ) {\n nextSteps.push(\n `${filePath}: the Agent is not constructed with an inline \\`Agent(...)\\` call, so session_manager could not be wired in automatically. Manually add \\`session_manager=get_session_manager()\\` to its constructor (see the py#agent generator's template), creating ${sessionPath} first if it doesn't already exist.`,\n );\n continue;\n }\n\n if (!tree.exists(sessionPath)) {\n const mod = await captureGritQLVariable(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n 'mod',\n );\n const agentName = agentTmpNameFor(project, dir);\n\n if (mod && agentName) {\n tree.write(\n sessionPath,\n legacySessionManagerContent(\n mod,\n localSessionsDirFor(project.root, agentName),\n ),\n );\n } else {\n nextSteps.push(\n `${filePath}: could not determine the agent-connection module or this agent's name from its ComponentMetadata — manually create ${sessionPath} (see the py#agent generator's template) and wire \\`session_manager=get_session_manager()\\` into the Agent constructor.`,\n );\n continue;\n }\n }\n\n const agentContent = tree.read(filePath, 'utf-8') ?? '';\n if (!agentContent.includes('from .session import get_session_manager')) {\n await applyGritQL(tree, filePath, AGENT_PY_SESSION_IMPORT_PATTERN);\n await applyGritQL(tree, filePath, AGENT_PY_SESSION_MANAGER_PATTERN);\n }\n\n if (\n !(tree.read(filePath, 'utf-8') ?? '').includes('get_session_manager')\n ) {\n nextSteps.push(\n `${filePath}: found ${sessionPath} but couldn't confirm the get_session_manager import — wire \\`session_manager=get_session_manager()\\` into the Agent constructor manually.`,\n );\n continue;\n }\n\n continue;\n }\n\n if (\n filePath.endsWith('/main.py') &&\n (tree.read(filePath, 'utf-8') ?? '').includes('ag_ui_strands')\n ) {\n const alreadyWired = (tree.read(filePath, 'utf-8') ?? '').includes(\n 'StrandsAgentConfig',\n );\n\n if (!alreadyWired) {\n const needsWiring = await matchGritQL(\n tree,\n filePath,\n AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN,\n );\n if (!needsWiring) {\n nextSteps.push(\n `${filePath}: the StrandsAgent constructor has diverged from the generated shape - left as-is. Manually add \\`config=StrandsAgentConfig(session_manager_provider=lambda _input_data: get_session_manager())\\` to it (see the py#agent generator's template).`,\n );\n continue;\n }\n\n await applyGritQL(tree, filePath, AGUI_MAIN_IMPORT_PATTERN);\n await applyGritQL(tree, filePath, AGUI_MAIN_CONSTRUCTOR_PATTERN);\n }\n\n const dir = filePath.split('/').slice(0, -1).join('/');\n const sessionPath = `${dir}/session.py`;\n\n if (!tree.exists(sessionPath)) {\n const project = findOwningProject(tree, dir);\n const mod = await captureGritQLVariable(\n tree,\n filePath,\n SESSION_ID_CONTEXT_IMPORT_CAPTURE_PATTERN,\n 'mod',\n );\n const agentName = project && agentTmpNameFor(project, dir);\n\n if (project && mod && agentName) {\n tree.write(\n sessionPath,\n legacySessionManagerContent(\n mod,\n localSessionsDirFor(project.root, agentName),\n ),\n );\n } else {\n nextSteps.push(\n `${filePath}: could not determine the project root, agent-connection module, or this agent's name from its ComponentMetadata — manually create ${sessionPath} (see the py#agent generator's template) and wire \\`config=StrandsAgentConfig(session_manager_provider=lambda _input_data: get_session_manager())\\` into the StrandsAgent constructor.`,\n );\n continue;\n }\n }\n\n await applyGritQL(tree, filePath, AGUI_MAIN_SESSION_IMPORT_PATTERN);\n\n if (\n !(tree.read(filePath, 'utf-8') ?? '').includes('get_session_manager')\n ) {\n nextSteps.push(\n `${filePath}: found ${sessionPath} but couldn't confirm the get_session_manager import — wire it into the StrandsAgent constructor manually.`,\n );\n }\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["readFileSync","join","getProjects","joinPathFragments","visitNotIgnoredFiles","PY_AGENT_GENERATOR_INFO","addPyDependencies","addPythonReExport","getPythonAgentConnectionModuleName","getPythonAgentConnectionProjectDir","applyGritQL","captureGritQLVariable","matchGritQL","declareDependencies","formatFilesInSubtree","kebabCase","getRelativePathToRootByDirectory","toProjectRelativePath","LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN","SESSION_ID_CONTEXT_IMPORT_CAPTURE_PATTERN","DEPENDENCIES","py","name","ts","LANGCHAIN_AGENT_MATCH_PATTERN","LANGCHAIN_CHECKPOINTER_PATTERN","LANGCHAIN_IN_MEMORY_IMPORT_PATTERN","langChainSessionImportPattern","LOG_TOOL_ERRORS_HOOKS_PATTERN","logToolErrorsImportPattern","mod","LOG_TOOL_ERRORS_WRITE_PATTERN","TOOL_ERRORS_STRANDS_PY_CONTENT","dirname","ensureToolErrorsBase","tree","projectDir","exists","moduleDir","toolErrorsPath","write","AGENT_PY_CONSTRUCTOR_MATCH_PATTERN","AGENT_PY_SESSION_MANAGER_PATTERN","AGENT_PY_SESSION_IMPORT_PATTERN","AGUI_MAIN_IMPORT_PATTERN","AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN","AGUI_MAIN_CONSTRUCTOR_PATTERN","AGUI_MAIN_SESSION_IMPORT_PATTERN","legacySessionManagerContent","agentConnectionModule","localSessionsDir","legacyLangChainSessionContent","findOwningProject","dirPath","best","project","values","root","startsWith","length","findAgentComponentMetadata","dirRelativeToProjectRoot","metadata","components","find","component","generator","id","path","agentTmpNameFor","dir","targetPrefix","undefined","split","pop","agentComponentFor","localSessionsDirFor","projectRoot","agentTmpName","framework","migration","nextSteps","filePaths","filePath","push","endsWith","slice","content","read","includes","agentName","sessionPath","migratedContent","protocol","agentContent","alreadyWired","needsWiring"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/migrations/v1.0.0-rc.72/0001-py-agent-session-management-support/migration.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport {\n getProjects,\n joinPathFragments,\n type MigrationReturnObject,\n type ProjectConfiguration,\n type Tree,\n visitNotIgnoredFiles,\n} from '@nx/devkit';\nimport { PY_AGENT_GENERATOR_INFO } from '../../../py/agent/generator.js';\nimport { addPyDependencies } from '../../../utils/add-dependencies.js';\nimport {\n addPythonReExport,\n getPythonAgentConnectionModuleName,\n getPythonAgentConnectionProjectDir,\n} from '../../../utils/agent-connection/agent-connection.js';\nimport {\n applyGritQL,\n captureGritQLVariable,\n matchGritQL,\n} from '../../../utils/ast.js';\nimport { declareDependencies } from '../../../utils/declared-dependencies.js';\nimport { formatFilesInSubtree } from '../../../utils/format.js';\nimport { kebabCase } from '../../../utils/names.js';\nimport type { ComponentMetadata } from '../../../utils/nx.js';\nimport {\n getRelativePathToRootByDirectory,\n toProjectRelativePath,\n} from '../../../utils/paths.js';\n\n/**\n * Add session management support to py#agent.\n *\n * How to write a migration:\n * - https://nx.dev/docs/kb/migration-generators\n * - What `nextSteps` means: https://nx.dev/docs/reference/devkit/MigrationReturnObject\n *\n * Guardrails:\n * - Pattern-match before writing: skip files that have diverged from the shape\n * your generators produce and report them via `nextSteps`, rather than\n * clobbering the user's changes.\n * - Idempotent: re-running must be a no-op.\n * - Format what you write: finish with `formatFilesInSubtree` so the files\n * this migration wrote are formatted correctly.\n */\n\n// Captures the agent-connection module a file imports `log_model_errors` (or\n// `session_id_context`) from, and gates every rewrite below on the import\n// actually being present. Generic over `$names` since a connection generator\n// may have merged its own import into the same line.\nconst LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN =\n 'language python\\n`from $mod import $names` where { $names <: contains `log_model_errors` }';\nconst SESSION_ID_CONTEXT_IMPORT_CAPTURE_PATTERN =\n 'language python\\n`from $mod import $names` where { $names <: contains `session_id_context` }';\n\nconst DEPENDENCIES = declareDependencies()({\n py: [{ name: 'langgraph-checkpoint-sqlite' }, { name: 'aiosqlite' }],\n ts: [],\n});\n\nconst LANGCHAIN_AGENT_MATCH_PATTERN =\n 'language python\\n`create_agent($args)` where { $args <: contains `system_prompt=$_`, $args <: contains `checkpointer=InMemorySaver()` }';\nconst LANGCHAIN_CHECKPOINTER_PATTERN =\n 'language python\\n`checkpointer=InMemorySaver()` => `checkpointer=get_checkpointer()`';\nconst LANGCHAIN_IN_MEMORY_IMPORT_PATTERN =\n 'language python\\n`from langgraph.checkpoint.memory import InMemorySaver` => .';\nconst langChainSessionImportPattern =\n 'language python\\n`from langchain.agents import create_agent` => raw`from langchain.agents import create_agent\\n\\nfrom .session import get_checkpointer`';\n\n// Every strands agent.py already hooks log_model_errors regardless of\n// protocol (hooks, unlike session_manager, carry over per-thread for AG-UI\n// without special wiring — see StrandsAgent's kwargs-forwarding), so\n// log_tool_errors is retrofitted the same way for every protocol.\nconst LOG_TOOL_ERRORS_HOOKS_PATTERN =\n 'language python\\n`hooks=[$hooks]` where { $hooks <: contains `log_model_errors`, $hooks <: not contains `log_tool_errors` }';\nconst logToolErrorsImportPattern = (mod: string) =>\n `language python\\n\\`from contextlib import contextmanager\\` => raw\\`from contextlib import contextmanager\\nfrom ${mod} import log_tool_errors\\``;\nconst LOG_TOOL_ERRORS_WRITE_PATTERN =\n 'language python\\n`hooks=[log_model_errors]` => `hooks=[log_model_errors, log_tool_errors]`';\n\n// Existing agent-connection projects predate tool_errors_strands.py. This has\n// no EJS templating, so it's read verbatim from the generator's own template\n// rather than kept as a second, hand-copied source of truth.\nconst TOOL_ERRORS_STRANDS_PY_CONTENT = readFileSync(\n join(\n import.meta.dirname,\n '../../../utils/agent-connection/files/py-core-strands/base/tool_errors_strands.py.template',\n ),\n 'utf-8',\n);\n\n/**\n * Ensures the shared Python agent-connection project has tool_errors_strands.py\n * and re-exports log_tool_errors, backfilling projects generated before this\n * helper existed. Returns false (and leaves the tree untouched) if the\n * agent-connection project itself can't be found.\n */\nasync function ensureToolErrorsBase(tree: Tree): Promise<boolean> {\n const projectDir = getPythonAgentConnectionProjectDir(tree);\n if (!tree.exists(joinPathFragments(projectDir, 'project.json'))) {\n return false;\n }\n const moduleDir = joinPathFragments(\n projectDir,\n getPythonAgentConnectionModuleName(tree),\n );\n const toolErrorsPath = joinPathFragments(\n moduleDir,\n 'core',\n 'tool_errors_strands.py',\n );\n if (!tree.exists(toolErrorsPath)) {\n tree.write(toolErrorsPath, TOOL_ERRORS_STRANDS_PY_CONTENT);\n }\n await addPythonReExport(\n tree,\n joinPathFragments(moduleDir, '__init__.py'),\n '.core.tool_errors_strands',\n 'log_tool_errors',\n );\n return true;\n}\n\n// HTTP/A2A agents build one Agent per session (via with_session_id), so\n// wiring `session_manager` directly into the constructor is safe. Anchored\n// on a `tools=` keyword argument so this only matches an inline kwargs call\n// (as the generator produces), not e.g. `Agent(**agent_kwargs)`.\nconst AGENT_PY_CONSTRUCTOR_MATCH_PATTERN =\n 'language python\\n`Agent($args)` where { $args <: contains `tools=$_` }';\nconst AGENT_PY_SESSION_MANAGER_PATTERN =\n 'language python\\n`yield Agent($args)` => `yield Agent(session_manager=get_session_manager(), $args)` where { $args <: not contains `session_manager=$_` }';\nconst AGENT_PY_SESSION_IMPORT_PATTERN =\n 'language python\\n`from contextlib import contextmanager` => raw`from contextlib import contextmanager\\n\\nfrom .session import get_session_manager`';\n\n// AG-UI's StrandsAgent adapter needs a session_manager_provider (called once\n// per thread_id) rather than a plain session_manager.\nconst AGUI_MAIN_IMPORT_PATTERN =\n 'language python\\n`from ag_ui_strands import $names` => `from ag_ui_strands import StrandsAgentConfig, $names` where { $names <: contains `StrandsAgent`, $names <: not contains `StrandsAgentConfig` }';\nconst AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN =\n 'language python\\n`StrandsAgent($args)` where { $args <: contains `agent=$_` }';\nconst AGUI_MAIN_CONSTRUCTOR_PATTERN = `${AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN} => \\`StrandsAgent(config=StrandsAgentConfig(session_manager_provider=lambda _input_data: get_session_manager()), $args)\\` where { $args <: not contains \\`config=\\` }`;\nconst AGUI_MAIN_SESSION_IMPORT_PATTERN =\n 'language python\\n`from .agent import get_agent` => raw`from .agent import get_agent\\nfrom .session import get_session_manager` where { $program <: not contains `from .session import get_session_manager` }';\n\n// Existing agents predate session.py, so there's no prior storage to\n// preserve — default to in-memory, mirroring the ts#agent migration.\nconst legacySessionManagerContent = (\n agentConnectionModule: string,\n localSessionsDir: string,\n): string =>\n `import os\n\nfrom strands.session import FileSessionManager, SessionManager\n\nfrom ${agentConnectionModule} import get_current_session_id\n\n\ndef get_session_manager() -> SessionManager | None:\n \"\"\"Returns a SessionManager for persisting conversation state across\n invocations. Local development always uses local file storage for\n convenience, regardless of the configured session option. Without a\n configured session option, conversation state is kept in memory only and\n does not survive process restarts.\n \"\"\"\n session_id = get_current_session_id()\n if not session_id:\n raise RuntimeError(\n \"No current session id — cannot resolve a SessionManager outside of a request scope.\"\n )\n if os.environ.get(\"LOCAL_DEV\") == \"true\":\n return FileSessionManager(session_id=session_id, storage_dir=\"${localSessionsDir}\")\n return None\n`;\n\nconst legacyLangChainSessionContent = (localSessionsDir: string): string =>\n `import os\n\nimport aiosqlite\nfrom langgraph.checkpoint.base import BaseCheckpointSaver\nfrom langgraph.checkpoint.memory import InMemorySaver\nfrom langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver\n\n\ndef get_checkpointer() -> BaseCheckpointSaver:\n \"\"\"Returns the checkpointer used to persist conversation state.\"\"\"\n if os.environ.get(\"LOCAL_DEV\") == \"true\":\n os.makedirs(\"${localSessionsDir}\", exist_ok=True)\n conn = aiosqlite.connect(os.path.join(\"${localSessionsDir}\", \"checkpoints.sqlite\"))\n return AsyncSqliteSaver(conn)\n return InMemorySaver()\n`;\n\n/** The Nx project owning `dirPath`, if any (the longest-matching project.root). */\nconst findOwningProject = (\n tree: Tree,\n dirPath: string,\n): ProjectConfiguration | undefined => {\n let best: ProjectConfiguration | undefined;\n for (const project of getProjects(tree).values()) {\n if (\n (dirPath === project.root || dirPath.startsWith(`${project.root}/`)) &&\n (!best || project.root.length > best.root.length)\n ) {\n best = project;\n }\n }\n return best;\n};\n\n/** This agent's metadata, accepting both current and legacy component paths. */\nconst findAgentComponentMetadata = (\n project: ProjectConfiguration,\n dirRelativeToProjectRoot: string,\n): ComponentMetadata | undefined =>\n (project.metadata as { components?: ComponentMetadata[] })?.components?.find(\n (component) =>\n component.generator === PY_AGENT_GENERATOR_INFO.id &&\n (component.path === dirRelativeToProjectRoot ||\n component.path === `${dirRelativeToProjectRoot}/agent.py`),\n );\n\n/**\n * This agent's real kebab-case name — the generator's own target-prefix\n * (ComponentMetadata's `name` field), used directly rather than\n * reconstructing it by kebab-casing the class name (`rc`). That round trip\n * loses word boundaries for names with single-letter segments, e.g.\n * `kebabCase(\"OldSHttp\")` => \"old-shttp\", not the real \"old-s-http\".\n *\n * When no `--name` was given at generation time, the generator falls back\n * to `${project}-agent` for the real name, but records a literal 'agent' as\n * the target-prefix — indistinguishable from an agent explicitly named\n * \"agent\" — so re-derive the fallback from the project name in that case,\n * exactly as the generator itself does.\n */\nconst agentTmpNameFor = (\n project: ProjectConfiguration,\n dir: string,\n): string | undefined => {\n const dirRelativeToProjectRoot = toProjectRelativePath(project, dir);\n const targetPrefix = findAgentComponentMetadata(\n project,\n dirRelativeToProjectRoot,\n )?.name;\n if (!targetPrefix) return undefined;\n if (targetPrefix !== 'agent') return targetPrefix;\n return kebabCase(`${project.name.split('.').pop() ?? project.name}-agent`);\n};\n\n/** This agent's protocol + framework, from its ComponentMetadata entry. */\nconst agentComponentFor = (\n project: ProjectConfiguration,\n dir: string,\n): ComponentMetadata | undefined => {\n const dirRelativeToProjectRoot = toProjectRelativePath(project, dir);\n return findAgentComponentMetadata(project, dirRelativeToProjectRoot);\n};\n\n/** The relative path from `projectRoot` up to this agent's workspace-root-level local session storage. */\nconst localSessionsDirFor = (\n projectRoot: string,\n agentTmpName: string,\n framework: 'strands' | 'langchain' = 'strands',\n): string =>\n joinPathFragments(\n getRelativePathToRootByDirectory(projectRoot),\n `tmp/agents/${framework}/${agentTmpName}`,\n );\n\nexport default async function migration(\n tree: Tree,\n): Promise<MigrationReturnObject> {\n const nextSteps: string[] = [];\n\n const filePaths: string[] = [];\n visitNotIgnoredFiles(tree, '', (filePath) => filePaths.push(filePath));\n\n for (const filePath of filePaths) {\n if (filePath.endsWith('/agent.py')) {\n // log_tool_errors applies to every protocol (unlike session_manager),\n // so retrofit it independently of whether the owning project can be\n // resolved below. LOG_TOOL_ERRORS_HOOKS_PATTERN's own `where` clause\n // (contains log_model_errors, not already containing log_tool_errors)\n // doubles as the \"still needs retrofitting\" check.\n if (await matchGritQL(tree, filePath, LOG_TOOL_ERRORS_HOOKS_PATTERN)) {\n const mod = await captureGritQLVariable(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n 'mod',\n );\n if ((await ensureToolErrorsBase(tree)) && mod) {\n await applyGritQL(tree, filePath, logToolErrorsImportPattern(mod));\n await applyGritQL(tree, filePath, LOG_TOOL_ERRORS_WRITE_PATTERN);\n } else {\n nextSteps.push(\n `${filePath}: could not find the shared agent-connection project — manually add \\`log_tool_errors\\` to the hooks list (see the py#agent generator's template).`,\n );\n }\n }\n\n const dir = filePath.split('/').slice(0, -1).join('/');\n const project = findOwningProject(tree, dir);\n\n // Without a registered project there's no ComponentMetadata, so this\n // agent's protocol/framework/agent-connection module can't be\n // resolved — and a pre-migration AG-UI agent.py is textually identical\n // to an HTTP/A2A one, so there's nothing left to safely guess from.\n if (!project) {\n if (\n await matchGritQL(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n )\n ) {\n nextSteps.push(\n `${filePath}: could not determine the project root — manually verify whether this is an AG-UI or HTTP/A2A Strands agent and wire session_manager in accordingly (see the py#agent generator's template).`,\n );\n }\n continue;\n }\n\n const component = agentComponentFor(project, dir);\n\n if (component?.framework === 'langchain') {\n const content = tree.read(filePath, 'utf-8') ?? '';\n if (content.includes('checkpointer=get_checkpointer()')) {\n continue;\n }\n if (\n !(await matchGritQL(tree, filePath, LANGCHAIN_AGENT_MATCH_PATTERN))\n ) {\n nextSteps.push(\n `${filePath}: the create_agent call has diverged from the generated shape — manually create ${dir}/session.py and pass \\`checkpointer=get_checkpointer()\\` to \\`create_agent\\` (see the py#agent generator's template).`,\n );\n continue;\n }\n\n const agentName = agentTmpNameFor(project, dir);\n const sessionPath = `${dir}/session.py`;\n if (!agentName) {\n nextSteps.push(\n `${filePath}: could not determine this agent's name from its ComponentMetadata — manually create ${sessionPath} and pass \\`checkpointer=get_checkpointer()\\` to \\`create_agent\\` (see the py#agent generator's template).`,\n );\n continue;\n }\n\n if (!tree.exists(sessionPath)) {\n tree.write(\n sessionPath,\n legacyLangChainSessionContent(\n localSessionsDirFor(project.root, agentName, 'langchain'),\n ),\n );\n }\n addPyDependencies(tree, DEPENDENCIES, { projectRoot: project.root });\n await applyGritQL(tree, filePath, langChainSessionImportPattern);\n await applyGritQL(tree, filePath, LANGCHAIN_IN_MEMORY_IMPORT_PATTERN);\n await applyGritQL(tree, filePath, LANGCHAIN_CHECKPOINTER_PATTERN);\n const migratedContent = tree.read(filePath, 'utf-8') ?? '';\n if (\n !migratedContent.includes('from .session import get_checkpointer') ||\n !migratedContent.includes('checkpointer=get_checkpointer()')\n ) {\n nextSteps.push(\n `${filePath}: session.py was created but the checkpointer could not be wired automatically — import \\`get_checkpointer\\` from it and pass \\`checkpointer=get_checkpointer()\\` to \\`create_agent\\`.`,\n );\n }\n continue;\n }\n\n // AG-UI wires session_manager_provider on the StrandsAgent adapter in\n // main.py instead — handled by the branch below.\n if (component?.protocol === 'ag-ui') {\n continue;\n }\n\n if (!component?.protocol) {\n if (\n await matchGritQL(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n )\n ) {\n nextSteps.push(\n `${filePath}: could not determine this agent's protocol/framework from its ComponentMetadata — manually verify whether it's AG-UI or HTTP/A2A Strands and wire session_manager in accordingly (see the py#agent generator's template).`,\n );\n }\n continue;\n }\n\n // HTTP/A2A: wire session_manager into the Agent constructor and create\n // the sibling session.py if it doesn't exist yet.\n if (\n !(await matchGritQL(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n ))\n ) {\n continue;\n }\n\n const sessionPath = `${dir}/session.py`;\n\n if (\n !(await matchGritQL(tree, filePath, AGENT_PY_CONSTRUCTOR_MATCH_PATTERN))\n ) {\n nextSteps.push(\n `${filePath}: the Agent is not constructed with an inline \\`Agent(...)\\` call, so session_manager could not be wired in automatically. Manually add \\`session_manager=get_session_manager()\\` to its constructor (see the py#agent generator's template), creating ${sessionPath} first if it doesn't already exist.`,\n );\n continue;\n }\n\n if (!tree.exists(sessionPath)) {\n const mod = await captureGritQLVariable(\n tree,\n filePath,\n LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN,\n 'mod',\n );\n const agentName = agentTmpNameFor(project, dir);\n\n if (mod && agentName) {\n tree.write(\n sessionPath,\n legacySessionManagerContent(\n mod,\n localSessionsDirFor(project.root, agentName),\n ),\n );\n } else {\n nextSteps.push(\n `${filePath}: could not determine the agent-connection module or this agent's name from its ComponentMetadata — manually create ${sessionPath} (see the py#agent generator's template) and wire \\`session_manager=get_session_manager()\\` into the Agent constructor.`,\n );\n continue;\n }\n }\n\n const agentContent = tree.read(filePath, 'utf-8') ?? '';\n if (!agentContent.includes('from .session import get_session_manager')) {\n await applyGritQL(tree, filePath, AGENT_PY_SESSION_IMPORT_PATTERN);\n await applyGritQL(tree, filePath, AGENT_PY_SESSION_MANAGER_PATTERN);\n }\n\n if (\n !(tree.read(filePath, 'utf-8') ?? '').includes('get_session_manager')\n ) {\n nextSteps.push(\n `${filePath}: found ${sessionPath} but couldn't confirm the get_session_manager import — wire \\`session_manager=get_session_manager()\\` into the Agent constructor manually.`,\n );\n continue;\n }\n\n continue;\n }\n\n if (\n filePath.endsWith('/main.py') &&\n (tree.read(filePath, 'utf-8') ?? '').includes('ag_ui_strands')\n ) {\n const alreadyWired = (tree.read(filePath, 'utf-8') ?? '').includes(\n 'StrandsAgentConfig',\n );\n\n if (!alreadyWired) {\n const needsWiring = await matchGritQL(\n tree,\n filePath,\n AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN,\n );\n if (!needsWiring) {\n nextSteps.push(\n `${filePath}: the StrandsAgent constructor has diverged from the generated shape - left as-is. Manually add \\`config=StrandsAgentConfig(session_manager_provider=lambda _input_data: get_session_manager())\\` to it (see the py#agent generator's template).`,\n );\n continue;\n }\n\n await applyGritQL(tree, filePath, AGUI_MAIN_IMPORT_PATTERN);\n await applyGritQL(tree, filePath, AGUI_MAIN_CONSTRUCTOR_PATTERN);\n }\n\n const dir = filePath.split('/').slice(0, -1).join('/');\n const sessionPath = `${dir}/session.py`;\n\n if (!tree.exists(sessionPath)) {\n const project = findOwningProject(tree, dir);\n const mod = await captureGritQLVariable(\n tree,\n filePath,\n SESSION_ID_CONTEXT_IMPORT_CAPTURE_PATTERN,\n 'mod',\n );\n const agentName = project && agentTmpNameFor(project, dir);\n\n if (project && mod && agentName) {\n tree.write(\n sessionPath,\n legacySessionManagerContent(\n mod,\n localSessionsDirFor(project.root, agentName),\n ),\n );\n } else {\n nextSteps.push(\n `${filePath}: could not determine the project root, agent-connection module, or this agent's name from its ComponentMetadata — manually create ${sessionPath} (see the py#agent generator's template) and wire \\`config=StrandsAgentConfig(session_manager_provider=lambda _input_data: get_session_manager())\\` into the StrandsAgent constructor.`,\n );\n continue;\n }\n }\n\n await applyGritQL(tree, filePath, AGUI_MAIN_SESSION_IMPORT_PATTERN);\n\n if (\n !(tree.read(filePath, 'utf-8') ?? '').includes('get_session_manager')\n ) {\n nextSteps.push(\n `${filePath}: found ${sessionPath} but couldn't confirm the get_session_manager import — wire it into the StrandsAgent constructor manually.`,\n );\n }\n }\n }\n\n await formatFilesInSubtree(tree);\n\n return { nextSteps };\n}\n"],"names":["readFileSync","join","getProjects","joinPathFragments","visitNotIgnoredFiles","PY_AGENT_GENERATOR_INFO","addPyDependencies","addPythonReExport","getPythonAgentConnectionModuleName","getPythonAgentConnectionProjectDir","applyGritQL","captureGritQLVariable","matchGritQL","declareDependencies","formatFilesInSubtree","kebabCase","getRelativePathToRootByDirectory","toProjectRelativePath","LOG_MODEL_ERRORS_IMPORT_CAPTURE_PATTERN","SESSION_ID_CONTEXT_IMPORT_CAPTURE_PATTERN","DEPENDENCIES","py","name","ts","LANGCHAIN_AGENT_MATCH_PATTERN","LANGCHAIN_CHECKPOINTER_PATTERN","LANGCHAIN_IN_MEMORY_IMPORT_PATTERN","langChainSessionImportPattern","LOG_TOOL_ERRORS_HOOKS_PATTERN","logToolErrorsImportPattern","mod","LOG_TOOL_ERRORS_WRITE_PATTERN","TOOL_ERRORS_STRANDS_PY_CONTENT","dirname","ensureToolErrorsBase","tree","projectDir","exists","moduleDir","toolErrorsPath","write","AGENT_PY_CONSTRUCTOR_MATCH_PATTERN","AGENT_PY_SESSION_MANAGER_PATTERN","AGENT_PY_SESSION_IMPORT_PATTERN","AGUI_MAIN_IMPORT_PATTERN","AGUI_MAIN_CONSTRUCTOR_MATCH_PATTERN","AGUI_MAIN_CONSTRUCTOR_PATTERN","AGUI_MAIN_SESSION_IMPORT_PATTERN","legacySessionManagerContent","agentConnectionModule","localSessionsDir","legacyLangChainSessionContent","findOwningProject","dirPath","best","project","values","root","startsWith","length","findAgentComponentMetadata","dirRelativeToProjectRoot","metadata","components","find","component","generator","id","path","agentTmpNameFor","dir","targetPrefix","undefined","split","pop","agentComponentFor","localSessionsDirFor","projectRoot","agentTmpName","framework","migration","nextSteps","filePaths","filePath","push","endsWith","slice","content","read","includes","agentName","sessionPath","migratedContent","protocol","agentContent","alreadyWired","needsWiring"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import { type Tree } from '@nx/devkit';
6
- import type { CodeGenData } from '../utils/codegen-data/types';
6
+ import type { CodeGenData } from '../utils/codegen-data/types.js';
7
7
  import type { OpenApiTsClientGeneratorSchema } from './schema';
8
8
  /**
9
9
  * Generates typescript client from an openapi spec
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/ts-client/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { generateFiles, logger, type Tree } from '@nx/devkit';\nimport * as path from 'path';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { esmVars } from '../../utils/module-format';\nimport { buildOpenApiCodeGenData } from '../utils/codegen-data';\nimport type { CodeGenData } from '../utils/codegen-data/types';\nimport { parseOpenApiSpec } from '../utils/parse';\nimport type { Spec } from '../utils/types';\nimport type { OpenApiTsClientGeneratorSchema } from './schema';\n\n/**\n * Generates typescript client from an openapi spec\n */\nexport const openApiTsClientGenerator = async (\n tree: Tree,\n options: OpenApiTsClientGeneratorSchema,\n) => {\n const data = await buildOpenApiCodeGenerationData(\n tree,\n options.openApiSpecPath,\n );\n\n generateOpenApiTsClient(tree, data, options.outputPath);\n\n await formatFilesInSubtree(tree);\n};\n\n/**\n * Build a data structure which can be used to generate code from OpenAPI\n */\nexport const buildOpenApiCodeGenerationData = async (\n tree: Tree,\n specPath: string,\n) => {\n const spec = await parseOpenApiSpec(tree, specPath);\n warnForUnsupportedFeatures(spec);\n return buildOpenApiCodeGenData(spec);\n};\n\n/**\n * Warn for spec features the generated client does not implement, so their\n * omission is never silent.\n */\nconst warnForUnsupportedFeatures = (spec: Spec) => {\n if (Object.keys((spec as { webhooks?: object }).webhooks ?? {}).length > 0) {\n logger.warn(\n 'OpenAPI webhooks are not supported and no client code is generated for them',\n );\n }\n for (const [p, pathItem] of Object.entries(spec.paths ?? {})) {\n for (const [method, op] of Object.entries(pathItem ?? {})) {\n if (typeof op !== 'object' || op === null) continue;\n const operation = op as {\n callbacks?: object;\n servers?: unknown[];\n };\n if (Object.keys(operation.callbacks ?? {}).length > 0) {\n logger.warn(\n `Operation ${method.toUpperCase()} ${p} declares callbacks, which are not supported and are ignored`,\n );\n }\n if ((operation.servers ?? []).length > 0) {\n logger.warn(\n `Operation ${method.toUpperCase()} ${p} declares operation-level servers, which are ignored — the client always uses its configured url`,\n );\n }\n }\n }\n};\n\n/**\n * Generate an OpenAPI typescript client in the target directory\n */\nexport const generateOpenApiTsClient = (\n tree: Tree,\n data: CodeGenData,\n outputPath: string,\n) => {\n generateFiles(tree, path.join(import.meta.dirname, 'files'), outputPath, {\n ...data,\n ...esmVars(tree),\n });\n};\n\nexport default openApiTsClientGenerator;\n"],"names":["generateFiles","logger","path","formatFilesInSubtree","esmVars","buildOpenApiCodeGenData","parseOpenApiSpec","openApiTsClientGenerator","tree","options","data","buildOpenApiCodeGenerationData","openApiSpecPath","generateOpenApiTsClient","outputPath","specPath","spec","warnForUnsupportedFeatures","Object","keys","webhooks","length","warn","p","pathItem","entries","paths","method","op","operation","callbacks","toUpperCase","servers","join","dirname"],"mappings":"AAAA;;;CAGC,GACD,SAASA,aAAa,EAAEC,MAAM,QAAmB,aAAa;AAC9D,YAAYC,UAAU,OAAO;AAC7B,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,OAAO,QAAQ,+BAA4B;AACpD,SAASC,uBAAuB,QAAQ,2BAAwB;AAEhE,SAASC,gBAAgB,QAAQ,oBAAiB;AAIlD;;CAEC,GACD,OAAO,MAAMC,2BAA2B,OACtCC,MACAC;IAEA,MAAMC,OAAO,MAAMC,+BACjBH,MACAC,QAAQG,eAAe;IAGzBC,wBAAwBL,MAAME,MAAMD,QAAQK,UAAU;IAEtD,MAAMX,qBAAqBK;AAC7B,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMG,iCAAiC,OAC5CH,MACAO;IAEA,MAAMC,OAAO,MAAMV,iBAAiBE,MAAMO;IAC1CE,2BAA2BD;IAC3B,OAAOX,wBAAwBW;AACjC,EAAE;AAEF;;;CAGC,GACD,MAAMC,6BAA6B,CAACD;IAClC,IAAIE,OAAOC,IAAI,CAAC,AAACH,KAA+BI,QAAQ,IAAI,CAAC,GAAGC,MAAM,GAAG,GAAG;QAC1EpB,OAAOqB,IAAI,CACT;IAEJ;IACA,KAAK,MAAM,CAACC,GAAGC,SAAS,IAAIN,OAAOO,OAAO,CAACT,KAAKU,KAAK,IAAI,CAAC,GAAI;QAC5D,KAAK,MAAM,CAACC,QAAQC,GAAG,IAAIV,OAAOO,OAAO,CAACD,YAAY,CAAC,GAAI;YACzD,IAAI,OAAOI,OAAO,YAAYA,OAAO,MAAM;YAC3C,MAAMC,YAAYD;YAIlB,IAAIV,OAAOC,IAAI,CAACU,UAAUC,SAAS,IAAI,CAAC,GAAGT,MAAM,GAAG,GAAG;gBACrDpB,OAAOqB,IAAI,CACT,CAAC,UAAU,EAAEK,OAAOI,WAAW,GAAG,CAAC,EAAER,EAAE,4DAA4D,CAAC;YAExG;YACA,IAAI,AAACM,CAAAA,UAAUG,OAAO,IAAI,EAAE,AAAD,EAAGX,MAAM,GAAG,GAAG;gBACxCpB,OAAOqB,IAAI,CACT,CAAC,UAAU,EAAEK,OAAOI,WAAW,GAAG,CAAC,EAAER,EAAE,gGAAgG,CAAC;YAE5I;QACF;IACF;AACF;AAEA;;CAEC,GACD,OAAO,MAAMV,0BAA0B,CACrCL,MACAE,MACAI;IAEAd,cAAcQ,MAAMN,KAAK+B,IAAI,CAAC,YAAYC,OAAO,EAAE,UAAUpB,YAAY;QACvE,GAAGJ,IAAI;QACP,GAAGN,QAAQI,KAAK;IAClB;AACF,EAAE;AAEF,eAAeD,yBAAyB"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/ts-client/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { generateFiles, logger, type Tree } from '@nx/devkit';\nimport * as path from 'path';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport { buildOpenApiCodeGenData } from '../utils/codegen-data.js';\nimport type { CodeGenData } from '../utils/codegen-data/types.js';\nimport { parseOpenApiSpec } from '../utils/parse.js';\nimport type { Spec } from '../utils/types.js';\nimport type { OpenApiTsClientGeneratorSchema } from './schema';\n\n/**\n * Generates typescript client from an openapi spec\n */\nexport const openApiTsClientGenerator = async (\n tree: Tree,\n options: OpenApiTsClientGeneratorSchema,\n) => {\n const data = await buildOpenApiCodeGenerationData(\n tree,\n options.openApiSpecPath,\n );\n\n generateOpenApiTsClient(tree, data, options.outputPath);\n\n await formatFilesInSubtree(tree);\n};\n\n/**\n * Build a data structure which can be used to generate code from OpenAPI\n */\nexport const buildOpenApiCodeGenerationData = async (\n tree: Tree,\n specPath: string,\n) => {\n const spec = await parseOpenApiSpec(tree, specPath);\n warnForUnsupportedFeatures(spec);\n return buildOpenApiCodeGenData(spec);\n};\n\n/**\n * Warn for spec features the generated client does not implement, so their\n * omission is never silent.\n */\nconst warnForUnsupportedFeatures = (spec: Spec) => {\n if (Object.keys((spec as { webhooks?: object }).webhooks ?? {}).length > 0) {\n logger.warn(\n 'OpenAPI webhooks are not supported and no client code is generated for them',\n );\n }\n for (const [p, pathItem] of Object.entries(spec.paths ?? {})) {\n for (const [method, op] of Object.entries(pathItem ?? {})) {\n if (typeof op !== 'object' || op === null) continue;\n const operation = op as {\n callbacks?: object;\n servers?: unknown[];\n };\n if (Object.keys(operation.callbacks ?? {}).length > 0) {\n logger.warn(\n `Operation ${method.toUpperCase()} ${p} declares callbacks, which are not supported and are ignored`,\n );\n }\n if ((operation.servers ?? []).length > 0) {\n logger.warn(\n `Operation ${method.toUpperCase()} ${p} declares operation-level servers, which are ignored — the client always uses its configured url`,\n );\n }\n }\n }\n};\n\n/**\n * Generate an OpenAPI typescript client in the target directory\n */\nexport const generateOpenApiTsClient = (\n tree: Tree,\n data: CodeGenData,\n outputPath: string,\n) => {\n generateFiles(tree, path.join(import.meta.dirname, 'files'), outputPath, {\n ...data,\n ...esmVars(tree),\n });\n};\n\nexport default openApiTsClientGenerator;\n"],"names":["generateFiles","logger","path","formatFilesInSubtree","esmVars","buildOpenApiCodeGenData","parseOpenApiSpec","openApiTsClientGenerator","tree","options","data","buildOpenApiCodeGenerationData","openApiSpecPath","generateOpenApiTsClient","outputPath","specPath","spec","warnForUnsupportedFeatures","Object","keys","webhooks","length","warn","p","pathItem","entries","paths","method","op","operation","callbacks","toUpperCase","servers","join","dirname"],"mappings":"AAAA;;;CAGC,GACD,SAASA,aAAa,EAAEC,MAAM,QAAmB,aAAa;AAC9D,YAAYC,UAAU,OAAO;AAC7B,SAASC,oBAAoB,QAAQ,wBAAwB;AAC7D,SAASC,OAAO,QAAQ,+BAA+B;AACvD,SAASC,uBAAuB,QAAQ,2BAA2B;AAEnE,SAASC,gBAAgB,QAAQ,oBAAoB;AAIrD;;CAEC,GACD,OAAO,MAAMC,2BAA2B,OACtCC,MACAC;IAEA,MAAMC,OAAO,MAAMC,+BACjBH,MACAC,QAAQG,eAAe;IAGzBC,wBAAwBL,MAAME,MAAMD,QAAQK,UAAU;IAEtD,MAAMX,qBAAqBK;AAC7B,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMG,iCAAiC,OAC5CH,MACAO;IAEA,MAAMC,OAAO,MAAMV,iBAAiBE,MAAMO;IAC1CE,2BAA2BD;IAC3B,OAAOX,wBAAwBW;AACjC,EAAE;AAEF;;;CAGC,GACD,MAAMC,6BAA6B,CAACD;IAClC,IAAIE,OAAOC,IAAI,CAAC,AAACH,KAA+BI,QAAQ,IAAI,CAAC,GAAGC,MAAM,GAAG,GAAG;QAC1EpB,OAAOqB,IAAI,CACT;IAEJ;IACA,KAAK,MAAM,CAACC,GAAGC,SAAS,IAAIN,OAAOO,OAAO,CAACT,KAAKU,KAAK,IAAI,CAAC,GAAI;QAC5D,KAAK,MAAM,CAACC,QAAQC,GAAG,IAAIV,OAAOO,OAAO,CAACD,YAAY,CAAC,GAAI;YACzD,IAAI,OAAOI,OAAO,YAAYA,OAAO,MAAM;YAC3C,MAAMC,YAAYD;YAIlB,IAAIV,OAAOC,IAAI,CAACU,UAAUC,SAAS,IAAI,CAAC,GAAGT,MAAM,GAAG,GAAG;gBACrDpB,OAAOqB,IAAI,CACT,CAAC,UAAU,EAAEK,OAAOI,WAAW,GAAG,CAAC,EAAER,EAAE,4DAA4D,CAAC;YAExG;YACA,IAAI,AAACM,CAAAA,UAAUG,OAAO,IAAI,EAAE,AAAD,EAAGX,MAAM,GAAG,GAAG;gBACxCpB,OAAOqB,IAAI,CACT,CAAC,UAAU,EAAEK,OAAOI,WAAW,GAAG,CAAC,EAAER,EAAE,gGAAgG,CAAC;YAE5I;QACF;IACF;AACF;AAEA;;CAEC,GACD,OAAO,MAAMV,0BAA0B,CACrCL,MACAE,MACAI;IAEAd,cAAcQ,MAAMN,KAAK+B,IAAI,CAAC,YAAYC,OAAO,EAAE,UAAUpB,YAAY;QACvE,GAAGJ,IAAI;QACP,GAAGN,QAAQI,KAAK;IAClB;AACF,EAAE;AAEF,eAAeD,yBAAyB"}
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import { type Tree } from '@nx/devkit';
6
- import type { CodeGenData } from '../utils/codegen-data/types';
6
+ import type { CodeGenData } from '../utils/codegen-data/types.js';
7
7
  import type { OpenApiTsHooksGeneratorSchema } from './schema';
8
8
  /**
9
9
  * Generates typescript hooks from an openapi spec
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/ts-hooks/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { generateFiles, type Tree } from '@nx/devkit';\nimport path from 'path';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { esmVars } from '../../utils/module-format';\nimport {\n buildOpenApiCodeGenerationData,\n generateOpenApiTsClient,\n} from '../ts-client/generator';\nimport type { CodeGenData } from '../utils/codegen-data/types';\nimport type { OpenApiTsHooksGeneratorSchema } from './schema';\n\n/**\n * Generates typescript hooks from an openapi spec\n */\nexport const openApiTsHooksGenerator = async (\n tree: Tree,\n options: OpenApiTsHooksGeneratorSchema,\n) => {\n const data = await buildOpenApiCodeGenerationData(\n tree,\n options.openApiSpecPath,\n );\n\n generateOpenApiTsClient(tree, data, options.outputPath);\n generateOpenApiTsHooks(tree, data, options.outputPath);\n\n await formatFilesInSubtree(tree);\n};\n\n/**\n * Generate OpenAPI typescript hooks in the target directory\n */\nexport const generateOpenApiTsHooks = (\n tree: Tree,\n data: CodeGenData,\n outputPath: string,\n) => {\n generateFiles(tree, path.join(import.meta.dirname, 'files'), outputPath, {\n ...data,\n ...esmVars(tree),\n });\n};\n\nexport default openApiTsHooksGenerator;\n"],"names":["generateFiles","path","formatFilesInSubtree","esmVars","buildOpenApiCodeGenerationData","generateOpenApiTsClient","openApiTsHooksGenerator","tree","options","data","openApiSpecPath","outputPath","generateOpenApiTsHooks","join","dirname"],"mappings":"AAAA;;;CAGC,GACD,SAASA,aAAa,QAAmB,aAAa;AACtD,OAAOC,UAAU,OAAO;AACxB,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,OAAO,QAAQ,+BAA4B;AACpD,SACEC,8BAA8B,EAC9BC,uBAAuB,QAClB,4BAAyB;AAIhC;;CAEC,GACD,OAAO,MAAMC,0BAA0B,OACrCC,MACAC;IAEA,MAAMC,OAAO,MAAML,+BACjBG,MACAC,QAAQE,eAAe;IAGzBL,wBAAwBE,MAAME,MAAMD,QAAQG,UAAU;IACtDC,uBAAuBL,MAAME,MAAMD,QAAQG,UAAU;IAErD,MAAMT,qBAAqBK;AAC7B,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMK,yBAAyB,CACpCL,MACAE,MACAE;IAEAX,cAAcO,MAAMN,KAAKY,IAAI,CAAC,YAAYC,OAAO,EAAE,UAAUH,YAAY;QACvE,GAAGF,IAAI;QACP,GAAGN,QAAQI,KAAK;IAClB;AACF,EAAE;AAEF,eAAeD,wBAAwB"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/ts-hooks/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { generateFiles, type Tree } from '@nx/devkit';\nimport path from 'path';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { esmVars } from '../../utils/module-format.js';\nimport {\n buildOpenApiCodeGenerationData,\n generateOpenApiTsClient,\n} from '../ts-client/generator.js';\nimport type { CodeGenData } from '../utils/codegen-data/types.js';\nimport type { OpenApiTsHooksGeneratorSchema } from './schema';\n\n/**\n * Generates typescript hooks from an openapi spec\n */\nexport const openApiTsHooksGenerator = async (\n tree: Tree,\n options: OpenApiTsHooksGeneratorSchema,\n) => {\n const data = await buildOpenApiCodeGenerationData(\n tree,\n options.openApiSpecPath,\n );\n\n generateOpenApiTsClient(tree, data, options.outputPath);\n generateOpenApiTsHooks(tree, data, options.outputPath);\n\n await formatFilesInSubtree(tree);\n};\n\n/**\n * Generate OpenAPI typescript hooks in the target directory\n */\nexport const generateOpenApiTsHooks = (\n tree: Tree,\n data: CodeGenData,\n outputPath: string,\n) => {\n generateFiles(tree, path.join(import.meta.dirname, 'files'), outputPath, {\n ...data,\n ...esmVars(tree),\n });\n};\n\nexport default openApiTsHooksGenerator;\n"],"names":["generateFiles","path","formatFilesInSubtree","esmVars","buildOpenApiCodeGenerationData","generateOpenApiTsClient","openApiTsHooksGenerator","tree","options","data","openApiSpecPath","outputPath","generateOpenApiTsHooks","join","dirname"],"mappings":"AAAA;;;CAGC,GACD,SAASA,aAAa,QAAmB,aAAa;AACtD,OAAOC,UAAU,OAAO;AACxB,SAASC,oBAAoB,QAAQ,wBAAwB;AAC7D,SAASC,OAAO,QAAQ,+BAA+B;AACvD,SACEC,8BAA8B,EAC9BC,uBAAuB,QAClB,4BAA4B;AAInC;;CAEC,GACD,OAAO,MAAMC,0BAA0B,OACrCC,MACAC;IAEA,MAAMC,OAAO,MAAML,+BACjBG,MACAC,QAAQE,eAAe;IAGzBL,wBAAwBE,MAAME,MAAMD,QAAQG,UAAU;IACtDC,uBAAuBL,MAAME,MAAMD,QAAQG,UAAU;IAErD,MAAMT,qBAAqBK;AAC7B,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMK,yBAAyB,CACpCL,MACAE,MACAE;IAEAX,cAAcO,MAAMN,KAAKY,IAAI,CAAC,YAAYC,OAAO,EAAE,UAAUH,YAAY;QACvE,GAAGF,IAAI;QACP,GAAGN,QAAQI,KAAK;IAClB;AACF,EAAE;AAEF,eAAeD,wBAAwB"}
@@ -16,12 +16,12 @@ import {
16
16
  import { fireEvent, render, waitFor } from '@testing-library/react';
17
17
  import type React from 'react';
18
18
  import type { Mock } from 'vitest';
19
- import { importTypeScriptModule } from '../../utils/js';
20
- import { createTreeUsingTsSolutionSetup } from '../../utils/test';
21
- import { TypeScriptVerifier } from '../../utils/test/ts.spec';
22
- import { PET_STORE_SPEC } from '../ts-client/generator.petstore.spec';
23
- import type { Spec } from '../utils/types';
24
- import { openApiTsHooksGenerator } from './generator';
19
+ import { importTypeScriptModule } from '../../utils/js.js';
20
+ import { createTreeUsingTsSolutionSetup } from '../../utils/test.js';
21
+ import { TypeScriptVerifier } from '../../utils/test/ts.spec.js';
22
+ import { PET_STORE_SPEC } from '../ts-client/generator.petstore.spec.js';
23
+ import type { Spec } from '../utils/types.js';
24
+ import { openApiTsHooksGenerator } from './generator.js';
25
25
 
26
26
  describe('openApiTsHooksGenerator', () => {
27
27
  let tree: Tree;
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  import { type Tree } from '@nx/devkit';
6
- import type { CodeGenData } from '../utils/codegen-data/types';
6
+ import type { CodeGenData } from '../utils/codegen-data/types.js';
7
7
  import type { OpenApiTsMetadataGeneratorSchema } from './schema';
8
8
  /**
9
9
  * Generates typescript metadata from an openapi spec
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/ts-metadata/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { generateFiles, type Tree } from '@nx/devkit';\nimport path from 'path';\nimport { formatFilesInSubtree } from '../../utils/format';\nimport { buildOpenApiCodeGenerationData } from '../ts-client/generator';\nimport type { CodeGenData } from '../utils/codegen-data/types';\nimport type { OpenApiTsMetadataGeneratorSchema } from './schema';\n\n/**\n * Generates typescript metadata from an openapi spec\n */\nexport const openApiTsMetadataGenerator = async (\n tree: Tree,\n options: OpenApiTsMetadataGeneratorSchema,\n) => {\n const data = await buildOpenApiCodeGenerationData(\n tree,\n options.openApiSpecPath,\n );\n\n generateOpenApiTsMetadata(tree, data, options.outputPath);\n\n await formatFilesInSubtree(tree);\n};\n\n/**\n * Generate OpenAPI typescript metadata in the target directory\n */\nexport const generateOpenApiTsMetadata = (\n tree: Tree,\n data: CodeGenData,\n outputPath: string,\n) => {\n generateFiles(\n tree,\n path.join(import.meta.dirname, 'files'),\n outputPath,\n data,\n );\n};\n\nexport default openApiTsMetadataGenerator;\n"],"names":["generateFiles","path","formatFilesInSubtree","buildOpenApiCodeGenerationData","openApiTsMetadataGenerator","tree","options","data","openApiSpecPath","generateOpenApiTsMetadata","outputPath","join","dirname"],"mappings":"AAAA;;;CAGC,GACD,SAASA,aAAa,QAAmB,aAAa;AACtD,OAAOC,UAAU,OAAO;AACxB,SAASC,oBAAoB,QAAQ,wBAAqB;AAC1D,SAASC,8BAA8B,QAAQ,4BAAyB;AAIxE;;CAEC,GACD,OAAO,MAAMC,6BAA6B,OACxCC,MACAC;IAEA,MAAMC,OAAO,MAAMJ,+BACjBE,MACAC,QAAQE,eAAe;IAGzBC,0BAA0BJ,MAAME,MAAMD,QAAQI,UAAU;IAExD,MAAMR,qBAAqBG;AAC7B,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMI,4BAA4B,CACvCJ,MACAE,MACAG;IAEAV,cACEK,MACAJ,KAAKU,IAAI,CAAC,YAAYC,OAAO,EAAE,UAC/BF,YACAH;AAEJ,EAAE;AAEF,eAAeH,2BAA2B"}
1
+ {"version":3,"sources":["../../../../../../packages/nx-plugin/src/open-api/ts-metadata/generator.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { generateFiles, type Tree } from '@nx/devkit';\nimport path from 'path';\nimport { formatFilesInSubtree } from '../../utils/format.js';\nimport { buildOpenApiCodeGenerationData } from '../ts-client/generator.js';\nimport type { CodeGenData } from '../utils/codegen-data/types.js';\nimport type { OpenApiTsMetadataGeneratorSchema } from './schema';\n\n/**\n * Generates typescript metadata from an openapi spec\n */\nexport const openApiTsMetadataGenerator = async (\n tree: Tree,\n options: OpenApiTsMetadataGeneratorSchema,\n) => {\n const data = await buildOpenApiCodeGenerationData(\n tree,\n options.openApiSpecPath,\n );\n\n generateOpenApiTsMetadata(tree, data, options.outputPath);\n\n await formatFilesInSubtree(tree);\n};\n\n/**\n * Generate OpenAPI typescript metadata in the target directory\n */\nexport const generateOpenApiTsMetadata = (\n tree: Tree,\n data: CodeGenData,\n outputPath: string,\n) => {\n generateFiles(\n tree,\n path.join(import.meta.dirname, 'files'),\n outputPath,\n data,\n );\n};\n\nexport default openApiTsMetadataGenerator;\n"],"names":["generateFiles","path","formatFilesInSubtree","buildOpenApiCodeGenerationData","openApiTsMetadataGenerator","tree","options","data","openApiSpecPath","generateOpenApiTsMetadata","outputPath","join","dirname"],"mappings":"AAAA;;;CAGC,GACD,SAASA,aAAa,QAAmB,aAAa;AACtD,OAAOC,UAAU,OAAO;AACxB,SAASC,oBAAoB,QAAQ,wBAAwB;AAC7D,SAASC,8BAA8B,QAAQ,4BAA4B;AAI3E;;CAEC,GACD,OAAO,MAAMC,6BAA6B,OACxCC,MACAC;IAEA,MAAMC,OAAO,MAAMJ,+BACjBE,MACAC,QAAQE,eAAe;IAGzBC,0BAA0BJ,MAAME,MAAMD,QAAQI,UAAU;IAExD,MAAMR,qBAAqBG;AAC7B,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMI,4BAA4B,CACvCJ,MACAE,MACAG;IAEAV,cACEK,MACAJ,KAAKU,IAAI,CAAC,YAAYC,OAAO,EAAE,UAC/BF,YACAH;AAEJ,EAAE;AAEF,eAAeH,2BAA2B"}
@@ -2,7 +2,7 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import { type Model } from './types';
5
+ import { type Model } from './types.js';
6
6
  export declare const toTypeScriptType: (property: Model) => string;
7
7
  export declare const toTypeScriptName: (name: string) => string;
8
8
  export declare const toTypeScriptModelName: (name: string) => string;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/open-api/utils/codegen-data/languages.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { camelCase, snakeCase, toClassName } from '../../../utils/names';\nimport { type Model, PRIMITIVE_TYPES } from './types';\n\nconst toTypescriptPrimitive = (property: Model): string => {\n if (\n property.type === 'string' &&\n ['date', 'date-time'].includes(property.format ?? '')\n ) {\n return 'Date';\n } else if (property.type === 'binary') {\n return 'Blob';\n }\n return property.type;\n};\n\n// A nullable tuple member renders as a union with null.\nconst memberType = (rendered: string, member: Model): string =>\n member.isNullable && member.type !== 'null' ? `${rendered} | null` : rendered;\n\nexport const toTypeScriptType = (property: Model): string => {\n // A discriminated subtype's discriminator property renders as its literal\n // tag, making the union a true (narrowable) tagged union.\n if (property.discriminatorValue) {\n return property.discriminatorValue;\n }\n const link = property.link;\n // Enum links serialise as their primitive; use the model's own type instead.\n const valueType = () =>\n link && link.export !== 'enum' ? toTypeScriptType(link) : property.type;\n switch (property.export) {\n case 'enum':\n case 'generic':\n return toTypescriptPrimitive(property);\n case 'array':\n return `Array<${valueType()}>`;\n case 'tuple':\n return `[${property.properties\n .map((member) => memberType(toTypeScriptType(member), member))\n .join(', ')}]`;\n case 'dictionary':\n return `{ [key: string]: ${valueType()}; }`;\n case 'one-of':\n case 'any-of':\n case 'all-of':\n return toTypeScriptModelName(property.name);\n case 'reference':\n default:\n if (property.type === 'unknown') {\n return 'unknown';\n }\n if (PRIMITIVE_TYPES.has(property.type)) {\n return toTypescriptPrimitive(property);\n }\n return toTypeScriptModelName(property.type);\n }\n};\n\nexport const toTypeScriptName = (name: string): string => {\n // A name of only non-identifier characters (e.g. \"_\") camelCases to an empty\n // string; fall back to an underscore so the emitted property stays valid.\n return camelCase(name) || (name ?? '').replace(/[^a-zA-Z0-9]/g, '_') || '_';\n};\n\nconst TYPESCRIPT_RESERVED_MODEL_NAMES = new Set([\n 'Date',\n 'Blob',\n 'Object',\n 'String',\n 'Boolean',\n 'Integer',\n 'Long',\n 'Float',\n 'Array',\n 'ReadonlyArray',\n 'File',\n 'Error',\n 'Map',\n 'Set',\n 'Number',\n 'Symbol',\n 'BigInt',\n 'Function',\n 'Promise',\n 'RegExp',\n 'JSON',\n]);\n\nexport const toTypeScriptModelName = (name: string): string => {\n const candidateName = toClassName(name);\n\n // Prepend underscore for any reserved model names\n return TYPESCRIPT_RESERVED_MODEL_NAMES.has(candidateName)\n ? `_${candidateName}`\n : candidateName;\n};\n\nconst toPythonPrimitive = (property: Model): string => {\n if (property.type === 'string' && property.format === 'date') {\n return 'date';\n } else if (property.type === 'string' && property.format === 'date-time') {\n return 'datetime';\n } else if (property.type === 'any') {\n return 'object';\n } else if (property.type === 'binary') {\n return 'bytearray';\n } else if (property.type === 'number') {\n if (property.openapiType === 'integer') {\n return 'int';\n }\n\n switch (property.format) {\n case 'int32':\n case 'int64':\n return 'int';\n case 'float':\n case 'double':\n default:\n return 'float';\n }\n } else if (property.type === 'boolean') {\n return 'bool';\n } else if (property.type === 'string') {\n return 'str';\n }\n return property.type;\n};\n\nexport const toPythonType = (property: Model): string => {\n const link = property.link;\n const valueType = () =>\n link && link.export !== 'enum' ? toPythonType(link) : property.type;\n switch (property.export) {\n case 'generic':\n case 'reference':\n return toPythonPrimitive(property);\n case 'array':\n return `List[${valueType()}]`;\n case 'tuple':\n return `Tuple[${property.properties\n .map((member) => toPythonType(member))\n .join(', ')}]`;\n case 'dictionary':\n return `Dict[str, ${valueType()}]`;\n case 'one-of':\n case 'any-of':\n case 'all-of':\n return property.name;\n default:\n // \"any\" has export = interface\n if (PRIMITIVE_TYPES.has(property.type)) {\n return toPythonPrimitive(property);\n }\n return property.type;\n }\n};\n\n// @see https://github.com/OpenAPITools/openapi-generator/blob/e2a62ace74de361bef6338b7fa37da8577242aef/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java#L106\nconst PYTHON_KEYWORDS = new Set([\n // @property\n 'property',\n // typing keywords\n 'schema',\n 'base64',\n 'json',\n 'date',\n 'float',\n // python reserved words\n 'and',\n 'del',\n 'from',\n 'not',\n 'while',\n 'as',\n 'elif',\n 'global',\n 'or',\n 'with',\n 'assert',\n 'else',\n 'if',\n 'pass',\n 'yield',\n 'break',\n 'except',\n 'import',\n 'print',\n 'class',\n 'exec',\n 'in',\n 'raise',\n 'continue',\n 'finally',\n 'is',\n 'return',\n 'def',\n 'for',\n 'lambda',\n 'try',\n 'self',\n 'nonlocal',\n 'None',\n 'True',\n 'False',\n 'async',\n 'await',\n]);\n\nexport const toPythonName = (\n namedEntity: 'model' | 'property' | 'operation',\n name: string,\n) => {\n const nameSnakeCase = snakeCase(name);\n\n // Names overlapping a TypeScript reserved word carry a leading `_`; strip it\n // before testing against the Python keyword set.\n if (PYTHON_KEYWORDS.has(name.startsWith('_') ? name.slice(1) : name)) {\n const nameSuffix = `_${nameSnakeCase}`;\n switch (namedEntity) {\n case 'model':\n return `model${nameSuffix}`;\n case 'operation':\n return `call${nameSuffix}`;\n case 'property':\n return `var${nameSuffix}`;\n default:\n break;\n }\n }\n return nameSnakeCase;\n};\n"],"names":["camelCase","snakeCase","toClassName","PRIMITIVE_TYPES","toTypescriptPrimitive","property","type","includes","format","memberType","rendered","member","isNullable","toTypeScriptType","discriminatorValue","link","valueType","export","properties","map","join","toTypeScriptModelName","name","has","toTypeScriptName","replace","TYPESCRIPT_RESERVED_MODEL_NAMES","Set","candidateName","toPythonPrimitive","openapiType","toPythonType","PYTHON_KEYWORDS","toPythonName","namedEntity","nameSnakeCase","startsWith","slice","nameSuffix"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../packages/nx-plugin/src/open-api/utils/codegen-data/languages.ts"],"sourcesContent":["/**\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { camelCase, snakeCase, toClassName } from '../../../utils/names.js';\nimport { type Model, PRIMITIVE_TYPES } from './types.js';\n\nconst toTypescriptPrimitive = (property: Model): string => {\n if (\n property.type === 'string' &&\n ['date', 'date-time'].includes(property.format ?? '')\n ) {\n return 'Date';\n } else if (property.type === 'binary') {\n return 'Blob';\n }\n return property.type;\n};\n\n// A nullable tuple member renders as a union with null.\nconst memberType = (rendered: string, member: Model): string =>\n member.isNullable && member.type !== 'null' ? `${rendered} | null` : rendered;\n\nexport const toTypeScriptType = (property: Model): string => {\n // A discriminated subtype's discriminator property renders as its literal\n // tag, making the union a true (narrowable) tagged union.\n if (property.discriminatorValue) {\n return property.discriminatorValue;\n }\n const link = property.link;\n // Enum links serialise as their primitive; use the model's own type instead.\n const valueType = () =>\n link && link.export !== 'enum' ? toTypeScriptType(link) : property.type;\n switch (property.export) {\n case 'enum':\n case 'generic':\n return toTypescriptPrimitive(property);\n case 'array':\n return `Array<${valueType()}>`;\n case 'tuple':\n return `[${property.properties\n .map((member) => memberType(toTypeScriptType(member), member))\n .join(', ')}]`;\n case 'dictionary':\n return `{ [key: string]: ${valueType()}; }`;\n case 'one-of':\n case 'any-of':\n case 'all-of':\n return toTypeScriptModelName(property.name);\n case 'reference':\n default:\n if (property.type === 'unknown') {\n return 'unknown';\n }\n if (PRIMITIVE_TYPES.has(property.type)) {\n return toTypescriptPrimitive(property);\n }\n return toTypeScriptModelName(property.type);\n }\n};\n\nexport const toTypeScriptName = (name: string): string => {\n // A name of only non-identifier characters (e.g. \"_\") camelCases to an empty\n // string; fall back to an underscore so the emitted property stays valid.\n return camelCase(name) || (name ?? '').replace(/[^a-zA-Z0-9]/g, '_') || '_';\n};\n\nconst TYPESCRIPT_RESERVED_MODEL_NAMES = new Set([\n 'Date',\n 'Blob',\n 'Object',\n 'String',\n 'Boolean',\n 'Integer',\n 'Long',\n 'Float',\n 'Array',\n 'ReadonlyArray',\n 'File',\n 'Error',\n 'Map',\n 'Set',\n 'Number',\n 'Symbol',\n 'BigInt',\n 'Function',\n 'Promise',\n 'RegExp',\n 'JSON',\n]);\n\nexport const toTypeScriptModelName = (name: string): string => {\n const candidateName = toClassName(name);\n\n // Prepend underscore for any reserved model names\n return TYPESCRIPT_RESERVED_MODEL_NAMES.has(candidateName)\n ? `_${candidateName}`\n : candidateName;\n};\n\nconst toPythonPrimitive = (property: Model): string => {\n if (property.type === 'string' && property.format === 'date') {\n return 'date';\n } else if (property.type === 'string' && property.format === 'date-time') {\n return 'datetime';\n } else if (property.type === 'any') {\n return 'object';\n } else if (property.type === 'binary') {\n return 'bytearray';\n } else if (property.type === 'number') {\n if (property.openapiType === 'integer') {\n return 'int';\n }\n\n switch (property.format) {\n case 'int32':\n case 'int64':\n return 'int';\n case 'float':\n case 'double':\n default:\n return 'float';\n }\n } else if (property.type === 'boolean') {\n return 'bool';\n } else if (property.type === 'string') {\n return 'str';\n }\n return property.type;\n};\n\nexport const toPythonType = (property: Model): string => {\n const link = property.link;\n const valueType = () =>\n link && link.export !== 'enum' ? toPythonType(link) : property.type;\n switch (property.export) {\n case 'generic':\n case 'reference':\n return toPythonPrimitive(property);\n case 'array':\n return `List[${valueType()}]`;\n case 'tuple':\n return `Tuple[${property.properties\n .map((member) => toPythonType(member))\n .join(', ')}]`;\n case 'dictionary':\n return `Dict[str, ${valueType()}]`;\n case 'one-of':\n case 'any-of':\n case 'all-of':\n return property.name;\n default:\n // \"any\" has export = interface\n if (PRIMITIVE_TYPES.has(property.type)) {\n return toPythonPrimitive(property);\n }\n return property.type;\n }\n};\n\n// @see https://github.com/OpenAPITools/openapi-generator/blob/e2a62ace74de361bef6338b7fa37da8577242aef/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java#L106\nconst PYTHON_KEYWORDS = new Set([\n // @property\n 'property',\n // typing keywords\n 'schema',\n 'base64',\n 'json',\n 'date',\n 'float',\n // python reserved words\n 'and',\n 'del',\n 'from',\n 'not',\n 'while',\n 'as',\n 'elif',\n 'global',\n 'or',\n 'with',\n 'assert',\n 'else',\n 'if',\n 'pass',\n 'yield',\n 'break',\n 'except',\n 'import',\n 'print',\n 'class',\n 'exec',\n 'in',\n 'raise',\n 'continue',\n 'finally',\n 'is',\n 'return',\n 'def',\n 'for',\n 'lambda',\n 'try',\n 'self',\n 'nonlocal',\n 'None',\n 'True',\n 'False',\n 'async',\n 'await',\n]);\n\nexport const toPythonName = (\n namedEntity: 'model' | 'property' | 'operation',\n name: string,\n) => {\n const nameSnakeCase = snakeCase(name);\n\n // Names overlapping a TypeScript reserved word carry a leading `_`; strip it\n // before testing against the Python keyword set.\n if (PYTHON_KEYWORDS.has(name.startsWith('_') ? name.slice(1) : name)) {\n const nameSuffix = `_${nameSnakeCase}`;\n switch (namedEntity) {\n case 'model':\n return `model${nameSuffix}`;\n case 'operation':\n return `call${nameSuffix}`;\n case 'property':\n return `var${nameSuffix}`;\n default:\n break;\n }\n }\n return nameSnakeCase;\n};\n"],"names":["camelCase","snakeCase","toClassName","PRIMITIVE_TYPES","toTypescriptPrimitive","property","type","includes","format","memberType","rendered","member","isNullable","toTypeScriptType","discriminatorValue","link","valueType","export","properties","map","join","toTypeScriptModelName","name","has","toTypeScriptName","replace","TYPESCRIPT_RESERVED_MODEL_NAMES","Set","candidateName","toPythonPrimitive","openapiType","toPythonType","PYTHON_KEYWORDS","toPythonName","namedEntity","nameSnakeCase","startsWith","slice","nameSuffix"],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- import { type CodeGenData } from './codegen-data/types';
6
- import type { Spec } from './types';
5
+ import { type CodeGenData } from './codegen-data/types.js';
6
+ import type { Spec } from './types.js';
7
7
  /**
8
8
  * Build the data structure used to generate code from an OpenAPI spec.
9
9
  */