agentcore-cli 0.31.1__py3-none-any.whl

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 (655) hide show
  1. agentcore/__init__.py +1 -0
  2. agentcore/agent_inspector/NOTICE +9 -0
  3. agentcore/agent_inspector/favicon.svg +60 -0
  4. agentcore/agent_inspector/index.css +1 -0
  5. agentcore/agent_inspector/index.html +14 -0
  6. agentcore/agent_inspector/index.js +289 -0
  7. agentcore/assets/AGENTS.md +60 -0
  8. agentcore/assets/README.md +108 -0
  9. agentcore/assets/agents/AGENTS.md +218 -0
  10. agentcore/assets/cdk/.prettierrc +8 -0
  11. agentcore/assets/cdk/README.md +26 -0
  12. agentcore/assets/cdk/bin/cdk.ts +216 -0
  13. agentcore/assets/cdk/cdk.json +88 -0
  14. agentcore/assets/cdk/gitignore.template +9 -0
  15. agentcore/assets/cdk/jest.config.js +9 -0
  16. agentcore/assets/cdk/lib/cdk-stack.ts +291 -0
  17. agentcore/assets/cdk/npmignore.template +6 -0
  18. agentcore/assets/cdk/package.json +30 -0
  19. agentcore/assets/cdk/test/cdk.test.ts +31 -0
  20. agentcore/assets/cdk/tsconfig.json +28 -0
  21. agentcore/assets/container/python/Dockerfile +47 -0
  22. agentcore/assets/container/python/dockerignore.template +27 -0
  23. agentcore/assets/container/typescript/Dockerfile +25 -0
  24. agentcore/assets/container/typescript/dockerignore.template +24 -0
  25. agentcore/assets/datasets/predefined-v1.jsonl +3 -0
  26. agentcore/assets/datasets/simulated-v1.jsonl +3 -0
  27. agentcore/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
  28. agentcore/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
  29. agentcore/assets/evaluators/autoevals-lambda/pyproject.toml +22 -0
  30. agentcore/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
  31. agentcore/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
  32. agentcore/assets/evaluators/deepeval-lambda/pyproject.toml +19 -0
  33. agentcore/assets/evaluators/python-lambda/execution-role-policy.json +10 -0
  34. agentcore/assets/evaluators/python-lambda/lambda_function.py +19 -0
  35. agentcore/assets/evaluators/python-lambda/pyproject.toml +15 -0
  36. agentcore/assets/harness/invoke.py.template +74 -0
  37. agentcore/assets/mcp/python/README.md +27 -0
  38. agentcore/assets/mcp/python/pyproject.toml +22 -0
  39. agentcore/assets/mcp/python/server.py +117 -0
  40. agentcore/assets/mcp/python-lambda/README.md +22 -0
  41. agentcore/assets/mcp/python-lambda/handler.py +144 -0
  42. agentcore/assets/mcp/python-lambda/pyproject.toml +15 -0
  43. agentcore/assets/python/a2a/googleadk/base/README.md +22 -0
  44. agentcore/assets/python/a2a/googleadk/base/gitignore.template +41 -0
  45. agentcore/assets/python/a2a/googleadk/base/main.py +124 -0
  46. agentcore/assets/python/a2a/googleadk/base/model/__init__.py +1 -0
  47. agentcore/assets/python/a2a/googleadk/base/model/load.py +41 -0
  48. agentcore/assets/python/a2a/googleadk/base/pyproject.toml +22 -0
  49. agentcore/assets/python/a2a/langchain_langgraph/base/README.md +22 -0
  50. agentcore/assets/python/a2a/langchain_langgraph/base/gitignore.template +41 -0
  51. agentcore/assets/python/a2a/langchain_langgraph/base/main.py +144 -0
  52. agentcore/assets/python/a2a/langchain_langgraph/base/model/__init__.py +1 -0
  53. agentcore/assets/python/a2a/langchain_langgraph/base/model/load.py +123 -0
  54. agentcore/assets/python/a2a/langchain_langgraph/base/pyproject.toml +26 -0
  55. agentcore/assets/python/a2a/strands/base/README.md +22 -0
  56. agentcore/assets/python/a2a/strands/base/gitignore.template +41 -0
  57. agentcore/assets/python/a2a/strands/base/main.py +113 -0
  58. agentcore/assets/python/a2a/strands/base/model/__init__.py +1 -0
  59. agentcore/assets/python/a2a/strands/base/model/load.py +123 -0
  60. agentcore/assets/python/a2a/strands/base/pyproject.toml +23 -0
  61. agentcore/assets/python/a2a/strands/capabilities/memory/__init__.py +1 -0
  62. agentcore/assets/python/a2a/strands/capabilities/memory/session.py +46 -0
  63. agentcore/assets/python/agui/googleadk/base/README.md +30 -0
  64. agentcore/assets/python/agui/googleadk/base/gitignore.template +41 -0
  65. agentcore/assets/python/agui/googleadk/base/main.py +91 -0
  66. agentcore/assets/python/agui/googleadk/base/model/__init__.py +1 -0
  67. agentcore/assets/python/agui/googleadk/base/model/load.py +41 -0
  68. agentcore/assets/python/agui/googleadk/base/pyproject.toml +25 -0
  69. agentcore/assets/python/agui/langchain_langgraph/base/README.md +22 -0
  70. agentcore/assets/python/agui/langchain_langgraph/base/gitignore.template +41 -0
  71. agentcore/assets/python/agui/langchain_langgraph/base/main.py +130 -0
  72. agentcore/assets/python/agui/langchain_langgraph/base/model/__init__.py +1 -0
  73. agentcore/assets/python/agui/langchain_langgraph/base/model/load.py +123 -0
  74. agentcore/assets/python/agui/langchain_langgraph/base/pyproject.toml +31 -0
  75. agentcore/assets/python/agui/strands/base/README.md +22 -0
  76. agentcore/assets/python/agui/strands/base/gitignore.template +41 -0
  77. agentcore/assets/python/agui/strands/base/main.py +105 -0
  78. agentcore/assets/python/agui/strands/base/model/__init__.py +1 -0
  79. agentcore/assets/python/agui/strands/base/model/load.py +123 -0
  80. agentcore/assets/python/agui/strands/base/pyproject.toml +27 -0
  81. agentcore/assets/python/agui/strands/capabilities/memory/__init__.py +1 -0
  82. agentcore/assets/python/agui/strands/capabilities/memory/session.py +46 -0
  83. agentcore/assets/python/http/autogen/base/README.md +45 -0
  84. agentcore/assets/python/http/autogen/base/gitignore.template +41 -0
  85. agentcore/assets/python/http/autogen/base/main.py +145 -0
  86. agentcore/assets/python/http/autogen/base/mcp_client/__init__.py +1 -0
  87. agentcore/assets/python/http/autogen/base/mcp_client/client.py +28 -0
  88. agentcore/assets/python/http/autogen/base/model/__init__.py +1 -0
  89. agentcore/assets/python/http/autogen/base/model/load.py +136 -0
  90. agentcore/assets/python/http/autogen/base/pyproject.toml +34 -0
  91. agentcore/assets/python/http/bma/base/Dockerfile +41 -0
  92. agentcore/assets/python/http/bma/base/README.md +178 -0
  93. agentcore/assets/python/http/bma/base/client.py +200 -0
  94. agentcore/assets/python/http/bma/base/lifecycle/server.py +641 -0
  95. agentcore/assets/python/http/bma/base/otel/collector.yaml +69 -0
  96. agentcore/assets/python/http/bma/base/plugins/acr-report/.codex-plugin/plugin.json +6 -0
  97. agentcore/assets/python/http/bma/base/plugins/acr-report/skills/acr-report/SKILL.md +16 -0
  98. agentcore/assets/python/http/bma/base/policies/bma-acr-policy.json +11 -0
  99. agentcore/assets/python/http/bma/base/policies/bma-session-policy.json +35 -0
  100. agentcore/assets/python/http/bma/base/policies/bma-session-trust.json +20 -0
  101. agentcore/assets/python/http/bma/base/pyproject.toml +21 -0
  102. agentcore/assets/python/http/googleadk/base/README.md +45 -0
  103. agentcore/assets/python/http/googleadk/base/gitignore.template +41 -0
  104. agentcore/assets/python/http/googleadk/base/main.py +207 -0
  105. agentcore/assets/python/http/googleadk/base/mcp_client/__init__.py +1 -0
  106. agentcore/assets/python/http/googleadk/base/mcp_client/client.py +75 -0
  107. agentcore/assets/python/http/googleadk/base/model/__init__.py +1 -0
  108. agentcore/assets/python/http/googleadk/base/model/load.py +41 -0
  109. agentcore/assets/python/http/googleadk/base/pyproject.toml +24 -0
  110. agentcore/assets/python/http/langchain_langgraph/base/README.md +45 -0
  111. agentcore/assets/python/http/langchain_langgraph/base/gitignore.template +41 -0
  112. agentcore/assets/python/http/langchain_langgraph/base/main.py +227 -0
  113. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +1 -0
  114. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/client.py +79 -0
  115. agentcore/assets/python/http/langchain_langgraph/base/model/__init__.py +1 -0
  116. agentcore/assets/python/http/langchain_langgraph/base/model/load.py +123 -0
  117. agentcore/assets/python/http/langchain_langgraph/base/pyproject.toml +38 -0
  118. agentcore/assets/python/http/openaiagents/base/README.md +45 -0
  119. agentcore/assets/python/http/openaiagents/base/gitignore.template +41 -0
  120. agentcore/assets/python/http/openaiagents/base/main.py +200 -0
  121. agentcore/assets/python/http/openaiagents/base/mcp_client/__init__.py +1 -0
  122. agentcore/assets/python/http/openaiagents/base/mcp_client/client.py +74 -0
  123. agentcore/assets/python/http/openaiagents/base/model/__init__.py +1 -0
  124. agentcore/assets/python/http/openaiagents/base/model/load.py +37 -0
  125. agentcore/assets/python/http/openaiagents/base/pyproject.toml +21 -0
  126. agentcore/assets/python/http/strands/base/README.md +46 -0
  127. agentcore/assets/python/http/strands/base/gitignore.template +41 -0
  128. agentcore/assets/python/http/strands/base/main.py +714 -0
  129. agentcore/assets/python/http/strands/base/mcp_client/__init__.py +1 -0
  130. agentcore/assets/python/http/strands/base/mcp_client/client.py +116 -0
  131. agentcore/assets/python/http/strands/base/model/__init__.py +1 -0
  132. agentcore/assets/python/http/strands/base/model/load.py +239 -0
  133. agentcore/assets/python/http/strands/base/model/mantle_compat.py +21 -0
  134. agentcore/assets/python/http/strands/base/pyproject.toml +31 -0
  135. agentcore/assets/python/http/strands/base/skills/fetcher.py +279 -0
  136. agentcore/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
  137. agentcore/assets/python/http/strands/capabilities/memory/__init__.py +1 -0
  138. agentcore/assets/python/http/strands/capabilities/memory/session.py +47 -0
  139. agentcore/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
  140. agentcore/assets/python/http/strands/capabilities/payments/payments.py +142 -0
  141. agentcore/assets/python/mcp/standalone/base/README.md +36 -0
  142. agentcore/assets/python/mcp/standalone/base/gitignore.template +41 -0
  143. agentcore/assets/python/mcp/standalone/base/main.py +83 -0
  144. agentcore/assets/python/mcp/standalone/base/pyproject.toml +16 -0
  145. agentcore/assets/typescript/.gitkeep +0 -0
  146. agentcore/assets/typescript/http/strands/base/README.md +42 -0
  147. agentcore/assets/typescript/http/strands/base/gitignore.template +22 -0
  148. agentcore/assets/typescript/http/strands/base/main.ts +149 -0
  149. agentcore/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
  150. agentcore/assets/typescript/http/strands/base/model/load.ts +102 -0
  151. agentcore/assets/typescript/http/strands/base/package.json +38 -0
  152. agentcore/assets/typescript/http/strands/base/tsconfig.json +19 -0
  153. agentcore/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
  154. agentcore/assets/typescript/http/vercelai/base/README.md +42 -0
  155. agentcore/assets/typescript/http/vercelai/base/gitignore.template +22 -0
  156. agentcore/assets/typescript/http/vercelai/base/main.ts +70 -0
  157. agentcore/assets/typescript/http/vercelai/base/model/load.ts +121 -0
  158. agentcore/assets/typescript/http/vercelai/base/package.json +35 -0
  159. agentcore/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
  160. agentcore/aws/__init__.py +263 -0
  161. agentcore/aws/_aws_errors.py +72 -0
  162. agentcore/aws/_http.py +176 -0
  163. agentcore/aws/_util.py +37 -0
  164. agentcore/aws/account.py +165 -0
  165. agentcore/aws/agentcore.py +971 -0
  166. agentcore/aws/agentcore_ab_tests.py +230 -0
  167. agentcore/aws/agentcore_batch_evaluation.py +227 -0
  168. agentcore/aws/agentcore_config_bundles.py +220 -0
  169. agentcore/aws/agentcore_control.py +994 -0
  170. agentcore/aws/agentcore_datasets.py +222 -0
  171. agentcore/aws/agentcore_harness.py +330 -0
  172. agentcore/aws/agentcore_payments.py +430 -0
  173. agentcore/aws/agentcore_recommendation.py +140 -0
  174. agentcore/aws/agui_parser.py +131 -0
  175. agentcore/aws/agui_types.py +342 -0
  176. agentcore/aws/api_client.py +87 -0
  177. agentcore/aws/arn.py +18 -0
  178. agentcore/aws/aws_context.py +23 -0
  179. agentcore/aws/bedrock.py +44 -0
  180. agentcore/aws/bedrock_agent.py +129 -0
  181. agentcore/aws/bedrock_import.py +252 -0
  182. agentcore/aws/bedrock_import_types.py +111 -0
  183. agentcore/aws/cloudwatch.py +136 -0
  184. agentcore/aws/connect_shell.py +266 -0
  185. agentcore/aws/iam.py +41 -0
  186. agentcore/aws/partition.py +58 -0
  187. agentcore/aws/policy_generation.py +116 -0
  188. agentcore/aws/region.py +54 -0
  189. agentcore/aws/retry.py +27 -0
  190. agentcore/aws/shell_framer.py +136 -0
  191. agentcore/aws/stage_endpoint.py +39 -0
  192. agentcore/aws/target_region.py +54 -0
  193. agentcore/aws/transaction_search.py +97 -0
  194. agentcore/cdk/__init__.py +10 -0
  195. agentcore/cdk/constants.py +13 -0
  196. agentcore/cdk/local_cdk_project.py +48 -0
  197. agentcore/cdk/toolkit.py +706 -0
  198. agentcore/cli/__init__.py +0 -0
  199. agentcore/cli/commands/__init__.py +0 -0
  200. agentcore/cli/commands/_jobs_common.py +39 -0
  201. agentcore/cli/commands/_run_wizards.py +639 -0
  202. agentcore/cli/commands/add/__init__.py +37 -0
  203. agentcore/cli/commands/add/_commander.py +52 -0
  204. agentcore/cli/commands/add/_common.py +47 -0
  205. agentcore/cli/commands/add/agent_wizard.py +528 -0
  206. agentcore/cli/commands/add/auth_options.py +154 -0
  207. agentcore/cli/commands/add/skill_action.py +105 -0
  208. agentcore/cli/commands/add/skill_command.py +87 -0
  209. agentcore/cli/commands/add/tool_action.py +160 -0
  210. agentcore/cli/commands/add/tool_command.py +117 -0
  211. agentcore/cli/commands/add/validate.py +333 -0
  212. agentcore/cli/commands/capacity_provider/__init__.py +86 -0
  213. agentcore/cli/commands/capacity_provider/action.py +114 -0
  214. agentcore/cli/commands/capacity_provider/constants.py +22 -0
  215. agentcore/cli/commands/config.py +91 -0
  216. agentcore/cli/commands/config_bundle.py +251 -0
  217. agentcore/cli/commands/create/__init__.py +643 -0
  218. agentcore/cli/commands/create/action.py +406 -0
  219. agentcore/cli/commands/create/dependencies.py +91 -0
  220. agentcore/cli/commands/create/harness_validate.py +82 -0
  221. agentcore/cli/commands/create/validate.py +195 -0
  222. agentcore/cli/commands/create/wizard.py +127 -0
  223. agentcore/cli/commands/dataset.py +119 -0
  224. agentcore/cli/commands/deploy/__init__.py +31 -0
  225. agentcore/cli/commands/deploy/_guards.py +25 -0
  226. agentcore/cli/commands/deploy/actions.py +840 -0
  227. agentcore/cli/commands/deploy/command.py +349 -0
  228. agentcore/cli/commands/deploy/progress.py +115 -0
  229. agentcore/cli/commands/deploy/types.py +68 -0
  230. agentcore/cli/commands/deploy/utils.py +43 -0
  231. agentcore/cli/commands/deploy/validate.py +21 -0
  232. agentcore/cli/commands/dev/__init__.py +5 -0
  233. agentcore/cli/commands/dev/_deps.py +50 -0
  234. agentcore/cli/commands/dev/browser_mode.py +270 -0
  235. agentcore/cli/commands/dev/command.py +450 -0
  236. agentcore/cli/commands/dev/terminal_mode.py +379 -0
  237. agentcore/cli/commands/exec/__init__.py +29 -0
  238. agentcore/cli/commands/exec/action.py +442 -0
  239. agentcore/cli/commands/exec/command.py +206 -0
  240. agentcore/cli/commands/exec/types.py +35 -0
  241. agentcore/cli/commands/export/__init__.py +114 -0
  242. agentcore/cli/commands/export/constants.py +21 -0
  243. agentcore/cli/commands/export/fetch_harness_spec.py +234 -0
  244. agentcore/cli/commands/export/harness_action.py +385 -0
  245. agentcore/cli/commands/export/harness_mapper.py +868 -0
  246. agentcore/cli/commands/export/harness_resolver.py +95 -0
  247. agentcore/cli/commands/export/types.py +90 -0
  248. agentcore/cli/commands/export/wizard.py +97 -0
  249. agentcore/cli/commands/feedback/__init__.py +69 -0
  250. agentcore/cli/commands/feedback/action.py +30 -0
  251. agentcore/cli/commands/feedback/consent_prompt.py +35 -0
  252. agentcore/cli/commands/feedback/wizard.py +49 -0
  253. agentcore/cli/commands/fetch/__init__.py +69 -0
  254. agentcore/cli/commands/fetch/action.py +62 -0
  255. agentcore/cli/commands/help.py +65 -0
  256. agentcore/cli/commands/import_/__init__.py +167 -0
  257. agentcore/cli/commands/import_/_js.py +72 -0
  258. agentcore/cli/commands/import_/actions.py +457 -0
  259. agentcore/cli/commands/import_/constants.py +45 -0
  260. agentcore/cli/commands/import_/import_evaluator.py +140 -0
  261. agentcore/cli/commands/import_/import_gateway.py +520 -0
  262. agentcore/cli/commands/import_/import_memory.py +128 -0
  263. agentcore/cli/commands/import_/import_online_eval.py +165 -0
  264. agentcore/cli/commands/import_/import_pipeline.py +145 -0
  265. agentcore/cli/commands/import_/import_runtime.py +214 -0
  266. agentcore/cli/commands/import_/import_utils.py +410 -0
  267. agentcore/cli/commands/import_/phase1_update.py +110 -0
  268. agentcore/cli/commands/import_/phase2_import.py +206 -0
  269. agentcore/cli/commands/import_/resource_import.py +228 -0
  270. agentcore/cli/commands/import_/template_utils.py +148 -0
  271. agentcore/cli/commands/import_/types.py +150 -0
  272. agentcore/cli/commands/import_/yaml_parser.py +265 -0
  273. agentcore/cli/commands/init.py +196 -0
  274. agentcore/cli/commands/invoke/__init__.py +32 -0
  275. agentcore/cli/commands/invoke/_deps.py +73 -0
  276. agentcore/cli/commands/invoke/action.py +840 -0
  277. agentcore/cli/commands/invoke/command.py +490 -0
  278. agentcore/cli/commands/invoke/constants.py +40 -0
  279. agentcore/cli/commands/invoke/guards.py +23 -0
  280. agentcore/cli/commands/invoke/interactive.py +604 -0
  281. agentcore/cli/commands/invoke/resolve.py +149 -0
  282. agentcore/cli/commands/invoke/resolve_prompt.py +60 -0
  283. agentcore/cli/commands/invoke/types.py +61 -0
  284. agentcore/cli/commands/invoke/validate.py +33 -0
  285. agentcore/cli/commands/job_actions.py +239 -0
  286. agentcore/cli/commands/job_history.py +380 -0
  287. agentcore/cli/commands/logs/__init__.py +53 -0
  288. agentcore/cli/commands/logs/action.py +159 -0
  289. agentcore/cli/commands/logs/filter_pattern.py +17 -0
  290. agentcore/cli/commands/logs/guards.py +51 -0
  291. agentcore/cli/commands/logs_evals.py +42 -0
  292. agentcore/cli/commands/package.py +118 -0
  293. agentcore/cli/commands/remove/__init__.py +172 -0
  294. agentcore/cli/commands/remove/skill_command.py +131 -0
  295. agentcore/cli/commands/remove/tool_command.py +59 -0
  296. agentcore/cli/commands/run.py +808 -0
  297. agentcore/cli/commands/run_ingest.py +97 -0
  298. agentcore/cli/commands/shared/__init__.py +0 -0
  299. agentcore/cli/commands/shared/arn_utils.py +9 -0
  300. agentcore/cli/commands/shared/filesystem_utils.py +421 -0
  301. agentcore/cli/commands/shared/header_utils.py +87 -0
  302. agentcore/cli/commands/shared/indexed_key_parser.py +76 -0
  303. agentcore/cli/commands/shared/lifecycle_utils.py +72 -0
  304. agentcore/cli/commands/shared/region_utils.py +20 -0
  305. agentcore/cli/commands/shared/vpc_utils.py +99 -0
  306. agentcore/cli/commands/status/__init__.py +30 -0
  307. agentcore/cli/commands/status/_guards.py +25 -0
  308. agentcore/cli/commands/status/action.py +741 -0
  309. agentcore/cli/commands/status/command.py +321 -0
  310. agentcore/cli/commands/status/constants.py +36 -0
  311. agentcore/cli/commands/status/format_knowledge_base.py +111 -0
  312. agentcore/cli/commands/telemetry.py +79 -0
  313. agentcore/cli/commands/traces/__init__.py +155 -0
  314. agentcore/cli/commands/traces/action.py +123 -0
  315. agentcore/cli/commands/update/__init__.py +63 -0
  316. agentcore/cli/commands/update/action.py +164 -0
  317. agentcore/cli/commands/validate.py +165 -0
  318. agentcore/cli/constants.py +96 -0
  319. agentcore/cli/errors.py +118 -0
  320. agentcore/cli/external_requirements/__init__.py +67 -0
  321. agentcore/cli/external_requirements/checks.py +280 -0
  322. agentcore/cli/external_requirements/detect.py +55 -0
  323. agentcore/cli/external_requirements/versions.py +57 -0
  324. agentcore/cli/groups.py +23 -0
  325. agentcore/cli/interactive.py +85 -0
  326. agentcore/cli/main.py +137 -0
  327. agentcore/cli/naming.py +11 -0
  328. agentcore/cli/notices.py +42 -0
  329. agentcore/cli/project.py +34 -0
  330. agentcore/cli/run_command.py +27 -0
  331. agentcore/cli/tree.py +135 -0
  332. agentcore/cli/update_notifier.py +123 -0
  333. agentcore/cli/variadic.py +50 -0
  334. agentcore/cloudformation/__init__.py +84 -0
  335. agentcore/cloudformation/bootstrap.py +64 -0
  336. agentcore/cloudformation/logical_ids.py +37 -0
  337. agentcore/cloudformation/outputs.py +566 -0
  338. agentcore/cloudformation/stack_discovery.py +75 -0
  339. agentcore/cloudformation/stack_events.py +107 -0
  340. agentcore/cloudformation/stack_status.py +98 -0
  341. agentcore/cloudformation/types.py +44 -0
  342. agentcore/lib/__init__.py +68 -0
  343. agentcore/lib/constants.py +77 -0
  344. agentcore/lib/dependency_management/__init__.py +23 -0
  345. agentcore/lib/dependency_management/messages.py +92 -0
  346. agentcore/lib/dependency_management/plan.py +98 -0
  347. agentcore/lib/dependency_management/semver.py +137 -0
  348. agentcore/lib/dependency_management/sync.py +139 -0
  349. agentcore/lib/dependency_management/types.py +56 -0
  350. agentcore/lib/errors/__init__.py +5 -0
  351. agentcore/lib/errors/types.py +352 -0
  352. agentcore/lib/errors/validation.py +121 -0
  353. agentcore/lib/packaging/__init__.py +81 -0
  354. agentcore/lib/packaging/build_args.py +23 -0
  355. agentcore/lib/packaging/build_context.py +26 -0
  356. agentcore/lib/packaging/build_context_dockerignore.py +45 -0
  357. agentcore/lib/packaging/container.py +95 -0
  358. agentcore/lib/packaging/helpers.py +289 -0
  359. agentcore/lib/packaging/node.py +153 -0
  360. agentcore/lib/packaging/python.py +135 -0
  361. agentcore/lib/packaging/types.py +69 -0
  362. agentcore/lib/packaging/uv.py +45 -0
  363. agentcore/lib/result.py +104 -0
  364. agentcore/lib/schemas/__init__.py +1 -0
  365. agentcore/lib/schemas/io/__init__.py +27 -0
  366. agentcore/lib/schemas/io/config_io.py +458 -0
  367. agentcore/lib/schemas/io/global_config.py +239 -0
  368. agentcore/lib/schemas/io/path_resolver.py +132 -0
  369. agentcore/lib/secrets/__init__.py +18 -0
  370. agentcore/lib/secrets/cipher.py +70 -0
  371. agentcore/lib/secrets/key_provider.py +163 -0
  372. agentcore/lib/secrets/sensitive_keys.py +55 -0
  373. agentcore/lib/time_constants.py +4 -0
  374. agentcore/lib/utils/__init__.py +47 -0
  375. agentcore/lib/utils/aws_account.py +15 -0
  376. agentcore/lib/utils/credentials.py +68 -0
  377. agentcore/lib/utils/dotenv.py +32 -0
  378. agentcore/lib/utils/env.py +105 -0
  379. agentcore/lib/utils/json_format.py +29 -0
  380. agentcore/lib/utils/json_rpc.py +22 -0
  381. agentcore/lib/utils/platform.py +33 -0
  382. agentcore/lib/utils/polling.py +86 -0
  383. agentcore/lib/utils/subprocess.py +135 -0
  384. agentcore/lib/utils/time_parser.py +48 -0
  385. agentcore/lib/utils/validation.py +106 -0
  386. agentcore/logging/__init__.py +10 -0
  387. agentcore/logging/_common.py +77 -0
  388. agentcore/logging/cdk_io_host.py +36 -0
  389. agentcore/logging/create_logger.py +107 -0
  390. agentcore/logging/dev_logger.py +63 -0
  391. agentcore/logging/exec_logger.py +159 -0
  392. agentcore/logging/invoke_logger.py +154 -0
  393. agentcore/logging/remove_logger.py +95 -0
  394. agentcore/operations/__init__.py +0 -0
  395. agentcore/operations/agent/__init__.py +0 -0
  396. agentcore/operations/agent/config_bundle_defaults.py +31 -0
  397. agentcore/operations/agent/generate/__init__.py +28 -0
  398. agentcore/operations/agent/generate/schema_mapper.py +319 -0
  399. agentcore/operations/agent/generate/types.py +172 -0
  400. agentcore/operations/agent/generate/write_agent_to_project.py +67 -0
  401. agentcore/operations/agent/import_/__init__.py +31 -0
  402. agentcore/operations/agent/import_/base_translator.py +449 -0
  403. agentcore/operations/agent/import_/constants.py +23 -0
  404. agentcore/operations/agent/import_/execute.py +127 -0
  405. agentcore/operations/agent/import_/langgraph_translator.py +294 -0
  406. agentcore/operations/agent/import_/pyproject_generator.py +73 -0
  407. agentcore/operations/agent/import_/strands_translator.py +289 -0
  408. agentcore/operations/config_bundle/__init__.py +1 -0
  409. agentcore/operations/config_bundle/bundle_name_variants.py +9 -0
  410. agentcore/operations/config_bundle/diff_versions.py +52 -0
  411. agentcore/operations/config_bundle/resolve_bundle.py +65 -0
  412. agentcore/operations/connectors/__init__.py +3 -0
  413. agentcore/operations/connectors/translators.py +63 -0
  414. agentcore/operations/dataset/__init__.py +21 -0
  415. agentcore/operations/dataset/delete.py +7 -0
  416. agentcore/operations/dataset/publish.py +16 -0
  417. agentcore/operations/dataset/pull.py +21 -0
  418. agentcore/operations/dataset/push.py +201 -0
  419. agentcore/operations/dataset/resolve_dataset.py +65 -0
  420. agentcore/operations/dataset/status.py +18 -0
  421. agentcore/operations/dataset/wait.py +25 -0
  422. agentcore/operations/deploy/__init__.py +152 -0
  423. agentcore/operations/deploy/backfill_vpc_id.py +90 -0
  424. agentcore/operations/deploy/change_detection.py +84 -0
  425. agentcore/operations/deploy/constants.py +58 -0
  426. agentcore/operations/deploy/dependency_sync.py +105 -0
  427. agentcore/operations/deploy/ensure_target.py +30 -0
  428. agentcore/operations/deploy/gateway_status.py +44 -0
  429. agentcore/operations/deploy/managed_memory_notice.py +36 -0
  430. agentcore/operations/deploy/payment_connector_authorization.py +106 -0
  431. agentcore/operations/deploy/post_deploy_datasets.py +96 -0
  432. agentcore/operations/deploy/post_deploy_knowledge_bases.py +104 -0
  433. agentcore/operations/deploy/post_deploy_observability.py +28 -0
  434. agentcore/operations/deploy/post_deploy_online_evals.py +60 -0
  435. agentcore/operations/deploy/pre_deploy_identity.py +505 -0
  436. agentcore/operations/deploy/preflight.py +385 -0
  437. agentcore/operations/deploy/region_override.py +45 -0
  438. agentcore/operations/deploy/teardown.py +153 -0
  439. agentcore/operations/dev/__init__.py +61 -0
  440. agentcore/operations/dev/_http.py +79 -0
  441. agentcore/operations/dev/_server.py +165 -0
  442. agentcore/operations/dev/codezip_dev_server.py +151 -0
  443. agentcore/operations/dev/config.py +128 -0
  444. agentcore/operations/dev/constants.py +9 -0
  445. agentcore/operations/dev/container_dev_server.py +237 -0
  446. agentcore/operations/dev/container_runtime.py +37 -0
  447. agentcore/operations/dev/dev_server.py +244 -0
  448. agentcore/operations/dev/gateway_env.py +25 -0
  449. agentcore/operations/dev/invoke.py +214 -0
  450. agentcore/operations/dev/invoke_a2a.py +204 -0
  451. agentcore/operations/dev/invoke_agui.py +88 -0
  452. agentcore/operations/dev/invoke_mcp.py +145 -0
  453. agentcore/operations/dev/invoke_types.py +30 -0
  454. agentcore/operations/dev/load_dev_env.py +26 -0
  455. agentcore/operations/dev/memory_env.py +19 -0
  456. agentcore/operations/dev/otel/__init__.py +5 -0
  457. agentcore/operations/dev/otel/collector.py +234 -0
  458. agentcore/operations/dev/otel/transforms.py +331 -0
  459. agentcore/operations/dev/payment_env.py +50 -0
  460. agentcore/operations/dev/server.py +28 -0
  461. agentcore/operations/dev/sse_transform.py +30 -0
  462. agentcore/operations/dev/utils.py +152 -0
  463. agentcore/operations/dev/web_ui/__init__.py +31 -0
  464. agentcore/operations/dev/web_ui/constants.py +25 -0
  465. agentcore/operations/dev/web_ui/handlers/__init__.py +36 -0
  466. agentcore/operations/dev/web_ui/handlers/_common.py +36 -0
  467. agentcore/operations/dev/web_ui/handlers/_deployed.py +37 -0
  468. agentcore/operations/dev/web_ui/handlers/a2a_proxy.py +37 -0
  469. agentcore/operations/dev/web_ui/handlers/cloudwatch_traces.py +71 -0
  470. agentcore/operations/dev/web_ui/handlers/harness_invocation.py +89 -0
  471. agentcore/operations/dev/web_ui/handlers/harness_utils.py +95 -0
  472. agentcore/operations/dev/web_ui/handlers/invocations.py +327 -0
  473. agentcore/operations/dev/web_ui/handlers/mcp_proxy.py +119 -0
  474. agentcore/operations/dev/web_ui/handlers/memory.py +84 -0
  475. agentcore/operations/dev/web_ui/handlers/resources.py +351 -0
  476. agentcore/operations/dev/web_ui/handlers/start.py +182 -0
  477. agentcore/operations/dev/web_ui/handlers/status.py +25 -0
  478. agentcore/operations/dev/web_ui/handlers/traces.py +50 -0
  479. agentcore/operations/dev/web_ui/run_web_ui.py +60 -0
  480. agentcore/operations/dev/web_ui/web_server.py +297 -0
  481. agentcore/operations/eval/__init__.py +8 -0
  482. agentcore/operations/eval/list_eval_runs.py +18 -0
  483. agentcore/operations/eval/logs_eval.py +119 -0
  484. agentcore/operations/eval/pause_resume.py +90 -0
  485. agentcore/operations/eval/run_eval.py +354 -0
  486. agentcore/operations/eval/shared/__init__.py +0 -0
  487. agentcore/operations/eval/shared/dataset_loader.py +68 -0
  488. agentcore/operations/eval/shared/dataset_session_provider.py +122 -0
  489. agentcore/operations/eval/shared/evaluator_runner.py +89 -0
  490. agentcore/operations/eval/shared/scenario_executor.py +71 -0
  491. agentcore/operations/eval/shared/span_collector.py +255 -0
  492. agentcore/operations/eval/storage.py +67 -0
  493. agentcore/operations/feedback/__init__.py +21 -0
  494. agentcore/operations/feedback/aperture_client.py +98 -0
  495. agentcore/operations/feedback/build_payload.py +97 -0
  496. agentcore/operations/feedback/constants.py +26 -0
  497. agentcore/operations/feedback/submit_feedback.py +150 -0
  498. agentcore/operations/fetch_access/__init__.py +36 -0
  499. agentcore/operations/fetch_access/_target.py +17 -0
  500. agentcore/operations/fetch_access/fetch_gateway_token.py +75 -0
  501. agentcore/operations/fetch_access/fetch_harness_token.py +72 -0
  502. agentcore/operations/fetch_access/fetch_runtime_token.py +76 -0
  503. agentcore/operations/fetch_access/list_agents.py +18 -0
  504. agentcore/operations/fetch_access/list_gateways.py +26 -0
  505. agentcore/operations/fetch_access/list_harnesses.py +23 -0
  506. agentcore/operations/fetch_access/oauth_token.py +162 -0
  507. agentcore/operations/fetch_access/types.py +34 -0
  508. agentcore/operations/harness/__init__.py +1 -0
  509. agentcore/operations/harness/orphan.py +84 -0
  510. agentcore/operations/harness/skill_utils.py +56 -0
  511. agentcore/operations/identity/__init__.py +33 -0
  512. agentcore/operations/identity/api_key_credential_provider.py +68 -0
  513. agentcore/operations/identity/oauth2_credential_provider.py +95 -0
  514. agentcore/operations/ingest/__init__.py +184 -0
  515. agentcore/operations/init/__init__.py +3 -0
  516. agentcore/operations/init/files.py +59 -0
  517. agentcore/operations/insights/__init__.py +21 -0
  518. agentcore/operations/insights/insights_storage.py +67 -0
  519. agentcore/operations/insights/run_insights.py +148 -0
  520. agentcore/operations/invoke/__init__.py +5 -0
  521. agentcore/operations/invoke/resolve_agent_context.py +85 -0
  522. agentcore/operations/jobs/__init__.py +38 -0
  523. agentcore/operations/jobs/ab_test/__init__.py +0 -0
  524. agentcore/operations/jobs/ab_test/build_options.py +126 -0
  525. agentcore/operations/jobs/ab_test/format.py +121 -0
  526. agentcore/operations/jobs/ab_test/handler.py +412 -0
  527. agentcore/operations/jobs/ab_test/promote.py +142 -0
  528. agentcore/operations/jobs/ab_test/resolve.py +221 -0
  529. agentcore/operations/jobs/batch_evaluation/__init__.py +0 -0
  530. agentcore/operations/jobs/batch_evaluation/build_source.py +68 -0
  531. agentcore/operations/jobs/batch_evaluation/dataset_phase1.py +95 -0
  532. agentcore/operations/jobs/batch_evaluation/format.py +58 -0
  533. agentcore/operations/jobs/batch_evaluation/handler.py +203 -0
  534. agentcore/operations/jobs/insights/__init__.py +0 -0
  535. agentcore/operations/jobs/insights/format.py +65 -0
  536. agentcore/operations/jobs/insights/handler.py +178 -0
  537. agentcore/operations/jobs/recommendation/__init__.py +0 -0
  538. agentcore/operations/jobs/recommendation/apply_to_bundle.py +76 -0
  539. agentcore/operations/jobs/recommendation/build_config.py +271 -0
  540. agentcore/operations/jobs/recommendation/fetch_session_spans.py +93 -0
  541. agentcore/operations/jobs/recommendation/format.py +77 -0
  542. agentcore/operations/jobs/recommendation/handler.py +331 -0
  543. agentcore/operations/jobs/shared/__init__.py +0 -0
  544. agentcore/operations/jobs/shared/constants.py +85 -0
  545. agentcore/operations/jobs/shared/engine.py +187 -0
  546. agentcore/operations/jobs/shared/format.py +104 -0
  547. agentcore/operations/jobs/shared/region.py +34 -0
  548. agentcore/operations/jobs/shared/resolve_agent_state.py +30 -0
  549. agentcore/operations/jobs/shared/storage.py +117 -0
  550. agentcore/operations/jobs/shared/wait.py +30 -0
  551. agentcore/operations/knowledge_base/__init__.py +33 -0
  552. agentcore/operations/knowledge_base/connector_config.py +105 -0
  553. agentcore/operations/knowledge_base/hydrate_data_sources.py +59 -0
  554. agentcore/operations/mcp/__init__.py +4 -0
  555. agentcore/operations/memory/__init__.py +13 -0
  556. agentcore/operations/memory/_records.py +72 -0
  557. agentcore/operations/memory/list_memory_records.py +45 -0
  558. agentcore/operations/memory/retrieve_memory_records.py +52 -0
  559. agentcore/operations/node/__init__.py +15 -0
  560. agentcore/operations/node/setup.py +36 -0
  561. agentcore/operations/python/__init__.py +17 -0
  562. agentcore/operations/python/setup.py +47 -0
  563. agentcore/operations/resolve_agent.py +159 -0
  564. agentcore/operations/session/__init__.py +86 -0
  565. agentcore/operations/traces/__init__.py +29 -0
  566. agentcore/operations/traces/get_trace.py +202 -0
  567. agentcore/operations/traces/insights_query.py +74 -0
  568. agentcore/operations/traces/list_traces.py +46 -0
  569. agentcore/operations/traces/trace_url.py +25 -0
  570. agentcore/operations/traces/types.py +55 -0
  571. agentcore/primitives/__init__.py +0 -0
  572. agentcore/primitives/_gateway_target_wizard.py +293 -0
  573. agentcore/primitives/_gateway_validation.py +442 -0
  574. agentcore/primitives/_harness_cli.py +557 -0
  575. agentcore/primitives/_harness_validation.py +163 -0
  576. agentcore/primitives/_harness_wizard.py +726 -0
  577. agentcore/primitives/_knowledge_base_wizard.py +259 -0
  578. agentcore/primitives/_payment_wizard.py +331 -0
  579. agentcore/primitives/_policy_form.py +160 -0
  580. agentcore/primitives/agent.py +817 -0
  581. agentcore/primitives/auth_utils.py +77 -0
  582. agentcore/primitives/base.py +178 -0
  583. agentcore/primitives/capacity_provider.py +501 -0
  584. agentcore/primitives/config_bundle.py +329 -0
  585. agentcore/primitives/credential.py +387 -0
  586. agentcore/primitives/credential_utils.py +45 -0
  587. agentcore/primitives/dataset.py +211 -0
  588. agentcore/primitives/deployed_gateways.py +34 -0
  589. agentcore/primitives/evaluator.py +909 -0
  590. agentcore/primitives/gateway.py +496 -0
  591. agentcore/primitives/gateway_target.py +988 -0
  592. agentcore/primitives/harness.py +706 -0
  593. agentcore/primitives/knowledge_base.py +477 -0
  594. agentcore/primitives/memory.py +387 -0
  595. agentcore/primitives/online_eval_config.py +365 -0
  596. agentcore/primitives/online_insights.py +275 -0
  597. agentcore/primitives/payment_connector.py +427 -0
  598. agentcore/primitives/payment_eligible.py +20 -0
  599. agentcore/primitives/payment_manager.py +605 -0
  600. agentcore/primitives/payment_validation.py +68 -0
  601. agentcore/primitives/policy.py +622 -0
  602. agentcore/primitives/policy_engine.py +358 -0
  603. agentcore/primitives/registry.py +56 -0
  604. agentcore/primitives/runtime_endpoint.py +361 -0
  605. agentcore/primitives/secret_flag_warning.py +17 -0
  606. agentcore/schema/__init__.py +14 -0
  607. agentcore/schema/_zod.py +395 -0
  608. agentcore/schema/constants.py +306 -0
  609. agentcore/schema/schemas/__init__.py +40 -0
  610. agentcore/schema/schemas/agent_env.py +545 -0
  611. agentcore/schema/schemas/agentcore_project.py +530 -0
  612. agentcore/schema/schemas/auth.py +286 -0
  613. agentcore/schema/schemas/aws_targets.py +72 -0
  614. agentcore/schema/schemas/connections.py +187 -0
  615. agentcore/schema/schemas/deployed_state.py +322 -0
  616. agentcore/schema/schemas/mcp.py +650 -0
  617. agentcore/schema/schemas/mcp_defs.py +54 -0
  618. agentcore/schema/schemas/primitives/__init__.py +52 -0
  619. agentcore/schema/schemas/primitives/ab_test.py +162 -0
  620. agentcore/schema/schemas/primitives/capacity_provider.py +214 -0
  621. agentcore/schema/schemas/primitives/config_bundle.py +48 -0
  622. agentcore/schema/schemas/primitives/dataset.py +55 -0
  623. agentcore/schema/schemas/primitives/evaluator.py +171 -0
  624. agentcore/schema/schemas/primitives/harness.py +710 -0
  625. agentcore/schema/schemas/primitives/knowledge_base.py +90 -0
  626. agentcore/schema/schemas/primitives/memory.py +113 -0
  627. agentcore/schema/schemas/primitives/online_eval_config.py +77 -0
  628. agentcore/schema/schemas/primitives/payment.py +114 -0
  629. agentcore/schema/schemas/primitives/policy.py +83 -0
  630. agentcore/schema/schemas/primitives/tags.py +50 -0
  631. agentcore/schema/schemas/zod_util.py +5 -0
  632. agentcore/schema/types/__init__.py +3 -0
  633. agentcore/schema/types/path.py +16 -0
  634. agentcore/templates/__init__.py +115 -0
  635. agentcore/templates/_handlebars.py +782 -0
  636. agentcore/templates/_js.py +164 -0
  637. agentcore/templates/base_renderer.py +107 -0
  638. agentcore/templates/cdk_renderer.py +129 -0
  639. agentcore/templates/evaluator_renderer.py +39 -0
  640. agentcore/templates/gateway_target_renderer.py +69 -0
  641. agentcore/templates/llm_context/README.md +16 -0
  642. agentcore/templates/llm_context/agentcore.ts +685 -0
  643. agentcore/templates/llm_context/aws-targets.ts +51 -0
  644. agentcore/templates/profiles.py +151 -0
  645. agentcore/templates/render.py +92 -0
  646. agentcore/templates/renderers.py +83 -0
  647. agentcore/templates/schema_assets.py +23 -0
  648. agentcore/templates/template_root.py +28 -0
  649. agentcore/templates/types.py +192 -0
  650. agentcore_cli-0.31.1.dist-info/METADATA +84 -0
  651. agentcore_cli-0.31.1.dist-info/RECORD +655 -0
  652. agentcore_cli-0.31.1.dist-info/WHEEL +4 -0
  653. agentcore_cli-0.31.1.dist-info/entry_points.txt +2 -0
  654. agentcore_cli-0.31.1.dist-info/licenses/LICENSE +175 -0
  655. agentcore_cli-0.31.1.dist-info/licenses/NOTICE +88 -0
