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,501 @@
1
+ """Capacity provider add/remove (port of src/cli/primitives/CapacityProviderPrimitive.ts).
2
+
3
+ A capacity provider is a customer-managed EC2 compute pool stored in ``agentcore.json``
4
+ ``capacityProviders`` and synthesized by the vended CDK project.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import re
10
+ from dataclasses import dataclass, field
11
+ from typing import Any
12
+
13
+ import typer
14
+ from pydantic import ValidationError as PydanticValidationError
15
+
16
+ from agentcore.cli import interactive
17
+ from agentcore.cli.errors import get_error_message
18
+ from agentcore.cli.run_command import run_cli_command
19
+ from agentcore.lib.errors.types import ConflictError, ResourceNotFoundError, ValidationError, to_error
20
+ from agentcore.lib.result import Err, Ok, serialize_result
21
+ from agentcore.lib.schemas.io.config_io import to_jsonable
22
+ from agentcore.lib.schemas.io.path_resolver import find_config_root
23
+ from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange
24
+
25
+
26
+ @dataclass
27
+ class AddCapacityProviderOptions:
28
+ name: str | None = None
29
+ subnets: str | None = None
30
+ security_groups: str | None = None
31
+ instance_types: str | None = None
32
+ operator_role_arn: str | None = None
33
+ description: str | None = None
34
+ os: str | None = None
35
+ volume_name: list[str] = field(default_factory=list)
36
+ volume_size: list[str] = field(default_factory=list)
37
+ volume_encrypted: bool | None = None
38
+ volume_kms_key: str | None = None
39
+ instance_profile_arn: str | None = None
40
+ idle_instance_timeout: str | None = None
41
+ max_lifetime: str | None = None
42
+
43
+
44
+ def _split_list(value: str | None) -> list[str]:
45
+ return [s.strip() for s in (value or "").split(",") if s.strip()]
46
+
47
+
48
+ def _js_number(raw: str) -> float | int | None:
49
+ from agentcore.primitives._harness_cli import _js_number as js_number
50
+
51
+ n = js_number(raw)
52
+ if n is None or n != n:
53
+ return float("nan")
54
+ return int(n) if abs(n) != float("inf") and float(n).is_integer() else n
55
+
56
+
57
+ def build_capacity_provider(options: AddCapacityProviderOptions) -> dict[str, Any]:
58
+ """Build and schema-validate the capacity provider config (rejects bad input at add time)."""
59
+ from agentcore.primitives.knowledge_base import zod_error_message
60
+ from agentcore.schema import CapacityProvider
61
+
62
+ names, sizes = options.volume_name or [], options.volume_size or []
63
+ if len(names) != len(sizes):
64
+ raise ValidationError(
65
+ f"--volume-name and --volume-size must be provided in matching pairs (got {len(names)} name(s) and "
66
+ f"{len(sizes)} size(s))."
67
+ )
68
+ volumes = []
69
+ for vol_name, size_raw in zip(names, sizes, strict=True):
70
+ if not vol_name.strip() or not re.fullmatch(r"[0-9]+", size_raw):
71
+ raise ValidationError(
72
+ f'Invalid volume "{vol_name}:{size_raw}". --volume-name must be non-empty and --volume-size a whole '
73
+ "number of GiB (e.g. --volume-name data --volume-size 20)."
74
+ )
75
+ ebs: dict[str, Any] = {"name": vol_name, "sizeGiB": int(size_raw)}
76
+ if options.volume_encrypted is not None:
77
+ ebs["encrypted"] = options.volume_encrypted
78
+ if options.volume_kms_key:
79
+ ebs["kmsKeyId"] = options.volume_kms_key
80
+ volumes.append({"ebsConfiguration": ebs})
81
+
82
+ lifecycle: dict[str, Any] = {}
83
+ if options.idle_instance_timeout is not None:
84
+ lifecycle["idleInstanceTimeout"] = _js_number(options.idle_instance_timeout)
85
+ if options.max_lifetime is not None:
86
+ lifecycle["maxLifetime"] = _js_number(options.max_lifetime)
87
+
88
+ launch: dict[str, Any] = {
89
+ "operatingSystem": options.os or "LINUX_X86_64",
90
+ "instanceRequirements": {"allowedInstanceTypes": _split_list(options.instance_types)},
91
+ }
92
+ if options.instance_profile_arn:
93
+ launch["instanceProfileArn"] = options.instance_profile_arn
94
+ ec2: dict[str, Any] = {
95
+ "launchTemplateSource": {"launchParameters": launch},
96
+ "vpcConfiguration": {
97
+ "subnets": _split_list(options.subnets),
98
+ "securityGroups": _split_list(options.security_groups),
99
+ },
100
+ }
101
+ if volumes:
102
+ ec2["volumes"] = volumes
103
+ if lifecycle:
104
+ ec2["lifecycleConfiguration"] = lifecycle
105
+
106
+ candidate: dict[str, Any] = {"name": options.name}
107
+ if options.description:
108
+ candidate["description"] = options.description
109
+ if options.operator_role_arn:
110
+ candidate["operatorRoleArn"] = options.operator_role_arn
111
+ candidate["computeConfiguration"] = {"ec2Configuration": ec2}
112
+ try:
113
+ return to_jsonable(CapacityProvider.model_validate(candidate))
114
+ except PydanticValidationError as exc:
115
+ raise Exception(zod_error_message(exc)) from None
116
+
117
+
118
+ class CapacityProviderPrimitive(BasePrimitive):
119
+ kind = "capacity-provider"
120
+ label = "Capacity Provider"
121
+
122
+ def _project(self) -> dict[str, Any]:
123
+ return to_jsonable(self.read_project_spec())
124
+
125
+ def add(self, options: AddCapacityProviderOptions) -> Ok[dict[str, Any]] | Err[Exception]:
126
+ try:
127
+ capacity_provider = build_capacity_provider(options)
128
+ project = self._project()
129
+ existing = project.get("capacityProviders") or []
130
+ if any(cp["name"] == capacity_provider["name"] for cp in existing):
131
+ raise ValueError(f'{self.label} "{capacity_provider["name"]}" already exists.')
132
+ project["capacityProviders"] = [*existing, capacity_provider]
133
+ self.write_project_spec(project)
134
+ return Ok({"capacityProviderName": capacity_provider["name"]})
135
+ except Exception as exc: # noqa: BLE001
136
+ return Err(to_error(exc))
137
+
138
+ @staticmethod
139
+ def _referencing_runtimes(project: dict[str, Any], name: str) -> list[str]:
140
+ return [
141
+ r["name"]
142
+ for r in project.get("runtimes") or []
143
+ if (r.get("capacityProviderConfiguration") or {}).get("capacityProviderName") == name
144
+ ]
145
+
146
+ def remove(self, name: str) -> Ok[None] | Err[Exception]:
147
+ try:
148
+ project = self._project()
149
+ existing = project.get("capacityProviders") or []
150
+ if not any(cp["name"] == name for cp in existing):
151
+ return Err(ResourceNotFoundError(f'Capacity provider "{name}" not found.'))
152
+ refs = self._referencing_runtimes(project, name)
153
+ if refs:
154
+ return Err(
155
+ ConflictError(
156
+ f'Capacity provider "{name}" is referenced by agent(s): {", ".join(refs)}. Remove those '
157
+ "references first."
158
+ )
159
+ )
160
+ remaining = [cp for cp in existing if cp["name"] != name]
161
+ updated = {**project}
162
+ if remaining:
163
+ updated["capacityProviders"] = remaining
164
+ else:
165
+ updated.pop("capacityProviders", None)
166
+ self.write_project_spec(updated)
167
+ return Ok(None)
168
+ except Exception as exc: # noqa: BLE001
169
+ return Err(to_error(exc))
170
+
171
+ def preview_remove(self, name: str) -> RemovalPreview:
172
+ project = self._project()
173
+ existing = project.get("capacityProviders") or []
174
+ if not any(cp["name"] == name for cp in existing):
175
+ raise ResourceNotFoundError(f'Capacity provider "{name}" not found.')
176
+ refs = self._referencing_runtimes(project, name)
177
+ if refs:
178
+ raise ConflictError(
179
+ f'Capacity provider "{name}" is referenced by agent(s): {", ".join(refs)}. Remove those references '
180
+ "first."
181
+ )
182
+ remaining = [cp for cp in existing if cp["name"] != name]
183
+ after = {**project}
184
+ if remaining:
185
+ after["capacityProviders"] = remaining
186
+ else:
187
+ after.pop("capacityProviders", None)
188
+ return RemovalPreview(
189
+ [f"Removing capacity provider: {name}"], [], [SchemaChange("agentcore/agentcore.json", project, after)]
190
+ )
191
+
192
+ def get_removable(self) -> list[RemovableResource]:
193
+ try:
194
+ return [RemovableResource(cp["name"]) for cp in self._project().get("capacityProviders") or []]
195
+ except Exception: # noqa: BLE001
196
+ return []
197
+
198
+ def get_all_names(self) -> list[str]:
199
+ return [r.name for r in self.get_removable()]
200
+
201
+ # --- CLI ----------------------------------------------------------------------------
202
+
203
+ def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
204
+ @add_app.command(
205
+ "capacity-provider",
206
+ help="Add a capacity provider (customer-managed EC2 compute pool for agent runtimes)",
207
+ )
208
+ def add_command(
209
+ name: str | None = typer.Option(None, "--name", help="Capacity provider name [non-interactive]"),
210
+ operator_role_arn: str | None = typer.Option(
211
+ None,
212
+ "--operator-role-arn",
213
+ help="IAM role ARN AgentCore assumes to manage the capacity provider. Optional — omit to have one "
214
+ "created automatically [non-interactive]",
215
+ ),
216
+ description: str | None = typer.Option(
217
+ None, "--description", help="Capacity provider description [non-interactive]"
218
+ ),
219
+ subnets: str | None = typer.Option(
220
+ None, "--subnets", help="Comma-separated subnet IDs (1-16) [non-interactive]"
221
+ ),
222
+ security_groups: str | None = typer.Option(
223
+ None, "--security-groups", help="Comma-separated security group IDs (1-16) [non-interactive]"
224
+ ),
225
+ os_: str | None = typer.Option(
226
+ None,
227
+ "--os",
228
+ help="Operating system: LINUX_X86_64 or LINUX_ARM64 (default: LINUX_X86_64) [non-interactive]",
229
+ ),
230
+ instance_types: str | None = typer.Option(
231
+ None, "--instance-types", help="Comma-separated allowed EC2 instance types (1-30) [non-interactive]"
232
+ ),
233
+ volume_name: list[str] | None = typer.Option(
234
+ None,
235
+ "--volume-name",
236
+ help="Named EBS volume name (repeatable, max 5, paired with --volume-size) [non-interactive]",
237
+ ),
238
+ volume_size: list[str] | None = typer.Option(
239
+ None,
240
+ "--volume-size",
241
+ help="EBS volume size in GiB (repeatable, paired with --volume-name) [non-interactive]",
242
+ ),
243
+ volume_encrypted: bool = typer.Option(
244
+ False, "--volume-encrypted", help="Encrypt EBS volumes [non-interactive]"
245
+ ),
246
+ volume_kms_key: str | None = typer.Option(
247
+ None, "--volume-kms-key", help="KMS key ARN for EBS volume encryption [non-interactive]"
248
+ ),
249
+ instance_profile_arn: str | None = typer.Option(
250
+ None, "--instance-profile-arn", help="IAM instance profile ARN for launched instances [non-interactive]"
251
+ ),
252
+ idle_instance_timeout: str | None = typer.Option(
253
+ None, "--idle-instance-timeout", help="Idle instance timeout in seconds (60-1209600) [non-interactive]"
254
+ ),
255
+ max_lifetime: str | None = typer.Option(
256
+ None, "--max-lifetime", help="Maximum instance lifetime in seconds (60-1209600) [non-interactive]"
257
+ ),
258
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
259
+ ) -> None:
260
+ if not find_config_root():
261
+ typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
262
+ raise typer.Exit(1)
263
+ options = AddCapacityProviderOptions(
264
+ name=name,
265
+ operator_role_arn=operator_role_arn,
266
+ description=description,
267
+ subnets=subnets,
268
+ security_groups=security_groups,
269
+ os=os_,
270
+ instance_types=instance_types,
271
+ volume_name=list(volume_name or []),
272
+ volume_size=list(volume_size or []),
273
+ volume_encrypted=True if volume_encrypted else None,
274
+ volume_kms_key=volume_kms_key,
275
+ instance_profile_arn=instance_profile_arn,
276
+ idle_instance_timeout=idle_instance_timeout,
277
+ max_lifetime=max_lifetime,
278
+ )
279
+
280
+ def action() -> None:
281
+ missing = [
282
+ flag
283
+ for flag, value in (
284
+ ("--name", name),
285
+ ("--subnets", subnets),
286
+ ("--security-groups", security_groups),
287
+ ("--instance-types", instance_types),
288
+ )
289
+ if not value
290
+ ]
291
+ if missing:
292
+ raise ValidationError(f"Missing required option(s): {', '.join(missing)}")
293
+ result = self.add(options)
294
+ if not result.success:
295
+ raise result.error
296
+ if as_json:
297
+ typer.echo(_dumps(serialize_result(result)))
298
+ else:
299
+ typer.echo(f"Added capacity provider '{result.value['capacityProviderName']}'")
300
+
301
+ run_cli_command(as_json, action)
302
+
303
+ self.register_remove_subcommand(remove_app)
304
+
305
+ # --- interactive (port of tui/screens/capacity-provider) ------------------------------
306
+
307
+ def add_interactive(self) -> None:
308
+ from agentcore.cli.commands.add._common import first_issue
309
+ from agentcore.cli.naming import generate_unique_name
310
+ from agentcore.schema import CapacityProviderName, is_valid_operator_role_arn
311
+
312
+ existing = self.get_all_names()
313
+ C = interactive.Choice
314
+ name = interactive.text(
315
+ "Capacity provider name",
316
+ default=generate_unique_name("MyCapacityProvider", existing),
317
+ validate=lambda v: (
318
+ first_issue(CapacityProviderName, v)
319
+ or ("Capacity provider name already exists" if v in existing else None)
320
+ ),
321
+ )
322
+ operator_role = interactive.text(
323
+ "Operator role ARN (optional, press Enter to auto-create)",
324
+ validate=lambda v: (
325
+ None if v.strip() == "" or is_valid_operator_role_arn(v) else "Must be a valid IAM role ARN"
326
+ ),
327
+ )
328
+
329
+ def id_list(pattern: str, plural: str, invalid: str): # type: ignore[no-untyped-def]
330
+ def validate(value: str) -> str | None:
331
+ ids = _split_list(value)
332
+ if not 1 <= len(ids) <= 16:
333
+ return f"Provide 1-16 {plural}"
334
+ return None if all(re.fullmatch(pattern, i) for i in ids) else invalid
335
+
336
+ return validate
337
+
338
+ subnets = interactive.text(
339
+ "Subnet IDs (comma-separated, 1-16)",
340
+ validate=id_list(r"subnet-[0-9a-zA-Z]{8,17}", "subnet IDs", "Each must be a valid subnet ID (subnet-...)"),
341
+ )
342
+ security_groups = interactive.text(
343
+ "Security group IDs (comma-separated, 1-16)",
344
+ validate=id_list(
345
+ r"sg-[0-9a-zA-Z]{8,17}", "security group IDs", "Each must be a valid security group ID (sg-...)"
346
+ ),
347
+ )
348
+ os_choice = interactive.select(
349
+ "Operating system (CPU architecture for the capacity provider instances)",
350
+ [
351
+ C("Linux x86_64", "LINUX_X86_64", "Intel/AMD 64-bit Linux instances"),
352
+ C("Linux ARM64", "LINUX_ARM64", "Graviton/ARM 64-bit Linux instances"),
353
+ ],
354
+ )
355
+ instance_types = interactive.text(
356
+ "Allowed EC2 instance types (comma-separated, 1-30)",
357
+ validate=lambda v: None if 1 <= len(_split_list(v)) <= 30 else "Provide 1-30 instance types",
358
+ )
359
+ instance_profile = interactive.text(
360
+ "Instance profile ARN for launched instances (optional, press Enter to skip)",
361
+ validate=lambda v: (
362
+ None
363
+ if v.strip() == "" or re.fullmatch(r"arn:[^:]+:iam::[0-9]{12}:instance-profile/.+", v.strip())
364
+ else "Must be a valid IAM instance profile ARN (arn:...:instance-profile/...)"
365
+ ),
366
+ ).strip()
367
+
368
+ volumes: list[dict[str, Any]] = []
369
+ while len(volumes) < 5:
370
+ taken = [v["name"] for v in volumes]
371
+ vol_name = interactive.text(
372
+ "Volume name (optional — press Enter to finish adding volumes)",
373
+ validate=lambda v, taken=taken: (
374
+ None if v.strip() == "" or v.strip() not in taken else f'Volume "{v.strip()}" already added'
375
+ ),
376
+ ).strip()
377
+ if not vol_name:
378
+ break
379
+
380
+ def validate_size(value: str) -> str | None:
381
+ if not re.fullmatch(r"[0-9]+", value.strip()):
382
+ return "Enter a whole number of GiB"
383
+ return None if 1 <= int(value.strip()) <= 65536 else "Size must be between 1 and 65536 GiB"
384
+
385
+ size = int(interactive.text(f'Size in GiB for "{vol_name}" (1-65536)', validate=validate_size).strip())
386
+ volumes.append({"name": vol_name, "sizeGiB": size})
387
+ if len(volumes) >= 5:
388
+ break
389
+ if (
390
+ interactive.select(
391
+ "Add another volume?", [C("Yes", "yes", "Add another volume"), C("No", "no", "Continue")]
392
+ )
393
+ != "yes"
394
+ ):
395
+ break
396
+
397
+ encrypted = False
398
+ kms_key = ""
399
+ if volumes:
400
+ encrypted = (
401
+ interactive.select(
402
+ "Encrypt EBS volumes? (Applies to all volumes on this capacity provider)",
403
+ [
404
+ C("No encryption", "no", "EBS volumes are not encrypted"),
405
+ C("Encrypt EBS volumes", "yes", "Optionally with your own KMS key"),
406
+ ],
407
+ )
408
+ == "yes"
409
+ )
410
+ if encrypted:
411
+ kms_key = interactive.text(
412
+ "KMS key ARN for volume encryption (optional, press Enter for an AWS-managed key)",
413
+ validate=lambda v: (
414
+ None
415
+ if v.strip() == ""
416
+ or re.fullmatch(
417
+ r"arn:[^:]+:kms:[a-z0-9-]+:[0-9]{12}:key/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}",
418
+ v.strip(),
419
+ )
420
+ else "Must be a valid KMS key ARN"
421
+ ),
422
+ ).strip()
423
+
424
+ def validate_lifetime(value: str) -> str | None:
425
+ trimmed = value.strip()
426
+ if trimmed == "":
427
+ return None
428
+ if not re.fullmatch(r"[0-9]+", trimmed):
429
+ return "Enter a whole number of seconds"
430
+ return None if 60 <= int(trimmed) <= 1209600 else "Must be between 60 and 1209600 seconds"
431
+
432
+ idle = interactive.text(
433
+ "Idle instance timeout in seconds (60-1209600, press Enter to skip)", validate=validate_lifetime
434
+ ).strip()
435
+ lifetime = interactive.text(
436
+ "Maximum instance lifetime in seconds (60-1209600, press Enter to skip)", validate=validate_lifetime
437
+ ).strip()
438
+ description = interactive.text("Description (optional, press Enter to skip)").strip()
439
+
440
+ for label, value in (
441
+ ("Name", name),
442
+ ("Operator Role", operator_role or "(auto-create)"),
443
+ ("Subnets", subnets),
444
+ ("Security Groups", security_groups),
445
+ ("OS", os_choice),
446
+ ("Instance Types", instance_types),
447
+ ("Instance Profile", instance_profile),
448
+ ("Volumes", ", ".join(f"{v['name']} ({v['sizeGiB']} GiB)" for v in volumes)),
449
+ ("Encryption", ("Yes" + (f" ({kms_key})" if kms_key else "")) if volumes and encrypted else ""),
450
+ ("Idle Timeout", idle),
451
+ ("Max Lifetime", lifetime),
452
+ ("Description", description),
453
+ ):
454
+ if value:
455
+ typer.echo(f" {label}: {value}")
456
+ if not interactive.confirm("Create this capacity provider?", default=True):
457
+ typer.echo("Cancelled.")
458
+ return
459
+
460
+ result = self.add(
461
+ AddCapacityProviderOptions(
462
+ name=name,
463
+ operator_role_arn=operator_role or None,
464
+ description=description or None,
465
+ subnets=subnets,
466
+ security_groups=security_groups,
467
+ os=os_choice,
468
+ instance_types=instance_types,
469
+ instance_profile_arn=instance_profile or None,
470
+ volume_name=[v["name"] for v in volumes],
471
+ volume_size=[str(v["sizeGiB"]) for v in volumes],
472
+ volume_encrypted=encrypted if volumes else None,
473
+ volume_kms_key=kms_key if encrypted and kms_key else None,
474
+ idle_instance_timeout=idle or None,
475
+ max_lifetime=lifetime or None,
476
+ )
477
+ )
478
+ if not result.success:
479
+ typer.echo("Failed to add capacity provider", err=True)
480
+ typer.echo(get_error_message(result.error), err=True)
481
+ raise typer.Exit(1)
482
+ typer.echo(f"Added capacity provider: {result.value['capacityProviderName']}")
483
+ typer.echo("Deploy with `agentcore deploy`.")
484
+ typer.echo(f" OS: {os_choice}")
485
+ typer.echo(f" Instance types: {instance_types}")
486
+ if volumes:
487
+ summary = ", ".join(f"{v['name']} ({v['sizeGiB']} GiB)" for v in volumes)
488
+ typer.echo(f" Volumes: {summary}")
489
+ if description:
490
+ typer.echo(f" Desc: {description}")
491
+
492
+
493
+ def _dumps(payload: dict[str, Any]) -> str:
494
+ import json
495
+
496
+ return json.dumps(payload, separators=(",", ":"))
497
+
498
+
499
+ __all__ = ["AddCapacityProviderOptions", "CapacityProviderPrimitive", "build_capacity_provider"]
500
+
501
+ PRIMITIVE = CapacityProviderPrimitive()