@@ -0,0 +1,817 @@
1
+ """Agent add/remove (port of src/cli/primitives/AgentPrimitive.tsx).
2
+
3
+ Three add paths, as upstream: ``create`` (render a framework template), ``byo`` (register existing
4
+ code) and ``import`` (translate a Bedrock Agent). The interactive wizard (``add_interactive``) ports
5
+ tui/screens/agent/AddAgentScreen + the generate wizard and feeds the same paths.
6
+ """
7
+
8
+ import json
9
+ import os
10
+ import shutil
11
+ from dataclasses import dataclass, field
12
+ from typing import Any
13
+
14
+ import typer
15
+
16
+ from agentcore.cli import interactive
17
+ from agentcore.cli.commands.add.validate import validate_add_agent_options
18
+ from agentcore.cli.commands.shared.header_utils import parse_and_normalize_headers
19
+ from agentcore.cli.commands.shared.vpc_utils import VPC_ENDPOINT_WARNING, parse_comma_separated_list
20
+ from agentcore.cli.errors import get_error_message
21
+ from agentcore.cli.run_command import run_cli_command
22
+ from agentcore.lib import (
23
+ APP_DIR,
24
+ ConfigIO,
25
+ ConflictError,
26
+ NoProjectError,
27
+ ResourceNotFoundError,
28
+ ValidationError,
29
+ find_config_root,
30
+ serialize_result,
31
+ set_env_var,
32
+ )
33
+ from agentcore.lib.errors.types import to_error
34
+ from agentcore.lib.result import Err, Ok
35
+ from agentcore.lib.schemas.io.config_io import to_jsonable
36
+ from agentcore.operations.agent.config_bundle_defaults import create_config_bundle_for_agent
37
+ from agentcore.operations.agent.generate import (
38
+ GenerateConfig,
39
+ map_generate_config_to_render_config,
40
+ map_model_provider_to_credentials,
41
+ write_agent_to_project,
42
+ )
43
+ from agentcore.operations.python import setup_python_project
44
+ from agentcore.primitives.auth_utils import (
45
+ JwtConfigOptions,
46
+ build_authorizer_config_from_jwt_config,
47
+ create_managed_oauth_credential,
48
+ )
49
+ from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange, emit_json
50
+ from agentcore.primitives.credential import CredentialPrimitive
51
+ from agentcore.primitives.credential_utils import compute_default_credential_env_var_name
52
+ from agentcore.schema import (
53
+ CREDENTIAL_PROVIDERS,
54
+ DEFAULT_PYTHON_VERSION,
55
+ LIFECYCLE_TIMEOUT_MAX,
56
+ LIFECYCLE_TIMEOUT_MIN,
57
+ is_capacity_provider_arn,
58
+ )
59
+ from agentcore.templates import RendererContext, create_renderer, template_needs_python_venv
60
+
61
+ _HEADER_ALLOWLIST_HELP = (
62
+ "Comma-separated list of header names to allow. X-prefixed names (e.g. Authorization, X-Api-Key, "
63
+ "X-Custom-Signature) pass through unchanged; bare names without X- prefix are auto-prefixed with "
64
+ "X-Amzn-Bedrock-AgentCore-Runtime-Custom- for backward compatibility. [non-interactive]"
65
+ )
66
+
67
+
68
+ def _split_csv(value: str | None) -> list[str] | None:
69
+ if not value:
70
+ return None
71
+ return [s.strip() for s in value.split(",") if s.strip()]
72
+
73
+
74
+ @dataclass
75
+ class AddAgentOptions:
76
+ """Options for adding an agent (upstream AddAgentOptions; mounts are camelCase dicts)."""
77
+
78
+ name: str
79
+ type: str = "create"
80
+ build_type: str = "CodeZip"
81
+ language: str = "Python"
82
+ framework: str = "Strands"
83
+ model_provider: str = "Bedrock"
84
+ api_key: str | None = None
85
+ memory: str | None = None
86
+ protocol: str | None = None
87
+ request_header_allowlist: list[str] | None = None
88
+ code_location: str | None = None
89
+ entrypoint: str | None = None
90
+ dockerfile: str | None = None
91
+ bedrock_agent_id: str | None = None
92
+ bedrock_alias_id: str | None = None
93
+ bedrock_region: str | None = None
94
+ network_mode: str | None = None
95
+ subnets: str | None = None
96
+ security_groups: str | None = None
97
+ vpc_id: str | None = None
98
+ authorizer_type: str | None = None
99
+ discovery_url: str | None = None
100
+ allowed_audience: str | None = None
101
+ allowed_clients: str | None = None
102
+ allowed_scopes: str | None = None
103
+ custom_claims: list[Any] | None = None
104
+ client_id: str | None = None
105
+ client_secret: str | None = None
106
+ # Set by the interactive wizard (carries client credentials and private endpoints).
107
+ jwt_config: JwtConfigOptions | None = None
108
+ idle_timeout: int | None = None
109
+ max_lifetime: int | None = None
110
+ session_storage_mount_path: str | None = None
111
+ efs_access_points: list[dict[str, Any]] = field(default_factory=list)
112
+ s3_access_points: list[dict[str, Any]] = field(default_factory=list)
113
+ capacity_provider: str | None = None
114
+ capacity_provider_volumes: list[dict[str, Any]] = field(default_factory=list)
115
+ with_config_bundle: bool | None = None
116
+
117
+
118
+ def _jwt_config(options: AddAgentOptions, include_client: bool) -> JwtConfigOptions | None:
119
+ if options.jwt_config is not None:
120
+ return options.jwt_config
121
+ if options.authorizer_type != "CUSTOM_JWT" or not options.discovery_url:
122
+ return None
123
+ return JwtConfigOptions(
124
+ discovery_url=options.discovery_url,
125
+ allowed_audience=_split_csv(options.allowed_audience),
126
+ allowed_clients=_split_csv(options.allowed_clients),
127
+ allowed_scopes=_split_csv(options.allowed_scopes),
128
+ custom_claims=options.custom_claims,
129
+ client_id=options.client_id if include_client else None,
130
+ client_secret=options.client_secret if include_client else None,
131
+ )
132
+
133
+
134
+ def build_capacity_provider_configuration(value: str | None) -> dict[str, Any] | None:
135
+ """`arn:` prefix -> external CP by ARN; anything else -> in-project sibling by name."""
136
+ if not value:
137
+ return None
138
+ return {"capacityProviderArn": value} if is_capacity_provider_arn(value) else {"capacityProviderName": value}
139
+
140
+
141
+ def _copy_dockerfile(project_root: str, dockerfile: str | None, dest_dir: str) -> str | None:
142
+ """A Dockerfile given as a path is copied into the agent directory; returns the file name."""
143
+ if not dockerfile or "/" not in dockerfile:
144
+ return dockerfile
145
+ source = os.path.abspath(os.path.join(project_root, dockerfile))
146
+ if not os.path.exists(source):
147
+ raise Exception(f"Dockerfile not found at {source}")
148
+ os.makedirs(dest_dir, exist_ok=True)
149
+ shutil.copyfile(source, os.path.join(dest_dir, os.path.basename(source)))
150
+ return os.path.basename(source)
151
+
152
+
153
+ class AgentPrimitive(BasePrimitive):
154
+ kind = "agent"
155
+ label = "Agent"
156
+ article = "an"
157
+
158
+ def __init__(self, config_io: ConfigIO | None = None):
159
+ super().__init__(config_io)
160
+ self.credential_primitive = CredentialPrimitive()
161
+
162
+ # --- add ----------------------------------------------------------------------------
163
+
164
+ def add(self, options: AddAgentOptions, config_base_dir: str | None = None) -> Ok[dict[str, Any]] | Err[Exception]:
165
+ try:
166
+ base_dir = config_base_dir or find_config_root()
167
+ if not base_dir:
168
+ return Err(NoProjectError())
169
+ config_io = ConfigIO(base_dir=base_dir)
170
+ if not config_io.config_exists("project"):
171
+ return Err(NoProjectError())
172
+ project = to_jsonable(config_io.read_project_spec())
173
+ if any(r["name"] == options.name for r in project["runtimes"]):
174
+ return Err(
175
+ ConflictError(
176
+ f'Agent "{options.name}" already exists. To update its configuration, edit '
177
+ "agentcore/agentcore.json directly."
178
+ )
179
+ )
180
+ if options.type == "import":
181
+ return self.handle_import_path(options, base_dir)
182
+ if options.type == "byo":
183
+ return self.handle_byo_path(options, base_dir)
184
+ return self.handle_create_path(options, base_dir)
185
+ except Exception as exc: # noqa: BLE001
186
+ return Err(to_error(exc))
187
+
188
+ def to_generate_config(self, options: AddAgentOptions) -> GenerateConfig:
189
+ return GenerateConfig(
190
+ project_name=options.name,
191
+ build_type=options.build_type,
192
+ dockerfile=options.dockerfile,
193
+ sdk=options.framework,
194
+ model_provider=options.model_provider,
195
+ api_key=options.api_key,
196
+ memory=options.memory or "none",
197
+ language=options.language,
198
+ protocol=options.protocol or "HTTP",
199
+ network_mode=options.network_mode,
200
+ subnets=parse_comma_separated_list(options.subnets),
201
+ security_groups=parse_comma_separated_list(options.security_groups),
202
+ vpc_id=options.vpc_id,
203
+ authorizer_type=options.authorizer_type,
204
+ jwt_config=_jwt_config(options, include_client=False) if options.authorizer_type == "CUSTOM_JWT" else None,
205
+ request_header_allowlist=options.request_header_allowlist,
206
+ idle_runtime_session_timeout=options.idle_timeout,
207
+ max_lifetime=options.max_lifetime,
208
+ session_storage_mount_path=options.session_storage_mount_path,
209
+ efs_access_points=list(options.efs_access_points),
210
+ s3_access_points=list(options.s3_access_points),
211
+ capacity_provider_configuration=build_capacity_provider_configuration(options.capacity_provider),
212
+ capacity_provider_volumes=list(options.capacity_provider_volumes),
213
+ with_config_bundle=options.with_config_bundle,
214
+ )
215
+
216
+ def handle_create_path(self, options: AddAgentOptions, config_base_dir: str) -> Ok[dict[str, Any]]:
217
+ """Render the framework template into app/<name>/ and register it."""
218
+ project_root = os.path.dirname(config_base_dir)
219
+ config_io = ConfigIO(base_dir=config_base_dir)
220
+ project = to_jsonable(config_io.read_project_spec())
221
+ generate_config = self.to_generate_config(options)
222
+ agent_path = os.path.join(project_root, APP_DIR, options.name)
223
+
224
+ strategy = None
225
+ identity_providers = []
226
+ if options.protocol != "MCP" and options.model_provider != "Bedrock":
227
+ strategy = self.credential_primitive.resolve_credential_strategy(
228
+ project["name"],
229
+ options.name,
230
+ options.model_provider,
231
+ options.api_key,
232
+ config_base_dir,
233
+ project["credentials"],
234
+ )
235
+ from agentcore.templates import IdentityProviderRenderConfig
236
+
237
+ identity_providers = [
238
+ IdentityProviderRenderConfig(name=strategy.credential_name, env_var_name=strategy.env_var_name)
239
+ ]
240
+
241
+ render_config = map_generate_config_to_render_config(generate_config, identity_providers, config_base_dir)
242
+ create_renderer(render_config).render(RendererContext(output_dir=project_root))
243
+
244
+ # Wizard only: a Dockerfile path is copied over the template default.
245
+ generate_config.dockerfile = _copy_dockerfile(project_root, generate_config.dockerfile, agent_path)
246
+
247
+ if strategy is not None:
248
+ write_agent_to_project(generate_config, config_base_dir=config_base_dir, credential_strategy=strategy)
249
+ # Always write the env var (empty when skipped) so users can find and fill it in.
250
+ env_var_name = strategy.env_var_name or compute_default_credential_env_var_name(
251
+ f"{project['name']}{options.model_provider}"
252
+ )
253
+ set_env_var(env_var_name, options.api_key or "", config_base_dir)
254
+ else:
255
+ write_agent_to_project(generate_config, config_base_dir=config_base_dir)
256
+
257
+ jwt = options.jwt_config
258
+ if options.authorizer_type == "CUSTOM_JWT" and jwt and jwt.client_id and jwt.client_secret:
259
+ create_managed_oauth_credential(
260
+ options.name, jwt, config_io.write_project_spec, config_io.read_project_spec, config_base_dir
261
+ )
262
+
263
+ if options.language == "Python" and template_needs_python_venv(options.framework):
264
+ setup_python_project(agent_path)
265
+
266
+ if options.with_config_bundle:
267
+ create_config_bundle_for_agent(options.name, config_base_dir)
268
+
269
+ return Ok({"agentName": options.name, "agentPath": agent_path})
270
+
271
+ def handle_import_path(self, options: AddAgentOptions, config_base_dir: str) -> Ok[Any] | Err[Exception]:
272
+ from agentcore.operations.agent.import_ import ExecuteImportAgentParams, execute_import_agent
273
+
274
+ jwt = _jwt_config(options, include_client=True)
275
+ return execute_import_agent(
276
+ ExecuteImportAgentParams(
277
+ name=options.name,
278
+ framework=options.framework,
279
+ memory=options.memory or "none",
280
+ bedrock_region=options.bedrock_region or "",
281
+ bedrock_agent_id=options.bedrock_agent_id or "",
282
+ bedrock_alias_id=options.bedrock_alias_id or "",
283
+ config_base_dir=config_base_dir,
284
+ authorizer_type=options.authorizer_type if options.jwt_config else None,
285
+ jwt_config=jwt if options.jwt_config else None,
286
+ idle_timeout=options.idle_timeout,
287
+ max_lifetime=options.max_lifetime,
288
+ session_storage_mount_path=options.session_storage_mount_path,
289
+ efs_access_points=list(options.efs_access_points),
290
+ s3_access_points=list(options.s3_access_points),
291
+ capacity_provider_configuration=build_capacity_provider_configuration(options.capacity_provider),
292
+ capacity_provider_volumes=list(options.capacity_provider_volumes),
293
+ )
294
+ )
295
+
296
+ def map_byo_agent(self, options: AddAgentOptions, code_location: str) -> dict[str, Any]:
297
+ protocol = options.protocol or "HTTP"
298
+ cp_config = build_capacity_provider_configuration(options.capacity_provider)
299
+ # A capacity provider supplies its own network topology: no networkMode/networkConfig then.
300
+ network_mode = None if cp_config else (options.network_mode or "PUBLIC")
301
+ subnets = parse_comma_separated_list(options.subnets)
302
+ security_groups = parse_comma_separated_list(options.security_groups)
303
+ jwt = _jwt_config(options, include_client=False)
304
+
305
+ agent: dict[str, Any] = {"name": options.name, "build": options.build_type}
306
+ if options.dockerfile:
307
+ agent["dockerfile"] = options.dockerfile
308
+ agent["entrypoint"] = options.entrypoint or "main.py"
309
+ agent["codeLocation"] = code_location
310
+ agent["runtimeVersion"] = DEFAULT_PYTHON_VERSION
311
+ agent["protocol"] = protocol
312
+ if network_mode is not None:
313
+ agent["networkMode"] = network_mode
314
+ if network_mode == "VPC" and subnets and security_groups:
315
+ network_config: dict[str, Any] = {"subnets": subnets, "securityGroups": security_groups}
316
+ if options.vpc_id:
317
+ network_config["vpcId"] = options.vpc_id
318
+ agent["networkConfig"] = network_config
319
+ if protocol == "MCP":
320
+ agent["instrumentation"] = {"enableOtel": False}
321
+ if options.request_header_allowlist:
322
+ agent["requestHeaderAllowlist"] = options.request_header_allowlist
323
+ if options.authorizer_type:
324
+ agent["authorizerType"] = options.authorizer_type
325
+ if options.authorizer_type == "CUSTOM_JWT" and jwt:
326
+ agent["authorizerConfiguration"] = build_authorizer_config_from_jwt_config(jwt)
327
+ if options.idle_timeout is not None or options.max_lifetime is not None:
328
+ lifecycle: dict[str, Any] = {}
329
+ if options.idle_timeout is not None:
330
+ lifecycle["idleRuntimeSessionTimeout"] = options.idle_timeout
331
+ if options.max_lifetime is not None:
332
+ lifecycle["maxLifetime"] = options.max_lifetime
333
+ agent["lifecycleConfiguration"] = lifecycle
334
+ if cp_config:
335
+ agent["capacityProviderConfiguration"] = cp_config
336
+ from agentcore.cli.commands.shared.filesystem_utils import build_filesystem_configurations
337
+
338
+ agent.update(
339
+ build_filesystem_configurations(
340
+ options.session_storage_mount_path,
341
+ list(options.efs_access_points),
342
+ list(options.s3_access_points),
343
+ list(options.capacity_provider_volumes),
344
+ )
345
+ )
346
+ return agent
347
+
348
+ def handle_byo_path(self, options: AddAgentOptions, config_base_dir: str) -> Ok[dict[str, Any]]:
349
+ """Register existing code at --code-location (the directory is created if missing)."""
350
+ raw_location = options.code_location or ""
351
+ code_location = raw_location if raw_location.endswith("/") else f"{raw_location}/"
352
+ project_root = os.path.dirname(config_base_dir)
353
+ code_dir = os.path.join(project_root, code_location.rstrip("/"))
354
+ os.makedirs(code_dir, exist_ok=True)
355
+ options.dockerfile = _copy_dockerfile(project_root, options.dockerfile, code_dir)
356
+
357
+ config_io = ConfigIO(base_dir=config_base_dir)
358
+ project = to_jsonable(config_io.read_project_spec())
359
+ project["runtimes"].append(self.map_byo_agent(options, code_location))
360
+
361
+ env_update: tuple[str, str] | None = None
362
+ if options.protocol != "MCP" and options.model_provider != "Bedrock":
363
+ strategy = self.credential_primitive.resolve_credential_strategy(
364
+ project["name"],
365
+ options.name,
366
+ options.model_provider,
367
+ options.api_key,
368
+ config_base_dir,
369
+ project["credentials"],
370
+ )
371
+ if not strategy.reuse:
372
+ credentials = map_model_provider_to_credentials(options.model_provider, project["name"])
373
+ if credentials:
374
+ credentials[0]["name"] = strategy.credential_name
375
+ project["credentials"].extend(credentials)
376
+ env_var_name = strategy.env_var_name or compute_default_credential_env_var_name(
377
+ f"{project['name']}{options.model_provider}"
378
+ )
379
+ env_update = (env_var_name, options.api_key or "")
380
+
381
+ config_io.write_project_spec(project)
382
+ if env_update:
383
+ set_env_var(env_update[0], env_update[1], config_base_dir)
384
+
385
+ jwt = options.jwt_config or _jwt_config(options, include_client=True)
386
+ if (
387
+ options.authorizer_type == "CUSTOM_JWT"
388
+ and jwt
389
+ and jwt.client_id
390
+ and jwt.client_secret
391
+ and jwt.discovery_url
392
+ ):
393
+ create_managed_oauth_credential(
394
+ options.name, jwt, config_io.write_project_spec, config_io.read_project_spec, config_base_dir
395
+ )
396
+
397
+ return Ok({"agentName": options.name})
398
+
399
+ # --- remove -------------------------------------------------------------------------
400
+
401
+ def remove(self, name: str) -> Ok[None] | Err[Exception]:
402
+ try:
403
+ config_io = self.config_io
404
+ project = to_jsonable(config_io.read_project_spec())
405
+ index = next((i for i, r in enumerate(project["runtimes"]) if r["name"] == name), -1)
406
+ if index == -1:
407
+ return Err(ResourceNotFoundError(f'Agent "{name}" not found.'))
408
+ # Credentials are preserved for potential reuse.
409
+ project["runtimes"].pop(index)
410
+ config_io.write_project_spec(project)
411
+ return Ok(None)
412
+ except Exception as exc: # noqa: BLE001
413
+ return Err(to_error(exc))
414
+
415
+ def preview_remove(self, name: str) -> RemovalPreview:
416
+ project = to_jsonable(self.config_io.read_project_spec())
417
+ if not any(r["name"] == name for r in project["runtimes"]):
418
+ raise Exception(f'Agent "{name}" not found.')
419
+ after = {**project, "runtimes": [r for r in project["runtimes"] if r["name"] != name]}
420
+ return RemovalPreview(
421
+ [f"Removing agent: {name}"], [], [SchemaChange("agentcore/agentcore.json", project, after)]
422
+ )
423
+
424
+ def get_removable(self) -> list[RemovableResource]:
425
+ try:
426
+ return [RemovableResource(r["name"]) for r in to_jsonable(self.config_io.read_project_spec())["runtimes"]]
427
+ except Exception: # noqa: BLE001
428
+ return []
429
+
430
+ @staticmethod
431
+ def get_agent_scoped_credentials(project_name: str, agent_name: str, credentials: list[Any]) -> list[Any]:
432
+ """Credentials named {projectName}{agentName}{provider}."""
433
+ prefix = f"{project_name}{agent_name}"
434
+ result = []
435
+ for c in credentials:
436
+ name = c["name"] if isinstance(c, dict) else c.name
437
+ if name.startswith(prefix) and name[len(prefix) :] in CREDENTIAL_PROVIDERS:
438
+ result.append(c)
439
+ return result
440
+
441
+ # --- CLI ----------------------------------------------------------------------------
442
+
443
+ def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
444
+ @add_app.command("agent", help="Add an agent to the project")
445
+ def add_agent(
446
+ name: str | None = typer.Option(
447
+ None,
448
+ "--name",
449
+ help="Agent name (start with letter, alphanumeric + underscores, max 48 chars) [non-interactive]",
450
+ ),
451
+ agent_type: str = typer.Option(
452
+ "create", "--type", help="Agent type: create, byo, or import [non-interactive]"
453
+ ),
454
+ build: str | None = typer.Option(
455
+ None, "--build", help="Build type: CodeZip or Container (default: CodeZip) [non-interactive]"
456
+ ),
457
+ language: str | None = typer.Option(
458
+ None,
459
+ "--language",
460
+ help="Language: Python (create), or Python/TypeScript/Other (BYO) [non-interactive]",
461
+ ),
462
+ framework: str | None = typer.Option(
463
+ None,
464
+ "--framework",
465
+ help="Framework: Strands, LangChain_LangGraph, GoogleADK, OpenAIAgents, VercelAI, "
466
+ "BedrockManagedAgents [non-interactive]",
467
+ ),
468
+ model_provider: str | None = typer.Option(
469
+ None, "--model-provider", help="Model provider: Bedrock, Anthropic, OpenAI, Gemini [non-interactive]"
470
+ ),
471
+ api_key: str | None = typer.Option(
472
+ None, "--api-key", help="API key for non-Bedrock providers [non-interactive]"
473
+ ),
474
+ memory: str | None = typer.Option(
475
+ None, "--memory", help="Memory: none, shortTerm, longAndShortTerm (create path only) [non-interactive]"
476
+ ),
477
+ protocol: str | None = typer.Option(
478
+ None, "--protocol", help="Protocol: HTTP, MCP, A2A, AGUI (default: HTTP) [non-interactive]"
479
+ ),
480
+ code_location: str | None = typer.Option(
481
+ None, "--code-location", help="Path to existing code (BYO path only) [non-interactive]"
482
+ ),
483
+ entrypoint: str | None = typer.Option(
484
+ None,
485
+ "--entrypoint",
486
+ help="Entry file relative to code-location (BYO, default: main.py) [non-interactive]",
487
+ ),
488
+ agent_id: str | None = typer.Option(
489
+ None, "--agent-id", help="Bedrock Agent ID (import path only) [non-interactive]"
490
+ ),
491
+ agent_alias_id: str | None = typer.Option(
492
+ None, "--agent-alias-id", help="Bedrock Agent Alias ID (import path only) [non-interactive]"
493
+ ),
494
+ region: str | None = typer.Option(
495
+ None, "--region", help="AWS region for Bedrock Agent (import path only) [non-interactive]"
496
+ ),
497
+ network_mode: str | None = typer.Option(
498
+ None, "--network-mode", help="Network mode (PUBLIC, VPC) [non-interactive]"
499
+ ),
500
+ subnets: str | None = typer.Option(
501
+ None, "--subnets", help="Comma-separated subnet IDs (required for VPC mode) [non-interactive]"
502
+ ),
503
+ security_groups: str | None = typer.Option(
504
+ None,
505
+ "--security-groups",
506
+ help="Comma-separated security group IDs (required for VPC mode) [non-interactive]",
507
+ ),
508
+ vpc_id: str | None = typer.Option(
509
+ None, "--vpc-id", help="VPC ID (required for Container builds with VPC mode) [non-interactive]"
510
+ ),
511
+ authorizer_type: str | None = typer.Option(
512
+ None, "--authorizer-type", help="Inbound auth: AWS_IAM or CUSTOM_JWT [non-interactive]"
513
+ ),
514
+ discovery_url: str | None = typer.Option(
515
+ None, "--discovery-url", help="OIDC discovery URL (for CUSTOM_JWT) [non-interactive]"
516
+ ),
517
+ allowed_audience: str | None = typer.Option(
518
+ None, "--allowed-audience", help="Comma-separated allowed audiences (for CUSTOM_JWT) [non-interactive]"
519
+ ),
520
+ allowed_clients: str | None = typer.Option(
521
+ None, "--allowed-clients", help="Comma-separated allowed client IDs (for CUSTOM_JWT) [non-interactive]"
522
+ ),
523
+ allowed_scopes: str | None = typer.Option(
524
+ None, "--allowed-scopes", help="Comma-separated allowed scopes (for CUSTOM_JWT) [non-interactive]"
525
+ ),
526
+ custom_claims: str | None = typer.Option(
527
+ None,
528
+ "--custom-claims",
529
+ help="Custom claim validations as JSON array (for CUSTOM_JWT) [non-interactive]",
530
+ ),
531
+ client_id: str | None = typer.Option(
532
+ None, "--client-id", help="OAuth client ID for agent bearer token [non-interactive]"
533
+ ),
534
+ client_secret: str | None = typer.Option(
535
+ None, "--client-secret", help="OAuth client secret [non-interactive]"
536
+ ),
537
+ request_header_allowlist: str | None = typer.Option(
538
+ None, "--request-header-allowlist", help=_HEADER_ALLOWLIST_HELP
539
+ ),
540
+ idle_timeout: str | None = typer.Option(
541
+ None,
542
+ "--idle-timeout",
543
+ help=f"Idle session timeout in seconds ({LIFECYCLE_TIMEOUT_MIN}-{LIFECYCLE_TIMEOUT_MAX}) "
544
+ "[non-interactive]",
545
+ ),
546
+ max_lifetime: str | None = typer.Option(
547
+ None,
548
+ "--max-lifetime",
549
+ help=f"Max instance lifetime in seconds ({LIFECYCLE_TIMEOUT_MIN}-{LIFECYCLE_TIMEOUT_MAX}) "
550
+ "[non-interactive]",
551
+ ),
552
+ session_storage_mount_path: str | None = typer.Option(
553
+ None,
554
+ "--session-storage-mount-path",
555
+ help="Absolute mount path for session filesystem storage (e.g. /mnt/session-storage) [non-interactive]",
556
+ ),
557
+ efs_access_point_arn: list[str] = typer.Option(
558
+ [],
559
+ "--efs-access-point-arn",
560
+ help="EFS access point ARN (repeatable, paired with --efs-mount-path) [non-interactive]",
561
+ ),
562
+ efs_mount_path: list[str] = typer.Option(
563
+ [],
564
+ "--efs-mount-path",
565
+ help="EFS mount path (e.g. /mnt/tools, paired with --efs-access-point-arn) [non-interactive]",
566
+ ),
567
+ s3_access_point_arn: list[str] = typer.Option(
568
+ [],
569
+ "--s3-access-point-arn",
570
+ help="S3 Files access point ARN (repeatable, paired with --s3-mount-path) [non-interactive]",
571
+ ),
572
+ s3_mount_path: list[str] = typer.Option(
573
+ [],
574
+ "--s3-mount-path",
575
+ help="S3 Files mount path (e.g. /mnt/datasets, paired with --s3-access-point-arn) [non-interactive]",
576
+ ),
577
+ capacity_provider: str | None = typer.Option(
578
+ None,
579
+ "--capacity-provider",
580
+ help="Attach to a capacity provider — an in-project capacity-provider name or an external CP ARN "
581
+ "[non-interactive]",
582
+ ),
583
+ cp_volume_name: list[str] = typer.Option(
584
+ [],
585
+ "--cp-volume-name",
586
+ help="Capacity provider volume name to mount (repeatable, paired with --cp-volume-mount-path) "
587
+ "[non-interactive]",
588
+ ),
589
+ cp_volume_mount_path: list[str] = typer.Option(
590
+ [],
591
+ "--cp-volume-mount-path",
592
+ help="Capacity provider volume mount path (e.g. /mnt/models, paired with --cp-volume-name) "
593
+ "[non-interactive]",
594
+ ),
595
+ with_config_bundle: bool = typer.Option(
596
+ False,
597
+ "--with-config-bundle",
598
+ help="Create a config bundle wired into the agent template [non-interactive]",
599
+ ),
600
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
601
+ ) -> None:
602
+ if not find_config_root():
603
+ typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
604
+ raise typer.Exit(1)
605
+
606
+ if not (name or framework or as_json):
607
+ try:
608
+ interactive.require_tty()
609
+ self.add_interactive()
610
+ except typer.Exit:
611
+ raise
612
+ except Exception as exc: # noqa: BLE001
613
+ typer.echo(get_error_message(exc), err=True)
614
+ raise typer.Exit(1) from None
615
+ raise typer.Exit(0)
616
+
617
+ cli: dict[str, Any] = {
618
+ "name": name,
619
+ "type": agent_type,
620
+ "build": build,
621
+ "language": language,
622
+ "framework": framework,
623
+ "modelProvider": model_provider,
624
+ "apiKey": api_key,
625
+ "memory": memory,
626
+ "protocol": protocol,
627
+ "codeLocation": code_location,
628
+ "entrypoint": entrypoint,
629
+ "agentId": agent_id,
630
+ "agentAliasId": agent_alias_id,
631
+ "region": region,
632
+ "networkMode": network_mode,
633
+ "subnets": subnets,
634
+ "securityGroups": security_groups,
635
+ "vpcId": vpc_id,
636
+ "authorizerType": authorizer_type,
637
+ "discoveryUrl": discovery_url,
638
+ "allowedAudience": allowed_audience,
639
+ "allowedClients": allowed_clients,
640
+ "allowedScopes": allowed_scopes,
641
+ "customClaims": custom_claims,
642
+ "clientId": client_id,
643
+ "clientSecret": client_secret,
644
+ "requestHeaderAllowlist": request_header_allowlist,
645
+ "idleTimeout": idle_timeout,
646
+ "maxLifetime": max_lifetime,
647
+ "sessionStorageMountPath": session_storage_mount_path,
648
+ "efsAccessPointArn": list(efs_access_point_arn),
649
+ "efsMountPath": list(efs_mount_path),
650
+ "s3AccessPointArn": list(s3_access_point_arn),
651
+ "s3MountPath": list(s3_mount_path),
652
+ "capacityProvider": capacity_provider,
653
+ "cpVolumeName": list(cp_volume_name),
654
+ "cpVolumeMountPath": list(cp_volume_mount_path),
655
+ "withConfigBundle": with_config_bundle or None,
656
+ }
657
+ run_cli_command(as_json, lambda: self._run_add_cli(cli, as_json))
658
+
659
+ self.register_remove_subcommand(remove_app)
660
+
661
+ def _run_add_cli(self, cli: dict[str, Any], as_json: bool) -> None:
662
+ from agentcore.cli.commands.shared import filesystem_utils as fs
663
+
664
+ validation = validate_add_agent_options(cli)
665
+ if not validation.valid:
666
+ raise ValidationError(validation.error or "")
667
+
668
+ efs_arns, efs_paths = cli["efsAccessPointArn"], cli["efsMountPath"]
669
+ s3_arns, s3_paths = cli["s3AccessPointArn"], cli["s3MountPath"]
670
+ efs_pairs = fs.zip_access_point_pairs(efs_arns, efs_paths, "EFS")
671
+ if not efs_pairs.success:
672
+ raise Exception(efs_pairs.error)
673
+ s3_pairs = fs.zip_access_point_pairs(s3_arns, s3_paths, "S3 Files")
674
+ if not s3_pairs.success:
675
+ raise Exception(s3_pairs.error)
676
+ check = fs.validate_access_point_mounts(efs_pairs.mounts, fs.validate_efs_access_point_arn)
677
+ if not check.success:
678
+ raise Exception(check.error)
679
+ check = fs.validate_access_point_mounts(s3_pairs.mounts, fs.validate_s3_files_access_point_arn)
680
+ if not check.success:
681
+ raise Exception(check.error)
682
+ cp_pairs = fs.zip_capacity_provider_volume_pairs(cli["cpVolumeName"], cli["cpVolumeMountPath"])
683
+ if not cp_pairs.success:
684
+ raise Exception(cp_pairs.error)
685
+ check = fs.validate_capacity_provider_volume_mounts(cp_pairs.mounts)
686
+ if not check.success:
687
+ raise Exception(check.error)
688
+ if cp_pairs.mounts and not cli["capacityProvider"]:
689
+ raise Exception(
690
+ "Capacity provider volume mounts (--cp-volume-name / --cp-volume-mount-path) require attaching the "
691
+ "runtime to a capacity provider (--capacity-provider <name-or-arn>)."
692
+ )
693
+ if cli["capacityProvider"] and cli["networkMode"] is not None:
694
+ raise Exception(
695
+ "--network-mode cannot be set when attaching a capacity provider (--capacity-provider) — the "
696
+ "capacity provider supplies the network topology. Remove --network-mode."
697
+ )
698
+ has_byo_fs = bool(efs_arns or s3_arns)
699
+ if has_byo_fs and cli["networkMode"] != "VPC":
700
+ raise Exception(
701
+ "EFS and S3 Files filesystem mounts require VPC network mode. Add --network-mode VPC --subnets <ids> "
702
+ "--security-groups <ids>."
703
+ )
704
+ if has_byo_fs:
705
+ self._validate_filesystem(cli, efs_pairs.mounts, s3_pairs.mounts)
706
+
707
+ custom_claims = json.loads(cli["customClaims"]) if cli["customClaims"] else None
708
+ headers = parse_and_normalize_headers(cli["requestHeaderAllowlist"]) if cli["requestHeaderAllowlist"] else None
709
+ result = self.add(
710
+ AddAgentOptions(
711
+ name=cli["name"],
712
+ type=cli["type"] or "create",
713
+ build_type=cli["build"] or "CodeZip",
714
+ language=cli["language"],
715
+ framework=cli["framework"],
716
+ model_provider=cli["modelProvider"],
717
+ api_key=cli["apiKey"],
718
+ memory=cli["memory"],
719
+ protocol=cli["protocol"],
720
+ network_mode=cli["networkMode"],
721
+ subnets=cli["subnets"],
722
+ security_groups=cli["securityGroups"],
723
+ vpc_id=cli["vpcId"],
724
+ request_header_allowlist=headers,
725
+ code_location=cli["codeLocation"],
726
+ entrypoint=cli["entrypoint"],
727
+ bedrock_agent_id=cli["agentId"],
728
+ bedrock_alias_id=cli["agentAliasId"],
729
+ bedrock_region=cli["region"],
730
+ authorizer_type=cli["authorizerType"],
731
+ discovery_url=cli["discoveryUrl"],
732
+ allowed_audience=cli["allowedAudience"],
733
+ allowed_clients=cli["allowedClients"],
734
+ allowed_scopes=cli["allowedScopes"],
735
+ custom_claims=custom_claims,
736
+ client_id=cli["clientId"],
737
+ client_secret=cli["clientSecret"],
738
+ idle_timeout=int(cli["idleTimeout"]) if cli["idleTimeout"] else None,
739
+ max_lifetime=int(cli["maxLifetime"]) if cli["maxLifetime"] else None,
740
+ session_storage_mount_path=cli["sessionStorageMountPath"],
741
+ efs_access_points=efs_pairs.mounts,
742
+ s3_access_points=s3_pairs.mounts,
743
+ capacity_provider=cli["capacityProvider"],
744
+ capacity_provider_volumes=cp_pairs.mounts,
745
+ with_config_bundle=cli["withConfigBundle"],
746
+ )
747
+ )
748
+ if not result.success:
749
+ raise result.error
750
+ if as_json:
751
+ emit_json(serialize_result(result))
752
+ else:
753
+ typer.echo(f"Added agent '{result.value['agentName']}'")
754
+ if result.value.get("agentPath"):
755
+ typer.echo(f"Agent code: {result.value['agentPath']}")
756
+ if cli["networkMode"] == "VPC":
757
+ typer.echo(f"\x1b[33mNote: {VPC_ENDPOINT_WARNING}\x1b[0m")
758
+
759
+ @staticmethod
760
+ def _validate_filesystem(cli: dict[str, Any], efs_mounts: list[dict], s3_mounts: list[dict]) -> None:
761
+ """Async filesystem checks (Level 1-3) against AWS, as upstream."""
762
+ from agentcore.aws.account import create_aws_client
763
+ from agentcore.cli.commands.shared import filesystem_utils as fs
764
+
765
+ subnet_ids = parse_comma_separated_list(cli["subnets"]) or []
766
+ sg_ids = parse_comma_separated_list(cli["securityGroups"]) or []
767
+ root = find_config_root()
768
+ targets = ConfigIO(base_dir=root).resolve_aws_deployment_targets() if root else []
769
+ first = to_jsonable(targets[0]) if targets else {}
770
+ region = (
771
+ first.get("region") or os.environ.get("AWS_REGION") or os.environ.get("AWS_DEFAULT_REGION") or "us-east-1"
772
+ )
773
+ agent_vpc_id = None
774
+ if subnet_ids:
775
+ try:
776
+ resp = create_aws_client("ec2", region).describe_subnets(SubnetIds=subnet_ids)
777
+ agent_vpc_id = (resp.get("Subnets") or [{}])[0].get("VpcId")
778
+ except Exception: # noqa: BLE001 - non-fatal: skip Level 2
779
+ pass
780
+ result = fs.validate_filesystem_mounts_configuration(
781
+ efs_mounts=efs_mounts,
782
+ s3_files_mounts=s3_mounts,
783
+ agent_vpc_id=agent_vpc_id,
784
+ agent_subnet_ids=subnet_ids,
785
+ agent_security_group_ids=sg_ids,
786
+ region=region,
787
+ )
788
+ if not result.success:
789
+ raise Exception(result.error)
790
+
791
+ def add_interactive(self) -> None:
792
+ """Prompt flow mirroring tui/screens/agent/AddAgentScreen (+ the generate wizard)."""
793
+ from agentcore.cli.commands.add.agent_wizard import run_add_agent_wizard
794
+
795
+ root = find_config_root()
796
+ config_io = ConfigIO(base_dir=root) if root else ConfigIO()
797
+ project = to_jsonable(config_io.read_project_spec())
798
+ options = run_add_agent_wizard(
799
+ existing_agent_names=[r["name"] for r in project["runtimes"]],
800
+ project_name=project["name"],
801
+ capacity_provider_names=[c["name"] for c in project.get("capacityProviders", [])],
802
+ project_root=os.path.dirname(root) if root else os.getcwd(),
803
+ )
804
+ if options is None:
805
+ typer.echo("Cancelled.")
806
+ return
807
+ result = self.add(options, root)
808
+ if not result.success:
809
+ typer.echo(get_error_message(result.error), err=True)
810
+ raise typer.Exit(1)
811
+ typer.echo(f"✓ Created agent: {result.value['agentName']}")
812
+ if result.value.get("agentPath"):
813
+ typer.echo(f"Agent code: {result.value['agentPath']}")
814
+ typer.echo("Next: run `agentcore dev` to test locally, or `agentcore deploy` to deploy.")
815
+
816
+
817
+ PRIMITIVE = AgentPrimitive()